summaryrefslogtreecommitdiffstats
path: root/ui/ozone/platform/drm/gpu/gbm_buffer.cc
diff options
context:
space:
mode:
authorwilliam.xie <william.xie@intel.com>2015-06-26 04:18:33 -0700
committerCommit bot <commit-bot@chromium.org>2015-06-26 11:19:11 +0000
commit3c16245b5b52fc947a9a2765ab038d13b375d5e3 (patch)
tree99da17417665a4985992b6c4c8c043642822b52f /ui/ozone/platform/drm/gpu/gbm_buffer.cc
parent17fce99eb549c36e92ac2a35312aaf65803290e7 (diff)
downloadchromium_src-3c16245b5b52fc947a9a2765ab038d13b375d5e3.zip
chromium_src-3c16245b5b52fc947a9a2765ab038d13b375d5e3.tar.gz
chromium_src-3c16245b5b52fc947a9a2765ab038d13b375d5e3.tar.bz2
[Ozone] enable video scaling when playing on overlay
When video playback on overlay, framebuffer needs to be scaled according to the display size. Considerring overlay hardware doesn't support scaling well, this CL is target to enable video scaling by VPP (video post processing unit) to get video playback working with correct size on overlay. BUG=499220 TEST=Enable Ozone hardware overlay, play h264 video, zoom webpage, verify that video is scaling along with webpage Review URL: https://codereview.chromium.org/1156893002 Cr-Commit-Position: refs/heads/master@{#336352}
Diffstat (limited to 'ui/ozone/platform/drm/gpu/gbm_buffer.cc')
-rw-r--r--ui/ozone/platform/drm/gpu/gbm_buffer.cc37
1 files changed, 37 insertions, 0 deletions
diff --git a/ui/ozone/platform/drm/gpu/gbm_buffer.cc b/ui/ozone/platform/drm/gpu/gbm_buffer.cc
index 8da5e5d..c92ba44 100644
--- a/ui/ozone/platform/drm/gpu/gbm_buffer.cc
+++ b/ui/ozone/platform/drm/gpu/gbm_buffer.cc
@@ -11,6 +11,7 @@
#include "base/logging.h"
#include "base/trace_event/trace_event.h"
+#include "ui/gfx/geometry/size_conversions.h"
#include "ui/ozone/platform/drm/gpu/drm_window.h"
#include "ui/ozone/platform/drm/gpu/gbm_device.h"
@@ -83,6 +84,14 @@ bool GbmPixmap::Initialize() {
return true;
}
+void GbmPixmap::SetScalingCallback(const ScalingCallback& scaling_callback) {
+ scaling_callback_ = scaling_callback;
+}
+
+scoped_refptr<NativePixmap> GbmPixmap::GetScaledPixmap(gfx::Size new_size) {
+ return scaling_callback_.Run(new_size);
+}
+
GbmPixmap::~GbmPixmap() {
if (dma_buf_ > 0)
close(dma_buf_);
@@ -105,9 +114,37 @@ bool GbmPixmap::ScheduleOverlayPlane(gfx::AcceleratedWidget widget,
gfx::OverlayTransform plane_transform,
const gfx::Rect& display_bounds,
const gfx::RectF& crop_rect) {
+ gfx::Size required_size;
+ if (plane_z_order &&
+ ShouldApplyScaling(display_bounds, crop_rect, &required_size)) {
+ scoped_refptr<NativePixmap> scaled_pixmap = GetScaledPixmap(required_size);
+ if (scaled_pixmap) {
+ return scaled_pixmap->ScheduleOverlayPlane(
+ widget, plane_z_order, plane_transform, display_bounds, crop_rect);
+ } else {
+ return false;
+ }
+ }
+
screen_manager_->GetWindow(widget)->QueueOverlayPlane(OverlayPlane(
buffer_, plane_z_order, plane_transform, display_bounds, crop_rect));
return true;
}
+bool GbmPixmap::ShouldApplyScaling(const gfx::Rect& display_bounds,
+ const gfx::RectF& crop_rect,
+ gfx::Size* required_size) {
+ if (crop_rect.width() == 0 || crop_rect.height() == 0) {
+ PLOG(ERROR) << "ShouldApplyScaling passed zero scaling target.";
+ return false;
+ }
+
+ gfx::Size pixmap_size = buffer_->GetSize();
+ // If the required size is not integer-sized, round it to the next integer.
+ *required_size = gfx::ToCeiledSize(
+ gfx::SizeF(display_bounds.width() / crop_rect.width(),
+ display_bounds.height() / crop_rect.height()));
+ return pixmap_size != *required_size;
+}
+
} // namespace ui