diff options
author | alokp <alokp@chromium.org> | 2016-03-01 14:37:10 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-03-01 22:38:45 +0000 |
commit | cc14ee1868e8b61fbf714f30b0f1808a55cbd755 (patch) | |
tree | 6cbcccbb1d369e60b2f917109740159d6b01ac0b /chromecast | |
parent | d20e8f05588bdcc60a94d91f767a08c9bb44fc92 (diff) | |
download | chromium_src-cc14ee1868e8b61fbf714f30b0f1808a55cbd755.zip chromium_src-cc14ee1868e8b61fbf714f30b0f1808a55cbd755.tar.gz chromium_src-cc14ee1868e8b61fbf714f30b0f1808a55cbd755.tar.bz2 |
[chromecast] Combine audio and video eos notification to report end of playback.
CastRenderer, which is only used for media playback using mojo pipeline,
will replace CmaRenderer. Some of the logic in CmaRenderer, like this one,
needs to be duplicated here. Alternative would be move this logic to
MediPipelineImpl, but that would require touching a lot code including IPC,
which will be deprecated soon. I have decided make a local change in
CastRenderer for now. It might be moved elsewhere when CmaRenderer is deprecated.
BUG=571155
Review URL: https://codereview.chromium.org/1753513002
Cr-Commit-Position: refs/heads/master@{#378579}
Diffstat (limited to 'chromecast')
-rw-r--r-- | chromecast/browser/media/cast_renderer.cc | 19 | ||||
-rw-r--r-- | chromecast/browser/media/cast_renderer.h | 5 |
2 files changed, 22 insertions, 2 deletions
diff --git a/chromecast/browser/media/cast_renderer.cc b/chromecast/browser/media/cast_renderer.cc index c2f458c..badc7cb 100644 --- a/chromecast/browser/media/cast_renderer.cc +++ b/chromecast/browser/media/cast_renderer.cc @@ -85,7 +85,8 @@ void CastRenderer::Initialize( if (audio_stream) { AvPipelineClient audio_client; audio_client.wait_for_key_cb = waiting_for_decryption_key_cb; - audio_client.eos_cb = ended_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; scoped_ptr<CodedFrameProvider> frame_provider(new DemuxerStreamAdapter( @@ -107,7 +108,8 @@ void CastRenderer::Initialize( // 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 = ended_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; // TODO(alokp): Change MediaPipelineImpl API to accept a single config @@ -124,6 +126,7 @@ void CastRenderer::Initialize( } } + ended_cb_ = ended_cb; init_cb.Run(::media::PIPELINE_OK); } @@ -140,6 +143,9 @@ void CastRenderer::Flush(const base::Closure& flush_cb) { void CastRenderer::StartPlayingFrom(base::TimeDelta time) { DCHECK(task_runner_->BelongsToCurrentThread()); + + eos_[STREAM_AUDIO] = !pipeline_->HasAudio(); + eos_[STREAM_VIDEO] = !pipeline_->HasVideo(); pipeline_->StartPlayingFrom(time); } @@ -168,5 +174,14 @@ bool CastRenderer::HasVideo() { return pipeline_->HasVideo(); } +void CastRenderer::OnEos(Stream stream) { + 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(); +} + } // namespace media } // namespace chromecast diff --git a/chromecast/browser/media/cast_renderer.h b/chromecast/browser/media/cast_renderer.h index 1e83951..01872dc 100644 --- a/chromecast/browser/media/cast_renderer.h +++ b/chromecast/browser/media/cast_renderer.h @@ -45,11 +45,16 @@ class CastRenderer : public ::media::Renderer { bool HasVideo() final; private: + enum Stream { STREAM_AUDIO, STREAM_VIDEO }; + void OnEos(Stream stream); + scoped_refptr<CmaMediaPipelineClient> pipeline_client_; scoped_refptr<base::SingleThreadTaskRunner> task_runner_; scoped_refptr<BalancedMediaTaskRunnerFactory> media_task_runner_factory_; scoped_ptr<TaskRunnerImpl> backend_task_runner_; scoped_ptr<MediaPipelineImpl> pipeline_; + bool eos_[2]; + base::Closure ended_cb_; DISALLOW_COPY_AND_ASSIGN(CastRenderer); }; |