| Index: ui/ozone/platform/cast/overlay_manager_cast.cc
|
| diff --git a/ui/ozone/platform/cast/overlay_manager_cast.cc b/ui/ozone/platform/cast/overlay_manager_cast.cc
|
| index cb7d6419ba97d83aeacc4b1f1578694c579e1db5..9d5c0adb4d29bdb86acd43c94e5ea50f84bf94fa 100644
|
| --- a/ui/ozone/platform/cast/overlay_manager_cast.cc
|
| +++ b/ui/ozone/platform/cast/overlay_manager_cast.cc
|
| @@ -4,6 +4,11 @@
|
|
|
| #include "ui/ozone/platform/cast/overlay_manager_cast.h"
|
|
|
| +#include "base/bind.h"
|
| +#include "base/location.h"
|
| +#include "base/memory/ref_counted.h"
|
| +#include "base/single_thread_task_runner.h"
|
| +#include "chromecast/browser/media/cma_message_loop.h"
|
| #include "chromecast/public/cast_media_shlib.h"
|
| #include "chromecast/public/graphics_types.h"
|
| #include "chromecast/public/video_plane.h"
|
| @@ -13,6 +18,16 @@
|
| namespace ui {
|
| namespace {
|
|
|
| +void SetVideoPlaneGeometry(
|
| + const chromecast::RectF& display_rect,
|
| + chromecast::media::VideoPlane::CoordinateType coordinate_type,
|
| + chromecast::media::VideoPlane::Transform transform) {
|
| + chromecast::media::VideoPlane* video_plane =
|
| + chromecast::media::CastMediaShlib::GetVideoPlane();
|
| + CHECK(video_plane);
|
| + video_plane->SetGeometry(display_rect, coordinate_type, transform);
|
| +}
|
| +
|
| // Translates a gfx::OverlayTransform into a VideoPlane::Transform.
|
| // Could be just a lookup table once we have unit tests for this code
|
| // to ensure it stays in sync with OverlayTransform.
|
| @@ -37,8 +52,18 @@ chromecast::media::VideoPlane::Transform ConvertTransform(
|
| }
|
| }
|
|
|
| +bool ExactlyEqual(const chromecast::RectF& r1, const chromecast::RectF& r2) {
|
| + return r1.x == r2.x && r1.y == r2.y && r1.width == r2.width &&
|
| + r1.height == r2.height;
|
| +}
|
| +
|
| class OverlayCandidatesCast : public OverlayCandidatesOzone {
|
| public:
|
| + OverlayCandidatesCast()
|
| + : cma_task_runner_(chromecast::media::CmaMessageLoop::GetTaskRunner()),
|
| + transform_(gfx::OVERLAY_TRANSFORM_INVALID),
|
| + display_rect_(0, 0, 0, 0) {}
|
| +
|
| void CheckOverlaySupport(OverlaySurfaceCandidateList* surfaces) override {
|
| for (auto& candidate : *surfaces) {
|
| if (candidate.plane_z_order == -1) {
|
| @@ -47,20 +72,34 @@ class OverlayCandidatesCast : public OverlayCandidatesOzone {
|
| // Compositor requires all overlay rectangles to have integer coords
|
| candidate.display_rect = gfx::ToEnclosedRect(candidate.display_rect);
|
|
|
| - chromecast::media::VideoPlane* video_plane =
|
| - chromecast::media::CastMediaShlib::GetVideoPlane();
|
| -
|
| chromecast::RectF display_rect(
|
| candidate.display_rect.x(), candidate.display_rect.y(),
|
| candidate.display_rect.width(), candidate.display_rect.height());
|
| - video_plane->SetGeometry(
|
| - display_rect,
|
| - chromecast::media::VideoPlane::COORDINATE_TYPE_GRAPHICS_PLANE,
|
| - ConvertTransform(candidate.transform));
|
| +
|
| + // Update video plane geometry + transform to match compositor quad.
|
| + // This must be done on CMA thread - and no point doing if it hasn't
|
| + // changed.
|
| + if (candidate.transform != transform_ ||
|
| + !ExactlyEqual(display_rect, display_rect_)) {
|
| + transform_ = candidate.transform;
|
| + display_rect_ = display_rect;
|
| +
|
| + cma_task_runner_->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(
|
| + &SetVideoPlaneGeometry, display_rect,
|
| + chromecast::media::VideoPlane::COORDINATE_TYPE_GRAPHICS_PLANE,
|
| + ConvertTransform(candidate.transform)));
|
| + }
|
| return;
|
| }
|
| }
|
| }
|
| +
|
| + private:
|
| + scoped_refptr<base::SingleThreadTaskRunner> cma_task_runner_;
|
| + gfx::OverlayTransform transform_;
|
| + chromecast::RectF display_rect_;
|
| };
|
|
|
| } // namespace
|
|
|