Optimizations
This commit is contained in:
parent
8d8c23e194
commit
102231103c
3 changed files with 219 additions and 284 deletions
|
@ -1,10 +1,19 @@
|
||||||
|
/// \file ts_packet.cpp
|
||||||
|
/// Holds all code for the TS namespace.
|
||||||
|
|
||||||
#include "ts_packet.h"
|
#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( );
|
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 ) {
|
if( Data.size() < 188 ) {
|
||||||
Clear( );
|
Clear( );
|
||||||
} else {
|
} 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 ) {
|
/// Sets the PID of a single TS::Packet.
|
||||||
Buffer[1] = (Buffer[1] & 0xE0) + ((NewVal & 0x1F00) >> 8 );
|
/// \param NewPID The new PID of the packet.
|
||||||
Buffer[2] = (NewVal & 0x00FF);
|
void TS::Packet::PID( int NewPID ) {
|
||||||
|
Buffer[1] = (Buffer[1] & 0xE0) + ((NewPID & 0x1F00) >> 8 );
|
||||||
|
Buffer[2] = (NewPID & 0x00FF);
|
||||||
Free = std::min( Free, 184 );
|
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];
|
return (( Buffer[1] & 0x1F ) << 8 ) + Buffer[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
void TS_Packet::ContinuityCounter( int NewVal ) {
|
/// Sets the Continuity Counter of a single TS::Packet
|
||||||
Buffer[3] = ( Buffer[3] & 0xF0 ) + ( NewVal & 0x0F );
|
/// \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 );
|
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 );
|
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;
|
return Free;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TS_Packet::Clear( ) {
|
/// Clears a TS::Packet
|
||||||
|
void TS::Packet::Clear( ) {
|
||||||
Free = 184;
|
Free = 184;
|
||||||
Buffer[0] = 0x47;
|
Buffer[0] = 0x47;
|
||||||
for( int i = 1; i < 188; i++ ) {
|
for( int i = 1; i < 188; i++ ) {
|
||||||
Buffer[i] = 0x00;
|
Buffer[i] = 0x00;
|
||||||
}
|
}
|
||||||
AdaptionField( 1 );
|
AdaptationField( 1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
void TS_Packet::AdaptionField( int NewVal ) {
|
/// Sets the selection value for an adaptationfield of a TS::Packet
|
||||||
Buffer[3] = ( Buffer[3] & 0xCF ) + ((NewVal & 0x03) << 4);
|
/// \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;
|
Buffer[4] = 0;
|
||||||
Free = std::min( Free, 184 );
|
Free = std::min( Free, 184 );
|
||||||
}
|
}
|
||||||
|
|
||||||
int TS_Packet::AdaptionField( ) {
|
int TS::Packet::AdaptationField( ) {
|
||||||
return ((Buffer[3] & 0x30) >> 4 );
|
return ((Buffer[3] & 0x30) >> 4 );
|
||||||
}
|
}
|
||||||
|
|
||||||
void TS_Packet::PCR( int64_t NewVal ) {
|
void TS::Packet::PCR( int64_t NewVal ) {
|
||||||
NewVal += (0xF618 * 300);
|
NewVal += (0xF618 * 300);
|
||||||
AdaptionField( 3 );
|
AdaptationField( 3 );
|
||||||
Buffer[4] = 7;
|
Buffer[4] = 7;
|
||||||
Buffer[5] = (Buffer[5] | 0x10 );
|
Buffer[5] = (Buffer[5] | 0x10 );
|
||||||
int64_t TmpVal = NewVal / 300;
|
int64_t TmpVal = NewVal / 300;
|
||||||
|
@ -76,8 +102,8 @@ void TS_Packet::PCR( int64_t NewVal ) {
|
||||||
Free = std::min( Free, 176 );
|
Free = std::min( Free, 176 );
|
||||||
};
|
};
|
||||||
|
|
||||||
int64_t TS_Packet::PCR( ) {
|
int64_t TS::Packet::PCR( ) {
|
||||||
if( !AdaptionField() ) {
|
if( !AdaptationField() ) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if( !(Buffer[5] & 0x10 ) ) {
|
if( !(Buffer[5] & 0x10 ) ) {
|
||||||
|
@ -90,22 +116,22 @@ int64_t TS_Packet::PCR( ) {
|
||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
int TS_Packet::AdaptionFieldLen( ) {
|
int TS::Packet::AdaptationFieldLen( ) {
|
||||||
if( !AdaptionField() ) {
|
if( !AdaptationField() ) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return (int)Buffer[4];
|
return (int)Buffer[4];
|
||||||
}
|
}
|
||||||
|
|
||||||
void TS_Packet::Print( ) {
|
void TS::Packet::Print( ) {
|
||||||
std::cout << "TS Packet: " << (Buffer[0] == 0x47)
|
std::cout << "TS Packet: " << (Buffer[0] == 0x47)
|
||||||
<< "\n\tNewUnit: " << UnitStart()
|
<< "\n\tNewUnit: " << UnitStart()
|
||||||
<< "\n\tPID: " << PID()
|
<< "\n\tPID: " << PID()
|
||||||
<< "\n\tContinuity Counter: " << ContinuityCounter()
|
<< "\n\tContinuity Counter: " << ContinuityCounter()
|
||||||
<< "\n\tAdaption Field: " << AdaptionField() << "\n";
|
<< "\n\tAdaption Field: " << AdaptationField() << "\n";
|
||||||
if( AdaptionField() ) {
|
if( AdaptationField() ) {
|
||||||
std::cout << "\t\tAdaption Field Length: " << AdaptionFieldLen() << "\n";
|
std::cout << "\t\tAdaption Field Length: " << AdaptationFieldLen() << "\n";
|
||||||
if( AdaptionFieldLen() ) {
|
if( AdaptationFieldLen() ) {
|
||||||
std::cout << "\t\tRandom Access: " << RandomAccess() << "\n";
|
std::cout << "\t\tRandom Access: " << RandomAccess() << "\n";
|
||||||
}
|
}
|
||||||
if( PCR() != -1 ) {
|
if( PCR() != -1 ) {
|
||||||
|
@ -114,11 +140,11 @@ void TS_Packet::Print( ) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int TS_Packet::UnitStart( ) {
|
int TS::Packet::UnitStart( ) {
|
||||||
return ( Buffer[1] & 0x40) >> 6;
|
return ( Buffer[1] & 0x40) >> 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TS_Packet::UnitStart( int NewVal ) {
|
void TS::Packet::UnitStart( int NewVal ) {
|
||||||
if( NewVal ) {
|
if( NewVal ) {
|
||||||
Buffer[1] = (Buffer[1] | 0x40);
|
Buffer[1] = (Buffer[1] | 0x40);
|
||||||
} else {
|
} else {
|
||||||
|
@ -126,15 +152,15 @@ void TS_Packet::UnitStart( int NewVal ) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int TS_Packet::RandomAccess( ) {
|
int TS::Packet::RandomAccess( ) {
|
||||||
if( !AdaptionField() ) {
|
if( !AdaptationField() ) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return ( Buffer[5] & 0x40) >> 6;
|
return ( Buffer[5] & 0x40) >> 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TS_Packet::RandomAccess( int NewVal ) {
|
void TS::Packet::RandomAccess( int NewVal ) {
|
||||||
if( AdaptionField() ) {
|
if( AdaptationField() ) {
|
||||||
if( Buffer[4] == 0 ) {
|
if( Buffer[4] == 0 ) {
|
||||||
Buffer[4] = 1;
|
Buffer[4] = 1;
|
||||||
}
|
}
|
||||||
|
@ -144,7 +170,7 @@ void TS_Packet::RandomAccess( int NewVal ) {
|
||||||
Buffer[5] = (Buffer[5] & 0xBF);
|
Buffer[5] = (Buffer[5] & 0xBF);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
AdaptionField( 3 );
|
AdaptationField( 3 );
|
||||||
Buffer[4] = 1;
|
Buffer[4] = 1;
|
||||||
if( NewVal ) {
|
if( NewVal ) {
|
||||||
Buffer[5] = 0x40;
|
Buffer[5] = 0x40;
|
||||||
|
@ -156,106 +182,31 @@ void TS_Packet::RandomAccess( int NewVal ) {
|
||||||
Free = std::min( Free, 182 );
|
Free = std::min( Free, 182 );
|
||||||
}
|
}
|
||||||
|
|
||||||
void TS_Packet::DefaultPAT( ) {
|
void TS::Packet::DefaultPAT( ) {
|
||||||
static int MyCntr = 0;
|
static int MyCntr = 0;
|
||||||
UnitStart( 1 );
|
std::copy( TS::PAT, TS::PAT + 188, Buffer );
|
||||||
PID( 0 );
|
|
||||||
ContinuityCounter( MyCntr );
|
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;
|
Free = 0;
|
||||||
MyCntr = ( (MyCntr + 1) % 0x10);
|
MyCntr = ( (MyCntr + 1) % 0x10);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TS_Packet::DefaultPMT( ) {
|
void TS::Packet::DefaultPMT( ) {
|
||||||
static int MyCntr = 0;
|
static int MyCntr = 0;
|
||||||
UnitStart( 1 );
|
std::copy( TS::PMT, TS::PMT + 188, Buffer );
|
||||||
PID( 0x1000 );
|
|
||||||
ContinuityCounter( MyCntr );
|
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;
|
Free = 0;
|
||||||
MyCntr = ( (MyCntr + 1) % 0x10);
|
MyCntr = ( (MyCntr + 1) % 0x10);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string TS_Packet::ToString( ) {
|
std::string TS::Packet::ToString( ) {
|
||||||
fprintf( stderr, "\t\t\tAdaptationFieldBitsInBuffer: %0.2X\n", AdaptionField( ) );
|
|
||||||
std::string Result( Buffer, 188 );
|
std::string Result( Buffer, 188 );
|
||||||
fprintf( stderr, "\t\t\tAdaptationFieldBitsInString: %0.2X\n", Result[3] );
|
|
||||||
std::cout.write( Buffer,188 );
|
std::cout.write( Buffer,188 );
|
||||||
if( Buffer[0] != 0x47) {
|
|
||||||
fprintf( stderr, "Breaking, something terrible has happened\n" );
|
|
||||||
exit(400);
|
|
||||||
}
|
|
||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TS_Packet::PESVideoLeadIn( int NewLen, uint64_t PTSt ) {
|
void TS::Packet::PESVideoLeadIn( int NewLen ) {
|
||||||
static int PTS = 27000000;
|
static int PTS = 27000000;
|
||||||
NewLen += 14;
|
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 );
|
int Offset = ( 188 - Free );
|
||||||
Buffer[Offset] = 0x00;//PacketStartCodePrefix
|
Buffer[Offset] = 0x00;//PacketStartCodePrefix
|
||||||
Buffer[Offset+1] = 0x00;//PacketStartCodePrefix (Cont)
|
Buffer[Offset+1] = 0x00;//PacketStartCodePrefix (Cont)
|
||||||
|
@ -284,15 +235,10 @@ void TS_Packet::PESVideoLeadIn( int NewLen, uint64_t PTSt ) {
|
||||||
PTS += 3003;
|
PTS += 3003;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TS_Packet::PESAudioLeadIn( int NewLen, uint64_t PTS ) {
|
void TS::Packet::PESAudioLeadIn( int NewLen, uint64_t PTS ) {
|
||||||
fprintf( stderr, "Free before PESAudio: %d\n", Free );
|
|
||||||
PTS = PTS * 90;
|
PTS = PTS * 90;
|
||||||
fprintf( stderr, "%d\n", PTS );
|
|
||||||
NewLen += 8;
|
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;
|
int Offset = ( 188 - Free ) - 2;
|
||||||
fprintf( stderr, "Audio PES Lead In: Offset = %d\n", Offset );
|
|
||||||
Buffer[Offset] = 0x00;//PacketStartCodePrefix
|
Buffer[Offset] = 0x00;//PacketStartCodePrefix
|
||||||
Buffer[Offset+1] = 0x00;//PacketStartCodePrefix (Cont)
|
Buffer[Offset+1] = 0x00;//PacketStartCodePrefix (Cont)
|
||||||
Buffer[Offset+2] = 0x01;//PacketStartCodePrefix (Cont)
|
Buffer[Offset+2] = 0x01;//PacketStartCodePrefix (Cont)
|
||||||
|
@ -311,29 +257,24 @@ void TS_Packet::PESAudioLeadIn( int NewLen, uint64_t PTS ) {
|
||||||
Free = Free - 12;
|
Free = Free - 12;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TS_Packet::FillFree( std::string & NewVal ) {
|
void TS::Packet::FillFree( std::string & NewVal ) {
|
||||||
int Offset = (188 - Free);
|
int Offset = 188 - Free;
|
||||||
fprintf( stderr, "Filling Free: Offset = %d\n", Offset );
|
std::copy( NewVal.begin(), NewVal.begin() + Free, Buffer + Offset );
|
||||||
for( int i = 0; (Offset + i) < 188; i++ ) {
|
|
||||||
Buffer[Offset+i] = NewVal[i];
|
|
||||||
}
|
|
||||||
NewVal.erase(0,Free);
|
NewVal.erase(0,Free);
|
||||||
Free = 0;
|
Free = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TS_Packet::AddStuffing( int NumBytes ) {
|
void TS::Packet::AddStuffing( int NumBytes ) {
|
||||||
if( NumBytes <= 0 ) { return; }
|
if( NumBytes <= 0 ) { return; }
|
||||||
if( AdaptionField( ) == 3 ) {
|
if( AdaptationField( ) == 3 ) {
|
||||||
int Offset = Buffer[4];
|
int Offset = Buffer[4];
|
||||||
fprintf( stderr, "AddStuffing: AdaptionField == 3 && Offset = %d\n", Offset );
|
|
||||||
Buffer[4] = Offset + NumBytes - 1;
|
Buffer[4] = Offset + NumBytes - 1;
|
||||||
for( int i = 0; i < ( NumBytes -2 ); i ++ ) {
|
for( int i = 0; i < ( NumBytes -2 ); i ++ ) {
|
||||||
Buffer[6+Offset+i] = 0xFF;
|
Buffer[6+Offset+i] = 0xFF;
|
||||||
}
|
}
|
||||||
Free -= NumBytes;
|
Free -= NumBytes;
|
||||||
} else {
|
} else {
|
||||||
AdaptionField( 3 );
|
AdaptationField( 3 );
|
||||||
fprintf( stderr, "AddStuffing: AdaptionField != 3\n" );
|
|
||||||
Buffer[4] = NumBytes - 1;
|
Buffer[4] = NumBytes - 1;
|
||||||
Buffer[5] = 0x00;
|
Buffer[5] = 0x00;
|
||||||
for( int i = 0; i < ( NumBytes -2 ); i ++ ) {
|
for( int i = 0; i < ( NumBytes -2 ); i ++ ) {
|
||||||
|
@ -341,59 +282,12 @@ void TS_Packet::AddStuffing( int NumBytes ) {
|
||||||
}
|
}
|
||||||
Free -= NumBytes;
|
Free -= NumBytes;
|
||||||
}
|
}
|
||||||
fprintf( stderr, "Free After Stuffing: %d\n", Free );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TS_Packet::FFMpegHeader( ) {
|
void TS::Packet::FFMpegHeader( ) {
|
||||||
static int MyCntr = 0;
|
static int MyCntr = 0;
|
||||||
UnitStart( 1 );
|
std::copy( TS::SDT, TS::SDT + 188, Buffer );
|
||||||
PID( 0x0011 );
|
|
||||||
ContinuityCounter( MyCntr );
|
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;
|
Free = 0;
|
||||||
MyCntr = ( (MyCntr + 1) % 0x10);
|
MyCntr = ( (MyCntr + 1) % 0x10);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
/// \file ts_packet.h
|
||||||
|
/// Holds all headers for the TS Namespace.
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
@ -7,20 +10,24 @@
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
class TS_Packet {
|
/// Holds all TS processing related code.
|
||||||
|
namespace TS {
|
||||||
|
/// Simple class for reading and writing TS Streams
|
||||||
|
class Packet {
|
||||||
public:
|
public:
|
||||||
TS_Packet();
|
Packet();
|
||||||
TS_Packet( std::string & Data );
|
Packet( std::string & Data );
|
||||||
~TS_Packet();
|
~Packet();
|
||||||
void PID( int NewVal );
|
void PID( int NewPID );
|
||||||
int PID();
|
int PID();
|
||||||
void ContinuityCounter( int NewVal );
|
void ContinuityCounter( int NewContinuity );
|
||||||
int ContinuityCounter();
|
int ContinuityCounter();
|
||||||
void Clear();
|
void Clear();
|
||||||
void PCR( int64_t NewVal );
|
void PCR( int64_t NewVal );
|
||||||
void AdaptionField( int NewVal );
|
int64_t PCR();
|
||||||
int AdaptionField( );
|
void AdaptationField( int NewVal );
|
||||||
int AdaptionFieldLen( );
|
int AdaptationField( );
|
||||||
|
int AdaptationFieldLen( );
|
||||||
void DefaultPAT();
|
void DefaultPAT();
|
||||||
void DefaultPMT();
|
void DefaultPMT();
|
||||||
int UnitStart( );
|
int UnitStart( );
|
||||||
|
@ -28,10 +35,10 @@ class TS_Packet {
|
||||||
int RandomAccess( );
|
int RandomAccess( );
|
||||||
void RandomAccess( int NewVal );
|
void RandomAccess( int NewVal );
|
||||||
int BytesFree();
|
int BytesFree();
|
||||||
int64_t PCR();
|
|
||||||
void Print();
|
void Print();
|
||||||
std::string ToString();
|
std::string ToString();
|
||||||
void PESVideoLeadIn( int NewLen, uint64_t PTS = 0 );
|
void PESVideoLeadIn( int NewLen );
|
||||||
void PESAudioLeadIn( int NewLen, uint64_t PTS = 0 );
|
void PESAudioLeadIn( int NewLen, uint64_t PTS = 0 );
|
||||||
void FillFree( std::string & PackageData );
|
void FillFree( std::string & PackageData );
|
||||||
void AddStuffing( int NumBytes );
|
void AddStuffing( int NumBytes );
|
||||||
|
@ -39,4 +46,72 @@ class TS_Packet {
|
||||||
private:
|
private:
|
||||||
int Free;
|
int Free;
|
||||||
char Buffer[188];///< The actual data
|
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
|
||||||
|
|
|
@ -20,37 +20,22 @@ std::string GetAudioHeader( int FrameLen ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int main( ) {
|
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];
|
char charBuffer[1024*10];
|
||||||
unsigned int charCount;
|
unsigned int charCount;
|
||||||
std::string StrData;
|
std::string StrData;
|
||||||
TS_Packet PackData;
|
TS::Packet PackData;
|
||||||
|
std::string ToPack;
|
||||||
DTSC::Stream DTSCStream;
|
DTSC::Stream DTSCStream;
|
||||||
int TSPackNum = 0;
|
int TSPackNum = 0;
|
||||||
std::string DTMIData;
|
std::string DTMIData;
|
||||||
std::string NaluData;
|
|
||||||
bool WritePesHeader;
|
bool WritePesHeader;
|
||||||
bool IsKeyFrame;
|
bool IsKeyFrame;
|
||||||
int TimeStamp = 0;
|
uint64_t TimeStamp = 0;
|
||||||
int ThisNaluSize;
|
int ThisNaluSize;
|
||||||
int VidContinuity = 0;
|
int VidContinuity = 0;
|
||||||
int AudioContinuity = 0;
|
int AudioContinuity = 0;
|
||||||
bool FirstKeyFrame = true;
|
bool FirstKeyFrame = true;
|
||||||
bool FirstIDRInKeyFrame;
|
bool FirstIDRInKeyFrame;
|
||||||
std::string AudioPack;
|
|
||||||
uint64_t AudioTimestamp = 0;
|
|
||||||
uint64_t NextAudioTimestamp = 0;
|
|
||||||
while( std::cin.good() ) {
|
while( std::cin.good() ) {
|
||||||
std::cin.read(charBuffer, 1024*10);
|
std::cin.read(charBuffer, 1024*10);
|
||||||
charCount = std::cin.gcount();
|
charCount = std::cin.gcount();
|
||||||
|
@ -65,46 +50,36 @@ int main( ) {
|
||||||
IsKeyFrame = false;
|
IsKeyFrame = false;
|
||||||
FirstKeyFrame = false;
|
FirstKeyFrame = false;
|
||||||
}
|
}
|
||||||
TimeStamp = (DTSCStream.getPacket(0).getContent("time").NumValue() * 27000);
|
TimeStamp = (DTSCStream.getPacket(0).getContent("time").NumValue() * 27000 );
|
||||||
if( TimeStamp < 0 ) { TimeStamp = 0; }
|
|
||||||
std::string ToPack;
|
|
||||||
int TSType;
|
int TSType;
|
||||||
bool FirstIDRPic = true;
|
bool FirstPic = true;
|
||||||
bool FirstNonIDRPic = true;
|
|
||||||
while( DTMIData.size() ) {
|
while( DTMIData.size() ) {
|
||||||
ThisNaluSize = (DTMIData[0] << 24) + (DTMIData[1] << 16) + (DTMIData[2] << 8) + DTMIData[3];
|
ThisNaluSize = (DTMIData[0] << 24) + (DTMIData[1] << 16) + (DTMIData[2] << 8) + DTMIData[3];
|
||||||
DTMIData.erase(0,4);//Erase the first four characters;
|
DTMIData.erase(0,4);//Erase the first four characters;
|
||||||
TSType = (int)DTMIData[0];
|
TSType = (int)DTMIData[0];
|
||||||
if( TSType == 0x25 ) {
|
if( TSType == 0x25 ) {
|
||||||
if( FirstIDRPic ) {
|
if( FirstPic ) {
|
||||||
ToPack.append(PPS_SPS,32);
|
ToPack.append(TS::PPS,24);
|
||||||
FirstIDRPic = false;
|
ToPack.append(TS::SPS,8);
|
||||||
FirstNonIDRPic = false;
|
FirstPic = false;
|
||||||
}
|
}
|
||||||
if( IsKeyFrame ) {
|
if( IsKeyFrame ) {
|
||||||
if( FirstKeyFrame ) {
|
if( !FirstKeyFrame && FirstIDRInKeyFrame ) {
|
||||||
ToPack.append(ShortNALUHeader,3);
|
ToPack.append(TS::NalHeader,4);
|
||||||
} else {
|
|
||||||
if( FirstIDRInKeyFrame ) {
|
|
||||||
ToPack.append(NALUHeader,4);
|
|
||||||
FirstIDRInKeyFrame = false;
|
FirstIDRInKeyFrame = false;
|
||||||
} else {
|
} else {
|
||||||
ToPack.append(ShortNALUHeader,3);
|
ToPack.append(TS::ShortNalHeader,3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
ToPack.append(ShortNALUHeader,3);
|
|
||||||
}
|
|
||||||
} else if ( TSType == 0x21 ) {
|
} else if ( TSType == 0x21 ) {
|
||||||
if( FirstNonIDRPic ) {
|
if( FirstPic ) {
|
||||||
ToPack.append(NALUHeader,4);
|
ToPack.append(TS::NalHeader,4);
|
||||||
FirstNonIDRPic = false;
|
FirstPic = false;
|
||||||
FirstIDRPic = false;
|
|
||||||
} else {
|
} else {
|
||||||
ToPack.append(ShortNALUHeader,3);
|
ToPack.append(TS::ShortNalHeader,3);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ToPack.append(NALUHeader,4);
|
ToPack.append(TS::NalHeader,4);
|
||||||
}
|
}
|
||||||
ToPack.append(DTMIData,0,ThisNaluSize);
|
ToPack.append(DTMIData,0,ThisNaluSize);
|
||||||
DTMIData.erase(0,ThisNaluSize);
|
DTMIData.erase(0,ThisNaluSize);
|
||||||
|
@ -129,37 +104,31 @@ int main( ) {
|
||||||
if( WritePesHeader ) {
|
if( WritePesHeader ) {
|
||||||
PackData.UnitStart( 1 );
|
PackData.UnitStart( 1 );
|
||||||
if( IsKeyFrame ) {
|
if( IsKeyFrame ) {
|
||||||
fprintf( stderr, "IsKeyFrame\n" );
|
|
||||||
PackData.RandomAccess( 1 );
|
PackData.RandomAccess( 1 );
|
||||||
PackData.PCR( TimeStamp );
|
PackData.PCR( TimeStamp );
|
||||||
} else {
|
} else {
|
||||||
PackData.AdaptionField( 0x01 );
|
PackData.AdaptationField( 0x01 );
|
||||||
}
|
}
|
||||||
fprintf( stderr, "Needed Stuffing: %d\n", 184 - (20+ToPack.size()) );
|
|
||||||
PackData.AddStuffing( 184 - (20+ToPack.size()) );
|
PackData.AddStuffing( 184 - (20+ToPack.size()) );
|
||||||
PackData.PESVideoLeadIn( ToPack.size(), TimeStamp / 300 );
|
PackData.PESVideoLeadIn( ToPack.size() );
|
||||||
WritePesHeader = false;
|
WritePesHeader = false;
|
||||||
} else {
|
} else {
|
||||||
PackData.AdaptionField( 0x01 );
|
PackData.AdaptationField( 0x01 );
|
||||||
fprintf( stderr, "Needed Stuffing: %d\n", 184 - (ToPack.size()) );
|
|
||||||
PackData.AddStuffing( 184 - (ToPack.size()) );
|
PackData.AddStuffing( 184 - (ToPack.size()) );
|
||||||
}
|
}
|
||||||
PackData.FillFree( ToPack );
|
PackData.FillFree( ToPack );
|
||||||
PackData.ToString();
|
PackData.ToString();
|
||||||
}
|
}
|
||||||
fprintf( stderr, "PackNum: %d\n\tAdaptionField: %d\n==========\n", TSPackNum + (TSPackNum/210)+1 + 1, PackData.AdaptionField( ) );
|
|
||||||
TSPackNum++;
|
TSPackNum++;
|
||||||
}
|
}
|
||||||
} else if( DTSCStream.lastType() == DTSC::AUDIO ) {
|
} else if( DTSCStream.lastType() == DTSC::AUDIO ) {
|
||||||
WritePesHeader = true;
|
WritePesHeader = true;
|
||||||
DTMIData = DTSCStream.lastData();
|
DTMIData = DTSCStream.lastData();
|
||||||
AudioPack = GetAudioHeader( DTMIData.size() );
|
ToPack = GetAudioHeader( DTMIData.size() );
|
||||||
AudioPack += DTMIData;
|
ToPack += DTMIData;
|
||||||
fprintf( stderr, "DTMIData: %d\n", DTMIData.size() );
|
TimeStamp = DTSCStream.getPacket(0).getContent("time").NumValue() * 900;
|
||||||
AudioTimestamp = DTSCStream.getPacket(0).getContent("time").NumValue() * 900;
|
|
||||||
if( AudioTimestamp < 0 ) { AudioTimestamp = 0; }
|
|
||||||
PackData.Clear();
|
PackData.Clear();
|
||||||
while( AudioPack.size() ) {
|
while( ToPack.size() ) {
|
||||||
if ( ( TSPackNum % 210 ) == 0 ) {
|
if ( ( TSPackNum % 210 ) == 0 ) {
|
||||||
PackData.FFMpegHeader();
|
PackData.FFMpegHeader();
|
||||||
PackData.ToString();
|
PackData.ToString();
|
||||||
|
@ -178,19 +147,16 @@ int main( ) {
|
||||||
if( WritePesHeader ) {
|
if( WritePesHeader ) {
|
||||||
PackData.UnitStart( 1 );
|
PackData.UnitStart( 1 );
|
||||||
PackData.RandomAccess( 1 );
|
PackData.RandomAccess( 1 );
|
||||||
fprintf( stderr, "WritePes Needed Stuffing: %d\n", 184 - (14+AudioPack.size()) );
|
PackData.AddStuffing( 184 - (14 + ToPack.size()) );
|
||||||
PackData.AddStuffing( 184 - (14+ AudioPack.size()) );
|
PackData.PESAudioLeadIn( ToPack.size(), TimeStamp );
|
||||||
PackData.PESAudioLeadIn( AudioPack.size(), AudioTimestamp );
|
|
||||||
WritePesHeader = false;
|
WritePesHeader = false;
|
||||||
} else {
|
} else {
|
||||||
PackData.AdaptionField( 0x01 );
|
PackData.AdaptationField( 0x01 );
|
||||||
fprintf( stderr, "Needed Stuffing: %d\n", 184 - (AudioPack.size()) );
|
PackData.AddStuffing( 184 - (ToPack.size()) );
|
||||||
PackData.AddStuffing( 184 - (AudioPack.size()) );
|
|
||||||
}
|
}
|
||||||
PackData.FillFree( AudioPack );
|
PackData.FillFree( ToPack );
|
||||||
PackData.ToString();
|
PackData.ToString();
|
||||||
}
|
}
|
||||||
fprintf( stderr, "PackNum: %d\n\tAdaptionField: %d\n==========\n", TSPackNum + (TSPackNum/210)+1 + 1, PackData.AdaptionField( ) );
|
|
||||||
TSPackNum++;
|
TSPackNum++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue