diff options
author | Rainer Hochecker <fernetmenta@online.de> | 2015-02-01 07:47:12 +0100 |
---|---|---|
committer | Rainer Hochecker <fernetmenta@online.de> | 2015-02-01 07:47:12 +0100 |
commit | 23a8bde6a36884e6f2b523e378504451d09cb04a (patch) | |
tree | f6d9c9f08324344a9773ab7cf8a6dea65c2cf034 | |
parent | b0a7e2b0cb14ef142473cc97a596a149ad623069 (diff) |
VAAPI: avoid reset when running out of surfaces
-rw-r--r-- | xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp | 15 | ||||
-rw-r--r-- | xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.h | 1 |
2 files changed, 13 insertions, 3 deletions
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp index 4be8f39c4d..fa069cef0c 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp @@ -471,6 +471,7 @@ CDecoder::CDecoder() : m_vaapiOutput(&m_inMsgEvent) m_vaapiConfig.contextId = VA_INVALID_ID; m_vaapiConfig.configId = VA_INVALID_ID; m_avctx = NULL; + m_getBufferError = false; } CDecoder::~CDecoder() @@ -697,9 +698,9 @@ int CDecoder::FFGetBuffer(AVCodecContext *avctx, AVFrame *pic, int flags) uint16_t decoded, processed, render; bool vpp; va->m_bufferStats.Get(decoded, processed, render, vpp); - CLog::Log(LOGERROR, "VAAPI::FFGetBuffer - no surface available - dec: %d, render: %d", + CLog::Log(LOGWARNING, "VAAPI::FFGetBuffer - no surface available - dec: %d, render: %d", decoded, render); - va->m_DisplayState = VAAPI_ERROR; + va->m_getBufferError = true; return -1; } @@ -734,6 +735,8 @@ void CDecoder::FFReleaseBuffer(uint8_t *data) int CDecoder::Decode(AVCodecContext* avctx, AVFrame* pFrame) { + m_getBufferError = false; + int result = Check(avctx); if (result) return result; @@ -850,6 +853,7 @@ int CDecoder::Decode(AVCodecContext* avctx, AVFrame* pFrame) int CDecoder::Check(AVCodecContext* avctx) { + int ret = 0; EDisplayState state; { CSingleLock lock(m_DecoderSection); @@ -891,7 +895,12 @@ int CDecoder::Check(AVCodecContext* avctx) else return VC_ERROR; } - return 0; + + if (m_getBufferError) + ret |= VC_NOBUFFER; + + m_getBufferError = false; + return ret; } bool CDecoder::GetPicture(AVCodecContext* avctx, AVFrame* frame, DVDVideoPicture* picture) diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.h index 6b2b67a246..f737edc43e 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.h +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.h @@ -449,6 +449,7 @@ protected: CVideoSurfaces m_videoSurfaces; vaapi_context m_hwContext; AVCodecContext* m_avctx; + bool m_getBufferError; COutput m_vaapiOutput; CVaapiBufferStats m_bufferStats; |