aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRainer Hochecker <fernetmenta@online.de>2014-09-21 10:17:51 +0200
committerRainer Hochecker <fernetmenta@online.de>2014-09-21 10:17:51 +0200
commitf02ebef7be8b2e61ed3d1cb1ecbada940269174d (patch)
tree3474f352c70d6954d8b038ee1961ca031b272c57
parentd745fa815653a72a79f1adba9cad9d31329b069f (diff)
parentb51c2c7de29ba8edb727af1c7d9c4a220988f8a7 (diff)
Merge pull request #5391 from FernetMenta/vaapivdpau
Vaapivdpau: fix and optimization
-rw-r--r--xbmc/cores/VideoRenderers/LinuxRendererGL.cpp5
-rw-r--r--xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp21
-rw-r--r--xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.h3
3 files changed, 27 insertions, 2 deletions
diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp
index 5d3aaf7a79..e1219d4fe6 100644
--- a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp
+++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp
@@ -3500,6 +3500,11 @@ unsigned int CLinuxRendererGL::GetOptimalBufferSize()
{
if(m_format == RENDER_FMT_CVBREF)
return 2;
+ else if (m_format == RENDER_FMT_VAAPI ||
+ m_format == RENDER_FMT_VAAPINV12 ||
+ m_format == RENDER_FMT_VDPAU ||
+ m_format == RENDER_FMT_VDPAU_420)
+ return 5;
else
return 3;
}
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp
index 6685877b7a..3cbc681ae0 100644
--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp
+++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp
@@ -417,6 +417,17 @@ bool CVideoSurfaces::HasFree()
return !m_freeSurfaces.empty();
}
+bool CVideoSurfaces::HasRefs()
+{
+ CSingleLock lock(m_section);
+ for (std::map<VASurfaceID, int>::iterator it = m_state.begin(); it != m_state.end(); ++it)
+ {
+ if (it->second & SURFACE_USED_FOR_REFERENCE)
+ return true;
+ }
+ return false;
+}
+
//-----------------------------------------------------------------------------
// VAAPI
//-----------------------------------------------------------------------------
@@ -440,6 +451,7 @@ CDecoder::CDecoder() : m_vaapiOutput(&m_inMsgEvent)
m_vaapiConfig.context = 0;
m_vaapiConfig.contextId = VA_INVALID_ID;
m_vaapiConfig.configId = VA_INVALID_ID;
+ m_avctx = NULL;
}
CDecoder::~CDecoder()
@@ -483,7 +495,6 @@ bool CDecoder::Open(AVCodecContext* avctx, const enum PixelFormat fmt, unsigned
m_vaapiConfig.surfaceWidth = avctx->width;
m_vaapiConfig.surfaceHeight = avctx->height;
m_vaapiConfig.aspect = avctx->sample_aspect_ratio;
- m_vaapiConfig.numRenderBuffers = surfaces;
m_decoderThread = CThread::GetCurrentThreadId();
m_DisplayState = VAAPI_OPEN;
m_vaapiConfigured = false;
@@ -568,6 +579,8 @@ bool CDecoder::Open(AVCodecContext* avctx, const enum PixelFormat fmt, unsigned
avctx->hwaccel_context = &m_hwContext;
avctx->get_buffer2 = CDecoder::FFGetBuffer;
avctx->slice_flags = SLICE_FLAG_CODED_ORDER|SLICE_FLAG_ALLOW_FIELD;
+
+ m_avctx = avctx;
return true;
}
@@ -586,6 +599,12 @@ void CDecoder::Close()
long CDecoder::Release()
{
+ // if ffmpeg holds any references, flush buffers
+ if (m_avctx && m_videoSurfaces.HasRefs())
+ {
+ avcodec_flush_buffers(m_avctx);
+ }
+
// check if we should do some pre-cleanup here
// a second decoder might need resources
if (m_vaapiConfigured == true)
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.h
index d937eea3b0..c5a0071fe9 100644
--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.h
+++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.h
@@ -116,7 +116,6 @@ struct CVaapiConfig
CDecoder *vaapi;
int upscale;
CVideoSurfaces *videoSurfaces;
- int numRenderBuffers;
uint32_t maxReferences;
bool useInteropYuv;
CVAAPIContext *context;
@@ -331,6 +330,7 @@ public:
void Reset();
int Size();
bool HasFree();
+ bool HasRefs();
protected:
std::map<VASurfaceID, int> m_state;
std::list<VASurfaceID> m_freeSurfaces;
@@ -427,6 +427,7 @@ protected:
CVaapiConfig m_vaapiConfig;
CVideoSurfaces m_videoSurfaces;
vaapi_context m_hwContext;
+ AVCodecContext* m_avctx;
COutput m_vaapiOutput;
CVaapiBufferStats m_bufferStats;