diff --git a/language/Dutch/strings.xml b/language/Dutch/strings.xml
index 0fa14921dd604..5813051753e33 100644
--- a/language/Dutch/strings.xml
+++ b/language/Dutch/strings.xml
@@ -1233,7 +1233,8 @@
Hardwareversnelling inschakelen (OpenMax)
Pixelshaders
Hardware acceleratie toestaan (VideoToolbox)
-
+ Vdpau OpenGL interop RGB inschakelen
+ Vdpau OpenGL interop YUV inschakelen
A/V-synchronisatiemethode
Audiosignaal
Videosignaal (Drop/Dupe audio)
diff --git a/language/English/strings.xml b/language/English/strings.xml
index b42a3e962ac70..10bfa4d2c95ee 100644
--- a/language/English/strings.xml
+++ b/language/English/strings.xml
@@ -1232,6 +1232,8 @@
Allow hardware acceleration (OpenMax)
Pixel Shaders
Allow hardware acceleration (VideoToolbox)
+ Allow Vdpau OpenGL interop RGB
+ Allow Vdpau OpenGL interop YUV
A/V sync method
Audio clock
diff --git a/language/German/strings.xml b/language/German/strings.xml
index 9175cb90ae73e..9c7a6b29823c6 100644
--- a/language/German/strings.xml
+++ b/language/German/strings.xml
@@ -1266,6 +1266,8 @@
Hardwarebeschleunigung erlauben (OpenMax)
Pixel Shaders
Hardwarebeschleunigung erlauben (VideoToolbox)
+ Vdpau OpenGL interop RGB erlauben
+ Vdpau OpenGL interop YUV erlauben
A/V Sync Methode
Audio Takt
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp
index f77ac5fae3985..4ce41fab84b52 100644
--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp
+++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp
@@ -19,9 +19,6 @@
*
*/
-// switch to turn on GL_NV_vdpau_interop
-#define VDPAU_GL_INTEROP
-
#include "system.h"
#ifdef HAVE_LIBVDPAU
#include
@@ -118,42 +115,43 @@ CVDPAU::CVDPAU() : CThread("CVDPAU")
if (!glXReleaseTexImageEXT)
glXReleaseTexImageEXT = (PFNGLXRELEASETEXIMAGEEXTPROC)glXGetProcAddress((GLubyte *) "glXReleaseTexImageEXT");
- hasVdpauGlInterop = false;
m_GlInteropStatus = OUTPUT_NONE;
m_renderThread = NULL;
m_presentPicture = m_flipBuffer[0] = m_flipBuffer[1] = m_flipBuffer[2] = NULL;
m_flipBufferIdx = 0;
-#ifdef VDPAU_GL_INTEROP
#ifdef GL_NV_vdpau_interop
- if (!glVDPAUInitNV)
- glVDPAUInitNV = (PFNGLVDPAUINITNVPROC)glXGetProcAddress((GLubyte *) "glVDPAUInitNV");
- if (!glVDPAUFiniNV)
- glVDPAUFiniNV = (PFNGLVDPAUFININVPROC)glXGetProcAddress((GLubyte *) "glVDPAUFiniNV");
- if (!glVDPAURegisterOutputSurfaceNV)
- glVDPAURegisterOutputSurfaceNV = (PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC)glXGetProcAddress((GLubyte *) "glVDPAURegisterOutputSurfaceNV");
- if (!glVDPAURegisterVideoSurfaceNV)
- glVDPAURegisterVideoSurfaceNV = (PFNGLVDPAUREGISTERVIDEOSURFACENVPROC)glXGetProcAddress((GLubyte *) "glVDPAURegisterVideoSurfaceNV");
- if (!glVDPAUIsSurfaceNV)
- glVDPAUIsSurfaceNV = (PFNGLVDPAUISSURFACENVPROC)glXGetProcAddress((GLubyte *) "glVDPAUIsSurfaceNV");
- if (!glVDPAUUnregisterSurfaceNV)
- glVDPAUUnregisterSurfaceNV = (PFNGLVDPAUUNREGISTERSURFACENVPROC)glXGetProcAddress((GLubyte *) "glVDPAUUnregisterSurfaceNV");
- if (!glVDPAUSurfaceAccessNV)
- glVDPAUSurfaceAccessNV = (PFNGLVDPAUSURFACEACCESSNVPROC)glXGetProcAddress((GLubyte *) "glVDPAUSurfaceAccessNV");
- if (!glVDPAUMapSurfacesNV)
- glVDPAUMapSurfacesNV = (PFNGLVDPAUMAPSURFACESNVPROC)glXGetProcAddress((GLubyte *) "glVDPAUMapSurfacesNV");
- if (!glVDPAUUnmapSurfacesNV)
- glVDPAUUnmapSurfacesNV = (PFNGLVDPAUUNMAPSURFACESNVPROC)glXGetProcAddress((GLubyte *) "glVDPAUUnmapSurfacesNV");
- if (!glVDPAUGetSurfaceivNV)
- glVDPAUGetSurfaceivNV = (PFNGLVDPAUGETSURFACEIVNVPROC)glXGetProcAddress((GLubyte *) "glVDPAUGetSurfaceivNV");
-
- hasVdpauGlInterop = glewIsSupported("GL_NV_vdpau_interop");
- if (hasVdpauGlInterop)
- {
- CLog::Log(LOGNOTICE, "CVDPAU::CVDPAU GL interop supported and being used");
+ if (glewIsSupported("GL_NV_vdpau_interop"))
+ {
+ if (!glVDPAUInitNV)
+ glVDPAUInitNV = (PFNGLVDPAUINITNVPROC)glXGetProcAddress((GLubyte *) "glVDPAUInitNV");
+ if (!glVDPAUFiniNV)
+ glVDPAUFiniNV = (PFNGLVDPAUFININVPROC)glXGetProcAddress((GLubyte *) "glVDPAUFiniNV");
+ if (!glVDPAURegisterOutputSurfaceNV)
+ glVDPAURegisterOutputSurfaceNV = (PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC)glXGetProcAddress((GLubyte *) "glVDPAURegisterOutputSurfaceNV");
+ if (!glVDPAURegisterVideoSurfaceNV)
+ glVDPAURegisterVideoSurfaceNV = (PFNGLVDPAUREGISTERVIDEOSURFACENVPROC)glXGetProcAddress((GLubyte *) "glVDPAURegisterVideoSurfaceNV");
+ if (!glVDPAUIsSurfaceNV)
+ glVDPAUIsSurfaceNV = (PFNGLVDPAUISSURFACENVPROC)glXGetProcAddress((GLubyte *) "glVDPAUIsSurfaceNV");
+ if (!glVDPAUUnregisterSurfaceNV)
+ glVDPAUUnregisterSurfaceNV = (PFNGLVDPAUUNREGISTERSURFACENVPROC)glXGetProcAddress((GLubyte *) "glVDPAUUnregisterSurfaceNV");
+ if (!glVDPAUSurfaceAccessNV)
+ glVDPAUSurfaceAccessNV = (PFNGLVDPAUSURFACEACCESSNVPROC)glXGetProcAddress((GLubyte *) "glVDPAUSurfaceAccessNV");
+ if (!glVDPAUMapSurfacesNV)
+ glVDPAUMapSurfacesNV = (PFNGLVDPAUMAPSURFACESNVPROC)glXGetProcAddress((GLubyte *) "glVDPAUMapSurfacesNV");
+ if (!glVDPAUUnmapSurfacesNV)
+ glVDPAUUnmapSurfacesNV = (PFNGLVDPAUUNMAPSURFACESNVPROC)glXGetProcAddress((GLubyte *) "glVDPAUUnmapSurfacesNV");
+ if (!glVDPAUGetSurfaceivNV)
+ glVDPAUGetSurfaceivNV = (PFNGLVDPAUGETSURFACEIVNVPROC)glXGetProcAddress((GLubyte *) "glVDPAUGetSurfaceivNV");
+
+ CLog::Log(LOGNOTICE, "CVDPAU::CVDPAU GL interop supported");
}
+ else
#endif
-#endif
+ {
+ g_guiSettings.SetBool("videoplayer.usevdpauinteroprgb",false);
+ g_guiSettings.SetBool("videoplayer.usevdpauinteropyuv",false);
+ }
totalAvailableOutputSurfaces = 0;
presentSurface = VDP_INVALID_HANDLE;
@@ -647,7 +645,7 @@ bool CVDPAU::Supports(EINTERLACEMETHOD method)
|| method == VS_INTERLACEMETHOD_AUTO)
return true;
- if (hasVdpauGlInterop)
+ if (g_guiSettings.GetBool("videoplayer.usevdpauinteropyuv"))
{
if (method == VS_INTERLACEMETHOD_RENDER_BOB)
return true;
@@ -1167,7 +1165,8 @@ bool CVDPAU::ConfigOutputMethod(AVCodecContext *avctx, AVFrame *pFrame)
}
}
- if (!m_bVdpauDeinterlacing && hasVdpauGlInterop)
+ if (!m_bVdpauDeinterlacing &&
+ g_guiSettings.GetBool("videoplayer.usevdpauinteropyuv"))
{
if (m_vdpauOutputMethod == OUTPUT_GL_INTEROP_YUV)
return true;
@@ -1200,7 +1199,7 @@ bool CVDPAU::ConfigOutputMethod(AVCodecContext *avctx, AVFrame *pFrame)
totalAvailableOutputSurfaces = 0;
int tmpMaxOutputSurfaces = NUM_OUTPUT_SURFACES;
- if (!hasVdpauGlInterop)
+ if (!g_guiSettings.GetBool("videoplayer.usevdpauinteroprgb"))
tmpMaxOutputSurfaces = 4;
// Creation of outputSurfaces
@@ -1228,7 +1227,7 @@ bool CVDPAU::ConfigOutputMethod(AVCodecContext *avctx, AVFrame *pFrame)
for (int i = 0; i < NUM_OUTPUT_SURFACES; i++)
{
- if (hasVdpauGlInterop)
+ if (g_guiSettings.GetBool("videoplayer.usevdpauinteroprgb"))
m_allOutPic[i].outputSurface = outputSurfaces[i];
m_allOutPic[i].render = NULL;
@@ -1237,7 +1236,7 @@ bool CVDPAU::ConfigOutputMethod(AVCodecContext *avctx, AVFrame *pFrame)
m_mixerCmd = 0;
- if (hasVdpauGlInterop)
+ if (g_guiSettings.GetBool("videoplayer.usevdpauinteroprgb"))
m_vdpauOutputMethod = OUTPUT_GL_INTEROP_RGB;
else
{
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h
index 3e3aa47414dcc..96d22aacdf93d 100644
--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h
+++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h
@@ -299,7 +299,6 @@ class CVDPAU
bool m_bVdpauDeinterlacing;
bool m_binterlacedFrame;
int m_dropCount;
- bool hasVdpauGlInterop;
volatile bool glInteropFinish;
bool m_bsurfaceMapped;
bool m_dropState;
diff --git a/xbmc/settings/GUISettings.cpp b/xbmc/settings/GUISettings.cpp
index e228621b250ea..ed7b9906f1840 100644
--- a/xbmc/settings/GUISettings.cpp
+++ b/xbmc/settings/GUISettings.cpp
@@ -588,6 +588,8 @@ void CGUISettings::Initialize()
#ifdef HAVE_LIBVDPAU
AddBool(vp, "videoplayer.usevdpau", 13425, true);
+ AddBool(vp, "videoplayer.usevdpauinteroprgb", 13433, true);
+ AddBool(vp, "videoplayer.usevdpauinteropyuv", 13434, true);
#endif
#ifdef HAVE_LIBVA
AddBool(vp, "videoplayer.usevaapi", 13426, true);
diff --git a/xbmc/settings/GUIWindowSettingsCategory.cpp b/xbmc/settings/GUIWindowSettingsCategory.cpp
index eb04966b37912..8e0657cadcdd6 100644
--- a/xbmc/settings/GUIWindowSettingsCategory.cpp
+++ b/xbmc/settings/GUIWindowSettingsCategory.cpp
@@ -557,6 +557,40 @@ void CGUIWindowSettingsCategory::UpdateSettings()
pControl->SetEnabled(true);
}
}
+ else if (strSetting.Equals("videoplayer.usevdpauinteropyuv"))
+ {
+ bool hasInterop = false;
+#ifdef GL_NV_vdpau_interop
+ hasInterop = true;
+#endif
+ CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
+ if (pControl && hasInterop && glewIsSupported("GL_NV_vdpau_interop"))
+ {
+ pControl->SetEnabled(true);
+ }
+ else
+ {
+ pControl->SetEnabled(false);
+ g_guiSettings.SetBool("videoplayer.usevdpauinteropyuv",false);
+ }
+ }
+ else if (strSetting.Equals("videoplayer.usevdpauinteroprgb"))
+ {
+ bool hasInterop = false;
+#ifdef GL_NV_vdpau_interop
+ hasInterop = true;
+#endif
+ CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID());
+ if (pControl && hasInterop && glewIsSupported("GL_NV_vdpau_interop"))
+ {
+ pControl->SetEnabled(true);
+ }
+ else
+ {
+ pControl->SetEnabled(false);
+ g_guiSettings.SetBool("videoplayer.usevdpauinteroprgb",false);
+ }
+ }
else
#endif
if (strSetting.Equals("videoscreen.resolution"))