Working video and audio

This commit is contained in:
Erik Zandvliet 2012-06-11 12:49:22 +02:00 committed by Thulinma
parent be0038711d
commit 8d8c23e194
3 changed files with 244 additions and 40 deletions

View file

@ -10,6 +10,15 @@
#include "../../lib/ts_packet.h" //TS support
#include "../../lib/dtsc.h" //DTSC support
std::string GetAudioHeader( int FrameLen ) {
char StandardHeader[7] = {0xFF,0xF1,0x4C,0x80,0x00,0x1F,0xFC};
FrameLen += 7;
StandardHeader[3] = ( StandardHeader[3] & 0xFC ) + ( ( FrameLen & 0x00001800 ) >> 11 );
StandardHeader[4] = ( ( FrameLen & 0x000007F8 ) >> 3 );
StandardHeader[5] = ( StandardHeader[5] & 0x3F ) + ( ( FrameLen & 0x00000007 ) << 5 );
return std::string(StandardHeader,7);
}
int main( ) {
char ShortNALUHeader[3] = {0x00,0x00,0x01};
char NALUHeader[4] = {0x00,0x00,0x00,0x01};
@ -21,6 +30,8 @@ int main( ) {
0x5E,0xF7,0xC0,0x40,
0x00,0x00,0x00,0x01,
0x28,0xCE,0x09,0xC8};
char AudioHeader_01[7] = {0xFF,0xF1,0x4C,0x80,0x01,0xDF,0xFC};
char AudioHeader_45[7] = {0xFF,0xF1,0x4C,0x80,0x45,0xDF,0xFC};
char charBuffer[1024*10];
unsigned int charCount;
std::string StrData;
@ -34,6 +45,12 @@ int main( ) {
int TimeStamp = 0;
int ThisNaluSize;
int VidContinuity = 0;
int AudioContinuity = 0;
bool FirstKeyFrame = true;
bool FirstIDRInKeyFrame;
std::string AudioPack;
uint64_t AudioTimestamp = 0;
uint64_t NextAudioTimestamp = 0;
while( std::cin.good() ) {
std::cin.read(charBuffer, 1024*10);
charCount = std::cin.gcount();
@ -43,11 +60,13 @@ int main( ) {
DTMIData = DTSCStream.lastData();
if( DTSCStream.getPacket(0).getContent("keyframe").NumValue() ) {
IsKeyFrame = true;
TimeStamp = DTSCStream.getTime();
FirstIDRInKeyFrame = true;
} else {
IsKeyFrame = false;
TimeStamp = 0;
FirstKeyFrame = false;
}
TimeStamp = (DTSCStream.getPacket(0).getContent("time").NumValue() * 27000);
if( TimeStamp < 0 ) { TimeStamp = 0; }
std::string ToPack;
int TSType;
bool FirstIDRPic = true;
@ -61,8 +80,21 @@ int main( ) {
ToPack.append(PPS_SPS,32);
FirstIDRPic = false;
FirstNonIDRPic = false;
}
ToPack.append(ShortNALUHeader,3);
}
if( IsKeyFrame ) {
if( FirstKeyFrame ) {
ToPack.append(ShortNALUHeader,3);
} else {
if( FirstIDRInKeyFrame ) {
ToPack.append(NALUHeader,4);
FirstIDRInKeyFrame = false;
} else {
ToPack.append(ShortNALUHeader,3);
}
}
} else {
ToPack.append(ShortNALUHeader,3);
}
} else if ( TSType == 0x21 ) {
if( FirstNonIDRPic ) {
ToPack.append(NALUHeader,4);
@ -78,38 +110,90 @@ int main( ) {
DTMIData.erase(0,ThisNaluSize);
}
WritePesHeader = true;
fprintf( stderr, "PESHeader: %d, PackNum: %2d, ToPackSize: %d\n", WritePesHeader, TSPackNum, ToPack.size() );
while( ToPack.size() ) {
if ( ( TSPackNum % 210 ) == 0 ) {
PackData.FFMpegHeader();
PackData.ToString();
}
if ( ( TSPackNum % 42 ) == 0 ) {
PackData.DefaultPAT();
std::cout << PackData.ToString();
PackData.ToString();
} else if ( ( TSPackNum % 42 ) == 1 ) {
PackData.DefaultPMT();
std::cout << PackData.ToString();
PackData.ToString();
} else {
PackData.Clear();
PackData.PID( 0x100 );
PackData.ContinuityCounter( VidContinuity++ );
PackData.ContinuityCounter( VidContinuity );
VidContinuity ++;
if( WritePesHeader ) {
PackData.UnitStart( 1 );
if( IsKeyFrame ) {
PackData.AdaptionField( 0x03 );
fprintf( stderr, "IsKeyFrame\n" );
PackData.RandomAccess( 1 );
PackData.PCR( TimeStamp );
} else {
PackData.AdaptionField( 0x01 );
}
fprintf( stderr, "Needed Stuffing: %d\n", 184 - (20+ToPack.size()) );
PackData.AddStuffing( 184 - (20+ToPack.size()) );
PackData.PESLeadIn( ToPack.size() );
PackData.PESVideoLeadIn( ToPack.size(), TimeStamp / 300 );
WritePesHeader = false;
} else {
PackData.AdaptionField( 0x01 );
PackData.AddStuffing( 184 - (ToPack.size()) );
}
fprintf( stderr, "Needed Stuffing: %d\n", 184 - (ToPack.size()) );
PackData.AddStuffing( 184 - (ToPack.size()) );
}
PackData.FillFree( ToPack );
std::cout << PackData.ToString();
}
PackData.ToString();
}
fprintf( stderr, "PackNum: %d\n\tAdaptionField: %d\n==========\n", TSPackNum + (TSPackNum/210)+1 + 1, PackData.AdaptionField( ) );
TSPackNum++;
}
}
} else if( DTSCStream.lastType() == DTSC::AUDIO ) {
WritePesHeader = true;
DTMIData = DTSCStream.lastData();
AudioPack = GetAudioHeader( DTMIData.size() );
AudioPack += DTMIData;
fprintf( stderr, "DTMIData: %d\n", DTMIData.size() );
AudioTimestamp = DTSCStream.getPacket(0).getContent("time").NumValue() * 900;
if( AudioTimestamp < 0 ) { AudioTimestamp = 0; }
PackData.Clear();
while( AudioPack.size() ) {
if ( ( TSPackNum % 210 ) == 0 ) {
PackData.FFMpegHeader();
PackData.ToString();
}
if ( ( TSPackNum % 42 ) == 0 ) {
PackData.DefaultPAT();
PackData.ToString();
} else if ( ( TSPackNum % 42 ) == 1 ) {
PackData.DefaultPMT();
PackData.ToString();
} else {
PackData.Clear();
PackData.PID( 0x101 );
PackData.ContinuityCounter( AudioContinuity );
AudioContinuity ++;
if( WritePesHeader ) {
PackData.UnitStart( 1 );
PackData.RandomAccess( 1 );
fprintf( stderr, "WritePes Needed Stuffing: %d\n", 184 - (14+AudioPack.size()) );
PackData.AddStuffing( 184 - (14+ AudioPack.size()) );
PackData.PESAudioLeadIn( AudioPack.size(), AudioTimestamp );
WritePesHeader = false;
} else {
PackData.AdaptionField( 0x01 );
fprintf( stderr, "Needed Stuffing: %d\n", 184 - (AudioPack.size()) );
PackData.AddStuffing( 184 - (AudioPack.size()) );
}
PackData.FillFree( AudioPack );
PackData.ToString();
}
fprintf( stderr, "PackNum: %d\n\tAdaptionField: %d\n==========\n", TSPackNum + (TSPackNum/210)+1 + 1, PackData.AdaptionField( ) );
TSPackNum++;
}
}
}
}
return 0;