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);
|
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(){
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue