Fix non-4-byte H264 NAL unit lengths in TS and raw H264 outputs
This commit is contained in:
parent
c979acff52
commit
8bcdd0b10a
2 changed files with 39 additions and 11 deletions
|
@ -414,13 +414,23 @@ namespace Mist{
|
|||
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;
|
||||
uint32_t ThisNaluSize;
|
||||
while (i + 4 < len){
|
||||
uint32_t ThisNaluSize = Bit::btohl(dataPointer + i);
|
||||
webBuf.append("\000\000\000\001", 4);
|
||||
webBuf.append(dataPointer + i + 4, ThisNaluSize);
|
||||
i += ThisNaluSize + 4;
|
||||
if (lenSize == 4){
|
||||
ThisNaluSize = Bit::btohl(dataPointer + i);
|
||||
}else if (lenSize == 2){
|
||||
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);
|
||||
|
||||
if (stayLive && thisPacket.getFlag("keyframe")){liveSeek();}
|
||||
|
@ -428,13 +438,23 @@ namespace Mist{
|
|||
return;
|
||||
}
|
||||
|
||||
size_t lenSize = 4;
|
||||
if (M.getCodec(thisIdx) == "H264"){lenSize = (M.getInit(thisIdx)[4] & 3) + 1;}
|
||||
unsigned int i = 0;
|
||||
uint32_t ThisNaluSize;
|
||||
while (i + 4 < len){
|
||||
uint32_t ThisNaluSize = Bit::btohl(dataPointer + i);
|
||||
H.Chunkify("\000\000\000\001", 4, myConn);
|
||||
H.Chunkify(dataPointer + i + 4, ThisNaluSize, myConn);
|
||||
i += ThisNaluSize + 4;
|
||||
if (lenSize == 4){
|
||||
ThisNaluSize = Bit::btohl(dataPointer + i);
|
||||
}else if (lenSize == 2){
|
||||
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(){
|
||||
|
|
|
@ -164,16 +164,24 @@ namespace Mist{
|
|||
}
|
||||
/*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);
|
||||
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!",
|
||||
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;
|
||||
fillPacket(dataPointer + i + lenSize, ThisNaluSize, firstPack, video, keyframe, pkgPid, contPkg);
|
||||
i += ThisNaluSize + lenSize;
|
||||
}
|
||||
}else{
|
||||
uint64_t offset = thisPacket.getInt("offset") * 90;
|
||||
|
|
Loading…
Add table
Reference in a new issue