diff options
author | Joakim Plate <elupus@ecce.se> | 2014-11-22 21:09:06 +0100 |
---|---|---|
committer | Joakim Plate <elupus@ecce.se> | 2014-11-22 21:09:06 +0100 |
commit | 2d019fcf28a43662fb5c17f95da73282ec74e85a (patch) | |
tree | 831edd1610bbf6e1e45ac193d06bce8f0a7ae437 | |
parent | a5c97b3be36c9110c6ec11caec226fe5f979b26b (diff) | |
parent | cddc5c6953f09b9ad0e42409b5b6664d7f13f0ca (diff) |
Merge pull request #5703 from elupus/vda_fixes
Vda fixes
-rw-r--r-- | xbmc/cores/VideoRenderers/LinuxRendererGL.cpp | 119 | ||||
-rw-r--r-- | xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp | 4 | ||||
-rw-r--r-- | xbmc/cores/dvdplayer/DVDCodecs/DVDFactoryCodec.cpp | 3 | ||||
-rw-r--r-- | xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp | 12 | ||||
-rw-r--r-- | xbmc/cores/dvdplayer/DVDCodecs/Video/VDA.cpp | 77 | ||||
-rw-r--r-- | xbmc/cores/dvdplayer/DVDCodecs/Video/VDA.h | 4 | ||||
-rw-r--r-- | xbmc/settings/AdvancedSettings.cpp | 2 | ||||
-rw-r--r-- | xbmc/settings/AdvancedSettings.h | 1 |
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; |