private async Task ProcessMessagesAsync(IContentSink targetSink, CancellationToken cancellationToken)
{
var bufferStream = new MemoryStream();
var context = new FLVToMPEG2TS.Context(bufferStream);
var contentBuffer = new MemoryStream();
var fileParser = new FLVFileParser();
var msg = await msgQueue.DequeueAsync(cancellationToken).ConfigureAwait(false);
while (msg.Type != ContentMessage.MessageType.Stop)
{
switch (msg.Type)
{
case ContentMessage.MessageType.ChannelInfo:
targetSink.OnChannelInfo(msg.ChannelInfo);
break;
case ContentMessage.MessageType.ChannelTrack:
targetSink.OnChannelTrack(msg.ChannelTrack);
break;
case ContentMessage.MessageType.ContentHeader:
{
var buffer = contentBuffer;
var pos = buffer.Position;
buffer.Seek(0, SeekOrigin.End);
buffer.Write(msg.Content.Data.Span);
buffer.Position = pos;
fileParser.Read(buffer, context);
if (buffer.Position != 0)
{
var new_buf = new MemoryStream();
var trim_pos = buffer.Position;
buffer.Close();
var buf = buffer.ToArray();
new_buf.Write(buf, (int)trim_pos, (int)(buf.Length - trim_pos));
new_buf.Position = 0;
contentBuffer = new_buf;
}
if (bufferStream.Position != 0)
{
targetSink.OnContentHeader(
new Content(
msg.Content.Stream,
msg.Content.Timestamp,
msg.Content.Position,
bufferStream.ToArray(),
msg.Content.ContFlag
)
);
bufferStream.SetLength(0);
}
}
break;
case ContentMessage.MessageType.ContentBody:
{
var buffer = contentBuffer;
var pos = buffer.Position;
buffer.Seek(0, SeekOrigin.End);
buffer.Write(msg.Content.Data.Span);
buffer.Position = pos;
fileParser.Read(buffer, context);
if (buffer.Position != 0)
{
var new_buf = new MemoryStream();
var trim_pos = buffer.Position;
buffer.Close();
var buf = buffer.ToArray();
new_buf.Write(buf, (int)trim_pos, (int)(buf.Length - trim_pos));
new_buf.Position = 0;
contentBuffer = new_buf;
}
if (bufferStream.Position != 0)
{
targetSink.OnContent(
new Content(
msg.Content.Stream,
msg.Content.Timestamp,
msg.Content.Position,
bufferStream.ToArray(),
msg.Content.ContFlag
)
);
bufferStream.SetLength(0);
}
}
break;
}
msg = await msgQueue.DequeueAsync(cancellationToken).ConfigureAwait(false);
}
targetSink.OnStop(msg.StopReason);
}