diff options
author | Thomas McGuire <thomas.mcguire.qnx@kdab.com> | 2013-04-25 16:06:08 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-05-07 15:02:15 +0200 |
commit | 0d9526b5c9740d3d77d9c4d8403a6f9e7370643f (patch) | |
tree | befde05e75607014919cadf2243ef36fa39346c1 /src/imports/multimedia/qdeclarativevideooutput_render.cpp | |
parent | 2eac932747682e4fcc374843e764a377a84e8a3c (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.cpp | 53 |
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; |