예제 #1
0
        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);
                }
            }
        }
예제 #2
0
        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));
        }
예제 #3
0
            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);
            }
예제 #4
0
 protected void OnPCPChanTrack(Atom atom)
 {
     contentSink.OnChannelTrack(new ChannelTrack(atom.Children));
 }
예제 #5
0
 public void OnChannelTrack(ChannelTrack channel_track)
 {
     channelContentSink.OnChannelTrack(channel_track);
 }
예제 #6
0
 public void OnChannelTrack(ChannelTrack channel_track)
 {
     targetSink.OnChannelTrack(channel_track);
 }