summaryrefslogtreecommitdiff
path: root/avmedia
diff options
context:
space:
mode:
authorZolnai Tamás <tamas.zolnai@collabora.com>2014-07-21 14:21:25 +0200
committerCaolán McNamara <caolanm@redhat.com>2014-07-21 19:21:48 +0000
commit3c2ce3618f586d932b516c15167a79f2b882fbf5 (patch)
tree7c306cf0bf8fa2f2fa529b143e3e300ec1c7fdc0 /avmedia
parentf6445efb0e5c3de099f0425825fe1e6e8271dfb9 (diff)
fdo#81055: Crash due to inadequate checks for GL version / capabilities
Base line is OpenGL 2.1 + extensions. GL_ARB_framebuffer_object (part of OpenGL 3.0) for glGenFramebuffers, glGenRenderbuffers... GL_ARB_vertex_array_object (part of OpenGL 3.0) for glGenVertexArrays, glBindVertexArray... GL_ARB_sampler_objects (part of OpenGL 3.3) for glGenSamplers, glBindSampler... (cherry picked from commit 378b1d24a958114eb4484cb10f609f6e482772ec) (and cherry picked some part of commit 23c876deeb357b6306712ff0586a819176151c15) Change-Id: I3a3caeab7ef593188ee742c53e6715648bf14f50 Reviewed-on: https://gerrit.libreoffice.org/10440 Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'avmedia')
-rw-r--r--avmedia/source/opengl/oglplayer.cxx31
1 files changed, 31 insertions, 0 deletions
diff --git a/avmedia/source/opengl/oglplayer.cxx b/avmedia/source/opengl/oglplayer.cxx
index f39f84749427..b827d2fbe13d 100644
--- a/avmedia/source/opengl/oglplayer.cxx
+++ b/avmedia/source/opengl/oglplayer.cxx
@@ -246,6 +246,25 @@ awt::Size SAL_CALL OGLPlayer::getPreferredPlayerWindowSize() throw ( uno::Runtim
return awt::Size( 480, 360 );
}
+static bool lcl_CheckOpenGLRequirements()
+{
+ float fVersion = OpenGLHelper::getGLVersion();
+ if( fVersion >= 3.3 )
+ {
+ return true;
+ }
+ else if( fVersion >= 3.0 )
+ {
+ return glewIsSupported("GL_ARB_sampler_objects");
+ }
+ else if( fVersion >= 2.1 )
+ {
+ return glewIsSupported("GL_ARB_sampler_objects GL_ARB_framebuffer_object GL_ARB_vertex_array_object");
+ }
+
+ return false;
+}
+
uno::Reference< media::XPlayerWindow > SAL_CALL OGLPlayer::createPlayerWindow( const uno::Sequence< uno::Any >& rArguments )
throw ( uno::RuntimeException, std::exception )
{
@@ -271,6 +290,12 @@ uno::Reference< media::XPlayerWindow > SAL_CALL OGLPlayer::createPlayerWindow( c
return uno::Reference< media::XPlayerWindow >();
}
+ if( !lcl_CheckOpenGLRequirements() )
+ {
+ SAL_WARN("avmedia.opengl", "Your platform does not have the minimal OpenGL requiremenets!");
+ return uno::Reference< media::XPlayerWindow >();
+ }
+
Size aSize = pChildWindow->GetSizePixel();
m_aContext.setWinSize(aSize);
m_pHandle->viewport.x = 0;
@@ -305,6 +330,12 @@ uno::Reference< media::XFrameGrabber > SAL_CALL OGLPlayer::createFrameGrabber()
return uno::Reference< media::XFrameGrabber >();
}
+ if( !lcl_CheckOpenGLRequirements() )
+ {
+ SAL_WARN("avmedia.opengl", "Your platform does not have the minimal OpenGL requiremenets!");
+ return uno::Reference< media::XFrameGrabber >();
+ }
+
m_pHandle->viewport.x = 0;
m_pHandle->viewport.y = 0;
m_pHandle->viewport.width = getPreferredPlayerWindowSize().Width;