Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(243)

Unified Diff: media/renderers/video_renderer_impl.cc

Issue 2684103005: Allow media track switching. (Closed)
Patch Set: Fixed comments Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/renderers/video_renderer_impl.h ('k') | media/renderers/video_renderer_impl_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_);
« no previous file with comments | « media/renderers/video_renderer_impl.h ('k') | media/renderers/video_renderer_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698