| Index: content/renderer/render_frame_impl.cc
 | 
| diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
 | 
| index 096178bc478602062e296a870d92c7a362397750..e38df5765143bdb55d98b7d4da75a5f095ac594f 100644
 | 
| --- a/content/renderer/render_frame_impl.cc
 | 
| +++ b/content/renderer/render_frame_impl.cc
 | 
| @@ -250,6 +250,11 @@
 | 
|  #include "media/mojo/clients/mojo_decoder_factory.h"  // nogncheck
 | 
|  #endif
 | 
|  
 | 
| +#if BUILDFLAG(ENABLE_MEDIA_REMOTING)
 | 
| +#include "media/remoting/remoting_controller.h"        // nogncheck
 | 
| +#include "media/remoting/remoting_renderer_factory.h"  // nogncheck
 | 
| +#endif
 | 
| +
 | 
|  using base::Time;
 | 
|  using base::TimeDelta;
 | 
|  using blink::WebCachePolicy;
 | 
| @@ -2645,6 +2650,20 @@ blink::WebPlugin* RenderFrameImpl::createPlugin(
 | 
|  #endif  // defined(ENABLE_PLUGINS)
 | 
|  }
 | 
|  
 | 
| +#if BUILDFLAG(ENABLE_MEDIA_REMOTING)
 | 
| +std::unique_ptr<media::RemotingController>
 | 
| +RenderFrameImpl::CreateRemotingController() {
 | 
| +  media::mojom::RemotingSourcePtr remoting_source;
 | 
| +  media::mojom::RemotingSourceRequest remoting_source_request =
 | 
| +      mojo::GetProxy(&remoting_source);
 | 
| +  media::mojom::RemoterPtr remoter;
 | 
| +  GetRemoterFactory()->Create(std::move(remoting_source),
 | 
| +                              mojo::GetProxy(&remoter));
 | 
| +  return base::MakeUnique<media::RemotingController>(
 | 
| +      std::move(remoting_source_request), std::move(remoter));
 | 
| +}
 | 
| +#endif
 | 
| +
 | 
|  blink::WebMediaPlayer* RenderFrameImpl::createMediaPlayer(
 | 
|      const blink::WebMediaPlayerSource& source,
 | 
|      WebMediaPlayerClient* client,
 | 
| @@ -2683,7 +2702,17 @@ blink::WebMediaPlayer* RenderFrameImpl::createMediaPlayer(
 | 
|  #if defined(OS_ANDROID)
 | 
|    if (UseWebMediaPlayerImpl(url) && !media_surface_manager_)
 | 
|      media_surface_manager_ = new RendererSurfaceViewManager(this);
 | 
| +#endif  // defined(OS_ANDROID)
 | 
| +
 | 
| +#if BUILDFLAG(ENABLE_MEDIA_REMOTING)
 | 
| +  std::unique_ptr<media::RemotingController> remoting_controller =
 | 
| +      CreateRemotingController();
 | 
| +  base::WeakPtr<media::MediaObserver> media_observer =
 | 
| +      remoting_controller->GetWeakPtr();
 | 
| +#else
 | 
| +  base::WeakPtr<media::MediaObserver> media_observer = nullptr;
 | 
|  #endif
 | 
| +
 | 
|    media::WebMediaPlayerParams params(
 | 
|        base::Bind(&ContentRendererClient::DeferMediaLoad,
 | 
|                   base::Unretained(GetContentClient()->renderer()),
 | 
| @@ -2694,7 +2723,7 @@ blink::WebMediaPlayer* RenderFrameImpl::createMediaPlayer(
 | 
|        render_thread->compositor_task_runner(), context_3d_cb,
 | 
|        base::Bind(&v8::Isolate::AdjustAmountOfExternalAllocatedMemory,
 | 
|                   base::Unretained(blink::mainThreadIsolate())),
 | 
| -      initial_cdm, media_surface_manager_);
 | 
| +      initial_cdm, media_surface_manager_, media_observer);
 | 
|  
 | 
|  #if defined(OS_ANDROID)
 | 
|    if (!UseWebMediaPlayerImpl(url)) {
 | 
| @@ -2714,16 +2743,18 @@ blink::WebMediaPlayer* RenderFrameImpl::createMediaPlayer(
 | 
|            media_log, GetDecoderFactory(),
 | 
|            base::Bind(&RenderThreadImpl::GetGpuFactories,
 | 
|                       base::Unretained(render_thread))));
 | 
| -#endif  // defined(ENABLE_MOJO_RENDERER)
 | 
| +#endif
 | 
| +
 | 
| +#if BUILDFLAG(ENABLE_MEDIA_REMOTING)
 | 
| +  media::RemotingController* remoting_controller_ptr =
 | 
| +      remoting_controller.get();
 | 
| +  media_renderer_factory = base::MakeUnique<media::RemotingRendererFactory>(
 | 
| +      std::move(media_renderer_factory), std::move(remoting_controller));
 | 
| +#endif
 | 
|  
 | 
|    if (!url_index_.get() || url_index_->frame() != frame_)
 | 
|      url_index_.reset(new media::UrlIndex(frame_));
 | 
|  
 | 
| -  // TODO(miu): In a soon-upcoming change, call GetRemoterFactory()->Create() to
 | 
| -  // allow the local media pipeline to receive notifications about when Media
 | 
| -  // Remoting can take place. Control logic in/around WebMediaPlayerImpl will
 | 
| -  // implement media.mojom.RemotingSource. http://crbug.com/643964
 | 
| -
 | 
|    media::WebMediaPlayerImpl* media_player = new media::WebMediaPlayerImpl(
 | 
|        frame_, client, encrypted_client,
 | 
|        GetWebMediaPlayerDelegate()->AsWeakPtr(),
 | 
| @@ -2732,6 +2763,11 @@ blink::WebMediaPlayer* RenderFrameImpl::createMediaPlayer(
 | 
|  #if defined(OS_ANDROID)  // WMPI_CAST
 | 
|    media_player->SetMediaPlayerManager(GetMediaPlayerManager());
 | 
|    media_player->SetDeviceScaleFactor(render_view_->GetDeviceScaleFactor());
 | 
| +#endif  // defined(OS_ANDROID)
 | 
| +
 | 
| +#if BUILDFLAG(ENABLE_MEDIA_REMOTING)
 | 
| +  remoting_controller_ptr->SetSwitchRendererCallback(base::Bind(
 | 
| +      &media::WebMediaPlayerImpl::ScheduleRestart, media_player->AsWeakPtr()));
 | 
|  #endif
 | 
|  
 | 
|    return media_player;
 | 
| @@ -6282,11 +6318,13 @@ bool RenderFrameImpl::AreSecureCodecsSupported() {
 | 
|  #endif  // defined(OS_ANDROID)
 | 
|  }
 | 
|  
 | 
| +#if BUILDFLAG(ENABLE_MEDIA_REMOTING)
 | 
|  media::mojom::RemoterFactory* RenderFrameImpl::GetRemoterFactory() {
 | 
|    if (!remoter_factory_)
 | 
|      GetRemoteInterfaces()->GetInterface(&remoter_factory_);
 | 
|    return remoter_factory_.get();
 | 
|  }
 | 
| +#endif
 | 
|  
 | 
|  media::CdmFactory* RenderFrameImpl::GetCdmFactory() {
 | 
|    if (cdm_factory_)
 | 
| 
 |