Added the TS2DTSC converter sourcefile, a working TS to DTSC converter
This commit is contained in:
parent
01dc2a1a00
commit
3703f6e859
4 changed files with 173 additions and 47 deletions
38
lib/nal.cpp
38
lib/nal.cpp
|
@ -9,33 +9,27 @@ NAL_Unit::NAL_Unit( std::string & InputData ) {
|
|||
}
|
||||
|
||||
bool NAL_Unit::ReadData( std::string & InputData ) {
|
||||
std::string FullAnnexB;
|
||||
FullAnnexB += (char)0x00;
|
||||
FullAnnexB += (char)0x00;
|
||||
FullAnnexB += (char)0x00;
|
||||
FullAnnexB += (char)0x01;
|
||||
std::string ShortAnnexB;
|
||||
ShortAnnexB += (char)0x00;
|
||||
ShortAnnexB += (char)0x00;
|
||||
ShortAnnexB += (char)0x01;
|
||||
// fprintf( stderr, "NAL_Unit::ReadData --- DataSize: %d\n", InputData.size() );
|
||||
if( InputData.size() < 3 ) { return false; }
|
||||
bool AnnexB = false;
|
||||
if( InputData[0] == 0x00 && InputData[1] == 0x00 ) {
|
||||
if( InputData[2] == 0x01 ) {
|
||||
AnnexB = true;
|
||||
}
|
||||
if( InputData[2] == 0x00 && InputData[3] == 0x01 ) {
|
||||
InputData.erase(0,1);
|
||||
AnnexB = true;
|
||||
}
|
||||
}
|
||||
if( InputData.substr(0,3) == ShortAnnexB ) { AnnexB = true; }
|
||||
if( InputData.substr(0,4) == FullAnnexB ) { InputData.erase(0,1); AnnexB = true; }
|
||||
if( AnnexB ) {
|
||||
MyData = "";
|
||||
InputData.erase(0,3);//Intro Bytes
|
||||
bool FinalByteRead = false;
|
||||
while( !FinalByteRead ) {
|
||||
MyData += InputData[0];
|
||||
InputData.erase(0,1);
|
||||
if( InputData[0] == 0x00 && InputData[1] == 0x00 ) {
|
||||
if( InputData[2] == 0x01 ) {
|
||||
FinalByteRead = true;
|
||||
}
|
||||
if( InputData[2] == 0x00 && InputData[3] == 0x01 ) {
|
||||
InputData.erase(0,1);
|
||||
FinalByteRead= true;
|
||||
}
|
||||
}
|
||||
}
|
||||
int Location = std::min( InputData.find( ShortAnnexB ), InputData.find( FullAnnexB ) );
|
||||
MyData = InputData.substr(0,Location);
|
||||
InputData.erase(0,Location);
|
||||
} else {
|
||||
if( InputData.size() < 4 ) { return false; }
|
||||
int UnitLen = (InputData[0] << 24) + (InputData[1] << 16) + (InputData[2] << 8) + InputData[3];
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
#include <string>
|
||||
#include <cstdio>
|
||||
|
||||
class NAL_Unit {
|
||||
public:
|
||||
|
|
|
@ -365,54 +365,55 @@ int TS::Packet::PESTimeStamp( ) {
|
|||
MyTimestamp = (MyTimestamp << 8) + Buffer[PesOffset+12];
|
||||
MyTimestamp = (MyTimestamp << 7) + ((Buffer[PesOffset+13]) >> 1);
|
||||
fprintf( stderr, "PES Timestamp: %d\n", MyTimestamp );
|
||||
return 0;
|
||||
return MyTimestamp;
|
||||
}
|
||||
|
||||
int TS::Packet::GetDataOffset( ) {
|
||||
int Offset = 4;
|
||||
fprintf( stderr,"\tBefore Adapt: %d\n", Offset );
|
||||
if( AdaptationField( ) >= 2 ) {
|
||||
Offset += 1 + AdaptationFieldLen( );
|
||||
}
|
||||
fprintf( stderr,"\tBefore UnitStart: %d\n", Offset );
|
||||
if( UnitStart() ) {
|
||||
fprintf( stderr, "\t\tPES Header Len: %d\n", Buffer[Offset+8] );
|
||||
Offset += 8;//Default Header + Flag Bytes
|
||||
Offset += 1 + Buffer[Offset];//HeaderLengthByte + HeaderLength
|
||||
}
|
||||
fprintf( stderr,"\tBefore Return: %d\n", Offset );
|
||||
return Offset;
|
||||
}
|
||||
|
||||
/*
|
||||
DTSC::DTMI TS::Packet::toDTSC(DTSC::DTMI & metadata, std::string Type) {
|
||||
DTSC::DTMI outPack = DTSC::DTMI(Type, DTSC::DTMI_ROOT);
|
||||
outPack.addContent(DTSC::DTMI("datatype", Type));
|
||||
if( UnitStart() ){ outPack.addContent(DTSC::DTMI("time", PESTimeStamp( ))); }
|
||||
if( Type == "video" && (RandomAccess() > 0) ){ outPack.addContent(DTSC::DTMI("keyframe", 1)); }
|
||||
int DataOffset = GetDataOffset();
|
||||
fprintf( stderr, "Data Offset: %d\n", DataOffset );
|
||||
outPack.addContent(DTSC::DTMI("data", std::string((char*)Buffer+DataOffset, (size_t)188-DataOffset)));
|
||||
return outPack;
|
||||
}
|
||||
*/
|
||||
|
||||
void TS::Packet::toDTSC( std::string Type, DTSC::DTMI & CurrentDTSC ) {
|
||||
if( !CurrentDTSC.getContentP( "datatype" ) ) {
|
||||
CurrentDTSC.addContent( DTSC::DTMI("datatype", Type ) );
|
||||
}
|
||||
if( UnitStart() ) {
|
||||
if( !CurrentDTSC.getContentP( "time" ) ) {
|
||||
CurrentDTSC.addContent( DTSC::DTMI( "time", PESTimeStamp( ) ) );
|
||||
if( Type == "video" ) {
|
||||
if ( (RandomAccess() > 0) ){
|
||||
if( !CurrentDTSC.getContentP( "keyframe" ) && !CurrentDTSC.getContentP( "interframe" ) ) {
|
||||
CurrentDTSC.addContent(DTSC::DTMI("keyframe", 1));
|
||||
}
|
||||
} else {
|
||||
if( !CurrentDTSC.getContentP( "keyframe" ) && !CurrentDTSC.getContentP( "interframe" ) ) {
|
||||
CurrentDTSC.addContent(DTSC::DTMI("interframe", 1));
|
||||
}
|
||||
}
|
||||
}
|
||||
if( Type == "video" && (RandomAccess() > 0) ){
|
||||
if( !CurrentDTSC.getContentP( "keyframe" ) ) {
|
||||
CurrentDTSC.addContent(DTSC::DTMI("keyframe", 1));
|
||||
if( UnitStart() ) {
|
||||
if( !CurrentDTSC.getContentP( "time" ) ) {
|
||||
if( Type == "audio" ) {
|
||||
CurrentDTSC.addContent( DTSC::DTMI( "time", PESTimeStamp( ) / 81000 ) );
|
||||
} else {
|
||||
//CurrentDTSC.addContent( DTSC::DTMI( "time", PESTimeStamp( ) / 27000 ) );
|
||||
CurrentDTSC.addContent( DTSC::DTMI( "time", (PESTimeStamp( ) - 27000000) / 91 ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
if( Type == "video" ) {
|
||||
if( !CurrentDTSC.getContentP( "nalu" ) ) {
|
||||
CurrentDTSC.addContent( DTSC::DTMI( "nalu", 1 ) );
|
||||
}
|
||||
if( !CurrentDTSC.getContentP( "offset" ) ) {
|
||||
CurrentDTSC.addContent( DTSC::DTMI( "offset", 0 ) );
|
||||
}
|
||||
}
|
||||
int DataOffset = GetDataOffset();
|
||||
fprintf( stderr, "Data Offset: %d\n", DataOffset );
|
||||
std::string ToAppend = std::string((char*)Buffer+DataOffset, (size_t)188-DataOffset);
|
||||
std::string CurrentData;
|
||||
if( CurrentDTSC.getContentP( "data" ) ) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue