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);
 | 
			
		||||
        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 + 4, ThisNaluSize);
 | 
			
		||||
        i += ThisNaluSize + 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);
 | 
			
		||||
      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 + 4, ThisNaluSize, myConn);
 | 
			
		||||
      i += ThisNaluSize + 4;
 | 
			
		||||
      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){
 | 
			
		||||
          ThisNaluSize = Bit::btohl(dataPointer + i);
 | 
			
		||||
          if (ThisNaluSize + i + 4 > 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);
 | 
			
		||||
          }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
		Add a link
		
	
		Reference in a new issue