public async Task InitializeAsync(ISegmentManagerReaders segmentManagerReaders, Action checkConfiguration, Action checkForSamples, CancellationToken cancellationToken, Action <IProgramStreams> programStreamsHandler) { this._checkConfiguration = checkConfiguration; Task startReaderTask = this._segmentReaders.Manager.StartAsync(); MediaReader localReader = this; QueueWorker <WorkBuffer> queueWorker = new QueueWorker <WorkBuffer>((Action <WorkBuffer>)(wi => { IMediaParser mediaParser = localReader._mediaParser; if (null == wi) { mediaParser.ProcessEndOfData(); } else { if (null != wi.Metadata) { mediaParser.StartSegment(wi.Metadata); wi.Metadata = (ISegmentMetadata)null; } mediaParser.ProcessData(wi.Buffer, 0, wi.Length); } }), (Action <WorkBuffer>)(buffer => this._blockingPool.Free(buffer))); this._queueWorker = queueWorker; this._callbackReader = new CallbackReader(segmentManagerReaders.Readers, new Action <WorkBuffer>(queueWorker.Enqueue), this._blockingPool); this._bufferingManager.Initialize((IQueueThrottling)queueWorker, checkForSamples); try { await startReaderTask.ConfigureAwait(false); ContentType contentType = this._segmentReaders.Manager.ContentType; if ((ContentType)null == contentType) { Debug.WriteLine("MediaReader.CreateReaderPipeline() unable to determine content type, defaulting to transport stream"); contentType = ContentTypes.TransportStream; } else if (ContentTypes.Binary == contentType) { Debug.WriteLine("MediaReader.CreateReaderPipeline() detected binary content, defaulting to transport stream"); contentType = ContentTypes.TransportStream; } MediaParserParameters mediaParserParameters = new MediaParserParameters(); this._mediaParser = await this._mediaParserFactory.CreateAsync((IMediaParserParameters)mediaParserParameters, contentType, cancellationToken).ConfigureAwait(false); if (null == this._mediaParser) { throw new NotSupportedException("Unsupported content type: " + (object)contentType); } this._mediaParser.ConfigurationComplete += new EventHandler(this.ConfigurationComplete); this._mediaParser.Initialize(this._bufferingManager, programStreamsHandler); this._mediaParser.InitializeStream(this._segmentReaders.Manager.StreamMetadata); } catch (Exception ex) { this._bufferingManager.Shutdown((IQueueThrottling)queueWorker); throw; } }
private async Task ReadResponseAsync(IMediaParser mediaParser, IWebStreamResponse webStreamResponse, WebResponse webResponse, SingleStreamMediaManager.QueueThrottle throttle, CancellationToken cancellationToken) { byte[] buffer = new byte[16384]; Task cancellationTask = CancellationTokenExtensions.AsTask(cancellationToken); try { ISegmentMetadata segmentMetadata = this._webMetadataFactory.CreateSegmentMetadata(webResponse, (ContentType)null); mediaParser.StartSegment(segmentMetadata); using (Stream stream = await webStreamResponse.GetStreamAsync(cancellationToken).ConfigureAwait(false)) { while (true) { Task waitTask = throttle.WaitAsync(); if (!waitTask.IsCompleted) { Task task = await TaskEx.WhenAny(waitTask, cancellationTask).ConfigureAwait(false); cancellationToken.ThrowIfCancellationRequested(); } int length = await stream.ReadAsync(buffer, 0, buffer.Length, cancellationToken).ConfigureAwait(false); if (length > 0) { mediaParser.ProcessData(buffer, 0, length); } else { break; } } } } finally { mediaParser.ProcessEndOfData(); } }
async Task ReadResponseAsync(IMediaParser mediaParser, IWebStreamResponse webStreamResponse, WebResponse webResponse, QueueThrottle throttle, CancellationToken cancellationToken) { //Debug.WriteLine("SingleStreamMediaManager.ReadResponseAsync()"); var buffer = new byte[16 * 1024]; var cancellationTask = cancellationToken.AsTask(); try { var segmentMetadata = _webMetadataFactory.CreateSegmentMetadata(webResponse); mediaParser.StartSegment(segmentMetadata); using (var stream = await webStreamResponse.GetStreamAsync(cancellationToken).ConfigureAwait(false)) { for (; ; ) { var waitTask = throttle.WaitAsync(); if (!waitTask.IsCompleted) { await Task.WhenAny(waitTask, cancellationTask).ConfigureAwait(false); cancellationToken.ThrowIfCancellationRequested(); } var length = await stream.ReadAsync(buffer, 0, buffer.Length, cancellationToken).ConfigureAwait(false); if (length <= 0) return; mediaParser.ProcessData(buffer, 0, length); } } } finally { mediaParser.ProcessEndOfData(); //Debug.WriteLine("SingleStreamMediaManager.ReadResponseAsync() done"); } }