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"))