protected override Task OnStopped(CancellationToken cancel_token) { if (this.Channel != null) { sink.OnStop(StopReason.OffAir); this.Channel.RemoveContentSink(sink); } return(base.OnStopped(cancel_token)); }
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); }
public void OnStop(StopReason reason) { channelContentSink.OnStop(reason); taskSource.TrySetResult(reason); }
public void OnStop(StopReason reason) { targetSink.OnStop(reason); }