diff --git a/src/output/output_hls.cpp b/src/output/output_hls.cpp index 667ad095..b3cf6034 100644 --- a/src/output/output_hls.cpp +++ b/src/output/output_hls.cpp @@ -111,47 +111,6 @@ namespace Mist { capa["methods"][0u]["type"] = "html5/application/vnd.apple.mpegurl"; capa["methods"][0u]["priority"] = 9ll; } - - ///this function generates the PMT packet - std::string OutHLS::createPMT(){ - TS::ProgramMappingTable PMT; - PMT.PID(4096); - PMT.setTableId(2); - PMT.setSectionLength(0xB017); - PMT.setProgramNumber(1); - PMT.setVersionNumber(0); - PMT.setCurrentNextIndicator(0); - PMT.setSectionNumber(0); - PMT.setLastSectionNumber(0); - int vidTrack = -1; - for (std::set::iterator it = selectedTracks.begin(); it != selectedTracks.end(); it++){ - if (myMeta.tracks[*it].type == "video"){ - vidTrack = *it; - break; - } - } - if (vidTrack == -1){ - vidTrack = *(selectedTracks.begin()); - } - PMT.setPCRPID(0x100 + vidTrack - 1); - PMT.setProgramInfoLength(0); - short id = 0; - //for all selected tracks - for (std::set::iterator it = selectedTracks.begin(); it != selectedTracks.end(); it++){ - if (myMeta.tracks[*it].codec == "H264"){ - PMT.setStreamType(0x1B,id); - }else if (myMeta.tracks[*it].codec == "AAC"){ - PMT.setStreamType(0x0F,id); - }else if (myMeta.tracks[*it].codec == "MP3"){ - PMT.setStreamType(0x03,id); - } - PMT.setElementaryPID(0x100 + (*it) - 1, id); - PMT.setESInfoLength(0,id); - id++; - } - PMT.calcCRC(); - return PMT.getStrBuf(); - } void OutHLS::fillPacket(bool & first, const char * data, size_t dataLen, char & ContCounter){ static std::map contCounter; @@ -162,7 +121,7 @@ namespace Mist { tmpPack.FromPointer(TS::PAT); tmpPack.ContinuityCounter(++contCounter[tmpPack.PID()]); H.Chunkify(tmpPack.ToString(), 188, myConn); - tmpPack.FromPointer(createPMT().c_str()); + tmpPack.FromPointer(TS::createPMT(selectedTracks, myMeta).c_str()); tmpPack.ContinuityCounter(++contCounter[tmpPack.PID()]); H.Chunkify(tmpPack.ToString(), 188, myConn); PacketNumber += 2; @@ -220,7 +179,6 @@ namespace Mist { fillPacket(first, "\000\000\000\001\011\360", 6, VideoCounter); } - if (currentPacket.getInt("keyframe")){ if (!haveAvcc){ avccbox.setPayload(myMeta.tracks[currentPacket.getTrackId()].init); @@ -245,15 +203,23 @@ namespace Mist { PackData.AddStuffing(); fillPacket(first, 0, 0, VideoCounter); } - }else if (myMeta.tracks[currentPacket.getTrackId()].type == "audio"){ + }else if (myMeta.tracks[currentPacket.getTrackId()].type == "audio"){ + long long unsigned int tempTime; if (AppleCompat){ - bs = TS::Packet::getPESAudioLeadIn(7+dataLen, lastVid); + tempTime = lastVid; }else{ - bs = TS::Packet::getPESAudioLeadIn(7+dataLen, currentPacket.getTime() * 90); + tempTime = currentPacket.getTime() * 90; } + long unsigned int tempLen = dataLen; + if ( myMeta.tracks[currentPacket.getTrackId()].codec == "AAC"){ + tempLen += 7; + } + bs = TS::Packet::getPESAudioLeadIn(tempLen, tempTime); fillPacket(first, bs.data(), bs.size(), AudioCounter); - bs = TS::GetAudioHeader(dataLen, myMeta.tracks[currentPacket.getTrackId()].init); - fillPacket(first, bs.data(), bs.size(), AudioCounter); + if (myMeta.tracks[currentPacket.getTrackId()].codec == "AAC"){ + bs = TS::GetAudioHeader(dataLen, myMeta.tracks[currentPacket.getTrackId()].init); + fillPacket(first, bs.data(), bs.size(), AudioCounter); + } fillPacket(first, dataPointer,dataLen, AudioCounter); if (PackData.BytesFree() < 184){ PackData.AddStuffing(); diff --git a/src/output/output_httpts.cpp b/src/output/output_httpts.cpp index df15594c..c0472e46 100644 --- a/src/output/output_httpts.cpp +++ b/src/output/output_httpts.cpp @@ -27,43 +27,11 @@ namespace Mist { capa["methods"][0u]["priority"] = 1ll; } - ///this function generates the PMT packet - std::string OutHTTPTS::createPMT(){ - TS::ProgramMappingTable PMT; - PMT.PID(4096); - PMT.setTableId(2); - PMT.setSectionLength(0xB017); - PMT.setProgramNumber(1); - PMT.setVersionNumber(0); - PMT.setCurrentNextIndicator(0); - PMT.setSectionNumber(0); - PMT.setLastSectionNumber(0); - PMT.setPCRPID(0x100 + (*(selectedTracks.begin())) - 1); - PMT.setProgramInfoLength(0); - short id = 0; - //for all selected tracks - for (std::set::iterator it = selectedTracks.begin(); it != selectedTracks.end(); it++){ - if (myMeta.tracks[*it].codec == "H264"){ - PMT.setStreamType(0x1B,id); - }else if (myMeta.tracks[*it].codec == "AAC"){ - PMT.setStreamType(0x0F,id); - }else if (myMeta.tracks[*it].codec == "MP3"){ - PMT.setStreamType(0x03,id); - } - PMT.setElementaryPID(0x100 + (*it) - 1, id); - PMT.setESInfoLength(0,id); - id++; - } - PMT.calcCRC(); - return PMT.getStrBuf(); - } - void OutHTTPTS::fillPacket(bool & first, const char * data, size_t dataLen, char & ContCounter){ if (!PackData.BytesFree()){ if (PacketNumber % 42 == 0){ H.Chunkify(TS::PAT, 188, myConn); - std::string PMT = createPMT(); - H.Chunkify(PMT, myConn); + H.Chunkify(TS::createPMT(selectedTracks, myMeta), myConn); PacketNumber += 2; } H.Chunkify(PackData.ToString(), 188, myConn); @@ -127,10 +95,16 @@ namespace Mist { fillPacket(first, 0, 0, VideoCounter); } }else if (myMeta.tracks[currentPacket.getTrackId()].type == "audio"){ - bs = TS::Packet::getPESAudioLeadIn(7+dataLen, currentPacket.getTime() * 90); - fillPacket(first, bs.data(), bs.size(), AudioCounter); - bs = TS::GetAudioHeader(dataLen, myMeta.tracks[currentPacket.getTrackId()].init); + unsigned int tempLen = dataLen; + if ( myMeta.tracks[currentPacket.getTrackId()].codec == "AAC"){ + tempLen += 7; + } + bs = TS::Packet::getPESAudioLeadIn(tempLen, currentPacket.getTime() * 90); fillPacket(first, bs.data(), bs.size(), AudioCounter); + if (myMeta.tracks[currentPacket.getTrackId()].codec == "AAC"){ + bs = TS::GetAudioHeader(dataLen, myMeta.tracks[currentPacket.getTrackId()].init); + fillPacket(first, bs.data(), bs.size(), AudioCounter); + } ContCounter = &AudioCounter; fillPacket(first, dataPointer,dataLen, AudioCounter); if (PackData.BytesFree() < 184){ diff --git a/src/output/output_ts.cpp b/src/output/output_ts.cpp index 7656d4ec..60605f8a 100644 --- a/src/output/output_ts.cpp +++ b/src/output/output_ts.cpp @@ -119,10 +119,17 @@ namespace Mist { i += ThisNaluSize+4; } }else if (myMeta.tracks[currentPacket.getTrackId()].type == "audio"){ - bs = TS::Packet::getPESAudioLeadIn(7+dataLen, currentPacket.getTime() * 90); - fillPacket(first, bs.data(), bs.size(),AudioCounter); - bs = TS::GetAudioHeader(dataLen, myMeta.tracks[currentPacket.getTrackId()].init); + unsigned int tempLen = dataLen; + if (myMeta.tracks[currentPacket.getTrackId()].codec == "AAC"){ + tempLen += 7; + } + bs = TS::Packet::getPESAudioLeadIn(tempLen, currentPacket.getTime() * 90); fillPacket(first, bs.data(), bs.size(),AudioCounter); + if (myMeta.tracks[currentPacket.getTrackId()].codec == "AAC"){ + bs = TS::GetAudioHeader(dataLen, myMeta.tracks[currentPacket.getTrackId()].init); + fillPacket(first, bs.data(), bs.size(),AudioCounter); + }else{ + } fillPacket(first, dataPointer,dataLen,AudioCounter); } @@ -132,40 +139,9 @@ namespace Mist { } } - ///this function generates the PMT packet - std::string OutTS::createPMT(){ - TS::ProgramMappingTable PMT; - PMT.PID(4096); - PMT.setTableId(2); - PMT.setSectionLength(0xB017); - PMT.setProgramNumber(1); - PMT.setVersionNumber(0); - PMT.setCurrentNextIndicator(0); - PMT.setSectionNumber(0); - PMT.setLastSectionNumber(0); - PMT.setPCRPID(0x100 + (*(selectedTracks.begin())) - 1); - PMT.setProgramInfoLength(0); - short id = 0; - //for all selected tracks - for (std::set::iterator it = selectedTracks.begin(); it != selectedTracks.end(); it++){ - if (myMeta.tracks[*it].codec == "H264"){ - PMT.setStreamType(0x1B,id); - }else if (myMeta.tracks[*it].codec == "AAC"){ - PMT.setStreamType(0x0F,id); - }else if (myMeta.tracks[*it].codec == "MP3"){ - PMT.setStreamType(0x03,id); - } - PMT.setElementaryPID(0x100 + (*it) - 1, id); - PMT.setESInfoLength(0,id); - id++; - } - PMT.calcCRC(); - return PMT.getStrBuf(); - } - void OutTS::sendHeader(){ myConn.SendNow(TS::PAT, 188); - myConn.SendNow(createPMT()); + myConn.SendNow(TS::createPMT(selectedTracks, myMeta)); sentHeader = true; }