diff options
author | Allan Sandfeld Jensen <allan.jensen@theqtcompany.com> | 2016-05-10 17:00:10 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2016-06-01 16:56:20 +0000 |
commit | 9d94e3ad9a1f3cf215d267c4b43ce74d57c54b2b (patch) | |
tree | dea1a5350a954f97e99dc60ea3b73c6cb8706259 | |
parent | 533a256a734526c634a76a3e6bcff3e06fc00b99 (diff) |
Handle new resource offset and multiplier in YUV video nodes
Handles new properties added to YUV nodes to handle 9- and 10-bit per
color channel videos.
Change-Id: If96660995650d3deeda7601714146fafeef57176
Reviewed-by: Michael BrĂ¼ning <michael.bruning@theqtcompany.com>
-rw-r--r-- | src/core/delegated_frame_node.cpp | 6 | ||||
-rw-r--r-- | src/core/yuv_video_node.cpp | 31 | ||||
-rw-r--r-- | src/core/yuv_video_node.h | 9 |
3 files changed, 32 insertions, 14 deletions
diff --git a/src/core/delegated_frame_node.cpp b/src/core/delegated_frame_node.cpp index b181f04e3..ad1aff6d4 100644 --- a/src/core/delegated_frame_node.cpp +++ b/src/core/delegated_frame_node.cpp @@ -620,8 +620,10 @@ void DelegatedFrameNode::commit(ChromiumCompositorData *chromiumCompositorData, initAndHoldTexture(uResource, quad->ShouldDrawWithBlending()), initAndHoldTexture(vResource, quad->ShouldDrawWithBlending()), aResource ? initAndHoldTexture(aResource, quad->ShouldDrawWithBlending()) : 0, - toQt(vquad->ya_tex_coord_rect), toQt(vquad->uv_tex_coord_rect), - toQt(vquad->ya_tex_size), toQt(vquad->uv_tex_size), toQt(vquad->color_space)); + toQt(vquad->ya_tex_coord_rect), toQt(vquad->uv_tex_coord_rect), + toQt(vquad->ya_tex_size), toQt(vquad->uv_tex_size), + toQt(vquad->color_space), + vquad->resource_multiplier, vquad->resource_offset); videoNode->setRect(toQt(quad->rect)); currentLayerChain->appendChildNode(videoNode); break; diff --git a/src/core/yuv_video_node.cpp b/src/core/yuv_video_node.cpp index f8290878b..16e52575d 100644 --- a/src/core/yuv_video_node.cpp +++ b/src/core/yuv_video_node.cpp @@ -283,8 +283,19 @@ void YUVVideoMaterialShader::updateState(const RenderState &state, QSGMaterial * break; } - program()->setUniformValue(m_id_yuvMatrix, QMatrix3x3(yuv_to_rgb)); - program()->setUniformValue(m_id_yuvAdjust, QVector3D(yuv_adjust[0], yuv_adjust[1], yuv_adjust[2])); + float yuv_to_rgb_multiplied[9]; + float yuv_adjust_with_offset[3]; + + for (int i = 0; i < 9; ++i) + yuv_to_rgb_multiplied[i] = yuv_to_rgb[i] * mat->m_resourceMultiplier; + + for (int i = 0; i < 3; ++i) + yuv_adjust_with_offset[i] = + yuv_adjust[i] / mat->m_resourceMultiplier - mat->m_resourceOffset; + + + program()->setUniformValue(m_id_yuvMatrix, QMatrix3x3(yuv_to_rgb_multiplied)); + program()->setUniformValue(m_id_yuvAdjust, QVector3D(yuv_adjust_with_offset[0], yuv_adjust_with_offset[1], yuv_adjust_with_offset[2])); if (state.isOpacityDirty()) program()->setUniformValue(m_id_opacity, state.opacity()); @@ -312,7 +323,8 @@ void YUVAVideoMaterialShader::updateState(const RenderState &state, QSGMaterial YUVVideoMaterial::YUVVideoMaterial(QSGTexture *yTexture, QSGTexture *uTexture, QSGTexture *vTexture, const QRectF &yaTexCoordRect, const QRectF &uvTexCoordRect, const QSizeF &yaTexSize, const QSizeF &uvTexSize, - YUVVideoMaterial::ColorSpace colorspace) + YUVVideoMaterial::ColorSpace colorspace, + float rMul, float rOff) : m_yTexture(yTexture) , m_uTexture(uTexture) , m_vTexture(vTexture) @@ -321,6 +333,8 @@ YUVVideoMaterial::YUVVideoMaterial(QSGTexture *yTexture, QSGTexture *uTexture, Q , m_yaTexSize(yaTexSize) , m_uvTexSize(uvTexSize) , m_colorSpace(colorspace) + , m_resourceMultiplier(rMul) + , m_resourceOffset(rOff) { } @@ -341,8 +355,9 @@ int YUVVideoMaterial::compare(const QSGMaterial *other) const YUVAVideoMaterial::YUVAVideoMaterial(QSGTexture *yTexture, QSGTexture *uTexture, QSGTexture *vTexture, QSGTexture *aTexture, const QRectF &yaTexCoordRect, const QRectF &uvTexCoordRect, const QSizeF &yaTexSize, const QSizeF &uvTexSize, - YUVVideoMaterial::ColorSpace colorspace) - : YUVVideoMaterial(yTexture, uTexture, vTexture, yaTexCoordRect, uvTexCoordRect, yaTexSize, uvTexSize, colorspace) + YUVVideoMaterial::ColorSpace colorspace, + float rMul, float rOff) + : YUVVideoMaterial(yTexture, uTexture, vTexture, yaTexCoordRect, uvTexCoordRect, yaTexSize, uvTexSize, colorspace, rMul, rOff) , m_aTexture(aTexture) { setFlag(Blending, aTexture); @@ -363,15 +378,15 @@ int YUVAVideoMaterial::compare(const QSGMaterial *other) const YUVVideoNode::YUVVideoNode(QSGTexture *yTexture, QSGTexture *uTexture, QSGTexture *vTexture, QSGTexture *aTexture, const QRectF &yaTexCoordRect, const QRectF &uvTexCoordRect, const QSizeF &yaTexSize, const QSizeF &uvTexSize, - YUVVideoMaterial::ColorSpace colorspace) + YUVVideoMaterial::ColorSpace colorspace, float rMul, float rOff) : m_geometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 4) { setGeometry(&m_geometry); setFlag(QSGNode::OwnsMaterial); if (aTexture) - m_material = new YUVAVideoMaterial(yTexture, uTexture, vTexture, aTexture, yaTexCoordRect, uvTexCoordRect, yaTexSize, uvTexSize, colorspace); + m_material = new YUVAVideoMaterial(yTexture, uTexture, vTexture, aTexture, yaTexCoordRect, uvTexCoordRect, yaTexSize, uvTexSize, colorspace, rMul, rOff); else - m_material = new YUVVideoMaterial(yTexture, uTexture, vTexture, yaTexCoordRect, uvTexCoordRect, yaTexSize, uvTexSize, colorspace); + m_material = new YUVVideoMaterial(yTexture, uTexture, vTexture, yaTexCoordRect, uvTexCoordRect, yaTexSize, uvTexSize, colorspace, rMul, rOff); setMaterial(m_material); } diff --git a/src/core/yuv_video_node.h b/src/core/yuv_video_node.h index cce204fd3..670ec62b6 100644 --- a/src/core/yuv_video_node.h +++ b/src/core/yuv_video_node.h @@ -60,7 +60,7 @@ public: }; YUVVideoMaterial(QSGTexture *yTexture, QSGTexture *uTexture, QSGTexture *vTexture, const QRectF &yaTexCoordRect, const QRectF &uvTexCoordRect, const QSizeF &yaTexSize, const QSizeF &uvTexSize, - ColorSpace colorspace); + ColorSpace colorspace, float rMul, float rOff); virtual QSGMaterialType *type() const Q_DECL_OVERRIDE { @@ -79,7 +79,8 @@ public: QSizeF m_yaTexSize; QSizeF m_uvTexSize; ColorSpace m_colorSpace; - + float m_resourceMultiplier; + float m_resourceOffset; }; class YUVAVideoMaterial : public YUVVideoMaterial @@ -87,7 +88,7 @@ class YUVAVideoMaterial : public YUVVideoMaterial public: YUVAVideoMaterial(QSGTexture *yTexture, QSGTexture *uTexture, QSGTexture *vTexture, QSGTexture *aTexture, const QRectF &yaTexCoordRect, const QRectF &uvTexCoordRect, const QSizeF &yaTexSize, const QSizeF &uvTexSize, - ColorSpace colorspace); + ColorSpace colorspace, float rMul, float rOff); virtual QSGMaterialType *type() const Q_DECL_OVERRIDE { @@ -106,7 +107,7 @@ class YUVVideoNode : public QSGGeometryNode public: YUVVideoNode(QSGTexture *yTexture, QSGTexture *uTexture, QSGTexture *vTexture, QSGTexture *aTexture, const QRectF &yaTexCoordRect, const QRectF &uvTexCoordRect, const QSizeF &yaTexSize, const QSizeF &uvTexSize, - YUVVideoMaterial::ColorSpace colorspace); + YUVVideoMaterial::ColorSpace colorspace, float rMul, float rOff); void setRect(const QRectF &rect); private: |