public void Clear_SeveralTestChunks_EmptyArray()
        {
            int count        = 10;
            var chunkBytes   = new byte[] { 1, 2, 3, 4, 5 };
            var chunkSegment = new ArraySegment <byte>(chunkBytes);
            var chunkArray   = new ChunksArray(1500, 10);

            for (int i = 0; i < count; i++)
            {
                chunkArray.Insert(chunkSegment);
            }
            chunkArray.Clear();

            Assert.AreEqual(0, chunkArray.Count);
        }
示例#2
0
        private void ProcessBufferedPackets(ushort nextSeqNumber)
        {
            while (true)
            {
                bool anythingFound = false;

                for (int i = 0; i < _bufferedRtpPackets.Count; i++)
                {
                    if (_bufferedRtpPackets[i].SeqNumber != nextSeqNumber)
                    {
                        continue;
                    }

                    RtpPacket nextRtpPacket = _bufferedRtpPackets[i];

                    int chunkIndex = _rtpPacketIndexToChunkIndexMap[i];
                    nextRtpPacket.PayloadSegment = _chunksArray[chunkIndex];

                    _previousCorrectSeqNumber = nextRtpPacket.SeqNumber;
                    _previousTimestamp        = nextRtpPacket.Timestamp;
                    PacketPassed?.Invoke(ref nextRtpPacket);

                    ++nextSeqNumber;
                    anythingFound = true;
                    _removeList.Add(i);
                }

                if (!anythingFound)
                {
                    break;
                }
            }

            if (_removeList.Count == 0)
            {
                return;
            }

            if (_removeList.Count == _bufferedRtpPackets.Count)
            {
                _bufferedRtpPackets.Clear();
                _chunksArray.Clear();
                _rtpPacketIndexToChunkIndexMap.Clear();
            }
            else
            {
                if (_removeList.Count == 1)
                {
                    int removeIndex = _removeList[0];

                    _bufferedRtpPackets.RemoveAt(removeIndex);
                    _chunksArray.RemoveAt(_rtpPacketIndexToChunkIndexMap[removeIndex]);
                    _rtpPacketIndexToChunkIndexMap.RemoveAt(removeIndex);
                }
                else
                {
                    _removeList.Sort();

                    for (int i = _removeList.Count - 1; i > -1; i--)
                    {
                        int removeIndex = _removeList[i];

                        _bufferedRtpPackets.RemoveAt(removeIndex);
                        _chunksArray.RemoveAt(_rtpPacketIndexToChunkIndexMap[removeIndex]);
                        _rtpPacketIndexToChunkIndexMap.RemoveAt(removeIndex);
                    }
                }
            }

            _removeList.Clear();
        }
示例#3
0
        private void ProcessBufferedPackets(ushort nextSeqNumber, int mediaId)
        {
            ////Debug.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") + " - Sequence Assembler - Processing buffered packets. nextSeqNumber: " + nextSeqNumber.ToString());

            while (true)
            {
                bool anythingFound = false;

                for (int i = 0; i < _bufferedRtpPackets.Count; i++)
                {
                    if (_bufferedRtpPackets[i].SeqNumber != nextSeqNumber)
                    {
                        continue;
                    }

                    RtpPacket nextRtpPacket = _bufferedRtpPackets[i];

                    int chunkIndex = _rtpPacketIndexToChunkIndexMap[i];
                    nextRtpPacket.PayloadSegment = _chunksArray[chunkIndex];

                    _previousCorrectSeqNumber = nextRtpPacket.SeqNumber;
                    _previousTimestamp        = nextRtpPacket.Timestamp;
                    PacketPassed?.Invoke(ref nextRtpPacket, mediaId);

                    ++nextSeqNumber;
                    anythingFound = true;
                    _removeList.Add(i);
                }

                if (!anythingFound)
                {
                    break;
                }
            }

            if (_removeList.Count == 0)
            {
                return;
            }

            if (_removeList.Count == _bufferedRtpPackets.Count)
            {
                _bufferedRtpPackets.Clear();
                _chunksArray.Clear();
                _rtpPacketIndexToChunkIndexMap.Clear();
            }
            else
            {
                if (_removeList.Count == 1)
                {
                    int removeIndex = _removeList[0];

                    _bufferedRtpPackets.RemoveAt(removeIndex);
                    _chunksArray.RemoveAt(_rtpPacketIndexToChunkIndexMap[removeIndex]);
                    _rtpPacketIndexToChunkIndexMap.RemoveAt(removeIndex);
                }
                else
                {
                    _removeList.Sort();

                    for (int i = _removeList.Count - 1; i > -1; i--)
                    {
                        int removeIndex = _removeList[i];

                        _bufferedRtpPackets.RemoveAt(removeIndex);
                        _chunksArray.RemoveAt(_rtpPacketIndexToChunkIndexMap[removeIndex]);
                        _rtpPacketIndexToChunkIndexMap.RemoveAt(removeIndex);
                    }
                }
            }

            _removeList.Clear();
        }