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

Unified Diff: media/renderers/video_renderer_impl.cc

Issue 1955843002: Move Renderer permanent callbacks into RendererClient interface. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 7 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
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()));
}
}
« media/renderers/video_renderer_impl.h ('K') | « media/renderers/video_renderer_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698