Chromium Code Reviews| Index: media/renderers/video_renderer_impl.cc |
| diff --git a/media/renderers/video_renderer_impl.cc b/media/renderers/video_renderer_impl.cc |
| index 80f3ea985679f228b9cc3da0fe10eaa75f2cf38b..f244f6f458f5e2d6fd4c28be79ce4d4a3298e0ed 100644 |
| --- a/media/renderers/video_renderer_impl.cc |
| +++ b/media/renderers/video_renderer_impl.cc |
| @@ -20,6 +20,7 @@ |
| #include "media/base/media_log.h" |
| #include "media/base/media_switches.h" |
| #include "media/base/pipeline_status.h" |
| +#include "media/base/renderer_client.h" |
| #include "media/base/video_frame.h" |
| #include "media/renderers/gpu_video_accelerator_factories.h" |
| #include "media/video/gpu_memory_buffer_video_frame_pool.h" |
| @@ -37,6 +38,7 @@ VideoRendererImpl::VideoRendererImpl( |
| : task_runner_(media_task_runner), |
| sink_(sink), |
| sink_started_(false), |
| + client_(nullptr), |
| video_frame_stream_(new VideoFrameStream(media_task_runner, |
| std::move(decoders), |
| media_log)), |
| @@ -95,7 +97,7 @@ void VideoRendererImpl::Flush(const base::Closure& callback) { |
| // stream and needs to drain it before flushing it. |
| if (buffering_state_ != BUFFERING_HAVE_NOTHING) { |
| buffering_state_ = BUFFERING_HAVE_NOTHING; |
| - buffering_state_cb_.Run(BUFFERING_HAVE_NOTHING); |
| + client_->OnBufferingStateChange(buffering_state_); |
| } |
| received_end_of_stream_ = false; |
| rendered_end_of_stream_ = false; |
| @@ -121,23 +123,16 @@ void VideoRendererImpl::StartPlayingFrom(base::TimeDelta timestamp) { |
| } |
| void VideoRendererImpl::Initialize( |
| + RendererClient* client, |
| DemuxerStream* stream, |
| - const PipelineStatusCB& init_cb, |
| CdmContext* cdm_context, |
| - const StatisticsCB& statistics_cb, |
| - const BufferingStateCB& buffering_state_cb, |
| - const base::Closure& ended_cb, |
| - const PipelineStatusCB& error_cb, |
| const TimeSource::WallClockTimeCB& wall_clock_time_cb, |
| - const base::Closure& waiting_for_decryption_key_cb) { |
| + const PipelineStatusCB& init_cb) { |
| DCHECK(task_runner_->BelongsToCurrentThread()); |
| base::AutoLock auto_lock(lock_); |
| DCHECK(stream); |
| DCHECK_EQ(stream->type(), DemuxerStream::VIDEO); |
| DCHECK(!init_cb.is_null()); |
| - DCHECK(!statistics_cb.is_null()); |
| - DCHECK(!buffering_state_cb.is_null()); |
| - DCHECK(!ended_cb.is_null()); |
| DCHECK(!wall_clock_time_cb.is_null()); |
| DCHECK_EQ(kUninitialized, state_); |
| DCHECK(!render_first_frame_and_stop_); |
| @@ -154,21 +149,17 @@ void VideoRendererImpl::Initialize( |
| // failed. |
| init_cb_ = BindToCurrentLoop(init_cb); |
| - // Always post |buffering_state_cb_| because it may otherwise invoke reentrant |
| - // calls to OnTimeStateChanged() under lock, which can deadlock the compositor |
| - // and media threads. |
| - buffering_state_cb_ = BindToCurrentLoop(buffering_state_cb); |
| - |
| - statistics_cb_ = statistics_cb; |
| - ended_cb_ = ended_cb; |
| - error_cb_ = error_cb; |
| + client_ = client; |
| wall_clock_time_cb_ = wall_clock_time_cb; |
| state_ = kInitializing; |
| video_frame_stream_->Initialize( |
| stream, base::Bind(&VideoRendererImpl::OnVideoFrameStreamInitialized, |
| weak_factory_.GetWeakPtr()), |
| - cdm_context, statistics_cb, waiting_for_decryption_key_cb); |
| + cdm_context, base::Bind(&VideoRendererImpl::OnStatisticsUpdate, |
| + weak_factory_.GetWeakPtr()), |
| + base::Bind(&VideoRendererImpl::OnWaitingForDecryptionKey, |
| + weak_factory_.GetWeakPtr())); |
| } |
| scoped_refptr<VideoFrame> VideoRendererImpl::Render( |
| @@ -276,6 +267,21 @@ void VideoRendererImpl::OnVideoFrameStreamInitialized(bool success) { |
| base::ResetAndReturn(&init_cb_).Run(PIPELINE_OK); |
| } |
| +void VideoRendererImpl::OnPlaybackEnded() { |
| + DCHECK(task_runner_->BelongsToCurrentThread()); |
| + client_->OnEnded(); |
| +} |
| + |
| +void VideoRendererImpl::OnStatisticsUpdate(const PipelineStatistics& stats) { |
| + DCHECK(task_runner_->BelongsToCurrentThread()); |
| + client_->OnStatisticsUpdate(stats); |
| +} |
| + |
| +void VideoRendererImpl::OnWaitingForDecryptionKey() { |
| + DCHECK(task_runner_->BelongsToCurrentThread()); |
| + client_->OnWaitingForDecryptionKey(); |
| +} |
| + |
| void VideoRendererImpl::SetTickClockForTesting( |
| std::unique_ptr<base::TickClock> tick_clock) { |
| tick_clock_.swap(tick_clock); |
| @@ -356,8 +362,7 @@ void VideoRendererImpl::FrameReady(uint32_t sequence_token, |
| if (status == VideoFrameStream::DECODE_ERROR) { |
| DCHECK(!frame); |
| - PipelineStatus error = PIPELINE_ERROR_DECODE; |
| - task_runner_->PostTask(FROM_HERE, base::Bind(error_cb_, error)); |
| + client_->OnError(PIPELINE_ERROR_DECODE); |
|
xhwang
2016/05/09 18:13:23
The old code posts the callback (probably because
alokp
2016/05/09 21:31:44
Done.
|
| return; |
| } |
| @@ -451,7 +456,7 @@ void VideoRendererImpl::TransitionToHaveEnough_Locked() { |
| lock_.AssertAcquired(); |
| buffering_state_ = BUFFERING_HAVE_ENOUGH; |
| - buffering_state_cb_.Run(BUFFERING_HAVE_ENOUGH); |
| + client_->OnBufferingStateChange(buffering_state_); |
|
xhwang
2016/05/09 18:13:23
The old |buffering_state_cb_| involves a post (Bin
alokp
2016/05/09 21:31:44
Done.
|
| } |
| void VideoRendererImpl::TransitionToHaveNothing() { |
| @@ -462,7 +467,7 @@ void VideoRendererImpl::TransitionToHaveNothing() { |
| return; |
| buffering_state_ = BUFFERING_HAVE_NOTHING; |
| - buffering_state_cb_.Run(BUFFERING_HAVE_NOTHING); |
| + client_->OnBufferingStateChange(buffering_state_); |
|
xhwang
2016/05/09 18:13:23
ditto about post
alokp
2016/05/09 21:31:44
Done.
|
| } |
| void VideoRendererImpl::AddReadyFrame_Locked( |
| @@ -539,7 +544,9 @@ void VideoRendererImpl::UpdateStats_Locked() { |
| const size_t memory_usage = algorithm_->GetMemoryUsage(); |
| statistics.video_memory_usage = memory_usage - last_video_memory_usage_; |
| - task_runner_->PostTask(FROM_HERE, base::Bind(statistics_cb_, statistics)); |
| + task_runner_->PostTask(FROM_HERE, |
| + base::Bind(&VideoRendererImpl::OnStatisticsUpdate, |
| + weak_factory_.GetWeakPtr(), statistics)); |
| frames_decoded_ = 0; |
| frames_dropped_ = 0; |
| last_video_memory_usage_ = memory_usage; |
| @@ -604,7 +611,9 @@ void VideoRendererImpl::MaybeFireEndedCallback_Locked(bool time_progressing) { |
| (algorithm_->frames_queued() == 1u && |
| algorithm_->average_frame_duration().is_zero())) { |
| rendered_end_of_stream_ = true; |
| - task_runner_->PostTask(FROM_HERE, ended_cb_); |
| + task_runner_->PostTask(FROM_HERE, |
| + base::Bind(&VideoRendererImpl::OnPlaybackEnded, |
| + weak_factory_.GetWeakPtr())); |
| } |
| } |