| Index: media/remoting/remoting_renderer_controller.cc
|
| diff --git a/media/remoting/remoting_renderer_controller.cc b/media/remoting/remoting_renderer_controller.cc
|
| index 5f0d37eacdbc7a5939d49d5b0941e7077d07da8f..5e3a6ce896975d7d6064edd70bb2e9889f0871bb 100644
|
| --- a/media/remoting/remoting_renderer_controller.cc
|
| +++ b/media/remoting/remoting_renderer_controller.cc
|
| @@ -7,10 +7,21 @@
|
| #include "base/bind.h"
|
| #include "base/logging.h"
|
| #include "base/threading/thread_checker.h"
|
| +#include "media/base/video_util.h"
|
| #include "media/remoting/remoting_cdm_context.h"
|
|
|
| namespace media {
|
|
|
| +namespace {
|
| +
|
| +gfx::Size GetRotatedVideoSize(VideoRotation rotation, gfx::Size natural_size) {
|
| + if (rotation == VIDEO_ROTATION_90 || rotation == VIDEO_ROTATION_270)
|
| + return gfx::Size(natural_size.height(), natural_size.width());
|
| + return natural_size;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| RemotingRendererController::RemotingRendererController(
|
| scoped_refptr<RemotingSourceImpl> remoting_source)
|
| : remoting_source_(remoting_source), weak_factory_(this) {
|
| @@ -43,6 +54,10 @@ void RemotingRendererController::OnSessionStateChanged() {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
|
|
| VLOG(1) << "OnSessionStateChanged: " << remoting_source_->state();
|
| + if (remoting_source_->state() ==
|
| + RemotingSessionState::SESSION_PERMANENTLY_STOPPED)
|
| + UpdateAndMaybeShowInterstitial();
|
| +
|
| UpdateAndMaybeSwitch();
|
| }
|
|
|
| @@ -103,17 +118,22 @@ void RemotingRendererController::OnMetadataChanged(
|
| const PipelineMetadata& metadata) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
|
|
| + const gfx::Size old_size = pipeline_metadata_.natural_size;
|
| pipeline_metadata_ = metadata;
|
|
|
| is_encrypted_ = false;
|
| if (has_video()) {
|
| - video_decoder_config_ = metadata.video_decoder_config;
|
| - is_encrypted_ |= video_decoder_config_.is_encrypted();
|
| + is_encrypted_ |= metadata.video_decoder_config.is_encrypted();
|
| + pipeline_metadata_.natural_size = GetRotatedVideoSize(
|
| + pipeline_metadata_.video_rotation, pipeline_metadata_.natural_size);
|
| }
|
| if (has_audio()) {
|
| - audio_decoder_config_ = metadata.audio_decoder_config;
|
| - is_encrypted_ |= audio_decoder_config_.is_encrypted();
|
| + is_encrypted_ |= metadata.audio_decoder_config.is_encrypted();
|
| }
|
| +
|
| + if (pipeline_metadata_.natural_size != old_size)
|
| + UpdateAndMaybeShowInterstitial();
|
| +
|
| UpdateAndMaybeSwitch();
|
| }
|
|
|
| @@ -121,13 +141,13 @@ bool RemotingRendererController::IsVideoCodecSupported() {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| DCHECK(has_video());
|
|
|
| - switch (video_decoder_config_.codec()) {
|
| + switch (pipeline_metadata_.video_decoder_config.codec()) {
|
| case VideoCodec::kCodecH264:
|
| case VideoCodec::kCodecVP8:
|
| return true;
|
| default:
|
| VLOG(2) << "Remoting does not support video codec: "
|
| - << video_decoder_config_.codec();
|
| + << pipeline_metadata_.video_decoder_config.codec();
|
| return false;
|
| }
|
| }
|
| @@ -136,7 +156,7 @@ bool RemotingRendererController::IsAudioCodecSupported() {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| DCHECK(has_audio());
|
|
|
| - switch (audio_decoder_config_.codec()) {
|
| + switch (pipeline_metadata_.audio_decoder_config.codec()) {
|
| case AudioCodec::kCodecAAC:
|
| case AudioCodec::kCodecMP3:
|
| case AudioCodec::kCodecPCM:
|
| @@ -156,7 +176,7 @@ bool RemotingRendererController::IsAudioCodecSupported() {
|
| return true;
|
| default:
|
| VLOG(2) << "Remoting does not support audio codec: "
|
| - << audio_decoder_config_.codec();
|
| + << pipeline_metadata_.audio_decoder_config.codec();
|
| return false;
|
| }
|
| }
|
| @@ -238,9 +258,36 @@ void RemotingRendererController::UpdateAndMaybeSwitch() {
|
| // force-stop the session when remoting has ended; so no need to call
|
| // StopRemoting() from here.
|
| DCHECK(!is_encrypted_);
|
| + show_interstitial_cb_.Run(SkBitmap(), pipeline_metadata_.natural_size,
|
| + RemotingInterstitialType::NONE);
|
| switch_renderer_cb_.Run();
|
| + show_interstitial_cb_.Reset();
|
| remoting_source_->StopRemoting(this);
|
| }
|
| }
|
|
|
| +void RemotingRendererController::SetShowInterstitialCallback(
|
| + const ShowInterstitialCallback& cb) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + DCHECK(!cb.is_null());
|
| + DCHECK(show_interstitial_cb_.is_null());
|
| + show_interstitial_cb_ = cb;
|
| + UpdateAndMaybeShowInterstitial();
|
| +}
|
| +
|
| +void RemotingRendererController::UpdateAndMaybeShowInterstitial() {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + if (show_interstitial_cb_.is_null() ||
|
| + pipeline_metadata_.natural_size.IsEmpty())
|
| + return;
|
| +
|
| + DCHECK(remote_rendering_started_);
|
| + // TODO(xjz): Download poster image when available.
|
| + show_interstitial_cb_.Run(
|
| + SkBitmap(), pipeline_metadata_.natural_size,
|
| + remoting_source_->state() == RemotingSessionState::SESSION_STARTED
|
| + ? RemotingInterstitialType::SUCCESS
|
| + : RemotingInterstitialType::FAIL);
|
| +}
|
| +
|
| } // namespace media
|
|
|