You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.2 KiB
79 lines
2.2 KiB
#include "VideoItem.h"
|
|
|
|
struct VideoItem::Private{
|
|
QPointer<VideoSurface> surface;
|
|
bool surfaceDirty;
|
|
QRectF targetArea;
|
|
};
|
|
|
|
VideoItem::VideoItem(QQuickItem *parent): QQuickItem(parent), d(new Private){
|
|
d->surfaceDirty = true;
|
|
setFlag(QQuickItem::ItemHasContents, true);
|
|
}
|
|
|
|
VideoItem::~VideoItem(){
|
|
setSurface(0);
|
|
delete d;
|
|
}
|
|
|
|
VideoSurface *VideoItem::surface(){
|
|
return d->surface.data();
|
|
}
|
|
|
|
void VideoItem::setSurface(VideoSurface *surface)
|
|
{
|
|
if(d->surface){
|
|
d->surface.data()->d->items.remove(this);
|
|
}
|
|
d->surface = surface;
|
|
d->surfaceDirty = true;
|
|
|
|
if(d->surface){
|
|
d->surface.data()->d->items.insert(this);
|
|
}
|
|
}
|
|
|
|
QSGNode* VideoItem::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *UpdatePaintNodeData){
|
|
|
|
Q_UNUSED(UpdatePaintNodeData);
|
|
QRectF r = boundingRect();
|
|
QSGNode* newNode = 0;
|
|
|
|
if(d->surfaceDirty){
|
|
delete oldNode;
|
|
oldNode = 0;
|
|
d->surfaceDirty = false;
|
|
}
|
|
|
|
if(!d->surface || d->surface.data()->d->videosink == NULL ){
|
|
if(!oldNode){
|
|
QSGFlatColorMaterial *material = new QSGFlatColorMaterial;
|
|
material->setColor(Qt::black);
|
|
QSGGeometryNode *node = new QSGGeometryNode;
|
|
node->setMaterial(material);
|
|
node->setFlag(QSGNode::OwnsMaterial);
|
|
node->setFlag(QSGNode::OwnsGeometry);
|
|
newNode = node;
|
|
d->targetArea = QRectF();
|
|
}else{
|
|
newNode = oldNode;
|
|
}
|
|
if( r != d->targetArea ){
|
|
QSGGeometry *geometry = new QSGGeometry(QSGGeometry::defaultAttributes_Point2D(), 4);
|
|
geometry->vertexDataAsPoint2D()[0].set(r.x(),r.y());
|
|
geometry->vertexDataAsPoint2D()[1].set(r.x(), r.height());
|
|
geometry->vertexDataAsPoint2D()[2].set(r.width(), r.y());
|
|
geometry->vertexDataAsPoint2D()[3].set(r.width(), r.height());
|
|
QSGGeometryNode *node = static_cast<QSGGeometryNode*>(newNode);
|
|
node->setGeometry(geometry);
|
|
d->targetArea = r;
|
|
}
|
|
} else {
|
|
g_signal_emit_by_name(d->surface.data()->d->videosink,"update-node", (void *)oldNode, r.x(), r.y(), r.width(), r.height(), (void**)&newNode);
|
|
}
|
|
|
|
return newNode;
|
|
}
|
|
|
|
|