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;
}