| Index: chromecast/browser/media/cast_renderer.cc
|
| diff --git a/chromecast/browser/media/cast_renderer.cc b/chromecast/browser/media/cast_renderer.cc
|
| index c6f3ad15d8dba0c269cb5ed8774605d895a37048..b82836fd3761de9b6a72ca1e41aaa9c68dc2177e 100644
|
| --- a/chromecast/browser/media/cast_renderer.cc
|
| +++ b/chromecast/browser/media/cast_renderer.cc
|
| @@ -7,6 +7,7 @@
|
| #include "base/bind.h"
|
| #include "base/single_thread_task_runner.h"
|
| #include "chromecast/base/task_runner_impl.h"
|
| +#include "chromecast/browser/media/video_resolution_policy.h"
|
| #include "chromecast/media/cdm/cast_cdm_context.h"
|
| #include "chromecast/media/cma/base/balanced_media_task_runner_factory.h"
|
| #include "chromecast/media/cma/base/cma_logging.h"
|
| @@ -33,21 +34,29 @@ const base::TimeDelta kMaxDeltaFetcher(base::TimeDelta::FromMilliseconds(2000));
|
| CastRenderer::CastRenderer(
|
| const CreateMediaPipelineBackendCB& create_backend_cb,
|
| const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
|
| - const std::string& audio_device_id)
|
| + const std::string& audio_device_id,
|
| + VideoResolutionPolicy* video_resolution_policy)
|
| : create_backend_cb_(create_backend_cb),
|
| task_runner_(task_runner),
|
| audio_device_id_(audio_device_id),
|
| + video_resolution_policy_(video_resolution_policy),
|
| client_(nullptr),
|
| cast_cdm_context_(nullptr),
|
| media_task_runner_factory_(
|
| new BalancedMediaTaskRunnerFactory(kMaxDeltaFetcher)),
|
| weak_factory_(this) {
|
| CMALOG(kLogControl) << __FUNCTION__ << ": " << this;
|
| +
|
| + if (video_resolution_policy_)
|
| + video_resolution_policy_->AddObserver(this);
|
| }
|
|
|
| CastRenderer::~CastRenderer() {
|
| CMALOG(kLogControl) << __FUNCTION__ << ": " << this;
|
| DCHECK(task_runner_->BelongsToCurrentThread());
|
| +
|
| + if (video_resolution_policy_)
|
| + video_resolution_policy_->RemoveObserver(this);
|
| }
|
|
|
| void CastRenderer::Initialize(
|
| @@ -206,6 +215,15 @@ bool CastRenderer::HasVideo() {
|
| return pipeline_->HasVideo();
|
| }
|
|
|
| +void CastRenderer::OnVideoResolutionPolicyChanged() {
|
| + DCHECK(task_runner_->BelongsToCurrentThread());
|
| + if (!video_resolution_policy_)
|
| + return;
|
| +
|
| + if (video_resolution_policy_->ShouldBlock(video_res_))
|
| + OnError(::media::PIPELINE_ERROR_DECODE);
|
| +}
|
| +
|
| void CastRenderer::OnError(::media::PipelineStatus status) {
|
| DCHECK(task_runner_->BelongsToCurrentThread());
|
| client_->OnError(status);
|
| @@ -240,6 +258,9 @@ void CastRenderer::OnWaitingForDecryptionKey() {
|
| void CastRenderer::OnVideoNaturalSizeChange(const gfx::Size& size) {
|
| DCHECK(task_runner_->BelongsToCurrentThread());
|
| client_->OnVideoNaturalSizeChange(size);
|
| +
|
| + video_res_ = size;
|
| + OnVideoResolutionPolicyChanged();
|
| }
|
|
|
| void CastRenderer::OnVideoOpacityChange(bool opaque) {
|
|
|