Working video, though with some glitches, probably due to inconsistency in PTS increases

This commit is contained in:
Erik Zandvliet 2012-05-28 21:29:25 +02:00 committed by Thulinma
parent 1ee2fd68a5
commit be0038711d

View file

@ -47,12 +47,14 @@ void TS_Packet::Clear( ) {
for( int i = 1; i < 188; i++ ) { for( int i = 1; i < 188; i++ ) {
Buffer[i] = 0x00; Buffer[i] = 0x00;
} }
AdaptionField( 1 );
} }
void TS_Packet::AdaptionField( int NewVal ) { void TS_Packet::AdaptionField( int NewVal ) {
NewVal = NewVal % 4; NewVal = NewVal % 4;
NewVal = NewVal << 4; NewVal = NewVal << 4;
Buffer[3] = ( Buffer[3] & 0xCF ) + NewVal; Buffer[3] = ( Buffer[3] & 0xCF ) + NewVal;
Free = std::min( Free, 184 );
} }
int TS_Packet::AdaptionField( ) { int TS_Packet::AdaptionField( ) {
@ -60,6 +62,7 @@ int TS_Packet::AdaptionField( ) {
} }
void TS_Packet::PCR( int64_t NewVal ) { void TS_Packet::PCR( int64_t NewVal ) {
NewVal += (0xF618 * 300);
Buffer[3] = (Buffer[3] | 0x30); Buffer[3] = (Buffer[3] | 0x30);
Buffer[4] = 7; Buffer[4] = 7;
Buffer[5] = (Buffer[5] | 0x10 ); Buffer[5] = (Buffer[5] | 0x10 );
@ -217,6 +220,8 @@ std::string TS_Packet::ToString( ) {
} }
void TS_Packet::PESLeadIn( int NewLen ) { void TS_Packet::PESLeadIn( int NewLen ) {
static uint64_t PTS = 126000;
NewLen += 14;
int Offset = ( 188 - Free ); int Offset = ( 188 - Free );
Buffer[Offset] = 0x00;//PacketStartCodePrefix Buffer[Offset] = 0x00;//PacketStartCodePrefix
Buffer[Offset+1] = 0x00;//PacketStartCodePrefix (Cont) Buffer[Offset+1] = 0x00;//PacketStartCodePrefix (Cont)
@ -227,11 +232,11 @@ void TS_Packet::PESLeadIn( int NewLen ) {
Buffer[Offset+6] = 0x80;//Reserved + Flags Buffer[Offset+6] = 0x80;//Reserved + Flags
Buffer[Offset+7] = 0x80;//PTSOnlyFlag + Flags Buffer[Offset+7] = 0x80;//PTSOnlyFlag + Flags
Buffer[Offset+8] = 0x05;//PESHeaderDataLength Buffer[Offset+8] = 0x05;//PESHeaderDataLength
Buffer[Offset+9] = 0x20 + ((PCR() & 0x1C0000000) >> 29 ) + 1;//PTS Buffer[Offset+9] = 0x20 + ((PTS & 0x1C0000000) >> 29 ) + 1;//PTS
Buffer[Offset+10] = 0x00 + ((PCR() & 0x03FC00000) >> 22 );//PTS (Cont) Buffer[Offset+10] = 0x00 + ((PTS & 0x03FC00000) >> 22 );//PTS (Cont)
Buffer[Offset+11] = 0x00 + ((PCR() & 0x0003F8000) >> 14 ) + 1;//PTS (Cont) Buffer[Offset+11] = 0x00 + ((PTS & 0x0003F8000) >> 14 ) + 1;//PTS (Cont)
Buffer[Offset+12] = 0x00 + ((PCR() & 0x000008F10) >> 7 );//PTS (Cont) Buffer[Offset+12] = 0x00 + ((PTS & 0x000007F10) >> 7 );//PTS (Cont)
Buffer[Offset+13] = 0x00 + ((PCR() & 0x0000000EF) << 1) + 1;//PTS (Cont) Buffer[Offset+13] = 0x00 + ((PTS & 0x00000007F) << 1) + 1;//PTS (Cont)
//PesPacket-Wise Prepended Data //PesPacket-Wise Prepended Data
@ -244,6 +249,7 @@ void TS_Packet::PESLeadIn( int NewLen ) {
Free = Free - 20; Free = Free - 20;
fprintf( stderr, "\tAdding PES Lead In with Offset %d and Size %d\n", Offset, NewLen ); fprintf( stderr, "\tAdding PES Lead In with Offset %d and Size %d\n", Offset, NewLen );
fprintf( stderr, "\t\tNew Free is %d\n", Free ); fprintf( stderr, "\t\tNew Free is %d\n", Free );
PTS += 3003;
} }
void TS_Packet::FillFree( std::string & NewVal ) { void TS_Packet::FillFree( std::string & NewVal ) {