This commit is contained in:
Erik Zandvliet 2012-10-22 16:11:54 +02:00 committed by Thulinma
parent 2ec7cc00c5
commit 180e7751fe
5 changed files with 125 additions and 287 deletions

View file

@ -1,8 +1,7 @@
AM_CPPFLAGS = $(global_CFLAGS) $(MIST_CFLAGS)
LDADD = $(MIST_LIBS)
bin_PROGRAMS=MistDTSC2FLV MistFLV2DTSC MistDTSCFix MistDTSC2TS MistTS2DTSC
bin_PROGRAMS=MistDTSC2FLV MistFLV2DTSC MistDTSCFix MistDTSC2TS
MistDTSC2FLV_SOURCES=dtsc2flv.cpp
MistFLV2DTSC_SOURCES=flv2dtsc.cpp
MistDTSCFix_SOURCES=dtscfix.cpp
MistDTSC2TS_SOURCES=dtsc2ts.cpp
MistTS2DTSC_SOURCES=ts2dtsc.cpp

View file

@ -34,14 +34,14 @@ int main( ) {
if ( DTSCStream.parsePacket( StrData ) ) {
if( DTSCStream.lastType() == DTSC::VIDEO ) {
DTMIData = DTSCStream.lastData();
if( DTSCStream.getPacket(0).getContent("keyframe").NumValue() ) {
if( DTSCStream.getPacket(0).isMember("keyframe") ) {
IsKeyFrame = true;
FirstIDRInKeyFrame = true;
} else {
IsKeyFrame = false;
FirstKeyFrame = false;
}
TimeStamp = ((DTSCStream.getPacket(0).getContent("time").NumValue() + 700) * 27000 );
TimeStamp = ( DTSCStream.getPacket(0)["time"].asInt() * 27000 );
if( IsKeyFrame ) {
fprintf( stderr, "Keyframe, timeStamp: %u\n", TimeStamp );
}
@ -117,7 +117,7 @@ int main( ) {
DTMIData = DTSCStream.lastData();
ToPack = TS::GetAudioHeader( DTMIData.size() );
ToPack += DTMIData;
TimeStamp = DTSCStream.getPacket(0).getContent("time").NumValue() * 900;
TimeStamp = DTSCStream.getPacket(0)["time"].asInt() * 81000;
while( ToPack.size() ) {
if ( ( PacketNumber % 42 ) == 0 ) {
PackData.DefaultPAT();

View file

@ -1,153 +0,0 @@
#include <string>
#include <mist/ts_packet.h> //TS support
#include <mist/dtsc.h> //DTSC support
#include <mist/nal.h> //NAL Unit operations
//DTSC::DTMI MetaData
//DTSC::DTMI OutData
//X if( PID() == 0x00 ) --> PAT --> Extract first PMT PID()
//X if( PID() == PMTStream ) --> PMT --> Extract first video PMT() && Extract first audio PMT()
// if( PID() == AudioStream ) --> Audio --> Extract Timestamp IF keyframe --> DTSC
// if( PID() == VideoStream ) --> Video --> AnnexB_to_Regular --> Extract Timestamp IF keyframe --> Remove PPS? --> Remove SPS? --> DTSC
//Copied from FLV_TAG
void Meta_Put(DTSC::DTMI & meta, std::string cat, std::string elem, std::string val){
if (meta.getContentP(cat) == 0){meta.addContent(DTSC::DTMI(cat));}
meta.getContentP(cat)->addContent(DTSC::DTMI(elem, val));
}
void Meta_Put(DTSC::DTMI & meta, std::string cat, std::string elem, int val){
if (meta.getContentP(cat) == 0){meta.addContent(DTSC::DTMI(cat));}
meta.getContentP(cat)->addContent(DTSC::DTMI(elem, val));
}
int main( ) {
char charBuffer[1024*10];
unsigned int charCount;
std::string StrData;
TS::Packet TSData;
int PMT_PID = -1;
int VideoPID = -1;
int AudioPID = -1;
int VideoTime_Offset = -1;
DTSC::DTMI Meta;
DTSC::DTMI VideoOut;
DTSC::DTMI AudioOut;
//Default MetaData, not NEARLY all options used, because encoded in video rather than parameters
//Combined with Stubdata, for alignment with original DTSC of testcase
Meta_Put(Meta, "video", "codec", "H264");
Meta_Put(Meta, "video", "width", 1280);
Meta_Put(Meta, "video", "height", 720);
Meta_Put(Meta, "video", "fpks", 2997000);
Meta_Put(Meta, "video", "bps", 832794);
char VideoInit[] = {0x01,0x4D,0x40,0x1F,
0xFF,0xE1,0x00,0x14,
0x27,0x4D,0x40,0x1F,
0xA9,0x18,0x0A,0x00,
0xB7,0x60,0x0D,0x40,
0x40,0x40,0x4C,0x2B,
0x5E,0xF7,0xC0,0x40,
0x01,0x00,0x04,0x28,
0xCE,0x09,0xC8};
Meta_Put(Meta, "video", "init", std::string( VideoInit, 35 ) );
Meta_Put(Meta, "audio", "codec", "AAC");
Meta_Put(Meta, "audio", "bps", 24021);
Meta_Put(Meta, "audio", "rate", 48000);
Meta_Put(Meta, "audio", "size", 16);
Meta_Put(Meta, "audio", "channels", 2);
char AudioInit[] = {0x11,0x90};
Meta_Put(Meta, "audio", "init", std::string( AudioInit, 2 ) );
Meta.Pack(true);
Meta.packed.replace(0, 4, DTSC::Magic_Header);
std::cout << Meta.packed;
std::string PrevType = "";
while( std::cin.good() ) {
std::cin.read(charBuffer, 1024*10);
charCount = std::cin.gcount();
StrData.append(charBuffer, charCount);
while( TSData.FromString( StrData ) ) {
// fprintf( stderr, "PID: %d\n", TSData.PID() );
if( TSData.PID() == 0 ) {
int TmpPMTPid = TSData.ProgramMapPID( );
if( TmpPMTPid != -1 ) { PMT_PID = TmpPMTPid; }
// fprintf( stderr, "\tPMT PID: %d\n", PMT_PID );
}
if( TSData.PID() == PMT_PID ) {
TSData.UpdateStreamPID( VideoPID, AudioPID );
// fprintf( stderr, "\tVideoStream: %d\n\tAudioStream: %d\n", VideoPID, AudioPID );
}
if( TSData.PID() == VideoPID ) {
if( PrevType == "Audio" ) {
fprintf( stderr, "\tVideopacket, sending audiobuffer\n" );
std::string AudioData = AudioOut.getContent("data").StrValue();
AudioData.erase(0,7);//remove the header
AudioOut.addContent( DTSC::DTMI( "data", AudioData ) );
std::cout << AudioOut.Pack(true);
AudioOut = DTSC::DTMI();
AudioOut.addContent( DTSC::DTMI( "datatype", "audio" ) );
}
if( TSData.UnitStart( ) && PrevType == "Video" ) {
fprintf( stderr, "\tNew VideoPacket, Writing old\n" );
std::string AnnexBData = VideoOut.getContent("data").StrValue();
std::string NewData;
NAL_Unit Transformer;
int i = 0;
while( Transformer.ReadData( AnnexBData ) ) {
if( Transformer.Type() <= 6 || Transformer.Type() >= 10 ) { //Extract SPS/PPS/Separator Data
NewData += Transformer.SizePrepended( );
}
}
VideoOut.addContent( DTSC::DTMI( "data", NewData ) );
if( VideoTime_Offset == -1 ) {
VideoTime_Offset = VideoOut.getContent("time").NumValue();
}
int VideoTime = VideoOut.getContent("time").NumValue();
VideoOut.addContent( DTSC::DTMI( "time", VideoTime - VideoTime_Offset ) );
std::cout << VideoOut.Pack(true);
VideoOut = DTSC::DTMI();
}
TSData.toDTSC( "video", VideoOut );
PrevType = "Video";
}
if( TSData.PID() == AudioPID ) {
if( PrevType == "Video" ) {
fprintf( stderr, "\tAudiopacket, sending videobuffer\n" );
std::string AnnexBData = VideoOut.getContent("data").StrValue();
std::string NewData;
NAL_Unit Transformer;
int i = 0;
while( Transformer.ReadData( AnnexBData ) ) {
if( Transformer.Type() < 6 || Transformer.Type() > 9 ) { //Extract SPS/PPS/SEI/Separator Data
NewData += Transformer.SizePrepended( );
}
}
VideoOut.addContent( DTSC::DTMI( "data", NewData ) );
if( VideoTime_Offset == -1 ) {
VideoTime_Offset = VideoOut.getContent("time").NumValue();
}
int VideoTime = VideoOut.getContent("time").NumValue();
VideoOut.addContent( DTSC::DTMI( "time", VideoTime - VideoTime_Offset ) );
std::cout << VideoOut.Pack(true);
VideoOut = DTSC::DTMI();
}
if( TSData.UnitStart( ) && PrevType == "Audio" ) {
fprintf( stderr, "\tNew AudioPacket, Writing old\n" );
std::string AudioData = AudioOut.getContent("data").StrValue();
AudioData.erase(0,7);//remove the header
AudioOut.addContent( DTSC::DTMI( "data", AudioData ) );
std::cout << AudioOut.Pack(true);
AudioOut = DTSC::DTMI();
AudioOut.addContent( DTSC::DTMI( "datatype", "audio" ) );
}
TSData.toDTSC( "audio", AudioOut );
PrevType = "Audio";
}
}
}
return 0;
}