Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
    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;
    }
Ejemplo n.º 3
0
        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;
                }
            }
        }
Ejemplo n.º 4
0
    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;
        }
      }
    }