summaryrefslogtreecommitdiffstats
path: root/src/imports/multimedia/qdeclarativevideooutput_render.cpp
diff options
context:
space:
mode:
authorThomas McGuire <thomas.mcguire.qnx@kdab.com>2013-04-25 16:06:08 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-05-07 15:02:15 +0200
commit0d9526b5c9740d3d77d9c4d8403a6f9e7370643f (patch)
treebefde05e75607014919cadf2243ef36fa39346c1 /src/imports/multimedia/qdeclarativevideooutput_render.cpp
parent2eac932747682e4fcc374843e764a377a84e8a3c (diff)
VideoOutput: Take the surface's viewport into account
Task-Number: QTBUG-30410 Change-Id: I480ce0bcd7ec136e54b5bfc5fec0e901141b72d8 Reviewed-by: Josh Faust <jfaust@suitabletech.com> Reviewed-by: Yoann Lopes <yoann.lopes@digia.com>
Diffstat (limited to 'src/imports/multimedia/qdeclarativevideooutput_render.cpp')
-rw-r--r--src/imports/multimedia/qdeclarativevideooutput_render.cpp53
1 files changed, 42 insertions, 11 deletions
diff --git a/src/imports/multimedia/qdeclarativevideooutput_render.cpp b/src/imports/multimedia/qdeclarativevideooutput_render.cpp
index e9bcf4b26..96b979bc5 100644
--- a/src/imports/multimedia/qdeclarativevideooutput_render.cpp
+++ b/src/imports/multimedia/qdeclarativevideooutput_render.cpp
@@ -133,30 +133,45 @@ QSize QDeclarativeVideoRendererBackend::nativeSize() const
void QDeclarativeVideoRendererBackend::updateGeometry()
{
+ const QRectF viewport = videoSurface()->surfaceFormat().viewport();
+ const QSizeF frameSize = videoSurface()->surfaceFormat().frameSize();
+ const QRectF normalizedViewport(viewport.x() / frameSize.width(),
+ viewport.y() / frameSize.height(),
+ viewport.width() / frameSize.width(),
+ viewport.height() / frameSize.height());
const QRectF rect(0, 0, q->width(), q->height());
if (nativeSize().isEmpty()) {
m_renderedRect = rect;
- m_sourceTextureRect = QRectF(0, 0, 1, 1);
+ m_sourceTextureRect = normalizedViewport;
} else if (q->fillMode() == QDeclarativeVideoOutput::Stretch) {
m_renderedRect = rect;
- m_sourceTextureRect = QRectF(0, 0, 1, 1);
+ m_sourceTextureRect = normalizedViewport;
} else if (q->fillMode() == QDeclarativeVideoOutput::PreserveAspectFit) {
- m_sourceTextureRect = QRectF(0, 0, 1, 1);
+ m_sourceTextureRect = normalizedViewport;
m_renderedRect = q->contentRect();
} else if (q->fillMode() == QDeclarativeVideoOutput::PreserveAspectCrop) {
m_renderedRect = rect;
const qreal contentHeight = q->contentRect().height();
const qreal contentWidth = q->contentRect().width();
+
+ // Calculate the size of the source rectangle without taking the viewport into account
+ const qreal relativeOffsetLeft = -q->contentRect().left() / contentWidth;
+ const qreal relativeOffsetTop = -q->contentRect().top() / contentHeight;
+ const qreal relativeWidth = rect.width() / contentWidth;
+ const qreal relativeHeight = rect.height() / contentHeight;
+
+ // Now take the viewport size into account
+ const qreal totalOffsetLeft = normalizedViewport.x() + relativeOffsetLeft * normalizedViewport.width();
+ const qreal totalOffsetTop = normalizedViewport.y() + relativeOffsetTop * normalizedViewport.height();
+ const qreal totalWidth = normalizedViewport.width() * relativeWidth;
+ const qreal totalHeight = normalizedViewport.height() * relativeHeight;
+
if (qIsDefaultAspect(q->orientation())) {
- m_sourceTextureRect = QRectF(-q->contentRect().left() / contentWidth,
- -q->contentRect().top() / contentHeight,
- rect.width() / contentWidth,
- rect.height() / contentHeight);
+ m_sourceTextureRect = QRectF(totalOffsetLeft, totalOffsetTop,
+ totalWidth, totalHeight);
} else {
- m_sourceTextureRect = QRectF(-q->contentRect().top() / contentHeight,
- -q->contentRect().left() / contentWidth,
- rect.height() / contentHeight,
- rect.width() / contentWidth);
+ m_sourceTextureRect = QRectF(totalOffsetTop, totalOffsetLeft,
+ totalHeight, totalWidth);
}
}
}
@@ -223,6 +238,22 @@ QAbstractVideoSurface *QDeclarativeVideoRendererBackend::videoSurface() const
return m_surface;
}
+QRectF QDeclarativeVideoRendererBackend::adjustedViewport() const
+{
+ const QRectF viewport = m_surface->surfaceFormat().viewport();
+ const QSize pixelAspectRatio = m_surface->surfaceFormat().pixelAspectRatio();
+
+ if (pixelAspectRatio.height() != 0) {
+ const qreal ratio = pixelAspectRatio.width() / pixelAspectRatio.height();
+ QRectF result = viewport;
+ result.setX(result.x() * ratio);
+ result.setWidth(result.width() * ratio);
+ return result;
+ }
+
+ return viewport;
+}
+
QOpenGLContext *QDeclarativeVideoRendererBackend::glContext() const
{
return m_glContext;