public void AddContentSink(IContentSink sink) { ReplaceCollection(ref contentSinks, orig => { var new_collection = new List <IContentSink>(orig); new_collection.Add(sink); return(new_collection); }); var header = contentHeader; if (header != null) { sink.OnContentHeader(header); var channel_info = ChannelInfo; if (channel_info != null) { sink.OnChannelInfo(channel_info); } var channel_track = ChannelTrack; if (channel_track != null) { sink.OnChannelTrack(channel_track); } var contents = Contents.GetNewerContents(header.Stream, header.Timestamp, header.Position); foreach (var content in contents) { sink.OnContent(content); } } }
public IDisposable AddContentSink(IContentSink sink, long requestPos) { ReplaceCollection(ref contentSinks, orig => orig.Add(sink)); var header = contentHeader; if (header != null) { var channel_info = ChannelInfo; if (channel_info != null) { sink.OnChannelInfo(channel_info); } var channel_track = ChannelTrack; if (channel_track != null) { sink.OnChannelTrack(channel_track); } sink.OnContentHeader(header); var contents = Contents.GetFirstContents(header.Stream, header.Timestamp, header.Position); foreach (var content in contents) { if (header.Position >= requestPos || content.Position >= requestPos) { sink.OnContent(content); } } } return(new ContentSinkSubscription(this, sink)); }
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); }
protected void OnPCPChanTrack(Atom atom) { contentSink.OnChannelTrack(new ChannelTrack(atom.Children)); }
public void OnChannelTrack(ChannelTrack channel_track) { channelContentSink.OnChannelTrack(channel_track); }
public void OnChannelTrack(ChannelTrack channel_track) { targetSink.OnChannelTrack(channel_track); }