Commit 3737028e authored by Daniel Nicoara's avatar Daniel Nicoara Committed by Commit Bot

Replace video quad with a transparent quad

The video hole doesn't make practical use of the overlay API. Rather
than pretend to show anything via overlays, just replace the video quad
with a transparent quad.

This also allows the video hole to work with Ozone platforms other than
Cast since the Ozone platform is no longer expected to lie about
supporting the video hole overlay.

Bug: b/74998539
Test: Played video on device
Cq-Include-Trybots: luci.chromium.try:android_optional_gpu_tests_rel
Change-Id: Ia9b63f718d16ab8d933221a3ce551dbbf06b5748
Reviewed-on: https://chromium-review.googlesource.com/970910Reviewed-by: default avatarDaniele Castagna <dcastagna@chromium.org>
Reviewed-by: default avatarSadrul Chowdhury <sadrul@chromium.org>
Reviewed-by: default avatarSergey Volk <servolk@chromium.org>
Reviewed-by: default avatarLuke Halliwell <halliwell@chromium.org>
Commit-Queue: Daniel Nicoara <dnicoara@chromium.org>
Cr-Commit-Position: refs/heads/master@{#548780}
parent cf661ce6
...@@ -122,6 +122,7 @@ cast_source_set("browser") { ...@@ -122,6 +122,7 @@ cast_source_set("browser") {
"//components/network_session_configurator/common", "//components/network_session_configurator/common",
"//components/prefs", "//components/prefs",
"//components/proxy_config", "//components/proxy_config",
"//components/viz/service",
"//content", "//content",
"//content/public/browser", "//content/public/browser",
"//content/public/common", "//content/public/common",
...@@ -138,6 +139,7 @@ cast_source_set("browser") { ...@@ -138,6 +139,7 @@ cast_source_set("browser") {
"//ui/compositor", "//ui/compositor",
"//ui/display", "//ui/display",
"//ui/events", "//ui/events",
"//ui/events/devices",
"//ui/gl", "//ui/gl",
] ]
......
...@@ -51,4 +51,9 @@ include_rules = [ ...@@ -51,4 +51,9 @@ include_rules = [
# TODO(slan): Remove this when the network service is shipped on Cast. # TODO(slan): Remove this when the network service is shipped on Cast.
"+services/network", "+services/network",
# Needed to insert video plane callback.
# TODO(halliwell): Need to re-work this dependency otherwise Cast can't run
# with Viz out of process.
"+components/viz/service/display/overlay_strategy_underlay_cast.h",
] ]
...@@ -90,8 +90,8 @@ ...@@ -90,8 +90,8 @@
// callback. // callback.
#include "chromecast/browser/cast_display_configurator.h" #include "chromecast/browser/cast_display_configurator.h"
#include "chromecast/graphics/cast_screen.h" #include "chromecast/graphics/cast_screen.h"
#include "components/viz/service/display/overlay_strategy_underlay_cast.h" // nogncheck
#include "ui/display/screen.h" #include "ui/display/screen.h"
#include "ui/ozone/platform/cast/overlay_manager_cast.h" // nogncheck
#endif #endif
#if BUILDFLAG(ENABLE_CHROMECAST_EXTENSIONS) #if BUILDFLAG(ENABLE_CHROMECAST_EXTENSIONS)
...@@ -518,9 +518,9 @@ void CastBrowserMainParts::PreMainMessageLoopRun() { ...@@ -518,9 +518,9 @@ void CastBrowserMainParts::PreMainMessageLoopRun() {
display::Screen::GetScreen()->GetPrimaryDisplay().GetSizeInPixel(); display::Screen::GetScreen()->GetPrimaryDisplay().GetSizeInPixel();
video_plane_controller_.reset(new media::VideoPlaneController( video_plane_controller_.reset(new media::VideoPlaneController(
Size(display_size.width(), display_size.height()), GetMediaTaskRunner())); Size(display_size.width(), display_size.height()), GetMediaTaskRunner()));
ui::OverlayManagerCast::SetOverlayCompositedCallback( viz::OverlayStrategyUnderlayCast::SetOverlayCompositedCallback(
base::Bind(&media::VideoPlaneController::SetGeometry, base::BindRepeating(&media::VideoPlaneController::SetGeometryGfx,
base::Unretained(video_plane_controller_.get()))); base::Unretained(video_plane_controller_.get())));
#endif #endif
window_manager_ = CastWindowManager::Create( window_manager_ = CastWindowManager::Create(
......
...@@ -4,4 +4,5 @@ include_rules = [ ...@@ -4,4 +4,5 @@ include_rules = [
"+media/base", "+media/base",
"+media/cdm", "+media/cdm",
"+ui/gfx/geometry", "+ui/gfx/geometry",
"+ui/gfx/overlay_transform.h",
] ]
...@@ -106,5 +106,7 @@ cast_source_set("video_plane_controller") { ...@@ -106,5 +106,7 @@ cast_source_set("video_plane_controller") {
deps = [ deps = [
"//base", "//base",
"//chromecast/media:libcast_media", "//chromecast/media:libcast_media",
"//ui/gfx",
"//ui/gfx/geometry",
] ]
} }
...@@ -38,6 +38,30 @@ bool ResolutionSizeValid(const Size& s) { ...@@ -38,6 +38,30 @@ bool ResolutionSizeValid(const Size& s) {
return s.width >= 0 && s.height >= 0; return s.width >= 0 && s.height >= 0;
} }
// 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.
chromecast::media::VideoPlane::Transform ConvertTransform(
gfx::OverlayTransform transform) {
switch (transform) {
case gfx::OVERLAY_TRANSFORM_NONE:
return chromecast::media::VideoPlane::TRANSFORM_NONE;
case gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL:
return chromecast::media::VideoPlane::FLIP_HORIZONTAL;
case gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL:
return chromecast::media::VideoPlane::FLIP_VERTICAL;
case gfx::OVERLAY_TRANSFORM_ROTATE_90:
return chromecast::media::VideoPlane::ROTATE_90;
case gfx::OVERLAY_TRANSFORM_ROTATE_180:
return chromecast::media::VideoPlane::ROTATE_180;
case gfx::OVERLAY_TRANSFORM_ROTATE_270:
return chromecast::media::VideoPlane::ROTATE_270;
default:
NOTREACHED();
return chromecast::media::VideoPlane::TRANSFORM_NONE;
}
}
} // namespace } // namespace
// Helper class for calling VideoPlane::SetGeometry with rate-limiting. // Helper class for calling VideoPlane::SetGeometry with rate-limiting.
...@@ -155,6 +179,13 @@ VideoPlaneController::VideoPlaneController( ...@@ -155,6 +179,13 @@ VideoPlaneController::VideoPlaneController(
VideoPlaneController::~VideoPlaneController() {} VideoPlaneController::~VideoPlaneController() {}
void VideoPlaneController::SetGeometryGfx(const gfx::RectF& display_rect,
gfx::OverlayTransform transform) {
chromecast::RectF rect(display_rect.x(), display_rect.y(),
display_rect.width(), display_rect.height());
SetGeometry(rect, ConvertTransform(transform));
}
void VideoPlaneController::SetGeometry(const RectF& display_rect, void VideoPlaneController::SetGeometry(const RectF& display_rect,
VideoPlane::Transform transform) { VideoPlane::Transform transform) {
DCHECK(thread_checker_.CalledOnValidThread()); DCHECK(thread_checker_.CalledOnValidThread());
......
...@@ -11,6 +11,8 @@ ...@@ -11,6 +11,8 @@
#include "base/threading/thread_checker.h" #include "base/threading/thread_checker.h"
#include "chromecast/public/graphics_types.h" #include "chromecast/public/graphics_types.h"
#include "chromecast/public/video_plane.h" #include "chromecast/public/video_plane.h"
#include "ui/gfx/geometry/rect_f.h"
#include "ui/gfx/overlay_transform.h"
namespace base { namespace base {
class SingleThreadTaskRunner; class SingleThreadTaskRunner;
...@@ -36,9 +38,13 @@ class VideoPlaneController { ...@@ -36,9 +38,13 @@ class VideoPlaneController {
const Size& graphics_resolution, const Size& graphics_resolution,
scoped_refptr<base::SingleThreadTaskRunner> media_task_runner); scoped_refptr<base::SingleThreadTaskRunner> media_task_runner);
~VideoPlaneController(); ~VideoPlaneController();
// Sets the video plane geometry in *graphics plane coordinates*. If there is // Sets the video plane geometry in *graphics plane coordinates*. If there is
// no change to video plane parameters from the last call to this method, it // no change to video plane parameters from the last call to this method, it
// is a no-op. // is a no-op.
void SetGeometryGfx(const gfx::RectF& display_rect,
gfx::OverlayTransform transform);
void SetGeometry(const RectF& display_rect, VideoPlane::Transform transform); void SetGeometry(const RectF& display_rect, VideoPlane::Transform transform);
// Sets physical screen resolution. This must be called at least once when // Sets physical screen resolution. This must be called at least once when
......
...@@ -5,11 +5,18 @@ ...@@ -5,11 +5,18 @@
#include "components/viz/service/display/overlay_strategy_underlay_cast.h" #include "components/viz/service/display/overlay_strategy_underlay_cast.h"
#include "base/containers/adapters.h" #include "base/containers/adapters.h"
#include "base/lazy_instance.h"
#include "components/viz/common/quads/draw_quad.h" #include "components/viz/common/quads/draw_quad.h"
#include "components/viz/common/quads/solid_color_draw_quad.h" #include "components/viz/common/quads/solid_color_draw_quad.h"
#include "ui/gfx/geometry/rect_conversions.h" #include "ui/gfx/geometry/rect_conversions.h"
namespace viz { namespace viz {
namespace {
base::LazyInstance<OverlayStrategyUnderlayCast::OverlayCompositedCallback>::
DestructorAtExit g_overlay_composited_callback = LAZY_INSTANCE_INITIALIZER;
} // namespace
OverlayStrategyUnderlayCast::OverlayStrategyUnderlayCast( OverlayStrategyUnderlayCast::OverlayStrategyUnderlayCast(
OverlayCandidateValidator* capability_checker) OverlayCandidateValidator* capability_checker)
...@@ -23,10 +30,10 @@ bool OverlayStrategyUnderlayCast::Attempt( ...@@ -23,10 +30,10 @@ bool OverlayStrategyUnderlayCast::Attempt(
RenderPass* render_pass, RenderPass* render_pass,
cc::OverlayCandidateList* candidate_list, cc::OverlayCandidateList* candidate_list,
std::vector<gfx::Rect>* content_bounds) { std::vector<gfx::Rect>* content_bounds) {
const QuadList& const_quad_list = render_pass->quad_list; QuadList& quad_list = render_pass->quad_list;
bool found_underlay = false; bool found_underlay = false;
gfx::Rect content_rect; gfx::Rect content_rect;
for (const auto* quad : base::Reversed(const_quad_list)) { for (const auto* quad : base::Reversed(quad_list)) {
if (cc::OverlayCandidate::IsInvisibleQuad(quad)) if (cc::OverlayCandidate::IsInvisibleQuad(quad))
continue; continue;
...@@ -55,15 +62,37 @@ bool OverlayStrategyUnderlayCast::Attempt( ...@@ -55,15 +62,37 @@ bool OverlayStrategyUnderlayCast::Attempt(
} }
} }
const bool result = OverlayStrategyUnderlay::Attempt( if (found_underlay) {
output_color_matrix, resource_provider, render_pass, candidate_list, for (auto it = quad_list.begin(); it != quad_list.end(); ++it) {
content_bounds); cc::OverlayCandidate candidate;
if (!cc::OverlayCandidate::FromDrawQuad(
resource_provider, output_color_matrix, *it, &candidate)) {
continue;
}
render_pass->quad_list.ReplaceExistingQuadWithOpaqueTransparentSolidColor(
it);
if (!g_overlay_composited_callback.Get().is_null()) {
g_overlay_composited_callback.Get().Run(candidate.display_rect,
candidate.transform);
}
break;
}
}
DCHECK(content_bounds && content_bounds->empty()); DCHECK(content_bounds && content_bounds->empty());
DCHECK(result == found_underlay);
if (found_underlay) { if (found_underlay) {
content_bounds->push_back(content_rect); content_bounds->push_back(content_rect);
} }
return result; return found_underlay;
}
// static
void OverlayStrategyUnderlayCast::SetOverlayCompositedCallback(
const OverlayCompositedCallback& cb) {
g_overlay_composited_callback.Get() = cb;
} }
} // namespace viz } // namespace viz
...@@ -5,9 +5,11 @@ ...@@ -5,9 +5,11 @@
#ifndef COMPONENTS_VIZ_SERVICE_DISPLAY_OVERLAY_STRATEGY_UNDERLAY_CAST_H_ #ifndef COMPONENTS_VIZ_SERVICE_DISPLAY_OVERLAY_STRATEGY_UNDERLAY_CAST_H_
#define COMPONENTS_VIZ_SERVICE_DISPLAY_OVERLAY_STRATEGY_UNDERLAY_CAST_H_ #define COMPONENTS_VIZ_SERVICE_DISPLAY_OVERLAY_STRATEGY_UNDERLAY_CAST_H_
#include "base/callback.h"
#include "base/macros.h" #include "base/macros.h"
#include "components/viz/service/display/overlay_strategy_underlay.h" #include "components/viz/service/display/overlay_strategy_underlay.h"
#include "components/viz/service/viz_service_export.h" #include "components/viz/service/viz_service_export.h"
#include "ui/gfx/overlay_transform.h"
namespace viz { namespace viz {
...@@ -27,6 +29,13 @@ class VIZ_SERVICE_EXPORT OverlayStrategyUnderlayCast ...@@ -27,6 +29,13 @@ class VIZ_SERVICE_EXPORT OverlayStrategyUnderlayCast
cc::OverlayCandidateList* candidate_list, cc::OverlayCandidateList* candidate_list,
std::vector<gfx::Rect>* content_bounds) override; std::vector<gfx::Rect>* content_bounds) override;
// Callback that's made whenever an overlay quad is processed in the
// compositor. Used to allow hardware video plane to be positioned to match
// compositor hole.
using OverlayCompositedCallback =
base::RepeatingCallback<void(const gfx::RectF&, gfx::OverlayTransform)>;
static void SetOverlayCompositedCallback(const OverlayCompositedCallback& cb);
private: private:
DISALLOW_COPY_AND_ASSIGN(OverlayStrategyUnderlayCast); DISALLOW_COPY_AND_ASSIGN(OverlayStrategyUnderlayCast);
}; };
......
...@@ -4,72 +4,18 @@ ...@@ -4,72 +4,18 @@
#include "ui/ozone/platform/cast/overlay_manager_cast.h" #include "ui/ozone/platform/cast/overlay_manager_cast.h"
#include "base/lazy_instance.h"
#include "base/memory/ptr_util.h"
#include "ui/gfx/geometry/rect_conversions.h"
#include "ui/ozone/public/overlay_candidates_ozone.h" #include "ui/ozone/public/overlay_candidates_ozone.h"
namespace ui { namespace ui {
namespace { namespace {
base::LazyInstance<OverlayManagerCast::OverlayCompositedCallback>::
DestructorAtExit g_overlay_composited_callback = LAZY_INSTANCE_INITIALIZER;
// 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.
chromecast::media::VideoPlane::Transform ConvertTransform(
gfx::OverlayTransform transform) {
switch (transform) {
case gfx::OVERLAY_TRANSFORM_NONE:
return chromecast::media::VideoPlane::TRANSFORM_NONE;
case gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL:
return chromecast::media::VideoPlane::FLIP_HORIZONTAL;
case gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL:
return chromecast::media::VideoPlane::FLIP_VERTICAL;
case gfx::OVERLAY_TRANSFORM_ROTATE_90:
return chromecast::media::VideoPlane::ROTATE_90;
case gfx::OVERLAY_TRANSFORM_ROTATE_180:
return chromecast::media::VideoPlane::ROTATE_180;
case gfx::OVERLAY_TRANSFORM_ROTATE_270:
return chromecast::media::VideoPlane::ROTATE_270;
default:
NOTREACHED();
return chromecast::media::VideoPlane::TRANSFORM_NONE;
}
}
class OverlayCandidatesCast : public OverlayCandidatesOzone { class OverlayCandidatesCast : public OverlayCandidatesOzone {
public: public:
OverlayCandidatesCast() {} OverlayCandidatesCast() {}
void CheckOverlaySupport(OverlaySurfaceCandidateList* surfaces) override; void CheckOverlaySupport(OverlaySurfaceCandidateList* surfaces) override {}
}; };
void OverlayCandidatesCast::CheckOverlaySupport(
OverlaySurfaceCandidateList* surfaces) {
for (auto& candidate : *surfaces) {
if (candidate.plane_z_order != -1)
continue;
candidate.overlay_handled = true;
// Compositor requires all overlay rectangles to have integer coords.
candidate.display_rect =
gfx::RectF(gfx::ToEnclosedRect(candidate.display_rect));
chromecast::RectF display_rect(
candidate.display_rect.x(), candidate.display_rect.y(),
candidate.display_rect.width(), candidate.display_rect.height());
// Update video plane geometry + transform to match compositor quad.
if (!g_overlay_composited_callback.Get().is_null())
g_overlay_composited_callback.Get().Run(
display_rect, ConvertTransform(candidate.transform));
return;
}
}
} // namespace } // namespace
OverlayManagerCast::OverlayManagerCast() { OverlayManagerCast::OverlayManagerCast() {
...@@ -83,10 +29,4 @@ OverlayManagerCast::CreateOverlayCandidates(gfx::AcceleratedWidget w) { ...@@ -83,10 +29,4 @@ OverlayManagerCast::CreateOverlayCandidates(gfx::AcceleratedWidget w) {
return std::make_unique<OverlayCandidatesCast>(); return std::make_unique<OverlayCandidatesCast>();
} }
// static
void OverlayManagerCast::SetOverlayCompositedCallback(
const OverlayCompositedCallback& cb) {
g_overlay_composited_callback.Get() = cb;
}
} // namespace ui } // namespace ui
...@@ -7,16 +7,12 @@ ...@@ -7,16 +7,12 @@
#include <memory> #include <memory>
#include "base/callback.h"
#include "base/macros.h" #include "base/macros.h"
#include "chromecast/public/graphics_types.h"
#include "chromecast/public/video_plane.h"
#include "ui/ozone/ozone_export.h"
#include "ui/ozone/public/overlay_manager_ozone.h" #include "ui/ozone/public/overlay_manager_ozone.h"
namespace ui { namespace ui {
class OZONE_EXPORT OverlayManagerCast : public OverlayManagerOzone { class OverlayManagerCast : public OverlayManagerOzone {
public: public:
OverlayManagerCast(); OverlayManagerCast();
~OverlayManagerCast() override; ~OverlayManagerCast() override;
...@@ -25,16 +21,7 @@ class OZONE_EXPORT OverlayManagerCast : public OverlayManagerOzone { ...@@ -25,16 +21,7 @@ class OZONE_EXPORT OverlayManagerCast : public OverlayManagerOzone {
std::unique_ptr<OverlayCandidatesOzone> CreateOverlayCandidates( std::unique_ptr<OverlayCandidatesOzone> CreateOverlayCandidates(
gfx::AcceleratedWidget w) override; gfx::AcceleratedWidget w) override;
// Callback that's made whenever an overlay quad is processed
// in the compositor. Used to allow hardware video plane to
// be positioned to match compositor hole.
using OverlayCompositedCallback =
base::Callback<void(const chromecast::RectF&,
chromecast::media::VideoPlane::Transform)>;
static void SetOverlayCompositedCallback(const OverlayCompositedCallback& cb);
private: private:
DISALLOW_COPY_AND_ASSIGN(OverlayManagerCast); DISALLOW_COPY_AND_ASSIGN(OverlayManagerCast);
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment