Fix for QuickTime 7 media player backend

Fix build on Mac 10.6 (32bits)

Task-number: QTBUG-27179

Change-Id: If0b83605650966bf801b5fbb06d02c113d0b4214
Reviewed-by: Andy Nichols <andy.nichols@digia.com>
This commit is contained in:
Caroline Chao
2012-10-19 14:34:38 +02:00
committed by The Qt Project
parent 700b4cdf42
commit 8907cecc0d
3 changed files with 33 additions and 16 deletions

View File

@@ -55,6 +55,8 @@
#include <qabstractvideosurface.h> #include <qabstractvideosurface.h>
#include <qvideosurfaceformat.h> #include <qvideosurfaceformat.h>
#include <QtOpenGl/QGLContext>
QT_USE_NAMESPACE QT_USE_NAMESPACE
//#define USE_MAIN_MONITOR_COLOR_SPACE 1 //#define USE_MAIN_MONITOR_COLOR_SPACE 1

View File

@@ -61,6 +61,8 @@ class QT7PlayerSession;
class QT7PlayerService; class QT7PlayerService;
class QGLWidget; class QGLWidget;
class QGLFramebufferObject; class QGLFramebufferObject;
class QWindow;
class QOpenGLContext;
class QT7MovieViewRenderer : public QT7VideoRendererControl class QT7MovieViewRenderer : public QT7VideoRendererControl
{ {
@@ -88,7 +90,8 @@ private:
QSize m_nativeSize; QSize m_nativeSize;
QAbstractVideoSurface *m_surface; QAbstractVideoSurface *m_surface;
QVideoFrame m_currentFrame; QVideoFrame m_currentFrame;
QGLWidget *m_glWidget; QWindow *m_window;
QOpenGLContext *m_context;
QGLFramebufferObject *m_fbo; QGLFramebufferObject *m_fbo;
CIContext *m_ciContext; CIContext *m_ciContext;

View File

@@ -137,7 +137,7 @@ private:
@interface HiddenQTMovieView : QTMovieView @interface HiddenQTMovieView : QTMovieView
{ {
@private @private
QWidget *m_window; QWindow *m_window;
QT7MovieViewRenderer *m_renderer; QT7MovieViewRenderer *m_renderer;
QReadWriteLock m_rendererLock; QReadWriteLock m_rendererLock;
} }
@@ -160,10 +160,10 @@ private:
QWriteLocker lock(&self->m_rendererLock); QWriteLocker lock(&self->m_rendererLock);
self->m_renderer = renderer; self->m_renderer = renderer;
self->m_window = new QWidget; self->m_window = new QWindow;
self->m_window->setWindowOpacity(0.0); self->m_window->setOpacity(0.0);
self->m_window->show(); self->m_window->setGeometry(0,0,1,1);
self->m_window->hide(); self->m_window->create();
[(NSView *)(self->m_window->winId()) addSubview:self]; [(NSView *)(self->m_window->winId()) addSubview:self];
[self setDrawRect:QRect(0,0,1,1)]; [self setDrawRect:QRect(0,0,1,1)];
@@ -173,7 +173,7 @@ private:
- (void) dealloc - (void) dealloc
{ {
delete self->m_window; self->m_window->deleteLater();
[super dealloc]; [super dealloc];
} }
@@ -273,7 +273,8 @@ QT7MovieViewRenderer::QT7MovieViewRenderer(QObject *parent)
m_movie(0), m_movie(0),
m_movieView(0), m_movieView(0),
m_surface(0), m_surface(0),
m_glWidget(0), m_window(0),
m_context(0),
m_fbo(0), m_fbo(0),
m_ciContext(0), m_ciContext(0),
m_pendingRenderEvent(false) m_pendingRenderEvent(false)
@@ -289,7 +290,7 @@ QT7MovieViewRenderer::~QT7MovieViewRenderer()
[(HiddenQTMovieView*)m_movieView release]; [(HiddenQTMovieView*)m_movieView release];
[m_ciContext release]; [m_ciContext release];
delete m_fbo; delete m_fbo;
delete m_glWidget; delete m_window;
} }
void QT7MovieViewRenderer::setupVideoOutput() void QT7MovieViewRenderer::setupVideoOutput()
@@ -364,24 +365,35 @@ QVideoFrame QT7MovieViewRenderer::convertCIImageToGLTexture(const QVideoFrame &f
if (frame.handleType() != QAbstractVideoBuffer::CoreImageHandle) if (frame.handleType() != QAbstractVideoBuffer::CoreImageHandle)
return QVideoFrame(); return QVideoFrame();
if (!m_glWidget) { if (!m_window) {
QOpenGLContext *qGlContext = 0; QOpenGLContext *qGlContext = 0;
if (m_surface) if (m_surface)
qGlContext = qobject_cast<QOpenGLContext*>(m_surface->property("GLContext").value<QObject*>()); qGlContext = qobject_cast<QOpenGLContext*>(m_surface->property("GLContext").value<QObject*>());
if (qGlContext) { if (qGlContext) {
QGLContext *surfaceContext = QGLContext::fromOpenGLContext(qGlContext); m_window = new QWindow();
m_glWidget = new QGLWidget();
QGLContext *context = new QGLContext(surfaceContext->format()); QSurfaceFormat format(qGlContext->format());
m_glWidget->setContext(context, surfaceContext);
m_context = new QOpenGLContext(m_window);
m_context->setShareContext(qGlContext);
m_context->setFormat(format);
m_context->create();
m_window->setFormat(format);
m_window->setGeometry(0, 0, 1, 1);
m_window->setSurfaceType(QWindow::OpenGLSurface);
m_window->create();
} else { } else {
return QVideoFrame(); return QVideoFrame();
} }
} }
m_glWidget->makeCurrent(); if (!m_context)
return QVideoFrame();
m_context->makeCurrent(m_window);
if (!m_fbo || m_fbo->size() != frame.size()) { if (!m_fbo || m_fbo->size() != frame.size()) {
delete m_fbo; delete m_fbo;
@@ -414,6 +426,7 @@ QVideoFrame QT7MovieViewRenderer::convertCIImageToGLTexture(const QVideoFrame &f
[m_ciContext drawImage:ciImg inRect:dRect fromRect:sRect]; [m_ciContext drawImage:ciImg inRect:dRect fromRect:sRect];
} }
p.endNativePainting(); p.endNativePainting();
QAbstractVideoBuffer *buffer = new TextureVideoBuffer(m_fbo->texture()); QAbstractVideoBuffer *buffer = new TextureVideoBuffer(m_fbo->texture());
@@ -462,7 +475,6 @@ void QT7MovieViewRenderer::setSurface(QAbstractVideoSurface *surface)
void QT7MovieViewRenderer::renderFrame(const QVideoFrame &frame) void QT7MovieViewRenderer::renderFrame(const QVideoFrame &frame)
{ {
QMutexLocker locker(&m_mutex); QMutexLocker locker(&m_mutex);
m_currentFrame = frame; m_currentFrame = frame;