summaryrefslogtreecommitdiffstats
path: root/chromecast
diff options
context:
space:
mode:
authoralokp <alokp@chromium.org>2016-03-01 14:37:10 -0800
committerCommit bot <commit-bot@chromium.org>2016-03-01 22:38:45 +0000
commitcc14ee1868e8b61fbf714f30b0f1808a55cbd755 (patch)
tree6cbcccbb1d369e60b2f917109740159d6b01ac0b /chromecast
parentd20e8f05588bdcc60a94d91f767a08c9bb44fc92 (diff)
downloadchromium_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.cc19
-rw-r--r--chromecast/browser/media/cast_renderer.h5
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);
};