diff --git a/lib/ts_packet.cpp b/lib/ts_packet.cpp index df5f92a9..c1e7ba77 100644 --- a/lib/ts_packet.cpp +++ b/lib/ts_packet.cpp @@ -1,10 +1,19 @@ +/// \file ts_packet.cpp +/// Holds all code for the TS namespace. + #include "ts_packet.h" -TS_Packet::TS_Packet() { +/// This constructor creates an empty TS::Packet, ready for use for either reading or writing. +/// All this constructor does is call TS::Packet::Clear(). +TS::Packet::Packet() { Clear( ); } -TS_Packet::TS_Packet( std::string & Data ) { +/// This constructor creates a filled TS::Packet, or creates an empty +/// packet if not enough Data provided. +/// It fills the content with the first 188 bytes of Data. +/// \param Data The data to be read into the packet. +TS::Packet::Packet( std::string & Data ) { if( Data.size() < 188 ) { Clear( ); } else { @@ -16,53 +25,70 @@ TS_Packet::TS_Packet( std::string & Data ) { } } -TS_Packet::~TS_Packet() { } +/// The deconstructor deletes all space that may be occupied by a TS::Packet. +TS::Packet::~Packet() { } -void TS_Packet::PID( int NewVal ) { - Buffer[1] = (Buffer[1] & 0xE0) + ((NewVal & 0x1F00) >> 8 ); - Buffer[2] = (NewVal & 0x00FF); +/// Sets the PID of a single TS::Packet. +/// \param NewPID The new PID of the packet. +void TS::Packet::PID( int NewPID ) { + Buffer[1] = (Buffer[1] & 0xE0) + ((NewPID & 0x1F00) >> 8 ); + Buffer[2] = (NewPID & 0x00FF); Free = std::min( Free, 184 ); } -int TS_Packet::PID() { +/// Gets the PID of a single TS::Packet. +/// \return The value of the PID. +int TS::Packet::PID() { return (( Buffer[1] & 0x1F ) << 8 ) + Buffer[2]; } -void TS_Packet::ContinuityCounter( int NewVal ) { - Buffer[3] = ( Buffer[3] & 0xF0 ) + ( NewVal & 0x0F ); +/// Sets the Continuity Counter of a single TS::Packet +/// \param NewContinuity The new Continuity Counter of the packet. +void TS::Packet::ContinuityCounter( int NewContinuity ) { + Buffer[3] = ( Buffer[3] & 0xF0 ) + ( NewContinuity & 0x0F ); Free = std::min( Free, 184 ); } -int TS_Packet::ContinuityCounter() { +/// Gets the Continuity Counter of a single TS::Packet. +/// \return The value of the Continuity Counter. +int TS::Packet::ContinuityCounter() { return ( Buffer[3] & 0x0F ); } -int TS_Packet::BytesFree( ) { +/// Gets the amount of bytes that are not written yet in a TS::Packet +/// \return The amount of bytes that can still be written to this packet. +int TS::Packet::BytesFree( ) { return Free; } -void TS_Packet::Clear( ) { +/// Clears a TS::Packet +void TS::Packet::Clear( ) { Free = 184; Buffer[0] = 0x47; for( int i = 1; i < 188; i++ ) { Buffer[i] = 0x00; } - AdaptionField( 1 ); + AdaptationField( 1 ); } -void TS_Packet::AdaptionField( int NewVal ) { - Buffer[3] = ( Buffer[3] & 0xCF ) + ((NewVal & 0x03) << 4); +/// Sets the selection value for an adaptationfield of a TS::Packet +/// \param NewSelector The new value of the selection bits. +/// - 1: No AdaptationField +/// - 2: AdaptationField Only +/// - 3: AdaptationField followed by Data +void TS::Packet::AdaptationField( int NewSelector ) { + Buffer[3] = ( Buffer[3] & 0xCF ) + ((NewSelector & 0x03) << 4); Buffer[4] = 0; Free = std::min( Free, 184 ); } -int TS_Packet::AdaptionField( ) { +int TS::Packet::AdaptationField( ) { return ((Buffer[3] & 0x30) >> 4 ); } -void TS_Packet::PCR( int64_t NewVal ) { +void TS::Packet::PCR( int64_t NewVal ) { NewVal += (0xF618 * 300); - AdaptionField( 3 ); + AdaptationField( 3 ); Buffer[4] = 7; Buffer[5] = (Buffer[5] | 0x10 ); int64_t TmpVal = NewVal / 300; @@ -76,8 +102,8 @@ void TS_Packet::PCR( int64_t NewVal ) { Free = std::min( Free, 176 ); }; -int64_t TS_Packet::PCR( ) { - if( !AdaptionField() ) { +int64_t TS::Packet::PCR( ) { + if( !AdaptationField() ) { return -1; } if( !(Buffer[5] & 0x10 ) ) { @@ -90,22 +116,22 @@ int64_t TS_Packet::PCR( ) { return Result; } -int TS_Packet::AdaptionFieldLen( ) { - if( !AdaptionField() ) { +int TS::Packet::AdaptationFieldLen( ) { + if( !AdaptationField() ) { return -1; } return (int)Buffer[4]; } -void TS_Packet::Print( ) { +void TS::Packet::Print( ) { std::cout << "TS Packet: " << (Buffer[0] == 0x47) << "\n\tNewUnit: " << UnitStart() << "\n\tPID: " << PID() << "\n\tContinuity Counter: " << ContinuityCounter() - << "\n\tAdaption Field: " << AdaptionField() << "\n"; - if( AdaptionField() ) { - std::cout << "\t\tAdaption Field Length: " << AdaptionFieldLen() << "\n"; - if( AdaptionFieldLen() ) { + << "\n\tAdaption Field: " << AdaptationField() << "\n"; + if( AdaptationField() ) { + std::cout << "\t\tAdaption Field Length: " << AdaptationFieldLen() << "\n"; + if( AdaptationFieldLen() ) { std::cout << "\t\tRandom Access: " << RandomAccess() << "\n"; } if( PCR() != -1 ) { @@ -114,11 +140,11 @@ void TS_Packet::Print( ) { } } -int TS_Packet::UnitStart( ) { +int TS::Packet::UnitStart( ) { return ( Buffer[1] & 0x40) >> 6; } -void TS_Packet::UnitStart( int NewVal ) { +void TS::Packet::UnitStart( int NewVal ) { if( NewVal ) { Buffer[1] = (Buffer[1] | 0x40); } else { @@ -126,15 +152,15 @@ void TS_Packet::UnitStart( int NewVal ) { } } -int TS_Packet::RandomAccess( ) { - if( !AdaptionField() ) { +int TS::Packet::RandomAccess( ) { + if( !AdaptationField() ) { return -1; } return ( Buffer[5] & 0x40) >> 6; } -void TS_Packet::RandomAccess( int NewVal ) { - if( AdaptionField() ) { +void TS::Packet::RandomAccess( int NewVal ) { + if( AdaptationField() ) { if( Buffer[4] == 0 ) { Buffer[4] = 1; } @@ -144,7 +170,7 @@ void TS_Packet::RandomAccess( int NewVal ) { Buffer[5] = (Buffer[5] & 0xBF); } } else { - AdaptionField( 3 ); + AdaptationField( 3 ); Buffer[4] = 1; if( NewVal ) { Buffer[5] = 0x40; @@ -156,106 +182,31 @@ void TS_Packet::RandomAccess( int NewVal ) { Free = std::min( Free, 182 ); } -void TS_Packet::DefaultPAT( ) { +void TS::Packet::DefaultPAT( ) { static int MyCntr = 0; - UnitStart( 1 ); - PID( 0 ); + std::copy( TS::PAT, TS::PAT + 188, Buffer ); ContinuityCounter( MyCntr ); - AdaptionField( 0x01 ); - - - - - Buffer[ 4] = 0x00;//Pointer Field - Buffer[ 5] = 0x00;//TableID - Buffer[ 6] = 0xB0,//Reserved + SectionLength - Buffer[ 7] = 0x0D;//SectionLength (Cont) - Buffer[ 8] = 0x00;//Transport_Stream_ID - Buffer[ 9] = 0x01;//Transport_Stream_ID (Cont) - Buffer[10] = 0xC1;//Reserved + VersionNumber + Current_Next_Indicator - Buffer[11] = 0x00;//Section_Number - Buffer[12] = 0x00;//Last_Section_Number - Buffer[13] = 0x00; //Program Number - Buffer[14] = 0x01; //Program Number (Cont) - Buffer[15] = 0xF0; //Reserved + Program_Map_PID - Buffer[16] = 0x00; //Program_Map_PID (Cont) - Buffer[17] = 0x2A;//CRC32 - Buffer[18] = 0xB1;//CRC32 (Cont) - Buffer[19] = 0x04;//CRC32 (Cont) - Buffer[20] = 0xB2;//CRC32 (Cont) - std::fill( Buffer+21, Buffer+188, 0xFF ); Free = 0; MyCntr = ( (MyCntr + 1) % 0x10); } -void TS_Packet::DefaultPMT( ) { +void TS::Packet::DefaultPMT( ) { static int MyCntr = 0; - UnitStart( 1 ); - PID( 0x1000 ); + std::copy( TS::PMT, TS::PMT + 188, Buffer ); ContinuityCounter( MyCntr ); - AdaptionField( 0x01 ); - - - - Buffer[ 4] = 0x00;//Pointer Field - Buffer[ 5] = 0x02;//TableID - Buffer[ 6] = 0xb0;//Reserved + Section_Length - Buffer[ 7] = 0x1D;//Section_Length (Cont) - Buffer[ 8] = 0x00;//Program_Number - Buffer[ 9] = 0x01;//Program_Number (Cont) - Buffer[10] = 0xc1;//Reserved + VersionNumber + Current_Next_Indicator - Buffer[11] = 0x00;//Section_Number - Buffer[12] = 0x00;//Last_Section_Number - Buffer[13] = 0xe1;//Reserved + PCR_PID - Buffer[14] = 0x00;//PCR_PID (Cont) - Buffer[15] = 0xf0;//Reserved + Program_Info_Length - Buffer[16] = 0x00;//Program_Info_Length (Cont) - Buffer[17] = 0x1b; //Stream_Type - - - - Buffer[18] = 0xe1; //Reserved + Elementary_PID - Buffer[19] = 0x00; //Elementary_PID (Cont) - Buffer[20] = 0xf0; //Reserved + ES_Info_Length - Buffer[21] = 0x00; //ES_Info_Length (Cont) - Buffer[22] = 0x0f; //Stream_Type - Buffer[23] = 0xe1; - Buffer[24] = 0x01; - Buffer[25] = 0xf0; - Buffer[26] = 0x06; - Buffer[27] = 0x0a; - Buffer[28] = 0x04; - Buffer[29] = 0x65; - Buffer[30] = 0x6e; - Buffer[31] = 0x67; - Buffer[32] = 0x00; - Buffer[33] = 0x8d; - Buffer[34] = 0x82; - Buffer[35] = 0x9a; - Buffer[36] = 0x07; - - std::fill( Buffer+37, Buffer+188, 0xFF ); Free = 0; MyCntr = ( (MyCntr + 1) % 0x10); } -std::string TS_Packet::ToString( ) { - fprintf( stderr, "\t\t\tAdaptationFieldBitsInBuffer: %0.2X\n", AdaptionField( ) ); +std::string TS::Packet::ToString( ) { std::string Result( Buffer, 188 ); - fprintf( stderr, "\t\t\tAdaptationFieldBitsInString: %0.2X\n", Result[3] ); std::cout.write( Buffer,188 ); - if( Buffer[0] != 0x47) { - fprintf( stderr, "Breaking, something terrible has happened\n" ); - exit(400); - } return Result; } -void TS_Packet::PESVideoLeadIn( int NewLen, uint64_t PTSt ) { +void TS::Packet::PESVideoLeadIn( int NewLen ) { static int PTS = 27000000; NewLen += 14; - fprintf( stderr, "\t\t\t\t\tMyPTS: %X\n", PTS ); - fprintf( stderr, "\t\t\t\t\tMyLen: %d\n", NewLen ); int Offset = ( 188 - Free ); Buffer[Offset] = 0x00;//PacketStartCodePrefix Buffer[Offset+1] = 0x00;//PacketStartCodePrefix (Cont) @@ -284,15 +235,10 @@ void TS_Packet::PESVideoLeadIn( int NewLen, uint64_t PTSt ) { PTS += 3003; } -void TS_Packet::PESAudioLeadIn( int NewLen, uint64_t PTS ) { - fprintf( stderr, "Free before PESAudio: %d\n", Free ); +void TS::Packet::PESAudioLeadIn( int NewLen, uint64_t PTS ) { PTS = PTS * 90; - fprintf( stderr, "%d\n", PTS ); NewLen += 8; - fprintf( stderr, "\t\t\t\t\tMyPTS: %X\n", PTS ); - fprintf( stderr, "\t\t\t\t\tMyLen: %d\n", NewLen ); int Offset = ( 188 - Free ) - 2; - fprintf( stderr, "Audio PES Lead In: Offset = %d\n", Offset ); Buffer[Offset] = 0x00;//PacketStartCodePrefix Buffer[Offset+1] = 0x00;//PacketStartCodePrefix (Cont) Buffer[Offset+2] = 0x01;//PacketStartCodePrefix (Cont) @@ -311,29 +257,24 @@ void TS_Packet::PESAudioLeadIn( int NewLen, uint64_t PTS ) { Free = Free - 12; } -void TS_Packet::FillFree( std::string & NewVal ) { - int Offset = (188 - Free); - fprintf( stderr, "Filling Free: Offset = %d\n", Offset ); - for( int i = 0; (Offset + i) < 188; i++ ) { - Buffer[Offset+i] = NewVal[i]; - } +void TS::Packet::FillFree( std::string & NewVal ) { + int Offset = 188 - Free; + std::copy( NewVal.begin(), NewVal.begin() + Free, Buffer + Offset ); NewVal.erase(0,Free); Free = 0; } -void TS_Packet::AddStuffing( int NumBytes ) { +void TS::Packet::AddStuffing( int NumBytes ) { if( NumBytes <= 0 ) { return; } - if( AdaptionField( ) == 3 ) { + if( AdaptationField( ) == 3 ) { int Offset = Buffer[4]; - fprintf( stderr, "AddStuffing: AdaptionField == 3 && Offset = %d\n", Offset ); Buffer[4] = Offset + NumBytes - 1; for( int i = 0; i < ( NumBytes -2 ); i ++ ) { Buffer[6+Offset+i] = 0xFF; } Free -= NumBytes; } else { - AdaptionField( 3 ); - fprintf( stderr, "AddStuffing: AdaptionField != 3\n" ); + AdaptationField( 3 ); Buffer[4] = NumBytes - 1; Buffer[5] = 0x00; for( int i = 0; i < ( NumBytes -2 ); i ++ ) { @@ -341,59 +282,12 @@ void TS_Packet::AddStuffing( int NumBytes ) { } Free -= NumBytes; } - fprintf( stderr, "Free After Stuffing: %d\n", Free ); } -void TS_Packet::FFMpegHeader( ) { +void TS::Packet::FFMpegHeader( ) { static int MyCntr = 0; - UnitStart( 1 ); - PID( 0x0011 ); + std::copy( TS::SDT, TS::SDT + 188, Buffer ); ContinuityCounter( MyCntr ); - AdaptionField( 0x01 ); - Buffer[4] = 0x00; - Buffer[5] = 0x42; - Buffer[6] = 0xF0; - Buffer[7] = 0x25; - Buffer[8] = 0x00; - Buffer[9] = 0x01; - Buffer[10] = 0xC1; - Buffer[11] = 0x00; - Buffer[12] = 0x00; - Buffer[13] = 0x00; - Buffer[14] = 0x01; - Buffer[15] = 0xFF; - Buffer[16] = 0x00; - Buffer[17] = 0x01; - Buffer[18] = 0xFC; - Buffer[19] = 0x80; - Buffer[20] = 0x14; - Buffer[21] = 0x48; - Buffer[22] = 0x12; - Buffer[23] = 0x01; - Buffer[24] = 0x06; - Buffer[25] = 0x46; - Buffer[26] = 0x46; - Buffer[27] = 0x6D; - Buffer[28] = 0x70; - Buffer[29] = 0x65; - Buffer[30] = 0x67; - Buffer[31] = 0x09; - Buffer[32] = 0x53; - Buffer[33] = 0x65; - Buffer[34] = 0x72; - Buffer[35] = 0x76; - Buffer[36] = 0x69; - Buffer[37] = 0x63; - Buffer[38] = 0x65; - Buffer[39] = 0x30; - Buffer[40] = 0x31; - Buffer[41] = 0xA7; - Buffer[42] = 0x79; - Buffer[43] = 0xA0; - Buffer[44] = 0x03; - for( int i = 45; i < 188; i++ ) { - Buffer[i] = 0xFF; - } Free = 0; MyCntr = ( (MyCntr + 1) % 0x10); } diff --git a/lib/ts_packet.h b/lib/ts_packet.h index 958c6b49..43fbf1ef 100644 --- a/lib/ts_packet.h +++ b/lib/ts_packet.h @@ -1,3 +1,6 @@ +/// \file ts_packet.h +/// Holds all headers for the TS Namespace. + #pragma once #include #include @@ -7,36 +10,108 @@ #include #include -class TS_Packet { - public: - TS_Packet(); - TS_Packet( std::string & Data ); - ~TS_Packet(); - void PID( int NewVal ); - int PID(); - void ContinuityCounter( int NewVal ); - int ContinuityCounter(); - void Clear(); - void PCR( int64_t NewVal ); - void AdaptionField( int NewVal ); - int AdaptionField( ); - int AdaptionFieldLen( ); - void DefaultPAT(); - void DefaultPMT(); - int UnitStart( ); - void UnitStart( int NewVal ); - int RandomAccess( ); - void RandomAccess( int NewVal ); - int BytesFree(); - int64_t PCR(); - void Print(); - std::string ToString(); - void PESVideoLeadIn( int NewLen, uint64_t PTS = 0 ); - void PESAudioLeadIn( int NewLen, uint64_t PTS = 0 ); - void FillFree( std::string & PackageData ); - void AddStuffing( int NumBytes ); - void FFMpegHeader( ); - private: - int Free; - char Buffer[188];///< The actual data -}; +/// Holds all TS processing related code. +namespace TS { + /// Simple class for reading and writing TS Streams + class Packet { + public: + Packet(); + Packet( std::string & Data ); + ~Packet(); + void PID( int NewPID ); + int PID(); + void ContinuityCounter( int NewContinuity ); + int ContinuityCounter(); + void Clear(); + void PCR( int64_t NewVal ); + int64_t PCR(); + void AdaptationField( int NewVal ); + int AdaptationField( ); + int AdaptationFieldLen( ); + void DefaultPAT(); + void DefaultPMT(); + int UnitStart( ); + void UnitStart( int NewVal ); + int RandomAccess( ); + void RandomAccess( int NewVal ); + int BytesFree(); + + void Print(); + std::string ToString(); + void PESVideoLeadIn( int NewLen ); + void PESAudioLeadIn( int NewLen, uint64_t PTS = 0 ); + void FillFree( std::string & PackageData ); + void AddStuffing( int NumBytes ); + void FFMpegHeader( ); + private: + int Free; + char Buffer[188];///< The actual data + };//TS::Packet class + + static char PAT[188] = { + 0x47,0x40,0x00,0x10, 0x00,0x00,0xB0,0x0D, 0x00,0x01,0xC1,0x00, 0x00,0x00,0x01,0xF0, + 0x00,0x2A,0xB1,0x04, 0xB2,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF + }; + + static char PMT[188] = { + 0x47,0x50,0x00,0x10, 0x00,0x02,0xB0,0x1D, 0x00,0x01,0xC1,0x00, 0x00,0xE1,0x00,0xF0, + 0x00,0x1B,0xE1,0x00, 0xF0,0x00,0x0F,0xE1, 0x01,0xF0,0x06,0x0A, 0x04,0x65,0x6E,0x67, + 0x00,0x8D,0x82,0x9A, 0x07,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF + }; + + static char SDT[188] = { + 0x47,0x40,0x11,0x10, 0x00,0x42,0xF0,0x25, 0x00,0x01,0xC1,0x00, 0x00,0x00,0x01,0xFF, + 0x00,0x01,0xFC,0x80, 0x14,0x48,0x12,0x01, 0x06,0x46,0x46,0x6D, 0x70,0x65,0x67,0x09, + 0x53,0x65,0x72,0x76, 0x69,0x63,0x65,0x30, 0x31,0xA7,0x79,0xA0, 0x03,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF + }; + + static char PPS[24] = { + 0x00,0x00,0x00,0x01, + 0x27,0x4D,0x40,0x1F, + 0xA9,0x18,0x0A,0x00, + 0xB7,0x60,0x0D,0x40, + 0x40,0x40,0x4C,0x2B, + 0x5E,0xF7,0xC0,0x40 + }; + + static char SPS[8] = { + 0x00,0x00,0x00,0x01, + 0x28,0xCE,0x09,0xC8 + }; + + static char NalHeader[4] = { + 0x00,0x00,0x00,0x01 + }; + + static char ShortNalHeader[3] = { + 0x00,0x00,0x01 + }; +};//TS namespace diff --git a/src/converters/dtsc2ts.cpp b/src/converters/dtsc2ts.cpp index ed3fe1e6..57534303 100644 --- a/src/converters/dtsc2ts.cpp +++ b/src/converters/dtsc2ts.cpp @@ -20,37 +20,22 @@ std::string GetAudioHeader( int FrameLen ) { } int main( ) { - char ShortNALUHeader[3] = {0x00,0x00,0x01}; - char NALUHeader[4] = {0x00,0x00,0x00,0x01}; - char PPS_SPS[32] = {0x00,0x00,0x00,0x01, - 0x27,0x4D,0x40,0x1F, - 0xA9,0x18,0x0A,0x00, - 0xB7,0x60,0x0D,0x40, - 0x40,0x40,0x4C,0x2B, - 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; - TS_Packet PackData; + TS::Packet PackData; + std::string ToPack; DTSC::Stream DTSCStream; int TSPackNum = 0; std::string DTMIData; - std::string NaluData; bool WritePesHeader; bool IsKeyFrame; - int TimeStamp = 0; + uint64_t 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(); @@ -60,51 +45,41 @@ int main( ) { DTMIData = DTSCStream.lastData(); if( DTSCStream.getPacket(0).getContent("keyframe").NumValue() ) { IsKeyFrame = true; - FirstIDRInKeyFrame = true; + FirstIDRInKeyFrame = true; } else { IsKeyFrame = false; - FirstKeyFrame = false; + FirstKeyFrame = false; } - TimeStamp = (DTSCStream.getPacket(0).getContent("time").NumValue() * 27000); - if( TimeStamp < 0 ) { TimeStamp = 0; } - std::string ToPack; + TimeStamp = (DTSCStream.getPacket(0).getContent("time").NumValue() * 27000 ); int TSType; - bool FirstIDRPic = true; - bool FirstNonIDRPic = true; + bool FirstPic = true; while( DTMIData.size() ) { ThisNaluSize = (DTMIData[0] << 24) + (DTMIData[1] << 16) + (DTMIData[2] << 8) + DTMIData[3]; DTMIData.erase(0,4);//Erase the first four characters; TSType = (int)DTMIData[0]; if( TSType == 0x25 ) { - if( FirstIDRPic ) { - ToPack.append(PPS_SPS,32); - FirstIDRPic = false; - FirstNonIDRPic = false; + if( FirstPic ) { + ToPack.append(TS::PPS,24); + ToPack.append(TS::SPS,8); + FirstPic = false; } 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); - } + if( !FirstKeyFrame && FirstIDRInKeyFrame ) { + ToPack.append(TS::NalHeader,4); + FirstIDRInKeyFrame = false; + } else { + ToPack.append(TS::ShortNalHeader,3); + } + } } else if ( TSType == 0x21 ) { - if( FirstNonIDRPic ) { - ToPack.append(NALUHeader,4); - FirstNonIDRPic = false; - FirstIDRPic = false; + if( FirstPic ) { + ToPack.append(TS::NalHeader,4); + FirstPic = false; } else { - ToPack.append(ShortNALUHeader,3); + ToPack.append(TS::ShortNalHeader,3); } } else { - ToPack.append(NALUHeader,4); + ToPack.append(TS::NalHeader,4); } ToPack.append(DTMIData,0,ThisNaluSize); DTMIData.erase(0,ThisNaluSize); @@ -129,37 +104,31 @@ int main( ) { if( WritePesHeader ) { PackData.UnitStart( 1 ); if( IsKeyFrame ) { - fprintf( stderr, "IsKeyFrame\n" ); PackData.RandomAccess( 1 ); PackData.PCR( TimeStamp ); } else { - PackData.AdaptionField( 0x01 ); + PackData.AdaptationField( 0x01 ); } - fprintf( stderr, "Needed Stuffing: %d\n", 184 - (20+ToPack.size()) ); PackData.AddStuffing( 184 - (20+ToPack.size()) ); - PackData.PESVideoLeadIn( ToPack.size(), TimeStamp / 300 ); + PackData.PESVideoLeadIn( ToPack.size() ); WritePesHeader = false; } else { - PackData.AdaptionField( 0x01 ); - fprintf( stderr, "Needed Stuffing: %d\n", 184 - (ToPack.size()) ); + PackData.AdaptationField( 0x01 ); PackData.AddStuffing( 184 - (ToPack.size()) ); } PackData.FillFree( ToPack ); 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; } + ToPack = GetAudioHeader( DTMIData.size() ); + ToPack += DTMIData; + TimeStamp = DTSCStream.getPacket(0).getContent("time").NumValue() * 900; PackData.Clear(); - while( AudioPack.size() ) { + while( ToPack.size() ) { if ( ( TSPackNum % 210 ) == 0 ) { PackData.FFMpegHeader(); PackData.ToString(); @@ -169,7 +138,7 @@ int main( ) { PackData.ToString(); } else if ( ( TSPackNum % 42 ) == 1 ) { PackData.DefaultPMT(); - PackData.ToString(); + PackData.ToString(); } else { PackData.Clear(); PackData.PID( 0x101 ); @@ -178,19 +147,16 @@ int main( ) { 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 ); + PackData.AddStuffing( 184 - (14 + ToPack.size()) ); + PackData.PESAudioLeadIn( ToPack.size(), TimeStamp ); WritePesHeader = false; } else { - PackData.AdaptionField( 0x01 ); - fprintf( stderr, "Needed Stuffing: %d\n", 184 - (AudioPack.size()) ); - PackData.AddStuffing( 184 - (AudioPack.size()) ); + PackData.AdaptationField( 0x01 ); + PackData.AddStuffing( 184 - (ToPack.size()) ); } - PackData.FillFree( AudioPack ); + PackData.FillFree( ToPack ); PackData.ToString(); } - fprintf( stderr, "PackNum: %d\n\tAdaptionField: %d\n==========\n", TSPackNum + (TSPackNum/210)+1 + 1, PackData.AdaptionField( ) ); TSPackNum++; } }