Index: media/mojo/clients/mojo_renderer_impl.cc |
diff --git a/media/mojo/clients/mojo_renderer_impl.cc b/media/mojo/clients/mojo_renderer_impl.cc |
index f407b89c57c7a98bcfa6b465b0911ad4d7631049..acb1c67c46f8681061de6e41f5ec090055545ea9 100644 |
--- a/media/mojo/clients/mojo_renderer_impl.cc |
+++ b/media/mojo/clients/mojo_renderer_impl.cc |
@@ -13,8 +13,10 @@ |
#include "media/base/demuxer_stream_provider.h" |
#include "media/base/renderer_client.h" |
#include "media/base/video_renderer_sink.h" |
+#include "media/media_features.h" |
#include "media/mojo/clients/mojo_demuxer_stream_impl.h" |
#include "media/renderers/video_overlay_factory.h" |
+#include "mojo/common/url_type_converters.h" |
namespace media { |
@@ -27,7 +29,8 @@ MojoRendererImpl::MojoRendererImpl( |
video_overlay_factory_(std::move(video_overlay_factory)), |
video_renderer_sink_(video_renderer_sink), |
remote_renderer_info_(remote_renderer.PassInterface()), |
- binding_(this) { |
+ binding_(this), |
+ surface_id_(-1) { |
DVLOG(1) << __FUNCTION__; |
} |
@@ -48,6 +51,20 @@ void MojoRendererImpl::Initialize( |
client_ = client; |
init_cb_ = init_cb; |
+ if (!request_surface_cb_.is_null()) { |
+ task_runner_->PostTask( |
+ FROM_HERE, base::Bind(request_surface_cb_, |
+ base::Bind(&MojoRendererImpl::OnSurfaceCreated, |
+ base::Unretained(this)))); |
+ } else { |
+ InitializeRenderer(); |
+ } |
+} |
+ |
+void MojoRendererImpl::InitializeRenderer() { |
+ DVLOG(1) << __FUNCTION__; |
+ DCHECK(task_runner_->BelongsToCurrentThread()); |
+ |
// Create audio and video mojom::DemuxerStream and bind its lifetime to |
// the pipe. |
DemuxerStream* const audio = |
@@ -70,10 +87,20 @@ void MojoRendererImpl::Initialize( |
// |remote_renderer_| is destroyed. |
remote_renderer_->Initialize( |
binding_.CreateInterfacePtrAndBind(), std::move(audio_stream), |
- std::move(video_stream), |
+ std::move(video_stream), mojo::String::From(url_), surface_id_, |
base::Bind(&MojoRendererImpl::OnInitialized, base::Unretained(this))); |
} |
+void MojoRendererImpl::OnSurfaceCreated(int surface_id) { |
+ DVLOG(2) << __FUNCTION__; |
+ |
+ surface_id_ = surface_id; |
+ |
+ task_runner_->PostTask(FROM_HERE, |
+ base::Bind(&MojoRendererImpl::InitializeRenderer, |
+ base::Unretained(this))); |
+} |
+ |
void MojoRendererImpl::SetCdm(CdmContext* cdm_context, |
const CdmAttachedCB& cdm_attached_cb) { |
DVLOG(1) << __FUNCTION__; |
@@ -179,11 +206,21 @@ void MojoRendererImpl::OnVideoNaturalSizeChange(const gfx::Size& size) { |
DVLOG(2) << __FUNCTION__ << ": " << size.ToString(); |
DCHECK(task_runner_->BelongsToCurrentThread()); |
+#if !BUILDFLAG(FORCE_MOJO_MEDIA_PLAYER_RENDERER) |
+ // TODO(tguilbert): Investigate why this line crashes when using the |
+ // MediaPlayerRenderer. |
video_renderer_sink_->PaintSingleFrame( |
video_overlay_factory_->CreateFrame(size)); |
+#endif |
+ |
client_->OnVideoNaturalSizeChange(size); |
} |
+void MojoRendererImpl::OnDurationChange(int64_t duration_usec) { |
+ DVLOG(2) << __FUNCTION__ << ": duration" << duration_usec; |
+ client_->OnDurationChange(base::TimeDelta::FromMicroseconds(duration_usec)); |
+} |
+ |
void MojoRendererImpl::OnVideoOpacityChange(bool opaque) { |
DVLOG(2) << __FUNCTION__ << ": " << opaque; |
DCHECK(task_runner_->BelongsToCurrentThread()); |
@@ -230,4 +267,15 @@ void MojoRendererImpl::OnInitialized(bool success) { |
success ? PIPELINE_OK : PIPELINE_ERROR_INITIALIZATION_FAILED); |
} |
+#if defined(OS_ANDROID) |
+void MojoRendererImpl::SetUrl(const GURL& url) { |
+ url_ = url; |
+} |
+ |
+void MojoRendererImpl::SetRequestSurfaceCB( |
+ const RequestSurfaceCB& request_surface_cb) { |
+ request_surface_cb_ = request_surface_cb; |
+} |
+#endif |
+ |
} // namespace media |