From 570c5508223ba444af1e006eae4488a1a1ab0490 Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Mon, 8 Sep 2014 12:12:16 +0200 Subject: [PATCH] vaapi: fix potential segfault when pp method is changed --- .../cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp index bfcf468a075d7..6685877b7a159 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp @@ -1407,7 +1407,11 @@ void COutput::StateMachine(int signal, Protocol *port, Message *msg) switch (signal) { case COutputControlProtocol::TIMEOUT: - m_pp->AddPicture(m_currentPicture); + if (!m_pp->AddPicture(m_currentPicture)) + { + m_state = O_TOP_ERROR; + return; + } CVaapiProcessedPicture outPic; if (m_pp->Filter(outPic)) { @@ -1662,14 +1666,17 @@ bool COutput::HasWork() bool COutput::PreferPP() { - if (!m_pp) - return true; + if (!m_bufferPool.decodedPics.empty()) + { + if (!m_pp) + return true; - if (!m_bufferPool.decodedPics.empty() && !m_pp->DoesSync() && m_bufferPool.processedPics.size() < 4) - return true; + if (!m_pp->DoesSync() && m_bufferPool.processedPics.size() < 4) + return true; - if (m_bufferPool.freeRenderPics.empty() || m_bufferPool.processedPics.empty()) - return true; + if (m_bufferPool.freeRenderPics.empty() || m_bufferPool.processedPics.empty()) + return true; + } return false; } @@ -2125,6 +2132,7 @@ void COutput::ReleaseBufferPool(bool precleanup) glDeleteTextures(1, &pic->texture); glXDestroyPixmap(m_Display, pic->glPixmap); XFreePixmap(m_Display, pic->pixmap); + pic->texture = None; } av_frame_free(&pic->avFrame); pic->valid = false; @@ -2516,6 +2524,7 @@ bool CVppPostproc::AddPicture(CVaapiDecodedPicture &pic) m_decodedPics.push_front(pic); m_frameCount++; m_step = 0; + return true; } bool CVppPostproc::Filter(CVaapiProcessedPicture &outPic)