Full Audio and Video now working over HLS for the bipbop clip

This commit is contained in:
Erik Zandvliet 2013-01-05 14:30:45 +01:00
parent 0bb5a342e1
commit f43ff8341f
2 changed files with 32 additions and 44 deletions

View file

@ -326,44 +326,36 @@ namespace Connector_HTTP {
} }
int TSType; int TSType;
bool FirstPic = true; bool FirstPic = true;
bool haveInit = false;
std::string videoBuffer; std::string videoBuffer;
while( DTMIData.size() ) { while( DTMIData.size() ) {
ThisNaluSize = (DTMIData[0] << 24) + (DTMIData[1] << 16) + ThisNaluSize = (DTMIData[0] << 24) + (DTMIData[1] << 16) +
(DTMIData[2] << 8) + DTMIData[3]; (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] & 0x1F; TSType = (int)DTMIData[0] & 0x1F;
if( TSType == 0x09 ) { if( !( TSType == 0x09 ) ) {
DTMIData.erase(0,ThisNaluSize); if( TSType == 0x05 ) {
continue; if( FirstPic ) {
}
if( TSType == 0x07 || TSType == 0x08 ) {
haveInit = true;
}
if( TSType == 0x05 ) {
if( FirstPic ) {
if( !haveInit ) {
ToPack += avccbox.asAnnexB( ); ToPack += avccbox.asAnnexB( );
FirstPic = false;
}
if( IsKeyFrame ) {
if( !FirstKeyFrame && FirstIDRInKeyFrame ) {
ToPack += (char)0x00;
FirstIDRInKeyFrame = false;
}
ToPack.append(TS::ShortNalHeader,3);
} }
FirstPic = false; } else if ( TSType == 0x01 ) {
} if( FirstPic ) {
if( IsKeyFrame ) {
if( !FirstKeyFrame && FirstIDRInKeyFrame ) {
ToPack += (char)0x00; ToPack += (char)0x00;
FirstIDRInKeyFrame = false; FirstPic = false;
} }
ToPack.append(TS::ShortNalHeader,3); ToPack.append(TS::ShortNalHeader,3);
} else {
ToPack.append(TS::NalHeader,4);
} }
} else if ( TSType == 0x01 ) { ToPack.append(DTMIData,0,ThisNaluSize);
if( FirstPic ) {
ToPack += (char)0x00;
FirstPic = false;
}
ToPack.append(TS::ShortNalHeader,3);
} else {
ToPack.append(TS::NalHeader,4);
} }
ToPack.append(DTMIData,0,ThisNaluSize);
DTMIData.erase(0,ThisNaluSize); DTMIData.erase(0,ThisNaluSize);
} }
WritePesHeader = true; WritePesHeader = true;
@ -400,15 +392,16 @@ namespace Connector_HTTP {
} }
} else if( Strm.lastType() == DTSC::AUDIO ) { } else if( Strm.lastType() == DTSC::AUDIO ) {
WritePesHeader = true; WritePesHeader = true;
std::string audioBuffer = TS::GetAudioHeader( DTMIData.size(), Strm.metadata["audio"]["init"].asString() ); DTMIData = Strm.lastData();
int fullSize = Strm.lastData().size() + audioBuffer.size(); ToPack = TS::GetAudioHeader( DTMIData.size(), Strm.metadata["audio"]["init"].asString() );
int currentOffset = 0; ToPack += DTMIData;
while( fullSize ) { TimeStamp = Strm.getPacket(0)["time"].asInt() * 81000;
if ( PacketNumber == 0 ) { while( ToPack.size() ) {
if ( ( PacketNumber == 0 ) ) {
PackData.DefaultPAT(); PackData.DefaultPAT();
TSBuf << std::string(PackData.ToString(), 188); TSBuf.write(PackData.ToString(), 188);
PackData.DefaultPMT(); PackData.DefaultPMT();
TSBuf << std::string(PackData.ToString(), 188); TSBuf.write(PackData.ToString(), 188);
PacketNumber += 2; PacketNumber += 2;
} }
PackData.Clear(); PackData.Clear();
@ -417,21 +410,16 @@ namespace Connector_HTTP {
AudioCounter ++; AudioCounter ++;
if( WritePesHeader ) { if( WritePesHeader ) {
PackData.UnitStart( 1 ); PackData.UnitStart( 1 );
PackData.RandomAccess( 0 ); PackData.AddStuffing( 184 - (14 + ToPack.size()) );
PackData.AddStuffing( 184 - (14 + fullSize) ); PackData.PESAudioLeadIn( ToPack.size(), TimeStamp );
PackData.PESAudioLeadIn( fullSize, Strm.getPacket(0)["time"].asInt() * 81000 );
WritePesHeader = false; WritePesHeader = false;
} else { } else {
PackData.AdaptationField( 1 ); PackData.AdaptationField( 1 );
PackData.AddStuffing( 184 - fullSize ); PackData.AddStuffing( 184 - ToPack.size() );
} }
PackData.FillFree( audioBuffer ); PackData.FillFree( ToPack );
if( PackData.BytesFree( ) ) { TSBuf.write(PackData.ToString(), 188);
currentOffset += PackData.FillFree( Strm.lastData().c_str() + currentOffset, Strm.lastData().size() - currentOffset );
}
TSBuf << std::string(PackData.ToString(), 188);
PacketNumber ++; PacketNumber ++;
fullSize = audioBuffer.size() + (Strm.lastData().size() - currentOffset);
} }
} }
} }

View file

@ -57,7 +57,7 @@ int main( ) {
(DTMIData[2] << 8) + DTMIData[3]; (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] & 0x1F; TSType = (int)DTMIData[0] & 0x1F;
if( !( TSType == 0x09 ) ) {// || TSType == 0x07 || TSType == 0x08 ) ) { if( !( TSType == 0x09 ) ) {
if( TSType == 0x05 ) { if( TSType == 0x05 ) {
if( FirstPic ) { if( FirstPic ) {
ToPack += avccbox.asAnnexB( ); ToPack += avccbox.asAnnexB( );
@ -142,7 +142,7 @@ int main( ) {
WritePesHeader = false; WritePesHeader = false;
} else { } else {
PackData.AdaptationField( 1 ); PackData.AdaptationField( 1 );
PackData.AddStuffing( 184 - (ToPack.size()) ); PackData.AddStuffing( 184 - ToPack.size() );
} }
PackData.FillFree( ToPack ); PackData.FillFree( ToPack );
std::cout.write( PackData.ToString(), 188 ); std::cout.write( PackData.ToString(), 188 );