summaryrefslogtreecommitdiffstats
path: root/src/plugins/qnx/mediaplayer/mmrendererplayervideorenderercontrol.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/qnx/mediaplayer/mmrendererplayervideorenderercontrol.cpp')
-rw-r--r--src/plugins/qnx/mediaplayer/mmrendererplayervideorenderercontrol.cpp53
1 files changed, 22 insertions, 31 deletions
diff --git a/src/plugins/qnx/mediaplayer/mmrendererplayervideorenderercontrol.cpp b/src/plugins/qnx/mediaplayer/mmrendererplayervideorenderercontrol.cpp
index 7bb3c284d..3b5715157 100644
--- a/src/plugins/qnx/mediaplayer/mmrendererplayervideorenderercontrol.cpp
+++ b/src/plugins/qnx/mediaplayer/mmrendererplayervideorenderercontrol.cpp
@@ -58,7 +58,7 @@ MmRendererPlayerVideoRendererControl::MmRendererPlayerVideoRendererControl(QObje
, m_context(0)
, m_videoId(-1)
{
- connect(m_windowGrabber, SIGNAL(frameGrabbed(QImage, int)), SLOT(frameGrabbed(QImage, int)));
+ connect(m_windowGrabber, SIGNAL(updateScene(const QSize &)), SLOT(updateScene(const QSize &)));
}
MmRendererPlayerVideoRendererControl::~MmRendererPlayerVideoRendererControl()
@@ -142,13 +142,14 @@ void MmRendererPlayerVideoRendererControl::resume()
m_windowGrabber->resume();
}
-class BBTextureBuffer : public QAbstractVideoBuffer
+class QnxTextureBuffer : public QAbstractVideoBuffer
{
public:
- BBTextureBuffer(int handle) :
+ QnxTextureBuffer(WindowGrabber *windowGrabber) :
QAbstractVideoBuffer(QAbstractVideoBuffer::GLTextureHandle)
{
- m_handle = handle;
+ m_windowGrabber = windowGrabber;
+ m_handle = 0;
}
MapMode mapMode() const {
return QAbstractVideoBuffer::ReadWrite;
@@ -163,54 +164,46 @@ public:
return 0;
}
QVariant handle() const {
+ if (!m_handle) {
+ const_cast<QnxTextureBuffer*>(this)->m_handle = m_windowGrabber->getNextTextureId();
+ }
return m_handle;
}
private:
+ WindowGrabber *m_windowGrabber;
int m_handle;
};
-void MmRendererPlayerVideoRendererControl::frameGrabbed(const QImage &frame, int handle)
+void MmRendererPlayerVideoRendererControl::updateScene(const QSize &size)
{
if (m_surface) {
if (!m_surface->isActive()) {
if (m_windowGrabber->eglImageSupported()) {
- if (QOpenGLContext::currentContext())
- m_windowGrabber->createEglImages();
- else
- m_surface->setProperty("_q_GLThreadCallback", QVariant::fromValue<QObject*>(this));
-
- m_surface->start(QVideoSurfaceFormat(frame.size(), QVideoFrame::Format_BGR32,
- QAbstractVideoBuffer::GLTextureHandle));
+ m_surface->start(QVideoSurfaceFormat(size, QVideoFrame::Format_BGR32,
+ QAbstractVideoBuffer::GLTextureHandle));
} else {
- m_surface->start(QVideoSurfaceFormat(frame.size(), QVideoFrame::Format_ARGB32));
+ m_surface->start(QVideoSurfaceFormat(size, QVideoFrame::Format_ARGB32));
}
} else {
- if (m_surface->surfaceFormat().frameSize() != frame.size()) {
- QAbstractVideoBuffer::HandleType type = m_surface->surfaceFormat().handleType();
+ if (m_surface->surfaceFormat().frameSize() != size) {
m_surface->stop();
- if (type != QAbstractVideoBuffer::NoHandle) {
- m_surface->setProperty("_q_GLThreadCallback", QVariant::fromValue<QObject*>(this));
- m_surface->start(QVideoSurfaceFormat(frame.size(), QVideoFrame::Format_BGR32,
- QAbstractVideoBuffer::GLTextureHandle));
+ if (m_windowGrabber->eglImageSupported()) {
+ m_surface->start(QVideoSurfaceFormat(size, QVideoFrame::Format_BGR32,
+ QAbstractVideoBuffer::GLTextureHandle));
} else {
- m_surface->start(QVideoSurfaceFormat(frame.size(), QVideoFrame::Format_ARGB32));
+ m_surface->start(QVideoSurfaceFormat(size, QVideoFrame::Format_ARGB32));
}
}
}
// Depending on the support of EGL images on the current platform we either pass a texture
// handle or a copy of the image data
- if (m_surface->surfaceFormat().handleType() != QAbstractVideoBuffer::NoHandle) {
- if (m_windowGrabber->eglImagesInitialized() &&
- m_surface->property("_q_GLThreadCallback") != 0)
- m_surface->setProperty("_q_GLThreadCallback", 0);
-
-
- BBTextureBuffer *textBuffer = new BBTextureBuffer(handle);
- QVideoFrame actualFrame(textBuffer, frame.size(), QVideoFrame::Format_BGR32);
+ if (m_windowGrabber->eglImageSupported()) {
+ QnxTextureBuffer *textBuffer = new QnxTextureBuffer(m_windowGrabber);
+ QVideoFrame actualFrame(textBuffer, size, QVideoFrame::Format_BGR32);
m_surface->present(actualFrame);
} else {
- m_surface->present(frame.copy());
+ m_surface->present(m_windowGrabber->getNextImage().copy());
}
}
}
@@ -220,8 +213,6 @@ void MmRendererPlayerVideoRendererControl::customEvent(QEvent *e)
// This is running in the render thread (OpenGL enabled)
if (e->type() == QEvent::User)
m_windowGrabber->checkForEglImageExtension();
- else if (e->type() == QEvent::User + 1)
- m_windowGrabber->createEglImages();
}
QT_END_NAMESPACE