| Index: media/renderers/video_renderer_impl.cc
|
| diff --git a/media/renderers/video_renderer_impl.cc b/media/renderers/video_renderer_impl.cc
|
| index 329437d9a696ddbe9582da79a737baeae5251d84..a755c2194012777e4676a509791a0082967916fa 100644
|
| --- a/media/renderers/video_renderer_impl.cc
|
| +++ b/media/renderers/video_renderer_impl.cc
|
| @@ -31,7 +31,7 @@ VideoRendererImpl::VideoRendererImpl(
|
| const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
|
| const scoped_refptr<base::TaskRunner>& worker_task_runner,
|
| VideoRendererSink* sink,
|
| - ScopedVector<VideoDecoder> decoders,
|
| + const CreateVideoDecodersCB& create_video_decoders_cb,
|
| bool drop_frames,
|
| GpuVideoAcceleratorFactories* gpu_factories,
|
| const scoped_refptr<MediaLog>& media_log)
|
| @@ -39,15 +39,15 @@ VideoRendererImpl::VideoRendererImpl(
|
| sink_(sink),
|
| sink_started_(false),
|
| client_(nullptr),
|
| - video_frame_stream_(new VideoFrameStream(media_task_runner,
|
| - std::move(decoders),
|
| - media_log)),
|
| gpu_memory_buffer_pool_(nullptr),
|
| media_log_(media_log),
|
| low_delay_(false),
|
| received_end_of_stream_(false),
|
| rendered_end_of_stream_(false),
|
| state_(kUninitialized),
|
| + create_video_decoders_cb_(create_video_decoders_cb),
|
| + gpu_factories_(gpu_factories),
|
| + worker_task_runner_(worker_task_runner),
|
| pending_read_(false),
|
| drop_frames_(drop_frames),
|
| buffering_state_(BUFFERING_HAVE_NOTHING),
|
| @@ -63,11 +63,7 @@ VideoRendererImpl::VideoRendererImpl(
|
| max_buffered_frames_(limits::kMaxVideoFrames),
|
| weak_factory_(this),
|
| frame_callback_weak_factory_(this) {
|
| - if (gpu_factories &&
|
| - gpu_factories->ShouldUseGpuMemoryBuffersForVideoFrames()) {
|
| - gpu_memory_buffer_pool_.reset(new GpuMemoryBufferVideoFramePool(
|
| - media_task_runner, worker_task_runner, gpu_factories));
|
| - }
|
| + DCHECK(create_video_decoders_cb_);
|
| }
|
|
|
| VideoRendererImpl::~VideoRendererImpl() {
|
| @@ -150,10 +146,24 @@ void VideoRendererImpl::Initialize(
|
| DCHECK_EQ(stream->type(), DemuxerStream::VIDEO);
|
| DCHECK(!init_cb.is_null());
|
| DCHECK(!wall_clock_time_cb.is_null());
|
| - DCHECK_EQ(kUninitialized, state_);
|
| + DCHECK(kUninitialized == state_ || kFlushed == state_);
|
| DCHECK(!was_background_rendering_);
|
| DCHECK(!time_progressing_);
|
| - DCHECK(!have_renderered_frames_);
|
| +
|
| + ScopedVector<VideoDecoder> decoders = create_video_decoders_cb_.Run();
|
| + video_frame_stream_.reset(
|
| + new VideoFrameStream(task_runner_, std::move(decoders), media_log_));
|
| +
|
| + // Always re-initialize or reset the |gpu_memory_buffer_pool_| in case we are
|
| + // switching between video tracks with incompatible video formats (e.g. 8-bit
|
| + // H.264 to 10-bit H264 or vice versa).
|
| + if (gpu_factories_ &&
|
| + gpu_factories_->ShouldUseGpuMemoryBuffersForVideoFrames()) {
|
| + gpu_memory_buffer_pool_.reset(new GpuMemoryBufferVideoFramePool(
|
| + task_runner_, worker_task_runner_, gpu_factories_));
|
| + } else {
|
| + gpu_memory_buffer_pool_.reset();
|
| + }
|
|
|
| low_delay_ = (stream->liveness() == DemuxerStream::LIVENESS_LIVE);
|
| UMA_HISTOGRAM_BOOLEAN("Media.VideoRenderer.LowDelay", low_delay_);
|
|
|