From 6bad0360a1f75e0f43e95df002813fe13652b35c Mon Sep 17 00:00:00 2001 From: Erik Zandvliet Date: Tue, 26 Jun 2012 11:59:47 +0200 Subject: [PATCH] Input start --- lib/ts_packet.cpp | 34 ++++++++++++++++++++++++++++++---- lib/ts_packet.h | 5 ++++- src/converters/Makefile.am | 3 ++- 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/lib/ts_packet.cpp b/lib/ts_packet.cpp index 7e8985b4..45784d24 100644 --- a/lib/ts_packet.cpp +++ b/lib/ts_packet.cpp @@ -7,18 +7,19 @@ /// All this constructor does is call TS::Packet::Clear(). TS::Packet::Packet() { Clear( ); } -/// This constructor creates a filled TS::Packet, or creates an empty -/// packet if not enough Data provided. +/// This function fills a TS::Packet from provided Data. /// 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 ) { +/// \return true if it was possible to read in a full packet, false otherwise. +bool TS::Packet::FromString( std::string & Data ) { if( Data.size() < 188 ) { - Clear( ); + return false; } else { for( int i = 0; i < 188; i++ ) { Buffer[i] = Data[i]; } Data.erase(0,188); Free = 0; } + return true; } /// The deconstructor deletes all space that may be occupied by a TS::Packet. @@ -323,3 +324,28 @@ void TS::Packet::FFMpegHeader( ) { Free = 0; MyCntr = ( (MyCntr + 1) % 0x10); } + +int TS::Packet::ProgramMapPID( ) { + if( PID() != 0 ) { return -1; } + int Offset = Buffer[4]; + int ProgramNumber = ( Buffer[13+Offset] << 8 ) + Buffer[14+Offset]; + if( ProgramNumber == 0 ) { return -1; } + return ((Buffer[15+Offset] & 0x1F) << 8 ) + Buffer[16+Offset]; +} + +void TS::Packet::UpdateStreamPID( int & VideoPid, int & AudioPid ) { + int Offset = Buffer[4]; + int SectionLength = ( ( Buffer[6+Offset] & 0x0F) << 8 ) + Buffer[7+Offset]; + int ProgramInfoLength = ( (Buffer[15+Offset] & 0x0F) << 8 ) + Buffer[16+Offset]; + int CurOffset = 17+ProgramInfoLength+Offset; + while( CurOffset < SectionLength-4 ) { + if( Buffer[CurOffset] == 0x01 || Buffer[CurOffset == 0x02] ) { + VideoPid = ((Buffer[CurOffset+1] & 0x1F) << 8 ) + Buffer[CurOffset+2]; + } + if( Buffer[CurOffset] == 0x03 || Buffer[CurOffset == 0x04] ) { + AudioPid = ((Buffer[CurOffset+1] & 0x1F) << 8 ) + Buffer[CurOffset+2]; + } + int ESLen = (( Buffer[CurOffset+3] & 0xF0 ) << 8 ) + Buffer[CurOffset+4]; + CurOffset += ( 5 + ESLen ); + } +} diff --git a/lib/ts_packet.h b/lib/ts_packet.h index 658c69bc..80c67dc8 100644 --- a/lib/ts_packet.h +++ b/lib/ts_packet.h @@ -16,8 +16,8 @@ namespace TS { class Packet { public: Packet(); - Packet( std::string & Data ); ~Packet(); + bool FromString( std::string & Data ); void PID( int NewPID ); int PID(); void ContinuityCounter( int NewContinuity ); @@ -43,6 +43,9 @@ namespace TS { void FillFree( std::string & PackageData ); void AddStuffing( int NumBytes ); void FFMpegHeader( ); + + int ProgramMapPID( ); + void UpdateStreamPID( int & VideoPid, int & AudioPid ); private: int Free; char Buffer[188];///< The actual data diff --git a/src/converters/Makefile.am b/src/converters/Makefile.am index f6a56b41..f4a28f59 100644 --- a/src/converters/Makefile.am +++ b/src/converters/Makefile.am @@ -1,8 +1,9 @@ AM_CPPFLAGS = $(global_CFLAGS) $(MIST_CFLAGS) LDADD = $(MIST_LIBS) -bin_PROGRAMS=MistDTSC2FLV MistFLV2DTSC MistDTSCFix MistDTSC2TS +bin_PROGRAMS=MistDTSC2FLV MistFLV2DTSC MistDTSCFix MistDTSC2TS MistTS2DTSC MistDTSC2FLV_SOURCES=dtsc2flv.cpp MistFLV2DTSC_SOURCES=flv2dtsc.cpp MistDTSCFix_SOURCES=dtscfix.cpp MistDTSC2TS_SOURCES=dtsc2ts.cpp +MistTS2DTSC_SOURCES=ts2dtsc.cpp