X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fwidgets%2Fvideoglwidget.cpp;h=3c62742e8072380fc3d820795055a7390d363a70;hb=234d7fe2828b8e82253548e32081576fc56cbb80;hp=375f2d6b916a5a9b443ed3ab13fb8a9515219d33;hpb=8de0bdc9a16f0dd3b97d437a89e8217303947816;p=kdenlive diff --git a/src/widgets/videoglwidget.cpp b/src/widgets/videoglwidget.cpp index 375f2d6b..3c62742e 100644 --- a/src/widgets/videoglwidget.cpp +++ b/src/widgets/videoglwidget.cpp @@ -26,13 +26,17 @@ #include #endif #include "widgets/videoglwidget.h" +extern "C" { +GLAPI GLenum APIENTRY glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); +} +#include #ifndef GL_TEXTURE_RECTANGLE_EXT #define GL_TEXTURE_RECTANGLE_EXT GL_TEXTURE_RECTANGLE_NV #endif -VideoGLWidget::VideoGLWidget(QWidget *parent) - : QGLWidget(parent) +VideoGLWidget::VideoGLWidget(QWidget *parent, QGLWidget *share) + : QGLWidget(parent, share) , x(0) , y(0) , w(width()) @@ -40,6 +44,8 @@ VideoGLWidget::VideoGLWidget(QWidget *parent) , m_image_width(0) , m_image_height(0) , m_texture(0) + , m_frame(NULL) + , m_frame_texture(0) , m_display_ratio(4.0 / 3.0) , m_backgroundColor(Qt::gray) { @@ -52,6 +58,7 @@ VideoGLWidget::~VideoGLWidget() makeCurrent(); if (m_texture) glDeleteTextures(1, &m_texture); + // m_frame will be cleaned up when the profile is closed by Render. } QSize VideoGLWidget::minimumSizeHint() const @@ -146,6 +153,24 @@ void VideoGLWidget::paintGL() glEnd(); glDisable(GL_TEXTURE_RECTANGLE_EXT); } + if (m_frame_texture) { +#ifdef Q_WS_MAC + glClear(GL_COLOR_BUFFER_BIT); +#endif + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, m_frame_texture); + glBegin(GL_QUADS); + glTexCoord2i(0, 0); + glVertex2i(x, y); + glTexCoord2i(1, 0); + glVertex2i(x + w, y); + glTexCoord2i(1, 1); + glVertex2i(x + w, y + h); + glTexCoord2i(0, 1); + glVertex2i(x, y + h); + glEnd(); + glDisable(GL_TEXTURE_2D); + } } void VideoGLWidget::showImage(const QImage &image) @@ -155,6 +180,9 @@ void VideoGLWidget::showImage(const QImage &image) makeCurrent(); if (m_texture) glDeleteTextures(1, &m_texture); + delete m_frame; + m_frame = NULL; + m_frame_texture = 0; glPixelStorei(GL_UNPACK_ROW_LENGTH, m_image_width); glGenTextures(1, &m_texture); @@ -166,6 +194,22 @@ void VideoGLWidget::showImage(const QImage &image) updateGL(); } +void VideoGLWidget::showImage(Mlt::Frame* frame, GLuint texnum) +{ + makeCurrent(); + GLsync sync = (GLsync) frame->get("movit.convert.fence"); + glClientWaitSync(sync, 0, GL_TIMEOUT_IGNORED); + if (m_texture) { + glDeleteTextures(1, &m_texture); + m_texture = 0; + } + delete m_frame; + m_frame = frame; + m_frame_texture = texnum; + + updateGL(); +} + void VideoGLWidget::mouseDoubleClickEvent(QMouseEvent * event) { // TODO: disable screensaver?