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 |