Ejemplo n.º 1
0
        /// <summary>
        /// newPacket is how RtpListener sends an incoming RtpPacket who's SSRC matches this
        /// RtpStream into the RtpStream's queue for processing
        ///
        /// This method assumes there is only one thread calling newPacket
        /// </summary>
        internal virtual void ProcessPacket(RtpPacket packet)
        {
            #region Mark this stream and its participant as not stale
            stale = 0;
            // TODO - trade SdesData for Participant JVE
            // TODO - mark participant or we will destory and recreate streams JVE
//            if (participant != null)
//            {
//                participant.stale = 0;
//            }
            #endregion

            // Mark raw packet received
            packetsLost += LostPackets(ref maxSeq, packet.Sequence);
            packetsReceived++;
            bytesReceived += packet.PayloadSize;

            #region Reject Late Packets

            uint packetTS = packet.TimeStamp;
            uint deltaTS  = 0;

            if (packetsReceived != 1) // Skip this test if we're in a startup state
            {
                deltaTS = unchecked (packetTS - currentFrameTS);

                if (deltaTS > HALF_UINT_MAX)
                {
                    packetsReceivedLate++;
                    returnBufferHandler(packet.ReleaseBuffer());
                    return;
                }
            }

            #endregion

            // A packet from a future frame has been received, so send out the incomplete current frame
            // Note we cannot check for deltaTS == 1 because we may miss more than 1 frame
            if (deltaTS > 0)
            {
                if (frame != null)
                {
                    frame.Dispose();
                    frame = null;
                }

                RtpRetransmit.FrameIncomplete(this, (int)deltaTS);
            }

            // We're receiving the first packet for a new frame
            if (frame == null)
            {
                frame          = new RtpFrame(packet.PacketsInFrame, packetTS, returnBufferHandler);
                currentFrameTS = packetTS;
            }

            try
            {
                // Store the packet
                frame[packet.FrameIndex] = packet;
            }
            catch (DuplicatePacketException)
            {
                // Note: We have already updated the performance counters for these bytes / this packet
                // and we are rejecting it now.  So pcs could be higher than expected.
                eventLog.WriteEntry("Duplicate packet received in RtpStream - " + packet.ToString(),
                                    EventLogEntryType.Error, (int)RtpEL.ID.DuplicatePacketReceived);

                return;
            }

            // We've received the correct number of data packets, so we can now re-create the frame
            if (frame.Complete)
            {
                // Raise the event
                OnFrameReceivedEvent(frame.Data);

                // Clean up frame - like returning packets to RtpListener
                frame.Dispose();
                frame = null;

                // CXP RtpSenders increment by 1, to do otherwise is a signal from the Sender
                // which means the stream needs to know what the signal means
                currentFrameTS++;
            }
        }
Ejemplo n.º 2
0
 private void DisposeFrame()
 {
     frame.Dispose();
     frame = null;
 }
Ejemplo n.º 3
0
        private void InitializeFrame()
        {
            InitializePacketSize();

            frame = new RtpFrame((uint)packetSize, payloadType, ts);
        }
Ejemplo n.º 4
0
        private void InitializeFrame()
        {
            InitializePacketSize();

            frame = new RtpFrame((uint)packetSize, payloadType, ts);
        }
Ejemplo n.º 5
0
 private void DisposeFrame()
 {
     frame.Dispose();
     frame = null;
 }
Ejemplo n.º 6
0
        /// <summary>
        /// newPacket is how RtpListener sends an incoming RtpPacket who's SSRC matches this
        /// RtpStream into the RtpStream's queue for processing
        /// 
        /// This method assumes there is only one thread calling newPacket
        /// </summary>
        internal virtual void ProcessPacket(RtpPacket packet)
        {
            int frame_Index = 0;
            int packets_Size = 0;

            #region Mark this stream and its participant as not stale
            stale = 0;
            // TODO - trade SdesData for Participant JVE
            // TODO - mark participant or we will destory and recreate streams JVE
//            if (participant != null)
//            {
//                participant.stale = 0;
//            }
            #endregion

            // Mark raw packet received
            packetsLost += LostPackets(ref maxSeq, packet.Sequence);
            packetsReceived++;
            bytesReceived += packet.PayloadSize;

            #region Reject Late Packets

            uint packetTS = packet.TimeStamp;
            uint deltaTS = 0;

            if (packetsReceived != 1) // Skip this test if we're in a startup state
            {
                deltaTS = unchecked(packetTS - currentFrameTS);

                if (deltaTS > HALF_UINT_MAX)
                {
                    packetsReceivedLate++;
                    returnBufferHandler(packet.ReleaseBuffer());
                    return;
                }
            }

            #endregion

            // A packet from a future frame has been received, so send out the incomplete current frame
            // Note we cannot check for deltaTS == 1 because we may miss more than 1 frame
            if (deltaTS > 0)
            {
                if(frame != null)
                {
                    frame.Dispose();
                    frame = null;
                }

                RtpRetransmit.FrameIncomplete(this, (int)deltaTS);
            }

            // We're receiving the first packet for a new frame
            if (frame == null) 
            {
                frame = new RtpFrame(128, packetTS, returnBufferHandler);
                currentFrameTS = packetTS;
            }

            try
            {
                // Store the packet
                // payload type is jpeg
                frame_Index = packet.JpgOffset/packet.MaxPayloadSize;
                frame.ApproximatePacketsInFrame((uint)frame_Index + 1);
                frame[frame_Index] = packet;
            }
            catch(DuplicatePacketException)
            {
                // Note: We have already updated the performance counters for these bytes / this packet
                // and we are rejecting it now.  So pcs could be higher than expected.
                eventLog.WriteEntry("Duplicate packet received in RtpStream - " + packet.ToString(), 
                    EventLogEntryType.Error, (int)RtpEL.ID.DuplicatePacketReceived);

                return;
            }

            // We've received the correct number of data packets, so we can now re-create the frame
            //if (frame.Complete)
            if (packet.Marker)
            {
                packets_Size = frame_Index + 1;
                frame.PacketsInFrame = (uint)packets_Size;
            }

            if (frame.Complete)
            {
                // Raise the event
                OnFrameReceivedEvent(frame.Data);

                // Clean up frame - like returning packets to RtpListener
                frame.Dispose();
                frame = null;

                // CXP RtpSenders increment by 1, to do otherwise is a signal from the Sender
                // which means the stream needs to know what the signal means
                currentFrameTS++; 
            }
        }