aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoakim Plate <elupus@ecce.se>2014-11-22 21:09:06 +0100
committerJoakim Plate <elupus@ecce.se>2014-11-22 21:09:06 +0100
commit2d019fcf28a43662fb5c17f95da73282ec74e85a (patch)
tree831edd1610bbf6e1e45ac193d06bce8f0a7ae437
parenta5c97b3be36c9110c6ec11caec226fe5f979b26b (diff)
parentcddc5c6953f09b9ad0e42409b5b6664d7f13f0ca (diff)
Merge pull request #5703 from elupus/vda_fixes
Vda fixes
-rw-r--r--xbmc/cores/VideoRenderers/LinuxRendererGL.cpp119
-rw-r--r--xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp4
-rw-r--r--xbmc/cores/dvdplayer/DVDCodecs/DVDFactoryCodec.cpp3
-rw-r--r--xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp12
-rw-r--r--xbmc/cores/dvdplayer/DVDCodecs/Video/VDA.cpp77
-rw-r--r--xbmc/cores/dvdplayer/DVDCodecs/Video/VDA.h4
-rw-r--r--xbmc/settings/AdvancedSettings.cpp2
-rw-r--r--xbmc/settings/AdvancedSettings.h1
8 files changed, 76 insertions, 146 deletions
diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp
index 9b5d0a94f9..cf0b7d4156 100644
--- a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp
+++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp
@@ -922,11 +922,6 @@ void CLinuxRendererGL::LoadShaders(int field)
CLog::Log(LOGNOTICE, "GL: Using VAAPI render method");
m_renderMethod = RENDER_VAAPI;
}
- else if (m_format == RENDER_FMT_CVBREF)
- {
- CLog::Log(LOGNOTICE, "GL: Using CVBREF render method");
- m_renderMethod = RENDER_CVREF;
- }
else
{
int requestedMethod = CSettings::Get().GetInt("videoplayer.rendermethod");
@@ -1011,6 +1006,13 @@ void CLinuxRendererGL::LoadShaders(int field)
}
}
+ /* cvbref format piggy back on normal glsl */
+ if (m_format == RENDER_FMT_CVBREF)
+ {
+ CLog::Log(LOGNOTICE, "GL: Using CVBREF render method");
+ m_renderMethod |= RENDER_CVREF;
+ }
+
// determine whether GPU supports NPOT textures
if (!glewIsSupported("GL_ARB_texture_non_power_of_two"))
{
@@ -1191,7 +1193,6 @@ void CLinuxRendererGL::Render(DWORD flags, int renderBuffer)
#endif
else
{
- // RENDER_CVREF uses the same render as the default case
RenderSoftware(renderBuffer, m_currentField);
VerifyGLState();
}
@@ -1464,7 +1465,7 @@ void CLinuxRendererGL::RenderToFBO(int index, int field, bool weave /*= false*/)
void CLinuxRendererGL::RenderFromFBO()
{
- glEnable(m_textureTarget);
+ glEnable(GL_TEXTURE_2D);
glActiveTextureARB(GL_TEXTURE0);
VerifyGLState();
@@ -1478,10 +1479,10 @@ void CLinuxRendererGL::RenderFromFBO()
if (!m_pVideoFilterShader->GetTextureFilter(filter))
filter = m_scalingMethod == VS_SCALINGMETHOD_NEAREST ? GL_NEAREST : GL_LINEAR;
- m_fbo.fbo.SetFiltering(m_textureTarget, filter);
+ m_fbo.fbo.SetFiltering(GL_TEXTURE_2D, filter);
m_pVideoFilterShader->SetSourceTexture(0);
- m_pVideoFilterShader->SetWidth(m_sourceWidth);
- m_pVideoFilterShader->SetHeight(m_sourceHeight);
+ m_pVideoFilterShader->SetWidth(m_fbo.width);
+ m_pVideoFilterShader->SetHeight(m_fbo.height);
//disable non-linear stretch when a dvd menu is shown, parts of the menu are rendered through the overlay renderer
//having non-linear stretch on breaks the alignment
@@ -1495,14 +1496,14 @@ void CLinuxRendererGL::RenderFromFBO()
else
{
GLint filter = m_scalingMethod == VS_SCALINGMETHOD_NEAREST ? GL_NEAREST : GL_LINEAR;
- m_fbo.fbo.SetFiltering(m_textureTarget, filter);
+ m_fbo.fbo.SetFiltering(GL_TEXTURE_2D, filter);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
}
VerifyGLState();
- float imgwidth = m_fbo.width / m_sourceWidth;
- float imgheight = m_fbo.height / m_sourceHeight;
+ float imgwidth = m_sourceWidth / m_fbo.width;
+ float imgheight = m_sourceHeight / m_fbo.height;
glBegin(GL_QUADS);
@@ -1527,8 +1528,8 @@ void CLinuxRendererGL::RenderFromFBO()
VerifyGLState();
- glBindTexture(m_textureTarget, 0);
- glDisable(m_textureTarget);
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glDisable(GL_TEXTURE_2D);
VerifyGLState();
}
@@ -2581,58 +2582,36 @@ bool CLinuxRendererGL::UploadVAAPITexture(int index)
bool CLinuxRendererGL::UploadCVRefTexture(int index)
{
#ifdef TARGET_DARWIN
+ YUVBUFFER &buf = m_buffers[index];
+ YUVFIELDS &fields = buf.fields;
+
CVBufferRef cvBufferRef = m_buffers[index].cvBufferRef;
glEnable(m_textureTarget);
- if (cvBufferRef)
+ if (cvBufferRef && fields[m_currentField][0].flipindex != buf.flipindex)
{
- YUVFIELDS &fields = m_buffers[index].fields;
- YUVPLANE &plane = fields[0][0];
-
- if (Cocoa_GetOSVersion() >= 0x1074)
- {
- // 10.7.4 for Retina Macbooks on Lion breaks CGLTexImageIOSurface2D/GL_YCBCR_422_APPLE,
- // 10.8 Mountain Lion breaks CGLTexImageIOSurface2D/GL_YCBCR_422_APPLE,
- // upload the old way.
- CVPixelBufferLockBaseAddress(cvBufferRef, kCVPixelBufferLock_ReadOnly);
-
- GLsizei texHeight = CVPixelBufferGetHeight(cvBufferRef);
- size_t rowbytes = CVPixelBufferGetBytesPerRow(cvBufferRef);
- unsigned char *bufferBase = (unsigned char*)CVPixelBufferGetBaseAddress(cvBufferRef);
-
- glBindTexture(m_textureTarget, plane.id);
- glTexSubImage2D(m_textureTarget, 0, 0, 0, rowbytes/2, texHeight, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, bufferBase);
- glBindTexture(m_textureTarget, 0);
- CVPixelBufferUnlockBaseAddress(cvBufferRef, kCVPixelBufferLock_ReadOnly);
- }
- else
- {
- // It is the fastest way to render a CVPixelBuffer backed
- // with an IOSurface as there is no CPU -> GPU upload.
- CGLContextObj cgl_ctx = (CGLContextObj)g_Windowing.GetCGLContextObj();
- IOSurfaceRef surface = CVPixelBufferGetIOSurface(cvBufferRef);
- GLsizei texWidth = IOSurfaceGetWidth(surface);
- GLsizei texHeight= IOSurfaceGetHeight(surface);
- OSType format_type = CVPixelBufferGetPixelFormatType(cvBufferRef);
-
- glBindTexture(m_textureTarget, plane.id);
+ // It is the fastest way to render a CVPixelBuffer backed
+ // with an IOSurface as there is no CPU -> GPU upload.
+ CGLContextObj cgl_ctx = (CGLContextObj)g_Windowing.GetCGLContextObj();
+ IOSurfaceRef surface = CVPixelBufferGetIOSurface(cvBufferRef);
+ GLsizei texWidth = IOSurfaceGetWidth(surface);
+ GLsizei texHeight= IOSurfaceGetHeight(surface);
+ OSType format_type = IOSurfaceGetPixelFormat(surface);
- if (format_type == kCVPixelFormatType_422YpCbCr8)
- CGLTexImageIOSurface2D(cgl_ctx, m_textureTarget, GL_RGB8,
- texWidth, texHeight, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, surface, 0);
- else if (format_type == kCVPixelFormatType_32BGRA)
- CGLTexImageIOSurface2D(cgl_ctx, m_textureTarget, GL_RGBA8,
- texWidth, texHeight, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, surface, 0);
+ glBindTexture(m_textureTarget, fields[FIELD_FULL][0].id);
- glBindTexture(m_textureTarget, 0);
- }
+ if (format_type == kCVPixelFormatType_422YpCbCr8)
+ CGLTexImageIOSurface2D(cgl_ctx, m_textureTarget, GL_RGBA8,
+ texWidth / 2, texHeight, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, surface, 0);
+ else if (format_type == kCVPixelFormatType_32BGRA)
+ CGLTexImageIOSurface2D(cgl_ctx, m_textureTarget, GL_RGBA8,
+ texWidth, texHeight, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, surface, 0);
- CVBufferRelease(cvBufferRef);
- m_buffers[index].cvBufferRef = NULL;
+ glBindTexture(m_textureTarget, 0);
+ fields[FIELD_FULL][0].flipindex = buf.flipindex;
- plane.flipindex = m_buffers[index].flipindex;
}
@@ -2675,27 +2654,19 @@ bool CLinuxRendererGL::CreateCVRefTexture(int index)
im.cshift_x = 0;
im.cshift_y = 0;
- plane.texwidth = NP2(im.width);
- plane.texheight = NP2(im.height);
- plane.pixpertex_x = 1;
+ plane.pixpertex_x = 2;
plane.pixpertex_y = 1;
+ plane.texwidth = im.width / plane.pixpertex_x;
+ plane.texheight = im.height / plane.pixpertex_y;
- glEnable(m_textureTarget);
- glGenTextures(1, &plane.id);
- if (Cocoa_GetOSVersion() >= 0x1074)
+ if(m_renderMethod & RENDER_POT)
{
- // 10.7.4 for Retina Macbooks on Lion breaks CGLTexImageIOSurface2D/GL_YCBCR_422_APPLE,
- // 10.8 Mountain Lion breaks CGLTexImageIOSurface2D/GL_YCBCR_422_APPLE,
- // upload the old way.
- glBindTexture(m_textureTarget, plane.id);
- glTexParameteri(m_textureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(m_textureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- // This is necessary for non-power-of-two textures
- glTexParameteri(m_textureTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(m_textureTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- glTexImage2D(m_textureTarget, 0, GL_RGBA, plane.texwidth, plane.texheight, 0, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, NULL);
- glBindTexture(m_textureTarget, 0);
+ plane.texwidth = NP2(plane.texwidth);
+ plane.texheight = NP2(plane.texheight);
}
+
+ glEnable(m_textureTarget);
+ glGenTextures(1, &plane.id);
glDisable(m_textureTarget);
#endif
diff --git a/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp b/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp
index b675995cbb..8c95825b21 100644
--- a/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp
+++ b/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp
@@ -213,7 +213,7 @@ BaseYUV2RGBGLSLShader::BaseYUV2RGBGLSLShader(bool rect, unsigned flags, ERenderF
m_defines += "#define XBMC_NV12\n";
else if (m_format == RENDER_FMT_YUYV422)
m_defines += "#define XBMC_YUY2\n";
- else if (m_format == RENDER_FMT_UYVY422)
+ else if (m_format == RENDER_FMT_UYVY422 || m_format == RENDER_FMT_CVBREF)
m_defines += "#define XBMC_UYVY\n";
else if (m_format == RENDER_FMT_VDPAU_420)
m_defines += "#define XBMC_VDPAU_NV12\n";
@@ -376,7 +376,7 @@ YUV2RGBProgressiveShaderARB::YUV2RGBProgressiveShaderARB(bool rect, unsigned fla
else
shaderfile = "yuv2rgb_basic_2d_YUY2.arb";
}
- else if (m_format == RENDER_FMT_UYVY422)
+ else if (m_format == RENDER_FMT_UYVY422 || m_format == RENDER_FMT_CVBREF)
{
if(rect)
shaderfile = "yuv2rgb_basic_rect_UYVY.arb";
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/DVDFactoryCodec.cpp b/xbmc/cores/dvdplayer/DVDCodecs/DVDFactoryCodec.cpp
index f139433b79..3cbb9f23fe 100644
--- a/xbmc/cores/dvdplayer/DVDCodecs/DVDFactoryCodec.cpp
+++ b/xbmc/cores/dvdplayer/DVDCodecs/DVDFactoryCodec.cpp
@@ -58,6 +58,7 @@
#include "DVDStreamInfo.h"
+#include "settings/AdvancedSettings.h"
#include "settings/Settings.h"
#include "utils/SystemInfo.h"
#include "utils/StringUtils.h"
@@ -214,7 +215,7 @@ CDVDVideoCodec* CDVDFactoryCodec::CreateVideoCodec(CDVDStreamInfo &hint, unsigne
#endif
#if defined(TARGET_DARWIN_OSX)
- if (!hint.software && CSettings::Get().GetBool("videoplayer.usevda"))
+ if (!hint.software && CSettings::Get().GetBool("videoplayer.usevda") && !g_advancedSettings.m_useFfmpegVda)
{
if (hint.codec == AV_CODEC_ID_H264 && !hint.ptsinvalid)
{
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp
index 52a00a6fe5..8255ca7675 100644
--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp
+++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp
@@ -128,7 +128,7 @@ enum PixelFormat CDVDVideoCodecFFmpeg::GetFormat( struct AVCodecContext * avctx
#endif
#ifdef TARGET_DARWIN_OSX
- if (*cur == AV_PIX_FMT_VDA_VLD && CSettings::Get().GetBool("videoplayer.usevda"))
+ if (*cur == AV_PIX_FMT_VDA && CSettings::Get().GetBool("videoplayer.usevda") && g_advancedSettings.m_useFfmpegVda)
{
VDA::CDecoder* dec = new VDA::CDecoder();
if(dec->Open(avctx, *cur, ctx->m_uSurfacesCount))
@@ -142,6 +142,16 @@ enum PixelFormat CDVDVideoCodecFFmpeg::GetFormat( struct AVCodecContext * avctx
#endif
cur++;
}
+
+ // hardware decoder de-selected, restore standard ffmpeg
+ if (ctx->GetHardware())
+ {
+ ctx->SetHardware(NULL);
+ avctx->get_buffer2 = avcodec_default_get_buffer2;
+ avctx->slice_flags = 0;
+ avctx->hwaccel_context = 0;
+ }
+
return avcodec_default_get_format(avctx, fmt);
}
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDA.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDA.cpp
index 54de7b9b91..5b8c0d6307 100644
--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDA.cpp
+++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDA.cpp
@@ -32,62 +32,19 @@ extern "C" {
using namespace std;
using namespace VDA;
-
-static void RelBufferS(void *opaque, uint8_t *data)
-{ ((CDecoder*)((CDVDVideoCodecFFmpeg*)opaque)->GetHardware())->RelBuffer(data); }
-
static int GetBufferS(AVCodecContext *avctx, AVFrame *pic, int flags)
{ return ((CDecoder*)((CDVDVideoCodecFFmpeg*)avctx->opaque)->GetHardware())->GetBuffer(avctx, pic, flags); }
CDecoder::CDecoder()
-: m_renderbuffers_count(0)
+: m_renderbuffers_count(3)
{
- m_ctx = (vda_context*)calloc(1, sizeof(vda_context));
+ m_ctx = av_vda_alloc_context();
}
CDecoder::~CDecoder()
{
Close();
- free(m_ctx);
-}
-
-void CDecoder::RelBuffer(uint8_t *data)
-{
- CVPixelBufferRef cv_buffer = (CVPixelBufferRef)data;
- CVPixelBufferRelease(cv_buffer);
-}
-
-int CDecoder::GetBuffer(AVCodecContext *avctx, AVFrame *pic, int flags)
-{
- pic->data[3] = (uint8_t *)(uintptr_t)1;
- pic->reordered_opaque = avctx->reordered_opaque;
-
- AVBufferRef *buffer = av_buffer_create(pic->data[3], 0, RelBufferS, avctx->opaque, 0);
- if (!buffer)
- {
- CLog::Log(LOGERROR, "VAAPI::%s - error creating buffer", __FUNCTION__);
- return -1;
- }
- pic->buf[0] = buffer;
-
- return 0;
-}
-
-static void vda_decoder_callback (void *vda_hw_ctx,
- CFDictionaryRef user_info,
- OSStatus status,
- uint32_t infoFlags,
- CVImageBufferRef image_buffer)
-{
- struct vda_context *vda_ctx = (struct vda_context *)vda_hw_ctx;
-
- if (!image_buffer)
- return;
-
- if (vda_ctx->cv_pix_fmt_type != CVPixelBufferGetPixelFormatType(image_buffer))
- return;
-
- vda_ctx->cv_buffer = CVPixelBufferRetain(image_buffer);
+ av_free(m_ctx);
}
bool CDecoder::Create(AVCodecContext *avctx)
@@ -101,9 +58,7 @@ bool CDecoder::Create(AVCodecContext *avctx)
CFMutableDictionaryRef buffer_attributes;
CFMutableDictionaryRef io_surface_properties;
CFNumberRef cv_pix_fmt;
-
- m_ctx->priv_bitstream = NULL;
- m_ctx->priv_allocated_size = 0;
+ int32_t fmt = 'avc1', pix_fmt = kCVPixelFormatType_422YpCbCr8;
/* Each VCL NAL in the bitstream sent to the decoder
* is preceded by a 4 bytes length header.
@@ -130,9 +85,9 @@ bool CDecoder::Create(AVCodecContext *avctx)
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
- height = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &m_ctx->height);
- width = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &m_ctx->width);
- format = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &m_ctx->format);
+ height = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &avctx->height);
+ width = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &avctx->width);
+ format = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &fmt);
CFDictionarySetValue(config_info, kVDADecoderConfiguration_Height , height);
CFDictionarySetValue(config_info, kVDADecoderConfiguration_Width , width);
@@ -149,7 +104,7 @@ bool CDecoder::Create(AVCodecContext *avctx)
&kCFTypeDictionaryValueCallBacks);
cv_pix_fmt = CFNumberCreate(kCFAllocatorDefault,
kCFNumberSInt32Type,
- &m_ctx->cv_pix_fmt_type);
+ &pix_fmt);
CFDictionarySetValue(buffer_attributes,
kCVPixelBufferPixelFormatTypeKey,
cv_pix_fmt);
@@ -159,8 +114,8 @@ bool CDecoder::Create(AVCodecContext *avctx)
status = VDADecoderCreate(config_info,
buffer_attributes,
- (VDADecoderOutputCallback*)vda_decoder_callback,
- m_ctx,
+ (VDADecoderOutputCallback*)m_ctx->output_callback,
+ avctx,
&m_ctx->decoder);
CFRelease(height);
@@ -187,14 +142,13 @@ void CDecoder::Close()
if (m_ctx->decoder)
status = VDADecoderDestroy(m_ctx->decoder);
m_ctx->decoder = NULL;
- av_freep(&m_ctx->priv_bitstream);
}
bool CDecoder::Open(AVCodecContext *avctx, enum PixelFormat fmt, unsigned int surfaces)
{
Close();
- if(fmt != AV_PIX_FMT_VDA_VLD)
+ if(fmt != AV_PIX_FMT_VDA)
return false;
if(avctx->codec_id != AV_CODEC_ID_H264)
@@ -227,20 +181,11 @@ bool CDecoder::Open(AVCodecContext *avctx, enum PixelFormat fmt, unsigned int su
return false;
}
- /* init vda */
- memset(m_ctx, 0, sizeof(struct vda_context));
- m_ctx->width = avctx->width;
- m_ctx->height = avctx->height;
- m_ctx->format = 'avc1';
- m_ctx->use_sync_decoding = 1;
- m_ctx->cv_pix_fmt_type = kCVPixelFormatType_422YpCbCr8;
-
if (!Create(avctx))
return false;
avctx->pix_fmt = fmt;
avctx->hwaccel_context = m_ctx;
- avctx->get_buffer2 = GetBufferS;
return true;
}
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDA.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDA.h
index ad53203cda..95adb94b57 100644
--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDA.h
+++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDA.h
@@ -23,7 +23,7 @@
#include "DVDVideoCodecFFmpeg.h"
-struct vda_context;
+struct AVVDAContext;
namespace VDA {
@@ -47,7 +47,7 @@ public:
protected:
bool Create(AVCodecContext* avctx);
unsigned m_renderbuffers_count;
- vda_context* m_ctx;
+ struct AVVDAContext* m_ctx;
};
}
diff --git a/xbmc/settings/AdvancedSettings.cpp b/xbmc/settings/AdvancedSettings.cpp
index f4c309b4b5..c740427986 100644
--- a/xbmc/settings/AdvancedSettings.cpp
+++ b/xbmc/settings/AdvancedSettings.cpp
@@ -159,6 +159,7 @@ void CAdvancedSettings::Initialize()
m_videoCaptureUseOcclusionQuery = -1; //-1 is auto detect
m_videoVDPAUtelecine = false;
m_videoVDPAUdeintSkipChromaHD = false;
+ m_useFfmpegVda = false;
m_DXVACheckCompatibility = false;
m_DXVACheckCompatibilityPresent = false;
m_DXVAForceProcessorRenderer = true;
@@ -590,6 +591,7 @@ void CAdvancedSettings::ParseSettingsFile(const CStdString &file)
XMLUtils::GetInt(pElement, "useocclusionquery", m_videoCaptureUseOcclusionQuery, -1, 1);
XMLUtils::GetBoolean(pElement,"vdpauInvTelecine",m_videoVDPAUtelecine);
XMLUtils::GetBoolean(pElement,"vdpauHDdeintSkipChroma",m_videoVDPAUdeintSkipChromaHD);
+ XMLUtils::GetBoolean(pElement,"useffmpegvda", m_useFfmpegVda);
TiXmlElement* pStagefrightElem = pElement->FirstChildElement("stagefright");
if (pStagefrightElem)
diff --git a/xbmc/settings/AdvancedSettings.h b/xbmc/settings/AdvancedSettings.h
index 7df586e444..fb5a83729f 100644
--- a/xbmc/settings/AdvancedSettings.h
+++ b/xbmc/settings/AdvancedSettings.h
@@ -177,6 +177,7 @@ class CAdvancedSettings : public ISettingCallback, public ISettingsHandler
int m_videoIgnoreSecondsAtStart;
float m_videoIgnorePercentAtEnd;
bool m_audioApplyDrc;
+ bool m_useFfmpegVda;
int m_videoVDPAUScaling;
float m_videoNonLinStretchRatio;