aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRainer Hochecker <fernetmenta@online.de>2015-02-01 07:47:12 +0100
committerRainer Hochecker <fernetmenta@online.de>2015-02-01 07:47:12 +0100
commit23a8bde6a36884e6f2b523e378504451d09cb04a (patch)
treef6d9c9f08324344a9773ab7cf8a6dea65c2cf034
parentb0a7e2b0cb14ef142473cc97a596a149ad623069 (diff)
VAAPI: avoid reset when running out of surfaces
-rw-r--r--xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp15
-rw-r--r--xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.h1
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;