CSharpRTMP.Core.Protocols.Rtsp.OutNetRTPUDPH264Stream.FeedDataVideoFUA C# (CSharp) Метод

FeedDataVideoFUA() приватный Метод

private FeedDataVideoFUA ( Stream pData, uint dataLength, uint processedLength, uint totalLength, uint absoluteTimestamp ) : bool
pData Stream
dataLength uint
processedLength uint
totalLength uint
absoluteTimestamp uint
Результат bool
        private bool FeedDataVideoFUA(Stream pData, uint dataLength, uint processedLength, uint totalLength, uint absoluteTimestamp)
        {
            uint sentAmount = 0;
            while (sentAmount != dataLength)
            {
                var chunkSize = dataLength - sentAmount;
                chunkSize = chunkSize < _maxRTPPacketSize ? chunkSize : _maxRTPPacketSize;
                //1. Flags
                _videoData.Buffers[0][1] = processedLength + sentAmount + chunkSize == totalLength ?(byte) 0xe1 : (byte)0x61;
                //2. counter
                _videoData.Buffers[0].Write(2, _videoCounter);
                _videoCounter++;
                //3. Timestamp
                _videoData.Buffers[0].Write(4, BaseConnectivity.ToRTPTS(absoluteTimestamp, 90000));
                if (chunkSize == totalLength)
                {
                    //4. No chunking
                    Array.Resize(ref _videoData.Buffers[0], 12);
                    Array.Resize(ref _videoData.Buffers[1], (int) chunkSize);
                    pData.Read(_videoData.Buffers[1], 0, (int) chunkSize);
                }
                else
                {
                    //5. Chunking
                    Array.Resize(ref _videoData.Buffers[0], 14);
                    if (processedLength + sentAmount == 0)
                    {
                        //6. First chunk
                        var firstByte = (byte) pData.ReadByte();
                        _videoData.Buffers[0][12] = (byte) (firstByte & 0xe0 | (byte) NaluType.NALU_TYPE_FUA);
                        _videoData.Buffers[0][13] = (byte) (firstByte & 0x1f | 0x80);
                        Array.Resize(ref _videoData.Buffers[1], (int) chunkSize - 1);
                        pData.Read(_videoData.Buffers[1], 0, (int) chunkSize - 1);
                    }
                    else
                    {
                        _videoData.Buffers[0][13] &= 0x1f;
                        if (processedLength + sentAmount + chunkSize == totalLength)
                        {
                            //7. Last chunk
                            _videoData.Buffers[0][13] |= 0x40;
                        }
                        Array.Resize(ref _videoData.Buffers[1], (int) chunkSize);
                        pData.Read(_videoData.Buffers[1], 0, (int) chunkSize);
                    }
                }
                Connectivity.FeedVideoData(ref _videoData, absoluteTimestamp);
                sentAmount += chunkSize;
            }
            return true;
        }