xbmc-pvr: update XVBA patches

Signed-off-by: Stephan Raue <stephan@openelec.tv>
This commit is contained in:
Stephan Raue 2012-01-17 10:58:20 +01:00
parent d233723f0a
commit ea7aba51d4

View File

@ -972,7 +972,7 @@ index 8ec91c8..4803dd7 100644
PIX_FMT_RGB444BE, ///< packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), big-endian, most significant bits to 0 PIX_FMT_RGB444BE, ///< packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), big-endian, most significant bits to 0
PIX_FMT_RGB444LE, ///< packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), little-endian, most significant bits to 0 PIX_FMT_RGB444LE, ///< packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), little-endian, most significant bits to 0
diff --git a/xbmc/ApplicationMessenger.cpp b/xbmc/ApplicationMessenger.cpp diff --git a/xbmc/ApplicationMessenger.cpp b/xbmc/ApplicationMessenger.cpp
index b43f765..e68c630 100644 index e95ecdc..892948a 100644
--- a/xbmc/ApplicationMessenger.cpp --- a/xbmc/ApplicationMessenger.cpp
+++ b/xbmc/ApplicationMessenger.cpp +++ b/xbmc/ApplicationMessenger.cpp
@@ -72,7 +72,7 @@ @@ -72,7 +72,7 @@
@ -1043,7 +1043,7 @@ index f0b4aeb..47d25e4 100644
m_paused = false; m_paused = false;
m_clock = 0; m_clock = 0;
diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp
index 4961b7d..df3ec01 100644 index 4961b7d..70f20d7 100644
--- a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp --- a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp
+++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp +++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp
@@ -60,6 +60,9 @@ @@ -60,6 +60,9 @@
@ -1056,17 +1056,18 @@ index 4961b7d..df3ec01 100644
#ifdef HAS_GLX #ifdef HAS_GLX
#include <GL/glx.h> #include <GL/glx.h>
@@ -120,6 +123,9 @@ CLinuxRendererGL::YUVBUFFER::YUVBUFFER() @@ -120,6 +123,10 @@ CLinuxRendererGL::YUVBUFFER::YUVBUFFER()
#ifdef HAVE_LIBVDPAU #ifdef HAVE_LIBVDPAU
vdpau = NULL; vdpau = NULL;
#endif #endif
+#ifdef HAVE_LIBXVBA +#ifdef HAVE_LIBXVBA
+ xvba = NULL; + xvba = NULL;
+ xvba_tmp = NULL;
+#endif +#endif
} }
CLinuxRendererGL::YUVBUFFER::~YUVBUFFER() CLinuxRendererGL::YUVBUFFER::~YUVBUFFER()
@@ -159,6 +165,7 @@ CLinuxRendererGL::CLinuxRendererGL() @@ -159,6 +166,7 @@ CLinuxRendererGL::CLinuxRendererGL()
m_rgbPbo = 0; m_rgbPbo = 0;
m_dllSwScale = new DllSwScale; m_dllSwScale = new DllSwScale;
@ -1074,7 +1075,7 @@ index 4961b7d..df3ec01 100644
} }
CLinuxRendererGL::~CLinuxRendererGL() CLinuxRendererGL::~CLinuxRendererGL()
@@ -223,7 +230,7 @@ bool CLinuxRendererGL::ValidateRenderer() @@ -223,7 +231,7 @@ bool CLinuxRendererGL::ValidateRenderer()
void CLinuxRendererGL::ManageTextures() void CLinuxRendererGL::ManageTextures()
{ {
@ -1083,7 +1084,7 @@ index 4961b7d..df3ec01 100644
//m_iYV12RenderBuffer = 0; //m_iYV12RenderBuffer = 0;
return; return;
} }
@@ -568,6 +575,11 @@ void CLinuxRendererGL::Flush() @@ -568,6 +576,11 @@ void CLinuxRendererGL::Flush()
m_bValidated = false; m_bValidated = false;
} }
@ -1095,7 +1096,7 @@ index 4961b7d..df3ec01 100644
void CLinuxRendererGL::Update(bool bPauseDrawing) void CLinuxRendererGL::Update(bool bPauseDrawing)
{ {
if (!m_bConfigured) return; if (!m_bConfigured) return;
@@ -729,14 +741,15 @@ unsigned int CLinuxRendererGL::PreInit() @@ -729,14 +742,15 @@ unsigned int CLinuxRendererGL::PreInit()
{ {
CSingleLock lock(g_graphicsContext); CSingleLock lock(g_graphicsContext);
m_bConfigured = false; m_bConfigured = false;
@ -1114,7 +1115,7 @@ index 4961b7d..df3ec01 100644
// setup the background colour // setup the background colour
m_clearColour = (float)(g_advancedSettings.m_videoBlackBarColour & 0xff) / 0xff; m_clearColour = (float)(g_advancedSettings.m_videoBlackBarColour & 0xff) / 0xff;
@@ -816,7 +829,7 @@ void CLinuxRendererGL::UpdateVideoFilter() @@ -816,7 +830,7 @@ void CLinuxRendererGL::UpdateVideoFilter()
case VS_SCALINGMETHOD_LINEAR: case VS_SCALINGMETHOD_LINEAR:
SetTextureFilter(m_scalingMethod == VS_SCALINGMETHOD_NEAREST ? GL_NEAREST : GL_LINEAR); SetTextureFilter(m_scalingMethod == VS_SCALINGMETHOD_NEAREST ? GL_NEAREST : GL_LINEAR);
m_renderQuality = RQ_SINGLEPASS; m_renderQuality = RQ_SINGLEPASS;
@ -1123,7 +1124,7 @@ index 4961b7d..df3ec01 100644
{ {
m_pVideoFilterShader = new StretchFilterShader(); m_pVideoFilterShader = new StretchFilterShader();
if (!m_pVideoFilterShader->CompileAndLink()) if (!m_pVideoFilterShader->CompileAndLink())
@@ -897,6 +910,11 @@ void CLinuxRendererGL::LoadShaders(int field) @@ -897,6 +911,11 @@ void CLinuxRendererGL::LoadShaders(int field)
CLog::Log(LOGNOTICE, "GL: Using VAAPI render method"); CLog::Log(LOGNOTICE, "GL: Using VAAPI render method");
m_renderMethod = RENDER_VAAPI; m_renderMethod = RENDER_VAAPI;
} }
@ -1135,7 +1136,7 @@ index 4961b7d..df3ec01 100644
else else
{ {
int requestedMethod = g_guiSettings.GetInt("videoplayer.rendermethod"); int requestedMethod = g_guiSettings.GetInt("videoplayer.rendermethod");
@@ -1031,6 +1049,18 @@ void CLinuxRendererGL::LoadShaders(int field) @@ -1031,6 +1050,18 @@ void CLinuxRendererGL::LoadShaders(int field)
m_textureCreate = &CLinuxRendererGL::CreateVAAPITexture; m_textureCreate = &CLinuxRendererGL::CreateVAAPITexture;
m_textureDelete = &CLinuxRendererGL::DeleteVAAPITexture; m_textureDelete = &CLinuxRendererGL::DeleteVAAPITexture;
} }
@ -1154,7 +1155,7 @@ index 4961b7d..df3ec01 100644
else else
{ {
// setup default YV12 texture handlers // setup default YV12 texture handlers
@@ -1124,6 +1154,13 @@ void CLinuxRendererGL::Render(DWORD flags, int renderBuffer) @@ -1124,6 +1155,13 @@ void CLinuxRendererGL::Render(DWORD flags, int renderBuffer)
RenderVDPAU(renderBuffer, m_currentField); RenderVDPAU(renderBuffer, m_currentField);
} }
#endif #endif
@ -1168,7 +1169,7 @@ index 4961b7d..df3ec01 100644
#ifdef HAVE_LIBVA #ifdef HAVE_LIBVA
else if (m_renderMethod & RENDER_VAAPI) else if (m_renderMethod & RENDER_VAAPI)
{ {
@@ -1597,6 +1634,77 @@ void CLinuxRendererGL::RenderVAAPI(int index, int field) @@ -1597,6 +1635,77 @@ void CLinuxRendererGL::RenderVAAPI(int index, int field)
#endif #endif
} }
@ -1246,7 +1247,7 @@ index 4961b7d..df3ec01 100644
void CLinuxRendererGL::RenderSoftware(int index, int field) void CLinuxRendererGL::RenderSoftware(int index, int field)
{ {
YUVPLANES &planes = m_buffers[index].fields[field]; YUVPLANES &planes = m_buffers[index].fields[field];
@@ -2351,6 +2459,408 @@ void CLinuxRendererGL::UploadVAAPITexture(int index) @@ -2351,6 +2460,424 @@ void CLinuxRendererGL::UploadVAAPITexture(int index)
#endif #endif
} }
@ -1259,6 +1260,7 @@ index 4961b7d..df3ec01 100644
+ m_buffers[index].xvba->FinishGL(); + m_buffers[index].xvba->FinishGL();
+ +
+ SAFE_RELEASE(m_buffers[index].xvba); + SAFE_RELEASE(m_buffers[index].xvba);
+ SAFE_RELEASE(m_buffers[index].xvba_tmp);
+ +
+ if(plane.id && glIsTexture(plane.id)) + if(plane.id && glIsTexture(plane.id))
+ glDeleteTextures(1, &plane.id); + glDeleteTextures(1, &plane.id);
@ -1305,6 +1307,13 @@ index 4961b7d..df3ec01 100644
+#ifdef HAVE_LIBXVBA +#ifdef HAVE_LIBXVBA
+ XVBA::CDecoder *xvba = m_buffers[index].xvba; + XVBA::CDecoder *xvba = m_buffers[index].xvba;
+ +
+ if (m_buffers[index].xvba_tmp)
+ {
+ SAFE_RELEASE(m_buffers[index].xvba);
+ xvba = m_buffers[index].xvba = m_buffers[index].xvba_tmp;
+ m_buffers[index].xvba_tmp = NULL;
+ }
+
+ YUVFIELDS &fields = m_buffers[index].fields; + YUVFIELDS &fields = m_buffers[index].fields;
+ YUVPLANE &planeFallback = fields[0][1]; + YUVPLANE &planeFallback = fields[0][1];
+ YUVPLANE &plane = fields[m_currentField][0]; + YUVPLANE &plane = fields[m_currentField][0];
@ -1369,6 +1378,7 @@ index 4961b7d..df3ec01 100644
+ m_buffers[index].xvba->FinishGL(); + m_buffers[index].xvba->FinishGL();
+ +
+ SAFE_RELEASE(m_buffers[index].xvba); + SAFE_RELEASE(m_buffers[index].xvba);
+ SAFE_RELEASE(m_buffers[index].xvba_tmp);
+ +
+ if( fields[FIELD_FULL][0].id == 0 ) return; + if( fields[FIELD_FULL][0].id == 0 ) return;
+ +
@ -1571,6 +1581,13 @@ index 4961b7d..df3ec01 100644
+ YUVFIELDS& fields = buf.fields; + YUVFIELDS& fields = buf.fields;
+ XVBA::CDecoder *xvba = m_buffers[source].xvba; + XVBA::CDecoder *xvba = m_buffers[source].xvba;
+ +
+ if (m_buffers[source].xvba_tmp)
+ {
+ SAFE_RELEASE(m_buffers[source].xvba);
+ xvba = m_buffers[source].xvba = m_buffers[source].xvba_tmp;
+ m_buffers[source].xvba_tmp = NULL;
+ }
+
+ if (!(im->flags&IMAGE_FLAG_READY) || !xvba) + if (!(im->flags&IMAGE_FLAG_READY) || !xvba)
+ { + {
+ m_eventTexturesDone[source]->Set(); + m_eventTexturesDone[source]->Set();
@ -1655,7 +1672,7 @@ index 4961b7d..df3ec01 100644
void CLinuxRendererGL::UploadYUV422PackedTexture(int source) void CLinuxRendererGL::UploadYUV422PackedTexture(int source)
{ {
YUVBUFFER& buf = m_buffers[source]; YUVBUFFER& buf = m_buffers[source];
@@ -2934,6 +3444,9 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature) @@ -2934,6 +3461,9 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature)
if (m_renderMethod & RENDER_VAAPI) if (m_renderMethod & RENDER_VAAPI)
return false; return false;
@ -1665,7 +1682,7 @@ index 4961b7d..df3ec01 100644
return (m_renderMethod & RENDER_GLSL) return (m_renderMethod & RENDER_GLSL)
|| (m_renderMethod & RENDER_ARB) || (m_renderMethod & RENDER_ARB)
|| ((m_renderMethod & RENDER_SW) && glewIsSupported("GL_ARB_imaging") == GL_TRUE); || ((m_renderMethod & RENDER_SW) && glewIsSupported("GL_ARB_imaging") == GL_TRUE);
@@ -2947,6 +3460,9 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature) @@ -2947,6 +3477,9 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature)
if (m_renderMethod & RENDER_VAAPI) if (m_renderMethod & RENDER_VAAPI)
return false; return false;
@ -1675,7 +1692,7 @@ index 4961b7d..df3ec01 100644
return (m_renderMethod & RENDER_GLSL) return (m_renderMethod & RENDER_GLSL)
|| (m_renderMethod & RENDER_ARB) || (m_renderMethod & RENDER_ARB)
|| ((m_renderMethod & RENDER_SW) && glewIsSupported("GL_ARB_imaging") == GL_TRUE); || ((m_renderMethod & RENDER_SW) && glewIsSupported("GL_ARB_imaging") == GL_TRUE);
@@ -2970,7 +3486,8 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature) @@ -2970,7 +3503,8 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature)
if (feature == RENDERFEATURE_NONLINSTRETCH) if (feature == RENDERFEATURE_NONLINSTRETCH)
{ {
if (((m_renderMethod & RENDER_GLSL) && !(m_renderMethod & RENDER_POT)) || if (((m_renderMethod & RENDER_GLSL) && !(m_renderMethod & RENDER_POT)) ||
@ -1685,7 +1702,7 @@ index 4961b7d..df3ec01 100644
return true; return true;
} }
@@ -3010,10 +3527,22 @@ bool CLinuxRendererGL::Supports(EINTERLACEMETHOD method) @@ -3010,10 +3544,22 @@ bool CLinuxRendererGL::Supports(EINTERLACEMETHOD method)
if(m_renderMethod & RENDER_VAAPI) if(m_renderMethod & RENDER_VAAPI)
return false; return false;
@ -1712,7 +1729,7 @@ index 4961b7d..df3ec01 100644
if((method == VS_INTERLACEMETHOD_RENDER_BLEND if((method == VS_INTERLACEMETHOD_RENDER_BLEND
|| method == VS_INTERLACEMETHOD_RENDER_WEAVE_INVERTED || method == VS_INTERLACEMETHOD_RENDER_WEAVE_INVERTED
@@ -3045,7 +3574,7 @@ bool CLinuxRendererGL::Supports(ESCALINGMETHOD method) @@ -3045,7 +3591,7 @@ bool CLinuxRendererGL::Supports(ESCALINGMETHOD method)
|| method == VS_SCALINGMETHOD_LANCZOS3) || method == VS_SCALINGMETHOD_LANCZOS3)
{ {
if ((glewIsSupported("GL_EXT_framebuffer_object") && (m_renderMethod & RENDER_GLSL)) || if ((glewIsSupported("GL_EXT_framebuffer_object") && (m_renderMethod & RENDER_GLSL)) ||
@ -1721,7 +1738,7 @@ index 4961b7d..df3ec01 100644
{ {
// spline36 and lanczos3 are only allowed through advancedsettings.xml // spline36 and lanczos3 are only allowed through advancedsettings.xml
if(method != VS_SCALINGMETHOD_SPLINE36 if(method != VS_SCALINGMETHOD_SPLINE36
@@ -3104,7 +3633,7 @@ void CLinuxRendererGL::UnBindPbo(YUVBUFFER& buff) @@ -3104,7 +3650,7 @@ void CLinuxRendererGL::UnBindPbo(YUVBUFFER& buff)
pbo = true; pbo = true;
glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, buff.pbo[plane]); glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, buff.pbo[plane]);
@ -1730,7 +1747,7 @@ index 4961b7d..df3ec01 100644
buff.image.plane[plane] = (BYTE*)glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, GL_WRITE_ONLY_ARB) + PBO_OFFSET; buff.image.plane[plane] = (BYTE*)glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, GL_WRITE_ONLY_ARB) + PBO_OFFSET;
} }
if(pbo) if(pbo)
@@ -3128,4 +3657,13 @@ void CLinuxRendererGL::AddProcessor(VAAPI::CHolder& holder) @@ -3128,4 +3674,13 @@ void CLinuxRendererGL::AddProcessor(VAAPI::CHolder& holder)
} }
#endif #endif
@ -1738,14 +1755,14 @@ index 4961b7d..df3ec01 100644
+void CLinuxRendererGL::AddProcessor(XVBA::CDecoder* xvba) +void CLinuxRendererGL::AddProcessor(XVBA::CDecoder* xvba)
+{ +{
+ YUVBUFFER &buf = m_buffers[NextYV12Texture()]; + YUVBUFFER &buf = m_buffers[NextYV12Texture()];
+ SAFE_RELEASE(buf.xvba); + SAFE_RELEASE(buf.xvba_tmp);
+ buf.xvba = (XVBA::CDecoder*)xvba->Acquire(); + buf.xvba_tmp = (XVBA::CDecoder*)xvba->Acquire();
+} +}
+#endif +#endif
+ +
#endif #endif
diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.h b/xbmc/cores/VideoRenderers/LinuxRendererGL.h diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.h b/xbmc/cores/VideoRenderers/LinuxRendererGL.h
index 38c84aa..9b8a5ae 100644 index 38c84aa..ae0b81b 100644
--- a/xbmc/cores/VideoRenderers/LinuxRendererGL.h --- a/xbmc/cores/VideoRenderers/LinuxRendererGL.h
+++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.h +++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.h
@@ -40,6 +40,7 @@ class CBaseTexture; @@ -40,6 +40,7 @@ class CBaseTexture;
@ -1805,12 +1822,13 @@ index 38c84aa..9b8a5ae 100644
CFrameBufferObject m_fbo; CFrameBufferObject m_fbo;
@@ -270,6 +285,9 @@ protected: @@ -270,6 +285,10 @@ protected:
#ifdef HAVE_LIBVA #ifdef HAVE_LIBVA
VAAPI::CHolder& vaapi; VAAPI::CHolder& vaapi;
#endif #endif
+#ifdef HAVE_LIBXVBA +#ifdef HAVE_LIBXVBA
+ XVBA::CDecoder* xvba; + XVBA::CDecoder* xvba;
+ XVBA::CDecoder* xvba_tmp;
+#endif +#endif
}; };
@ -1999,10 +2017,10 @@ index 1dce256..8b7d5fb 100644
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp
new file mode 100644 new file mode 100644
index 0000000..8f0106a index 0000000..d6317e0
--- /dev/null --- /dev/null
+++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp
@@ -0,0 +1,1380 @@ @@ -0,0 +1,1401 @@
+/* +/*
+ * Copyright (C) 2005-2011 Team XBMC + * Copyright (C) 2005-2011 Team XBMC
+ * http://www.xbmc.org + * http://www.xbmc.org
@ -2264,6 +2282,8 @@ index 0000000..8f0106a
+//----------------------------------------------------------------------------- +//-----------------------------------------------------------------------------
+//----------------------------------------------------------------------------- +//-----------------------------------------------------------------------------
+ +
+static unsigned int decoderId = 0;
+
+CDecoder::CDecoder() +CDecoder::CDecoder()
+{ +{
+ m_context = 0; + m_context = 0;
@ -2317,7 +2337,9 @@ index 0000000..8f0106a
+ return false; + return false;
+ } + }
+ +
+ CLog::Log(LOGNOTICE,"(XVBA::Open) opening dxva decoder"); + m_decoderId = decoderId++;
+
+ CLog::Log(LOGNOTICE,"(XVBA::Open) opening xvba decoder, id: %d", m_decoderId);
+ +
+ if(avctx->coded_width == 0 + if(avctx->coded_width == 0
+ || avctx->coded_height == 0) + || avctx->coded_height == 0)
@ -2486,11 +2508,13 @@ index 0000000..8f0106a
+ +
+void CDecoder::Close() +void CDecoder::Close()
+{ +{
+ CLog::Log(LOGNOTICE, "XVBA::Close - closing decoder"); + CLog::Log(LOGNOTICE, "XVBA::Close - closing decoder, id: %d", m_decoderId);
+ +
+ if (!m_context) + if (!m_context)
+ return; + return;
+ +
+ FinishGL();
+
+ DestroySession(); + DestroySession();
+ if (m_context) + if (m_context)
+ m_context->Release(); + m_context->Release();
@ -2590,6 +2614,14 @@ index 0000000..8f0106a
+ if (Success != g_XVBA_vtable.CreateDecode(&sessionInput, &sessionOutput)) + if (Success != g_XVBA_vtable.CreateDecode(&sessionInput, &sessionOutput))
+ { + {
+ SetError(__FUNCTION__, "failed to create decoder session", __LINE__); + SetError(__FUNCTION__, "failed to create decoder session", __LINE__);
+ CLog::Log(LOGERROR, "Decoder failed with following stats: m_surfaceWidth %u, m_surfaceHeight %u,"
+ " m_vidWidth %u, m_vidHeight %u, coded_width %d, coded_height %d",
+ m_surfaceWidth,
+ m_surfaceHeight,
+ m_vidWidth,
+ m_vidHeight,
+ avctx->coded_width,
+ avctx->coded_height);
+ return false; + return false;
+ } + }
+ m_xvbaSession = sessionOutput.session; + m_xvbaSession = sessionOutput.session;
@ -3254,7 +3286,9 @@ index 0000000..8f0106a
+ return -1; + return -1;
+ } + }
+ +
+ if (!m_flipBuffer[index].outPic) + if (!m_flipBuffer[index].outPic ||
+ !m_flipBuffer[index].outPic->render ||
+ !m_flipBuffer[index].outPic->render->surface)
+ return -1; + return -1;
+ +
+ int i = field; + int i = field;
@ -3348,11 +3382,14 @@ index 0000000..8f0106a
+{ +{
+ CLog::Log(LOGNOTICE, "XVBA::FinishGL - clearing down gl resources"); + CLog::Log(LOGNOTICE, "XVBA::FinishGL - clearing down gl resources");
+ +
+ CSharedLock lock(m_decoderSection); + CExclusiveLock lock(m_decoderSection);
+ // if decoder was created with non supported codec, we would not have a flipBuffer and segfault
+ if(!m_flipBuffer)
+ return;
+ +
+ for (unsigned int i=0; i<m_numRenderBuffers;++i) + for (unsigned int i=0; i<m_numRenderBuffers;++i)
+ { + {
+ if (m_flipBuffer[i].outPic && !m_flipBuffer[i].isDuplicate) + if (m_flipBuffer[i].outPic && !m_flipBuffer[i].isDuplicate && m_flipBuffer[i].outPic->render)
+ { + {
+ { CSingleLock lock(m_videoSurfaceSec); + { CSingleLock lock(m_videoSurfaceSec);
+ m_flipBuffer[i].outPic->render->state &= ~FF_XVBA_STATE_USED_FOR_RENDER; + m_flipBuffer[i].outPic->render->state &= ~FF_XVBA_STATE_USED_FOR_RENDER;
@ -3364,7 +3401,7 @@ index 0000000..8f0106a
+ } + }
+ } + }
+ +
+ for (int j=0; j<3; ++j) + for (unsigned int j=0; j<3; ++j)
+ { + {
+ if (glIsTexture(m_flipBuffer[i].glTexture[j])) + if (glIsTexture(m_flipBuffer[i].glTexture[j]))
+ { + {
@ -3374,7 +3411,9 @@ index 0000000..8f0106a
+ } + }
+ if (m_flipBuffer[i].glSurface[j] && m_xvbaSession) + if (m_flipBuffer[i].glSurface[j] && m_xvbaSession)
+ { + {
+ g_XVBA_vtable.DestroySurface(m_flipBuffer[i].glSurface[j]); + { CSingleLock lock(m_apiSec);
+ g_XVBA_vtable.DestroySurface(m_flipBuffer[i].glSurface[j]);
+ }
+ m_flipBuffer[i].glSurface[j] = 0; + m_flipBuffer[i].glSurface[j] = 0;
+ CLog::Log(LOGDEBUG, "XVBA::FinishGL - destroyed shared surface"); + CLog::Log(LOGDEBUG, "XVBA::FinishGL - destroyed shared surface");
+ } + }
@ -3385,10 +3424,10 @@ index 0000000..8f0106a
+#endif +#endif
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h
new file mode 100644 new file mode 100644
index 0000000..fdf605b index 0000000..5ca39ab
--- /dev/null --- /dev/null
+++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h
@@ -0,0 +1,160 @@ @@ -0,0 +1,161 @@
+/* +/*
+ * Copyright (C) 2005-2011 Team XBMC + * Copyright (C) 2005-2011 Team XBMC
+ * http://www.xbmc.org + * http://www.xbmc.org
@ -3514,6 +3553,7 @@ index 0000000..fdf605b
+ +
+ XVBADecodeCap m_decoderCap; + XVBADecodeCap m_decoderCap;
+ void *m_xvbaSession; + void *m_xvbaSession;
+ unsigned int m_decoderId;
+ struct XVBABufferPool + struct XVBABufferPool
+ { + {
+ XVBABufferDescriptor *picture_descriptor_buffer; + XVBABufferDescriptor *picture_descriptor_buffer;
@ -5241,10 +5281,10 @@ index 09aeb14..aad726c 100644
m_bSucceeded=false; m_bSucceeded=false;
m_bCanceled=false; m_bCanceled=false;
diff --git a/xbmc/network/AirPlayServer.cpp b/xbmc/network/AirPlayServer.cpp diff --git a/xbmc/network/AirPlayServer.cpp b/xbmc/network/AirPlayServer.cpp
index d4c58e4..3ac73f9 100644 index 5a14773..dda7f0b 100644
--- a/xbmc/network/AirPlayServer.cpp --- a/xbmc/network/AirPlayServer.cpp
+++ b/xbmc/network/AirPlayServer.cpp +++ b/xbmc/network/AirPlayServer.cpp
@@ -168,7 +168,7 @@ void CAirPlayServer::StopServer(bool bWait) @@ -182,7 +182,7 @@ void CAirPlayServer::StopServer(bool bWait)
} }
} }
@ -5254,10 +5294,10 @@ index d4c58e4..3ac73f9 100644
m_port = port; m_port = port;
m_nonlocal = nonlocal; m_nonlocal = nonlocal;
diff --git a/xbmc/network/AirTunesServer.cpp b/xbmc/network/AirTunesServer.cpp diff --git a/xbmc/network/AirTunesServer.cpp b/xbmc/network/AirTunesServer.cpp
index 16f6e41..4799a24 100644 index 8779c7c..24ffa6f 100644
--- a/xbmc/network/AirTunesServer.cpp --- a/xbmc/network/AirTunesServer.cpp
+++ b/xbmc/network/AirTunesServer.cpp +++ b/xbmc/network/AirTunesServer.cpp
@@ -279,7 +279,7 @@ void CAirTunesServer::StopServer(bool bWait) @@ -295,7 +295,7 @@ void CAirTunesServer::StopServer(bool bWait)
} }
} }
@ -5392,7 +5432,7 @@ index e228621..b31dec0 100644
AddBool(g_sysinfo.IsVistaOrHigher() ? vp: NULL, "videoplayer.usedxva2", 13427, g_sysinfo.IsVistaOrHigher() ? true : false); AddBool(g_sysinfo.IsVistaOrHigher() ? vp: NULL, "videoplayer.usedxva2", 13427, g_sysinfo.IsVistaOrHigher() ? true : false);
#endif #endif
diff --git a/xbmc/settings/GUIWindowSettingsCategory.cpp b/xbmc/settings/GUIWindowSettingsCategory.cpp diff --git a/xbmc/settings/GUIWindowSettingsCategory.cpp b/xbmc/settings/GUIWindowSettingsCategory.cpp
index cdece6c..899ab93 100644 index eb04966..408152a 100644
--- a/xbmc/settings/GUIWindowSettingsCategory.cpp --- a/xbmc/settings/GUIWindowSettingsCategory.cpp
+++ b/xbmc/settings/GUIWindowSettingsCategory.cpp +++ b/xbmc/settings/GUIWindowSettingsCategory.cpp
@@ -936,6 +936,15 @@ void CGUIWindowSettingsCategory::UpdateSettings() @@ -936,6 +936,15 @@ void CGUIWindowSettingsCategory::UpdateSettings()
@ -7037,7 +7077,7 @@ index 4534aa1..c245679 100644
m_bRunning = false; m_bRunning = false;
m_pObserver = NULL; m_pObserver = NULL;
diff --git a/xbmc/video/VideoReferenceClock.cpp b/xbmc/video/VideoReferenceClock.cpp diff --git a/xbmc/video/VideoReferenceClock.cpp b/xbmc/video/VideoReferenceClock.cpp
index 076dc3a..3bd58ef 100644 index 83fabfe..a2e6efc 100644
--- a/xbmc/video/VideoReferenceClock.cpp --- a/xbmc/video/VideoReferenceClock.cpp
+++ b/xbmc/video/VideoReferenceClock.cpp +++ b/xbmc/video/VideoReferenceClock.cpp
@@ -30,6 +30,9 @@ @@ -30,6 +30,9 @@
@ -7112,7 +7152,7 @@ index 076dc3a..3bd58ef 100644
{ {
m_SystemFrequency = CurrentHostFrequency(); m_SystemFrequency = CurrentHostFrequency();
m_ClockSpeed = 1.0; m_ClockSpeed = 1.0;
@@ -159,6 +208,8 @@ void CVideoReferenceClock::Process() @@ -160,6 +209,8 @@ void CVideoReferenceClock::Process()
m_RefreshChanged = 0; m_RefreshChanged = 0;
m_Started.Set(); m_Started.Set();
@ -7121,7 +7161,7 @@ index 076dc3a..3bd58ef 100644
if (SetupSuccess) if (SetupSuccess)
{ {
m_UseVblank = true; //tell other threads we're using vblank as clock m_UseVblank = true; //tell other threads we're using vblank as clock
@@ -266,6 +317,14 @@ bool CVideoReferenceClock::SetupGLX() @@ -267,6 +318,14 @@ bool CVideoReferenceClock::SetupGLX()
return false; return false;
} }
@ -7136,7 +7176,7 @@ index 076dc3a..3bd58ef 100644
m_vInfo = glXChooseVisual(m_Dpy, DefaultScreen(m_Dpy), singleBufferAttributes); m_vInfo = glXChooseVisual(m_Dpy, DefaultScreen(m_Dpy), singleBufferAttributes);
if (!m_vInfo) if (!m_vInfo)
{ {
@@ -273,13 +332,16 @@ bool CVideoReferenceClock::SetupGLX() @@ -274,13 +333,16 @@ bool CVideoReferenceClock::SetupGLX()
return false; return false;
} }
@ -7158,7 +7198,7 @@ index 076dc3a..3bd58ef 100644
m_Context = glXCreateContext(m_Dpy, m_vInfo, NULL, True); m_Context = glXCreateContext(m_Dpy, m_vInfo, NULL, True);
if (!m_Context) if (!m_Context)
@@ -288,25 +350,32 @@ bool CVideoReferenceClock::SetupGLX() @@ -289,25 +351,32 @@ bool CVideoReferenceClock::SetupGLX()
return false; return false;
} }
@ -7202,7 +7242,7 @@ index 076dc3a..3bd58ef 100644
} }
m_glXGetVideoSyncSGI = (int (*)(unsigned int*))glXGetProcAddress((const GLubyte*)"glXGetVideoSyncSGI"); m_glXGetVideoSyncSGI = (int (*)(unsigned int*))glXGetProcAddress((const GLubyte*)"glXGetVideoSyncSGI");
@@ -323,16 +392,7 @@ bool CVideoReferenceClock::SetupGLX() @@ -324,16 +393,7 @@ bool CVideoReferenceClock::SetupGLX()
return false; return false;
} }
@ -7220,84 +7260,7 @@ index 076dc3a..3bd58ef 100644
UpdateRefreshrate(true); //forced refreshrate update UpdateRefreshrate(true); //forced refreshrate update
m_MissedVblanks = 0; m_MissedVblanks = 0;
@@ -340,95 +400,11 @@ bool CVideoReferenceClock::SetupGLX() @@ -479,18 +539,7 @@ void CVideoReferenceClock::CleanupGLX()
return true;
}
-bool CVideoReferenceClock::ParseNvSettings(int& RefreshRate)
-{
- double fRefreshRate;
- char Buff[255];
- int ReturnV;
- struct lconv *Locale = localeconv();
- FILE* NvSettings;
-
- const char* VendorPtr = (const char*)glGetString(GL_VENDOR);
- if (!VendorPtr)
- {
- CLog::Log(LOGDEBUG, "CVideoReferenceClock: glGetString(GL_VENDOR) returned NULL, not using nvidia-settings");
- return false;
- }
-
- CStdString Vendor = VendorPtr;
- Vendor.ToLower();
- if (Vendor.find("nvidia") == std::string::npos)
- {
- CLog::Log(LOGDEBUG, "CVideoReferenceClock: GL_VENDOR:%s, not using nvidia-settings", Vendor.c_str());
- return false;
- }
-
- NvSettings = popen(NVSETTINGSCMD, "r");
- if (!NvSettings)
- {
- CLog::Log(LOGDEBUG, "CVideoReferenceClock: %s: %s", NVSETTINGSCMD, strerror(errno));
- return false;
- }
-
- ReturnV = fscanf(NvSettings, "%254[^\n]", Buff);
- pclose(NvSettings);
- if (ReturnV != 1)
- {
- CLog::Log(LOGDEBUG, "CVideoReferenceClock: %s produced no output", NVSETTINGSCMD);
- return false;
- }
-
- CLog::Log(LOGDEBUG, "CVideoReferenceClock: output of %s: %s", NVSETTINGSCMD, Buff);
-
- for (int i = 0; i < 255 && Buff[i]; i++)
- {
- //workaround for locale mismatch
- if (Buff[i] == '.' || Buff[i] == ',')
- Buff[i] = *Locale->decimal_point;
- }
-
- ReturnV = sscanf(Buff, "%lf", &fRefreshRate);
- if (ReturnV != 1 || fRefreshRate <= 0.0)
- {
- CLog::Log(LOGDEBUG, "CVideoReferenceClock: can't make sense of that");
- return false;
- }
-
- RefreshRate = MathUtils::round_int(fRefreshRate);
- CLog::Log(LOGDEBUG, "CVideoReferenceClock: Detected refreshrate by nvidia-settings: %f hertz, rounding to %i hertz",
- fRefreshRate, RefreshRate);
-
- return true;
-}
-
-int CVideoReferenceClock::GetRandRRate()
-{
- int RefreshRate;
- XRRScreenConfiguration *CurrInfo;
-
- CurrInfo = XRRGetScreenInfo(m_Dpy, RootWindow(m_Dpy, m_vInfo->screen));
- RefreshRate = XRRConfigCurrentRate(CurrInfo);
- XRRFreeScreenConfigInfo(CurrInfo);
-
- return RefreshRate;
-}
-
void CVideoReferenceClock::CleanupGLX()
{ {
CLog::Log(LOGDEBUG, "CVideoReferenceClock: Cleaning up GLX"); CLog::Log(LOGDEBUG, "CVideoReferenceClock: Cleaning up GLX");
@ -7317,16 +7280,17 @@ index 076dc3a..3bd58ef 100644
if (m_vInfo) if (m_vInfo)
{ {
@@ -448,7 +424,7 @@ void CVideoReferenceClock::CleanupGLX() @@ -509,8 +558,7 @@ void CVideoReferenceClock::CleanupGLX()
m_Window = 0;
} }
//ati saves the Display* in their libGL, if we close it here, we crash - //ati saves the Display* in their libGL, if we close it here, we crash
- if (m_Dpy && !AtiWorkaround) - if (m_Dpy && !AtiWorkaround)
+ if (m_Dpy) + if (m_Dpy)
{ {
XCloseDisplay(m_Dpy); XCloseDisplay(m_Dpy);
m_Dpy = NULL; m_Dpy = NULL;
@@ -470,10 +446,55 @@ void CVideoReferenceClock::RunGLX() @@ -532,10 +580,55 @@ void CVideoReferenceClock::RunGLX()
m_glXGetVideoSyncSGI(&VblankCount); m_glXGetVideoSyncSGI(&VblankCount);
PrevVblankCount = VblankCount; PrevVblankCount = VblankCount;
@ -7366,15 +7330,15 @@ index 076dc3a..3bd58ef 100644
+ proximity++; + proximity++;
+ } + }
+ } + }
+ // we might have waited too long, reduce sleep time
+ else if (precision > 1) + else if (precision > 1)
+ precision--; + precision--;
+ +
+ // lets try to increase precision in order to reduce number
+ // of required steps
+ if (proximity > 4 && precision < 6) + if (proximity > 4 && precision < 6)
+ precision++; + precision++;
+ +
+// CLog::Log(LOGNOTICE, "----- diff: %ld, precision: %d, prox: %d, sleep: %d, correction: %d",
+// CurrentHostCounter()- lastVblankTime, precision, proximity, sleepTime, correction);
+
+ lastVblankTime = CurrentHostCounter(); + lastVblankTime = CurrentHostCounter();
+ +
+ ReturnV = 0; + ReturnV = 0;
@ -7383,7 +7347,7 @@ index 076dc3a..3bd58ef 100644
m_glXGetVideoSyncSGI(&VblankCount); //the vblank count returned by glXWaitVideoSyncSGI is not always correct m_glXGetVideoSyncSGI(&VblankCount); //the vblank count returned by glXWaitVideoSyncSGI is not always correct
Now = CurrentHostCounter(); //get the timestamp of this vblank Now = CurrentHostCounter(); //get the timestamp of this vblank
@@ -483,6 +504,9 @@ void CVideoReferenceClock::RunGLX() @@ -545,6 +638,9 @@ void CVideoReferenceClock::RunGLX()
return; return;
} }
@ -7393,7 +7357,7 @@ index 076dc3a..3bd58ef 100644
if (VblankCount > PrevVblankCount) if (VblankCount > PrevVblankCount)
{ {
//update the vblank timestamp, update the clock and send a signal that we got a vblank //update the vblank timestamp, update the clock and send a signal that we got a vblank
@@ -491,14 +515,14 @@ void CVideoReferenceClock::RunGLX() @@ -553,14 +649,14 @@ void CVideoReferenceClock::RunGLX()
UpdateClock((int)(VblankCount - PrevVblankCount), true); UpdateClock((int)(VblankCount - PrevVblankCount), true);
SingleLock.Leave(); SingleLock.Leave();
SendVblankSignal(); SendVblankSignal();
@ -7410,7 +7374,7 @@ index 076dc3a..3bd58ef 100644
//only try reattaching once //only try reattaching once
if (IsReset) if (IsReset)
return; return;
@@ -1020,44 +1044,17 @@ bool CVideoReferenceClock::UpdateRefreshrate(bool Forced /*= false*/) @@ -1082,23 +1178,13 @@ bool CVideoReferenceClock::UpdateRefreshrate(bool Forced /*= false*/)
#if defined(HAS_GLX) && defined(HAS_XRANDR) #if defined(HAS_GLX) && defined(HAS_XRANDR)
@ -7436,23 +7400,10 @@ index 076dc3a..3bd58ef 100644
+ if (!bUpdate) //refreshrate did not change + if (!bUpdate) //refreshrate did not change
return false; return false;
- //the refreshrate can be wrong on nvidia drivers, so read it from nvidia-settings when it's available //the refreshrate can be wrong on nvidia drivers, so read it from nvidia-settings when it's available
- if (m_UseNvSettings || Forced) @@ -1119,7 +1205,7 @@ bool CVideoReferenceClock::UpdateRefreshrate(bool Forced /*= false*/)
- { }
- int NvRefreshRate;
- //if this fails we can't get the refreshrate from nvidia-settings
- m_UseNvSettings = ParseNvSettings(NvRefreshRate);
-
- if (m_UseNvSettings)
- {
- CSingleLock SingleLock(m_CritSection);
- m_RefreshRate = NvRefreshRate;
- return true;
- }
-
- CLog::Log(LOGDEBUG, "CVideoReferenceClock: Using RandR for refreshrate detection");
- }
-
CSingleLock SingleLock(m_CritSection); CSingleLock SingleLock(m_CritSection);
- m_RefreshRate = GetRandRRate(); - m_RefreshRate = GetRandRRate();
+ m_RefreshRate = MathUtils::round_int(g_settings.m_ResInfo[g_graphicsContext.GetVideoResolution()].fRefreshRate); + m_RefreshRate = MathUtils::round_int(g_settings.m_ResInfo[g_graphicsContext.GetVideoResolution()].fRefreshRate);