blob: 77c807a126b8634e44c69ffd7c944fc6c5cda82a [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chromecast/starboard/media/renderer/geometry_change_handler.h"
#include "base/check.h"
#include "base/logging.h"
#include "chromecast/media/service/video_geometry_setter_service.h"
#include "ui/display/screen.h"
namespace chromecast {
namespace media {
namespace {
// Sets the SbPlayer's bounds as specified. `starboard` and `sb_player` must not
// be null.
void SetPlayerBounds(const gfx::RectF& bounds,
StarboardApiWrapper* starboard,
void* sb_player) {
CHECK(starboard);
CHECK(sb_player);
LOG(INFO) << "Setting SbPlayer's bounds to z=0, x=" << bounds.x()
<< ", y=" << bounds.y() << ", width=" << bounds.width()
<< ", height=" << bounds.height();
starboard->SetPlayerBounds(
sb_player, /*z_index=*/0, static_cast<int>(bounds.x()),
static_cast<int>(bounds.y()), static_cast<int>(bounds.width()),
static_cast<int>(bounds.height()));
}
} // namespace
GeometryChangeHandler::GeometryChangeHandler(
VideoGeometrySetterService* geometry_setter_service,
StarboardApiWrapper* starboard,
const base::UnguessableToken& overlay_plane_id)
: starboard_(starboard) {
CHECK(starboard_);
CHECK(geometry_setter_service);
geometry_setter_service->GetVideoGeometryChangeSubscriber(
geometry_change_subscriber_remote_.BindNewPipeAndPassReceiver());
geometry_change_subscriber_remote_->SubscribeToVideoGeometryChange(
overlay_plane_id,
geometry_change_client_receiver_.BindNewPipeAndPassRemote(),
base::DoNothing());
}
GeometryChangeHandler::~GeometryChangeHandler() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
}
void GeometryChangeHandler::SetSbPlayer(void* sb_player) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
CHECK(sb_player);
sb_player_ = sb_player;
// Update the player's bounds.
if (current_geometry_.has_value()) {
// Use the bounds specified by a mojo call.
SetPlayerBounds(*current_geometry_, starboard_, sb_player_);
} else {
// Default to fullscreen.
const gfx::Size display_size =
display::Screen::Get()->GetPrimaryDisplay().GetSizeInPixel();
SetPlayerBounds(
gfx::RectF(0, 0, display_size.width(), display_size.height()),
starboard_, sb_player_);
}
}
void GeometryChangeHandler::OnVideoGeometryChange(
const gfx::RectF& rect_f,
gfx::OverlayTransform transform) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
if (current_geometry_.has_value() && rect_f == *current_geometry_) {
return;
}
current_geometry_ = rect_f;
if (sb_player_) {
SetPlayerBounds(*current_geometry_, starboard_, sb_player_);
}
}
} // namespace media
} // namespace chromecast