Large video PES packets are now sent as unbounded packets instead of split over multiple PES packets

This commit is contained in:
Thulinma 2020-06-25 03:17:29 +02:00
parent a9bc4e2134
commit 04d28181e0

View file

@ -80,7 +80,7 @@ namespace Mist{
// prepare bufferstring // prepare bufferstring
if (video){ if (video){
if (codec == "H264" || codec == "HEVC"){ if (codec == "H264" || codec == "HEVC"){
unsigned int extraSize = 0; uint32_t extraSize = 0;
// dataPointer[4] & 0x1f is used to check if this should be done later: // dataPointer[4] & 0x1f is used to check if this should be done later:
// fillPacket("\000\000\000\001\011\360", 6); // fillPacket("\000\000\000\001\011\360", 6);
if (codec == "H264" && (dataPointer[4] & 0x1f) != 0x09){extraSize += 6;} if (codec == "H264" && (dataPointer[4] & 0x1f) != 0x09){extraSize += 6;}
@ -101,91 +101,45 @@ namespace Mist{
/*LTS-END*/ /*LTS-END*/
} }
unsigned int watKunnenWeIn1Ding = 65490 - 13; const uint32_t MAX_PES_SIZE = 65490 - 13;
unsigned int splitCount = (dataLen + extraSize) / watKunnenWeIn1Ding; uint32_t ThisNaluSize = 0;
unsigned int currPack = 0; uint32_t i = 0;
uint64_t ThisNaluSize = 0;
unsigned int i = 0;
unsigned int nalLead = 0;
uint64_t offset = thisPacket.getInt("offset") * 90; uint64_t offset = thisPacket.getInt("offset") * 90;
while (currPack <= splitCount){ bs = TS::Packet::getPESVideoLeadIn(
unsigned int alreadySent = 0; (((dataLen + extraSize) > MAX_PES_SIZE) ? 0 : dataLen + extraSize),
bs = TS::Packet::getPESVideoLeadIn( packTime, offset, true, M.getBps(thisIdx));
(currPack != splitCount ? watKunnenWeIn1Ding : dataLen + extraSize - currPack * watKunnenWeIn1Ding), fillPacket(bs.data(), bs.size(), firstPack, video, keyframe, pkgPid, contPkg);
packTime, offset, !currPack, M.getBps(thisIdx)); if (codec == "H264" && (dataPointer[4] & 0x1f) != 0x09){
fillPacket(bs.data(), bs.size(), firstPack, video, keyframe, pkgPid, contPkg); // End of previous nal unit, if not already present
if (!currPack){ fillPacket("\000\000\000\001\011\360", 6, firstPack, video, keyframe, pkgPid, contPkg);
if (codec == "H264" && (dataPointer[4] & 0x1f) != 0x09){ }
// End of previous nal unit, if not already present if (keyframe){
fillPacket("\000\000\000\001\011\360", 6, firstPack, video, keyframe, pkgPid, contPkg); if (codec == "H264"){
alreadySent += 6; MP4::AVCC avccbox;
} avccbox.setPayload(M.getInit(thisIdx));
if (keyframe){ bs = avccbox.asAnnexB();
if (codec == "H264"){ fillPacket(bs.data(), bs.size(), firstPack, video, keyframe, pkgPid, contPkg);
MP4::AVCC avccbox;
avccbox.setPayload(M.getInit(thisIdx));
bs = avccbox.asAnnexB();
fillPacket(bs.data(), bs.size(), firstPack, video, keyframe, pkgPid, contPkg);
alreadySent += bs.size();
}
/*LTS-START*/
if (codec == "HEVC"){
MP4::HVCC hvccbox;
hvccbox.setPayload(M.getInit(thisIdx));
bs = hvccbox.asAnnexB();
fillPacket(bs.data(), bs.size(), firstPack, video, keyframe, pkgPid, contPkg);
alreadySent += bs.size();
}
/*LTS-END*/
}
} }
while (i + 4 < (unsigned int)dataLen){ /*LTS-START*/
if (nalLead){ if (codec == "HEVC"){
fillPacket(&"\000\000\000\001"[4 - nalLead], nalLead, firstPack, video, keyframe, pkgPid, contPkg); MP4::HVCC hvccbox;
i += nalLead; hvccbox.setPayload(M.getInit(thisIdx));
alreadySent += nalLead; bs = hvccbox.asAnnexB();
nalLead = 0; fillPacket(bs.data(), bs.size(), firstPack, video, keyframe, pkgPid, contPkg);
}
if (!ThisNaluSize){
ThisNaluSize = Bit::btohl(dataPointer + i);
if (ThisNaluSize + i + 4 > dataLen){
WARN_MSG("Too big NALU detected (%" PRIu64 " > %" PRIu64 ") - skipping!",
ThisNaluSize + i + 4, dataLen);
break;
}
if (alreadySent + 4 > watKunnenWeIn1Ding){
nalLead = 4 - (watKunnenWeIn1Ding - alreadySent);
fillPacket("\000\000\000\001", watKunnenWeIn1Ding - alreadySent, firstPack, video,
keyframe, pkgPid, contPkg);
i += watKunnenWeIn1Ding - alreadySent;
alreadySent += watKunnenWeIn1Ding - alreadySent;
}else{
fillPacket("\000\000\000\001", 4, firstPack, video, keyframe, pkgPid, contPkg);
alreadySent += 4;
i += 4;
}
}
if (alreadySent + ThisNaluSize > watKunnenWeIn1Ding){
fillPacket(dataPointer + i, watKunnenWeIn1Ding - alreadySent, firstPack, video,
keyframe, pkgPid, contPkg);
i += watKunnenWeIn1Ding - alreadySent;
ThisNaluSize -= watKunnenWeIn1Ding - alreadySent;
alreadySent += watKunnenWeIn1Ding - alreadySent;
}else{
fillPacket(dataPointer + i, ThisNaluSize, firstPack, video, keyframe, pkgPid, contPkg);
alreadySent += ThisNaluSize;
i += ThisNaluSize;
ThisNaluSize = 0;
}
if (alreadySent == watKunnenWeIn1Ding){
packData.addStuffing();
fillPacket(0, 0, firstPack, video, keyframe, pkgPid, contPkg);
firstPack = true;
break;
}
} }
currPack++; /*LTS-END*/
}
while (i + 4 < (unsigned int)dataLen){
ThisNaluSize = Bit::btohl(dataPointer + i);
if (ThisNaluSize + i + 4 > dataLen){
WARN_MSG("Too big NALU detected (%" PRIu32 " > %" PRIu64 ") - skipping!",
ThisNaluSize + i + 4, dataLen);
break;
}
fillPacket("\000\000\000\001", 4, firstPack, video, keyframe, pkgPid, contPkg);
fillPacket(dataPointer + i + 4, ThisNaluSize, firstPack, video, keyframe, pkgPid, contPkg);
i += ThisNaluSize + 4;
} }
}else{ }else{
uint64_t offset = thisPacket.getInt("offset") * 90; uint64_t offset = thisPacket.getInt("offset") * 90;