From 02fa7a2b44431aed0650f48fb4a0d9da492d18a3 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Tue, 5 May 2015 18:18:08 +0100 Subject: [PATCH] [mmal] Move the image pool from decoder to renderer --- xbmc/cores/VideoRenderers/MMALRenderer.cpp | 22 +++++++++++-------- .../dvdplayer/DVDCodecs/Video/MMALCodec.cpp | 18 +++++---------- .../dvdplayer/DVDCodecs/Video/MMALCodec.h | 1 - 3 files changed, 18 insertions(+), 23 deletions(-) diff --git a/xbmc/cores/VideoRenderers/MMALRenderer.cpp b/xbmc/cores/VideoRenderers/MMALRenderer.cpp index 3204742b9f499..ffa42f83b50f9 100644 --- a/xbmc/cores/VideoRenderers/MMALRenderer.cpp +++ b/xbmc/cores/VideoRenderers/MMALRenderer.cpp @@ -41,8 +41,14 @@ CRenderInfo CMMALRenderer::GetRenderInfo() { + CSingleLock lock(m_sharedSection); CRenderInfo info; + // we'll assume that video is accelerated (RENDER_FMT_MMAL) for now + // we can reconfigure renderer later if necessary + if (!m_bConfigured) + m_bConfigured = init_vout(RENDER_FMT_MMAL); + #if defined(MMAL_DEBUG_VERBOSE) CLog::Log(LOGDEBUG, "%s::%s cookie:%p", CLASSNAME, __func__, (void *)m_vout_input_pool); #endif @@ -178,14 +184,11 @@ bool CMMALRenderer::init_vout(ERenderFormat format) return false; } - if (m_format == RENDER_FMT_YUV420P) + m_vout_input_pool = mmal_port_pool_create(m_vout_input , m_vout_input->buffer_num, m_vout_input->buffer_size); + if (!m_vout_input_pool) { - m_vout_input_pool = mmal_pool_create(m_vout_input->buffer_num, m_vout_input->buffer_size); - if (!m_vout_input_pool) - { - CLog::Log(LOGERROR, "%s::%s Failed to create pool for decoder input port (status=%x %s)", CLASSNAME, __func__, status, mmal_status_to_string(status)); - return false; - } + CLog::Log(LOGERROR, "%s::%s Failed to create pool for decoder input port (status=%x %s)", CLASSNAME, __func__, status, mmal_status_to_string(status)); + return false; } return true; } @@ -467,7 +470,7 @@ void CMMALRenderer::ReleaseBuffers() void CMMALRenderer::UnInitMMAL() { - CLog::Log(LOGDEBUG, "%s::%s", CLASSNAME, __func__); + CLog::Log(LOGDEBUG, "%s::%s pool(%p)", CLASSNAME, __func__, m_vout_input_pool); if (m_vout) { mmal_component_disable(m_vout); @@ -481,6 +484,8 @@ void CMMALRenderer::UnInitMMAL() m_vout_input = NULL; } + ReleaseBuffers(); + if (m_vout_input_pool) { mmal_pool_destroy(m_vout_input_pool); @@ -492,7 +497,6 @@ void CMMALRenderer::UnInitMMAL() mmal_component_release(m_vout); m_vout = NULL; } - ReleaseBuffers(); m_RenderUpdateCallBackFn = NULL; m_RenderUpdateCallBackCtx = NULL; diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/MMALCodec.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/MMALCodec.cpp index d38536be09aac..84b9ae7d7e2b9 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/MMALCodec.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/MMALCodec.cpp @@ -112,7 +112,6 @@ CMMALVideo::CMMALVideo() m_dec_input = NULL; m_dec_output = NULL; m_dec_input_pool = NULL; - m_dec_output_pool = NULL; m_vout_input_pool = NULL; m_deint = NULL; @@ -163,10 +162,6 @@ CMMALVideo::~CMMALVideo() mmal_pool_destroy(m_dec_input_pool); m_dec_input_pool = NULL; - if (m_dec_output_pool) - mmal_pool_destroy(m_dec_output_pool); - m_dec_output_pool = NULL; - if (m_deint) mmal_component_destroy(m_deint); m_deint = NULL; @@ -695,13 +690,6 @@ bool CMMALVideo::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options, MMALVide return false; } - m_dec_output_pool = mmal_port_pool_create(m_dec_output, m_dec_output->buffer_num, m_dec_output->buffer_size); - if(!m_dec_output_pool) - { - CLog::Log(LOGERROR, "%s::%s Failed to create pool for decode output port (status=%x %s)", CLASSNAME, __func__, status, mmal_status_to_string(status)); - return false; - } - if (!SendCodecConfigData()) return false; @@ -748,6 +736,7 @@ int CMMALVideo::Decode(uint8_t* pData, int iSize, double dts, double pts) MMAL_BUFFER_HEADER_T *buffer; MMAL_STATUS_T status; + Prime(); // we need to queue then de-queue the demux packet, seems silly but // mmal might not have an input buffer available when we are called // and we must store the demuxer packet and try again later. @@ -893,7 +882,10 @@ int CMMALVideo::Decode(uint8_t* pData, int iSize, double dts, double pts) void CMMALVideo::Prime() { MMAL_BUFFER_HEADER_T *buffer; - while (buffer = mmal_queue_get(m_dec_output_pool->queue), buffer) + if (g_advancedSettings.CanLogComponent(LOGVIDEO)) + CLog::Log(LOGDEBUG, "%s::%s - queue(%p)", CLASSNAME, __func__, m_vout_input_pool); + assert(m_vout_input_pool); + while (buffer = mmal_queue_get(m_vout_input_pool->queue), buffer) Recycle(buffer); } diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/MMALCodec.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/MMALCodec.h index 177775e5271e9..7c949c4bfaf20 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/MMALCodec.h +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/MMALCodec.h @@ -139,7 +139,6 @@ class CMMALVideo MMAL_PORT_T *m_dec_input; MMAL_PORT_T *m_dec_output; MMAL_POOL_T *m_dec_input_pool; - MMAL_POOL_T *m_dec_output_pool; MMAL_POOL_T *m_vout_input_pool; MMAL_ES_FORMAT_T *m_es_format;