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

Unified Diff: content/renderer/media/android/media_player_renderer_client.cc

Issue 2230583002: Add MediaPlayerRenderer/MediaPlayerRendererClient (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added MEDIA_EXPORT. Created 4 years, 4 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: content/renderer/media/android/media_player_renderer_client.cc
diff --git a/content/renderer/media/android/media_player_renderer_client.cc b/content/renderer/media/android/media_player_renderer_client.cc
new file mode 100644
index 0000000000000000000000000000000000000000..19b3c68570db15044c896b4b9f9182e45950457d
--- /dev/null
+++ b/content/renderer/media/android/media_player_renderer_client.cc
@@ -0,0 +1,154 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/renderer/media/android/media_player_renderer_client.h"
+
+#include "base/callback_helpers.h"
+
+namespace content {
+
+MediaPlayerRendererClient::MediaPlayerRendererClient(
+ scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
+ scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner,
+ media::MojoRenderer* mojo_renderer,
+ media::ScopedStreamTextureWrapper stream_texture_wrapper,
+ media::VideoRendererSink* sink)
+ : mojo_renderer_(mojo_renderer),
+ stream_texture_wrapper_(std::move(stream_texture_wrapper)),
+ client_(nullptr),
+ sink_(sink),
+ media_task_runner_(std::move(media_task_runner)),
+ compositor_task_runner_(std::move(compositor_task_runner)),
+ weak_factory_(this) {}
+
+MediaPlayerRendererClient::~MediaPlayerRendererClient() {}
+
+void MediaPlayerRendererClient::Initialize(
+ media::DemuxerStreamProvider* demuxer_stream_provider,
+ media::RendererClient* client,
+ const media::PipelineStatusCB& init_cb) {
+ DCHECK(media_task_runner_->BelongsToCurrentThread());
+ DCHECK(!init_cb_);
+
+ client_ = client;
+ init_cb_ = init_cb;
+
+ // Initialize the StreamTexture using a 1x1 texture because we do not have
+ // any size information from the MediaPlayer yet.
+ // The size will be automatically updated in OnVideoNaturalSizeChange() once
+ // we parse the media's metadata.
+ // Unretained is safe here because |stream_texture_wrapper_| resets the
+ // Closure it has before destroying itself on |compositor_task_runner_|,
+ // and |this| is garanteed to live until the Closure has been reset.
+ stream_texture_wrapper_->Initialize(
+ base::Bind(&MediaPlayerRendererClient::OnFrameAvailable,
+ base::Unretained(this)),
+ gfx::Size(1, 1), compositor_task_runner_,
+ base::Bind(&MediaPlayerRendererClient::InitializeRemoteRenderer,
+ weak_factory_.GetWeakPtr(), demuxer_stream_provider));
+}
+
+void MediaPlayerRendererClient::InitializeRemoteRenderer(
+ media::DemuxerStreamProvider* demuxer_stream_provider) {
+ DCHECK(media_task_runner_->BelongsToCurrentThread());
+ mojo_renderer_->Initialize(
+ demuxer_stream_provider, this,
+ base::Bind(&MediaPlayerRendererClient::CompleteInitialization,
+ weak_factory_.GetWeakPtr()));
+}
+
+void MediaPlayerRendererClient::CompleteInitialization(
+ media::PipelineStatus status) {
+ DCHECK(media_task_runner_->BelongsToCurrentThread());
+ DCHECK(!init_cb_.is_null());
+
+ // TODO(tguilbert): Register |stream_texture_wrapper_|'s surface and send it
+ // to MediaPlayerRenderer via |mojo_renderer_|. See crbug.com/627658.
+
+ base::ResetAndReturn(&init_cb_).Run(status);
+}
+
+void MediaPlayerRendererClient::SetCdm(
+ media::CdmContext* cdm_context,
+ const media::CdmAttachedCB& cdm_attached_cb) {
+ NOTREACHED();
+}
+
+void MediaPlayerRendererClient::Flush(const base::Closure& flush_cb) {
+ mojo_renderer_->Flush(flush_cb);
+}
+
+void MediaPlayerRendererClient::StartPlayingFrom(base::TimeDelta time) {
+ mojo_renderer_->StartPlayingFrom(time);
+}
+
+void MediaPlayerRendererClient::SetPlaybackRate(double playback_rate) {
+ mojo_renderer_->SetPlaybackRate(playback_rate);
+}
+
+void MediaPlayerRendererClient::SetVolume(float volume) {
+ mojo_renderer_->SetVolume(volume);
+}
+
+base::TimeDelta MediaPlayerRendererClient::GetMediaTime() {
+ return mojo_renderer_->GetMediaTime();
+}
+
+bool MediaPlayerRendererClient::HasAudio() {
+ // We do not know whether or not the media has Audio before starting playback.
+ // Conservatively assume we do.
+ // TODO(tguilbert): Consider using MIME types to determine presence of audio.
+ // Alternatively, consider piping the HasAudio() from the MediaPlayerRenderer
+ // through the mojo::Renderer interface.
+ return true;
+}
+
+bool MediaPlayerRendererClient::HasVideo() {
+ // We do not know whether or not the media has Video before starting playback.
+ // Conservatively assume we do.
+ // TODO(tguilbert): Consider using MIME types to determine presence of video.
+ // Alternatively, consider piping the HasVideo() from the MediaPlayerRenderer
+ // through the mojo::Renderer interface.
+ return true;
+}
+
+void MediaPlayerRendererClient::OnFrameAvailable() {
+ DCHECK(compositor_task_runner_->BelongsToCurrentThread());
+ // TODO(tguilbert): Force the repaint of the same frame. See crbug.com/636002.
+ sink_->PaintSingleFrame(stream_texture_wrapper_->GetCurrentFrame());
+}
+
+void MediaPlayerRendererClient::OnError(media::PipelineStatus status) {
+ client_->OnError(status);
+}
+
+void MediaPlayerRendererClient::OnEnded() {
+ client_->OnEnded();
+}
+
+void MediaPlayerRendererClient::OnStatisticsUpdate(
+ const media::PipelineStatistics& stats) {
+ client_->OnStatisticsUpdate(stats);
+}
+
+void MediaPlayerRendererClient::OnBufferingStateChange(
+ media::BufferingState state) {
+ client_->OnBufferingStateChange(state);
+}
+
+void MediaPlayerRendererClient::OnWaitingForDecryptionKey() {
+ client_->OnWaitingForDecryptionKey();
+}
+
+void MediaPlayerRendererClient::OnVideoNaturalSizeChange(
+ const gfx::Size& size) {
+ stream_texture_wrapper_->UpdateTextureSize(size);
+ client_->OnVideoNaturalSizeChange(size);
+}
+
+void MediaPlayerRendererClient::OnVideoOpacityChange(bool opaque) {
+ client_->OnVideoOpacityChange(opaque);
+}
+
+} // namespace content

Powered by Google App Engine
This is Rietveld 408576698