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) { |