summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNiels Ole Salscheider <niels_ole@salscheider-online.de>2016-03-06 13:50:03 +0100
committerDiane Trout <diane@ghic.org>2016-04-16 23:05:39 -0700
commitaf4d94de093b114c5371bda522ec11075ead60ea (patch)
treea75b90264491a397840b780725e6f24228bded21
parent6fc7f9bda0d9ec7a3c71f54be889ca8c8280f469 (diff)
The geometry must never be set to 0 once the node is added to the SG
The application can crash otherwise.
-rw-r--r--elements/gstqtvideosink/painters/videonode.cpp14
-rw-r--r--elements/gstqtvideosink/painters/videonode.h1
2 files changed, 9 insertions, 6 deletions
diff --git a/elements/gstqtvideosink/painters/videonode.cpp b/elements/gstqtvideosink/painters/videonode.cpp
index 2afb3e5..e14287c 100644
--- a/elements/gstqtvideosink/painters/videonode.cpp
+++ b/elements/gstqtvideosink/painters/videonode.cpp
@@ -22,7 +22,7 @@
#include <QtQuick/QSGFlatColorMaterial>
VideoNode::VideoNode()
- : QSGGeometryNode()
+ : m_validGeometry(false), QSGGeometryNode()
{
setFlags(OwnsGeometry | OwnsMaterial, true);
setMaterialTypeSolidBlack();
@@ -31,8 +31,8 @@ VideoNode::VideoNode()
void VideoNode::changeFormat(const BufferFormat & format)
{
setMaterial(VideoMaterial::create(format));
- setGeometry(0);
m_materialType = MaterialTypeVideo;
+ m_validGeometry = false;
}
void VideoNode::setMaterialTypeSolidBlack()
@@ -40,8 +40,8 @@ void VideoNode::setMaterialTypeSolidBlack()
QSGFlatColorMaterial *m = new QSGFlatColorMaterial;
m->setColor(Qt::black);
setMaterial(m);
- setGeometry(0);
m_materialType = MaterialTypeSolidBlack;
+ m_validGeometry = false;
}
void VideoNode::setCurrentFrame(GstBuffer* buffer)
@@ -77,7 +77,7 @@ void VideoNode::updateGeometry(const PaintAreas & areas)
QSGGeometry *g = geometry();
if (m_materialType == MaterialTypeVideo) {
- if (!g)
+ if (!m_validGeometry)
g = new QSGGeometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 4);
QSGGeometry::TexturedPoint2D *v = g->vertexDataAsTexturedPoint2D();
@@ -94,7 +94,7 @@ void VideoNode::updateGeometry(const PaintAreas & areas)
setTex(v + 2, areas.sourceRect.topRight());
setTex(v + 3, areas.sourceRect.bottomRight());
} else {
- if (!g)
+ if (!m_validGeometry)
g = new QSGGeometry(QSGGeometry::defaultAttributes_Point2D(), 4);
QSGGeometry::Point2D *v = g->vertexDataAsPoint2D();
@@ -105,8 +105,10 @@ void VideoNode::updateGeometry(const PaintAreas & areas)
setGeom(v + 3, areas.videoArea.bottomRight());
}
- if (!geometry())
+ if (!m_validGeometry) {
setGeometry(g);
+ m_validGeometry = true;
+ }
markDirty(DirtyGeometry);
}
diff --git a/elements/gstqtvideosink/painters/videonode.h b/elements/gstqtvideosink/painters/videonode.h
index ed9d36f..8ba4c3b 100644
--- a/elements/gstqtvideosink/painters/videonode.h
+++ b/elements/gstqtvideosink/painters/videonode.h
@@ -45,6 +45,7 @@ public:
private:
MaterialType m_materialType;
+ bool m_validGeometry;
};
#endif // VIDEONODE_H