Index: chromecast/browser/media/cast_renderer.cc |
diff --git a/chromecast/browser/media/cast_renderer.cc b/chromecast/browser/media/cast_renderer.cc |
index a6d3c3a293deee95d3dcc2396c4d095c577a35f6..3cd2b9638fab5df09d2d975faa469ea4e52807a8 100644 |
--- a/chromecast/browser/media/cast_renderer.cc |
+++ b/chromecast/browser/media/cast_renderer.cc |
@@ -32,8 +32,10 @@ CastRenderer::CastRenderer( |
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) |
: create_backend_cb_(create_backend_cb), |
task_runner_(task_runner), |
+ client_(nullptr), |
media_task_runner_factory_( |
- new BalancedMediaTaskRunnerFactory(kMaxDeltaFetcher)) { |
+ new BalancedMediaTaskRunnerFactory(kMaxDeltaFetcher)), |
+ weak_factory_(this) { |
CMALOG(kLogControl) << __FUNCTION__ << ": " << this; |
} |
@@ -44,12 +46,8 @@ CastRenderer::~CastRenderer() { |
void CastRenderer::Initialize( |
::media::DemuxerStreamProvider* demuxer_stream_provider, |
- const ::media::PipelineStatusCB& init_cb, |
- const ::media::StatisticsCB& statistics_cb, |
- const ::media::BufferingStateCB& buffering_state_cb, |
- const base::Closure& ended_cb, |
- const ::media::PipelineStatusCB& error_cb, |
- const base::Closure& waiting_for_decryption_key_cb) { |
+ ::media::RendererClient* client, |
+ const ::media::PipelineStatusCB& init_cb) { |
CMALOG(kLogControl) << __FUNCTION__ << ": " << this; |
DCHECK(task_runner_->BelongsToCurrentThread()); |
@@ -67,8 +65,10 @@ void CastRenderer::Initialize( |
// Create pipeline. |
MediaPipelineClient pipeline_client; |
- pipeline_client.error_cb = error_cb; |
- pipeline_client.buffering_state_cb = buffering_state_cb; |
+ pipeline_client.error_cb = |
+ base::Bind(&CastRenderer::OnError, weak_factory_.GetWeakPtr()); |
+ pipeline_client.buffering_state_cb = base::Bind( |
+ &CastRenderer::OnBufferingStateChange, weak_factory_.GetWeakPtr()); |
pipeline_.reset(new MediaPipelineImpl); |
pipeline_->SetClient(pipeline_client); |
pipeline_->Initialize(load_type, std::move(backend)); |
@@ -78,11 +78,14 @@ void CastRenderer::Initialize( |
demuxer_stream_provider->GetStream(::media::DemuxerStream::AUDIO); |
if (audio_stream) { |
AvPipelineClient audio_client; |
- audio_client.wait_for_key_cb = waiting_for_decryption_key_cb; |
- audio_client.eos_cb = |
- base::Bind(&CastRenderer::OnEos, base::Unretained(this), STREAM_AUDIO); |
- audio_client.playback_error_cb = error_cb; |
- audio_client.statistics_cb = statistics_cb; |
+ audio_client.wait_for_key_cb = base::Bind( |
+ &CastRenderer::OnWaitingForDecryptionKey, weak_factory_.GetWeakPtr()); |
+ audio_client.eos_cb = base::Bind(&CastRenderer::OnEnded, |
+ weak_factory_.GetWeakPtr(), STREAM_AUDIO); |
+ audio_client.playback_error_cb = |
+ base::Bind(&CastRenderer::OnError, weak_factory_.GetWeakPtr()); |
+ audio_client.statistics_cb = base::Bind(&CastRenderer::OnStatisticsUpdate, |
+ weak_factory_.GetWeakPtr()); |
std::unique_ptr<CodedFrameProvider> frame_provider(new DemuxerStreamAdapter( |
task_runner_, media_task_runner_factory_, audio_stream)); |
::media::PipelineStatus status = |
@@ -101,12 +104,14 @@ void CastRenderer::Initialize( |
if (video_stream) { |
VideoPipelineClient video_client; |
// TODO(alokp): Set VideoPipelineClient::natural_size_changed_cb. |
- video_client.av_pipeline_client.wait_for_key_cb = |
- waiting_for_decryption_key_cb; |
- video_client.av_pipeline_client.eos_cb = |
- base::Bind(&CastRenderer::OnEos, base::Unretained(this), STREAM_VIDEO); |
- video_client.av_pipeline_client.playback_error_cb = error_cb; |
- video_client.av_pipeline_client.statistics_cb = statistics_cb; |
+ video_client.av_pipeline_client.wait_for_key_cb = base::Bind( |
+ &CastRenderer::OnWaitingForDecryptionKey, weak_factory_.GetWeakPtr()); |
+ video_client.av_pipeline_client.eos_cb = base::Bind( |
+ &CastRenderer::OnEnded, weak_factory_.GetWeakPtr(), STREAM_VIDEO); |
+ video_client.av_pipeline_client.playback_error_cb = |
+ base::Bind(&CastRenderer::OnError, weak_factory_.GetWeakPtr()); |
+ video_client.av_pipeline_client.statistics_cb = base::Bind( |
+ &CastRenderer::OnStatisticsUpdate, weak_factory_.GetWeakPtr()); |
// TODO(alokp): Change MediaPipelineImpl API to accept a single config |
// after CmaRenderer is deprecated. |
std::vector<::media::VideoDecoderConfig> video_configs; |
@@ -122,7 +127,7 @@ void CastRenderer::Initialize( |
video_stream->EnableBitstreamConverter(); |
} |
- ended_cb_ = ended_cb; |
+ client_ = client; |
init_cb.Run(::media::PIPELINE_OK); |
} |
@@ -170,13 +175,35 @@ bool CastRenderer::HasVideo() { |
return pipeline_->HasVideo(); |
} |
-void CastRenderer::OnEos(Stream stream) { |
+void CastRenderer::OnError(::media::PipelineStatus status) { |
+ DCHECK(task_runner_->BelongsToCurrentThread()); |
+ client_->OnError(status); |
+} |
+ |
+void CastRenderer::OnEnded(Stream stream) { |
+ DCHECK(task_runner_->BelongsToCurrentThread()); |
DCHECK(!eos_[stream]); |
eos_[stream] = true; |
CMALOG(kLogControl) << __FUNCTION__ << ": eos_audio=" << eos_[STREAM_AUDIO] |
<< " eos_video=" << eos_[STREAM_VIDEO]; |
if (eos_[STREAM_AUDIO] && eos_[STREAM_VIDEO]) |
- ended_cb_.Run(); |
+ client_->OnEnded(); |
+} |
+ |
+void CastRenderer::OnStatisticsUpdate( |
+ const ::media::PipelineStatistics& stats) { |
+ DCHECK(task_runner_->BelongsToCurrentThread()); |
+ client_->OnStatisticsUpdate(stats); |
+} |
+ |
+void CastRenderer::OnBufferingStateChange(::media::BufferingState state) { |
+ DCHECK(task_runner_->BelongsToCurrentThread()); |
+ client_->OnBufferingStateChange(state); |
+} |
+ |
+void CastRenderer::OnWaitingForDecryptionKey() { |
+ DCHECK(task_runner_->BelongsToCurrentThread()); |
+ client_->OnWaitingForDecryptionKey(); |
} |
} // namespace media |