diff options
author | Rainer Hochecker <fernetmenta@online.de> | 2014-09-21 10:17:51 +0200 |
---|---|---|
committer | Rainer Hochecker <fernetmenta@online.de> | 2014-09-21 10:17:51 +0200 |
commit | f02ebef7be8b2e61ed3d1cb1ecbada940269174d (patch) | |
tree | 3474f352c70d6954d8b038ee1961ca031b272c57 | |
parent | d745fa815653a72a79f1adba9cad9d31329b069f (diff) | |
parent | b51c2c7de29ba8edb727af1c7d9c4a220988f8a7 (diff) |
Merge pull request #5391 from FernetMenta/vaapivdpau
Vaapivdpau: fix and optimization
-rw-r--r-- | xbmc/cores/VideoRenderers/LinuxRendererGL.cpp | 5 | ||||
-rw-r--r-- | xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp | 21 | ||||
-rw-r--r-- | xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.h | 3 |
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; |