예제 #1
0
        public void TestHeaderExtension()
        {
            var buffer = new ByteBuffer(_packetBytes, 0, _packetBytes.Length);
            var packet = RtpPacket.Decode(buffer);
            var date   = new DateTime(2017, 10, 17, 4, 33, 17, 32, DateTimeKind.Local);

            var headerBuf = new OnvifRtpHeader()
            {
                Time    = date,
                CbitSet = true,
                DbitSet = true,
                EbitSet = true,
                CSeq    = 3
            }.Encode();

            packet.HasExtensionHeader  = true;
            packet.ExtensionHeaderData = OnvifRtpHeader.PROFILE_ID;
            packet.ExtensionData       = headerBuf;

            var encoded = packet.Encode();
            var toTest  = RtpPacket.Decode(encoded);

            Assert.True(toTest.Version.Is(RtpVersion.V2));
            Assert.True(toTest.HasExtensionHeader);
            Assert.False(toTest.Marker);
            Assert.True(toTest.CsrcIds.IsEmpty);
            Assert.Equal(97, toTest.PayloadType);
            Assert.Equal(40179, toTest.SequenceNumber);
            Assert.Equal(3616193167, toTest.Timestamp);
            Assert.Equal((uint)1849968209, toTest.SSRC);
            Assert.Equal(51, toTest.Payload.Length);
            Assert.Equal(OnvifRtpHeader.PROFILE_ID, packet.ExtensionHeaderData);

            var header = OnvifRtpHeader.Decode(toTest.ExtensionData);

            Assert.Equal(date, header.Time.ToLocalTime());
            Assert.True(header.CbitSet);
            Assert.True(header.DbitSet);
            Assert.True(header.EbitSet);
            Assert.Equal(3, header.CSeq);
        }
예제 #2
0
        public void TestOnlyEbitSet()
        {
            var date = new DateTime(2017, 10, 17, 4, 33, 17, 32, DateTimeKind.Local);

            var buffer = new OnvifRtpHeader()
            {
                Time    = date,
                CbitSet = false,
                DbitSet = false,
                EbitSet = true,
                CSeq    = 3
            }.Encode();

            var header = OnvifRtpHeader.Decode(buffer);

            Assert.Equal(date, header.Time.ToLocalTime());
            Assert.False(header.CbitSet);
            Assert.False(header.DbitSet);
            Assert.True(header.EbitSet);
            Assert.Equal(3, header.CSeq);
        }
예제 #3
0
        /// <summary>
        /// Converts an RTP packet into an the RTP payload.  Basically it just strips off
        /// the RTP transport info and returns that actual payload data.
        /// </summary>
        /// <param name="buffer"></param>
        /// <returns></returns>
        public override bool WriteBuffer(ByteBuffer buffer)
        {
            try
            {
                var packet  = RtpPacket.Decode(buffer);
                var paylaod = packet.Payload;

                if (packet.HasExtensionHeader && packet.ExtensionHeaderData == OnvifRtpHeader.PROFILE_ID)
                {
                    // Packet contains Onvif header extension set packet time reference.
                    var onvifHdr = OnvifRtpHeader.Decode(packet.ExtensionData);
                    paylaod.TimeReference = onvifHdr.Time;
                }

                return(PushBuffer(paylaod));
            }
            catch (Exception e)
            {
                LOG.Error($"Unable to decode RTP packet, reason: {e.Message}");
                return(false);
            }
        }