private bool SanityCheck(TSHeader header, byte[] tsPacket) { //LogDebug("PesDecoder::OnTsPacket %i", tsPacketCount++); if (tsPacket == null) { ServiceRegistration.Get <ILogger>().Debug("tsPacket null!"); return(false); } // Assume that correct pid is passed! /*if (header.Pid != m_pid) * { * ServiceRegistration.Get<ILogger>().Debug("Header Pid is %i, expected %i", header.Pid, m_pid); * return false; * }*/ if (header.SyncByte != TS_PACKET_SYNC) { ServiceRegistration.Get <ILogger>().Debug("pesdecoder pid:%x sync error", _pid); return(false); } if (header.TransportError) { _bStart = false; _iWritePos = 0; _iPesLength = 0; ServiceRegistration.Get <ILogger>().Debug("pesdecoder pid:%x transport error", _pid); return(false); } bool scrambled = (header.TScrambling != 0); if (scrambled) { ServiceRegistration.Get <ILogger>().Debug("pesdecoder scrambled!"); return(false); } if (header.AdaptionFieldOnly()) { ServiceRegistration.Get <ILogger>().Debug("pesdecoder AdaptionFieldOnly!"); return(false); } return(true); }
private bool SanityCheck(TSHeader header, byte[] tsPacket) { //LogDebug("PesDecoder::OnTsPacket %i", tsPacketCount++); if (tsPacket == null) { ServiceRegistration.Get<ILogger>().Debug("tsPacket null!"); return false; } // Assume that correct pid is passed! /*if (header.Pid != m_pid) { ServiceRegistration.Get<ILogger>().Debug("Header Pid is %i, expected %i", header.Pid, m_pid); return false; }*/ if (header.SyncByte != TS_PACKET_SYNC) { ServiceRegistration.Get<ILogger>().Debug("pesdecoder pid:%x sync error", _pid); return false; } if (header.TransportError) { _bStart = false; _iWritePos = 0; _iPesLength = 0; ServiceRegistration.Get<ILogger>().Debug("pesdecoder pid:%x transport error", _pid); return false; } bool scrambled = (header.TScrambling != 0); if (scrambled) { ServiceRegistration.Get<ILogger>().Debug("pesdecoder scrambled!"); return false; } if (header.AdaptionFieldOnly()) { ServiceRegistration.Get<ILogger>().Debug("pesdecoder AdaptionFieldOnly!"); return false; } return true; }
public void OnTsPacket(byte[] tsPacket, UInt64 presentTime) { // ServiceRegistration.Get<ILogger>().Debug("PESDECODER ONTSPACKET"); TSHeader header = new TSHeader(tsPacket); if (!SanityCheck(header, tsPacket)) { return; } int pos = header.PayLoadStart; // where in the pes packet does the payload data start? if (header.PayloadUnitStart) // if this header starts a new PES packet { //ServiceRegistration.Get<ILogger>().Debug("PESDECODER: PayLoadUnitStart"); _hasPayloadStart = true; if (tsPacket[pos + 0] == 0 && tsPacket[pos + 1] == 0 && tsPacket[pos + 2] == 1) { if (_iStreamId < 0) { //if stream id not set yet, get it from this _iStreamId = tsPacket[pos + 3]; if (_iStreamId < 0) { throw new Exception("Stream id less than zero :" + _iStreamId); } } else { Assert(_iStreamId == tsPacket[pos + 3], "Stream id changed!"); // stream id should not change! } if (_iWritePos != 0) { //throw new Exception("Buffer is not empty, but new packet is being received!"); ServiceRegistration.Get <ILogger>().Warn("PESDECODER: Buffer is not empty, but new packet is being received!"); } _iWritePos = 0; _iPesHeaderLen = tsPacket[pos + 8] + 9; if (_pesHeader.Length < _iPesHeaderLen) { ServiceRegistration.Get <ILogger>().Error( "PESDecoder: Reported header length is bigger than header buffer! : {0} vs {1}", _pesHeader.Length, _iPesHeaderLen); } Array.Copy(tsPacket, pos, _pesHeader, 0, _iPesHeaderLen); //above replaces -> memcpy(m_pesHeader,&tsPacket[pos],m_iPesHeaderLen); pos += (_iPesHeaderLen); _bStart = true; int a = _pesHeader[4]; int b = _pesHeader[5]; _iPesLength = (a << 8) + b - (_iPesHeaderLen - 6); // calculate expected actual payload length } } else if (!_hasPayloadStart) { //ServiceRegistration.Get<ILogger>().Debug("PACKET DISCARDED: END OF PACKET FOR WHICH WE DONT HAVE START"); return; } if (_iWritePos < 0) { ServiceRegistration.Get <ILogger>().Debug("m_iWritePos < 0"); return; } if (_iStreamId <= 0) { ServiceRegistration.Get <ILogger>().Debug("m_iStreamId <= 0"); return; } Assert(pos > 0 && pos < 188, "Pos error : " + pos); Assert(_iWritePos + 188 - pos <= MAX_PES_PACKET, "About to exceed buffer size!"); // check that the buffer is not overrunning int bytesToWrite = 188 - pos; Assert(bytesToWrite < 188, "Bytes to write too big : " + bytesToWrite); Array.Copy(tsPacket, pos, _pesBuffer, _iWritePos, bytesToWrite); _iWritePos += bytesToWrite; if (_iPesLength == _iWritePos) // we have the expected data { // ServiceRegistration.Get<ILogger>().Debug("PESDECODER: GOT COMPLETE PACKET"); // assert(cb != null, "cb is null!"); if (_iWritePos > 0 && _cb != null) { //ServiceRegistration.Get<ILogger>().Debug("PESDECODER: CALLING CALLBACK"); _cb(_iStreamId, _pesHeader, _iPesHeaderLen, _pesBuffer, _iWritePos, _bStart, presentTime); _bStart = false; _iWritePos = 0; _hasPayloadStart = false; } } }
public void OnTsPacket(byte[] tsPacket, UInt64 presentTime) { // ServiceRegistration.Get<ILogger>().Debug("PESDECODER ONTSPACKET"); TSHeader header = new TSHeader(tsPacket); if (!SanityCheck(header, tsPacket)) return; int pos = header.PayLoadStart; // where in the pes packet does the payload data start? if (header.PayloadUnitStart) // if this header starts a new PES packet { //ServiceRegistration.Get<ILogger>().Debug("PESDECODER: PayLoadUnitStart"); _hasPayloadStart = true; if (tsPacket[pos + 0] == 0 && tsPacket[pos + 1] == 0 && tsPacket[pos + 2] == 1) { if (_iStreamId < 0) { //if stream id not set yet, get it from this _iStreamId = tsPacket[pos + 3]; if (_iStreamId < 0) { throw new Exception("Stream id less than zero :" + _iStreamId); } } else Assert(_iStreamId == tsPacket[pos + 3], "Stream id changed!"); // stream id should not change! if (_iWritePos != 0) { //throw new Exception("Buffer is not empty, but new packet is being received!"); ServiceRegistration.Get<ILogger>().Warn("PESDECODER: Buffer is not empty, but new packet is being received!"); } _iWritePos = 0; _iPesHeaderLen = tsPacket[pos + 8] + 9; if (_pesHeader.Length < _iPesHeaderLen) { ServiceRegistration.Get<ILogger>().Error( "PESDecoder: Reported header length is bigger than header buffer! : {0} vs {1}", _pesHeader.Length, _iPesHeaderLen); } Array.Copy(tsPacket, pos, _pesHeader, 0, _iPesHeaderLen); //above replaces -> memcpy(m_pesHeader,&tsPacket[pos],m_iPesHeaderLen); pos += (_iPesHeaderLen); _bStart = true; int a = _pesHeader[4]; int b = _pesHeader[5]; _iPesLength = (a << 8) + b - (_iPesHeaderLen - 6); // calculate expected actual payload length } } else if (!_hasPayloadStart) { //ServiceRegistration.Get<ILogger>().Debug("PACKET DISCARDED: END OF PACKET FOR WHICH WE DONT HAVE START"); return; } if (_iWritePos < 0) { ServiceRegistration.Get<ILogger>().Debug("m_iWritePos < 0"); return; } if (_iStreamId <= 0) { ServiceRegistration.Get<ILogger>().Debug("m_iStreamId <= 0"); return; } Assert(pos > 0 && pos < 188, "Pos error : " + pos); Assert(_iWritePos + 188 - pos <= MAX_PES_PACKET, "About to exceed buffer size!"); // check that the buffer is not overrunning int bytesToWrite = 188 - pos; Assert(bytesToWrite < 188, "Bytes to write too big : " + bytesToWrite); Array.Copy(tsPacket, pos, _pesBuffer, _iWritePos, bytesToWrite); _iWritePos += bytesToWrite; if (_iPesLength == _iWritePos) // we have the expected data { // ServiceRegistration.Get<ILogger>().Debug("PESDECODER: GOT COMPLETE PACKET"); // assert(cb != null, "cb is null!"); if (_iWritePos > 0 && _cb != null) { //ServiceRegistration.Get<ILogger>().Debug("PESDECODER: CALLING CALLBACK"); _cb(_iStreamId, _pesHeader, _iPesHeaderLen, _pesBuffer, _iWritePos, _bStart, presentTime); _bStart = false; _iWritePos = 0; _hasPayloadStart = false; } } }