From a927f33b64eea56d764bff9f37c9d4fca8093070 Mon Sep 17 00:00:00 2001 From: Philipp Kerling Date: Thu, 28 Mar 2019 17:43:25 +0100 Subject: [PATCH] [vaapi] Always deinterlace when an interlaced frame was encountered once PAFF video requires to run all frames through the deinterlacing filter even if they are stored progressive. After one interlaced frame was seen by the output, do not automatically set the deinterlace method to NONE which would skip the filter. Still, deinterlacing must be switched off if the user requests it. Fixes #15817 --- xbmc/cores/VideoPlayer/DVDCodecs/Video/VAAPI.cpp | 7 ++++++- xbmc/cores/VideoPlayer/DVDCodecs/Video/VAAPI.h | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/VAAPI.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/VAAPI.cpp index 5c6e6994d9c9f..c8e51afb9dd85 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/VAAPI.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/VAAPI.cpp @@ -1862,6 +1862,7 @@ bool COutput::Init() m_config.processInfo->SetDeinterlacingMethodDefault(EINTERLACEMETHOD::VS_INTERLACEMETHOD_VAAPI_BOB); m_vaError = false; + m_seenInterlaced = false; return true; } @@ -1982,9 +1983,13 @@ void COutput::InitCycle() EINTERLACEMETHOD method = m_config.processInfo->GetVideoSettings().m_InterlaceMethod; bool interlaced = m_currentPicture.DVDPic.iFlags & DVP_FLAG_INTERLACED; + // Remember whether any interlaced frames were encountered already. + // If this is the case, the deinterlace method will never automatically be switched to NONE again in + // order to not change deint methods every few frames in PAFF streams. + m_seenInterlaced = m_seenInterlaced || interlaced; if (!(flags & DVD_CODEC_CTRL_NO_POSTPROC) && - interlaced && + m_seenInterlaced && method != VS_INTERLACEMETHOD_NONE) { if (!m_config.processInfo->Supports(method)) diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/VAAPI.h b/xbmc/cores/VideoPlayer/DVDCodecs/Video/VAAPI.h index ee4115576096f..7deb65496d1b7 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/VAAPI.h +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/VAAPI.h @@ -275,6 +275,8 @@ class COutput : private CThread // extended state variables for state machine int m_extTimeout; bool m_vaError; + /// \brief Whether at least one interlaced frame was encountered in the video stream (indicating that more interlaced frames could potentially follow) + bool m_seenInterlaced; CVaapiConfig m_config; std::shared_ptr m_bufferPool; CVaapiDecodedPicture m_currentPicture;