Fix non-4-byte H264 NAL unit lengths in TS and raw H264 outputs

This commit is contained in:
Thulinma 2023-03-17 18:12:33 +01:00
parent c979acff52
commit 8bcdd0b10a
2 changed files with 39 additions and 11 deletions

View file

@ -414,13 +414,23 @@ namespace Mist{
Bit::htobs(webBuf+10, 0); Bit::htobs(webBuf+10, 0);
} }
size_t lenSize = 4;
if (M.getCodec(thisIdx) == "H264"){lenSize = (M.getInit(thisIdx)[4] & 3) + 1;}
unsigned int i = 0; unsigned int i = 0;
uint32_t ThisNaluSize;
while (i + 4 < len){ while (i + 4 < len){
uint32_t ThisNaluSize = Bit::btohl(dataPointer + i); if (lenSize == 4){
webBuf.append("\000\000\000\001", 4); ThisNaluSize = Bit::btohl(dataPointer + i);
webBuf.append(dataPointer + i + 4, ThisNaluSize); }else if (lenSize == 2){
i += ThisNaluSize + 4; ThisNaluSize = Bit::btohs(dataPointer + i);
}else{
ThisNaluSize = dataPointer[i];
} }
webBuf.append("\000\000\000\001", 4);
webBuf.append(dataPointer + i + lenSize, ThisNaluSize);
i += ThisNaluSize + lenSize;
}
webSock->sendFrame(webBuf, webBuf.size(), 2); webSock->sendFrame(webBuf, webBuf.size(), 2);
if (stayLive && thisPacket.getFlag("keyframe")){liveSeek();} if (stayLive && thisPacket.getFlag("keyframe")){liveSeek();}
@ -428,13 +438,23 @@ namespace Mist{
return; return;
} }
size_t lenSize = 4;
if (M.getCodec(thisIdx) == "H264"){lenSize = (M.getInit(thisIdx)[4] & 3) + 1;}
unsigned int i = 0; unsigned int i = 0;
uint32_t ThisNaluSize;
while (i + 4 < len){ while (i + 4 < len){
uint32_t ThisNaluSize = Bit::btohl(dataPointer + i); if (lenSize == 4){
H.Chunkify("\000\000\000\001", 4, myConn); ThisNaluSize = Bit::btohl(dataPointer + i);
H.Chunkify(dataPointer + i + 4, ThisNaluSize, myConn); }else if (lenSize == 2){
i += ThisNaluSize + 4; ThisNaluSize = Bit::btohs(dataPointer + i);
}else{
ThisNaluSize = dataPointer[i];
} }
H.Chunkify("\000\000\000\001", 4, myConn);
H.Chunkify(dataPointer + i + lenSize, ThisNaluSize, myConn);
i += ThisNaluSize + lenSize;
}
} }
void OutH264::sendHeader(){ void OutH264::sendHeader(){

View file

@ -164,16 +164,24 @@ namespace Mist{
} }
/*LTS-END*/ /*LTS-END*/
} }
while (i + 4 < (unsigned int)dataLen){ size_t lenSize = 4;
if (codec == "H264"){lenSize = (M.getInit(thisIdx)[4] & 3) + 1;}
while (i + lenSize < (unsigned int)dataLen){
if (lenSize == 4){
ThisNaluSize = Bit::btohl(dataPointer + i); ThisNaluSize = Bit::btohl(dataPointer + i);
if (ThisNaluSize + i + 4 > dataLen){ }else if (lenSize == 2){
ThisNaluSize = Bit::btohs(dataPointer + i);
}else{
ThisNaluSize = dataPointer[i];
}
if (ThisNaluSize + i + lenSize > dataLen){
WARN_MSG("Too big NALU detected (%" PRIu32 " > %zu) - skipping!", WARN_MSG("Too big NALU detected (%" PRIu32 " > %zu) - skipping!",
ThisNaluSize + i + 4, dataLen); ThisNaluSize + i + 4, dataLen);
break; break;
} }
fillPacket("\000\000\000\001", 4, firstPack, video, keyframe, pkgPid, contPkg); fillPacket("\000\000\000\001", 4, firstPack, video, keyframe, pkgPid, contPkg);
fillPacket(dataPointer + i + 4, ThisNaluSize, firstPack, video, keyframe, pkgPid, contPkg); fillPacket(dataPointer + i + lenSize, ThisNaluSize, firstPack, video, keyframe, pkgPid, contPkg);
i += ThisNaluSize + 4; i += ThisNaluSize + lenSize;
} }
}else{ }else{
uint64_t offset = thisPacket.getInt("offset") * 90; uint64_t offset = thisPacket.getInt("offset") * 90;