Skip to content

Commit

Permalink
fixup: Allocate mmal buffer header later and use small pool
Browse files Browse the repository at this point in the history
  • Loading branch information
popcornmix committed Feb 22, 2016
1 parent 954b7c1 commit c8bddc0
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 32 deletions.
49 changes: 28 additions & 21 deletions xbmc/cores/VideoPlayer/DVDCodecs/Video/MMALFFmpeg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,25 +40,6 @@ extern "C" {

#define CLASSNAME "CMMALYUVBuffer"

void CMMALYUVBuffer::GetMmal()
{
MMAL_POOL_T *render_pool = m_pool->m_renderer->GetPool(RENDER_FMT_MMAL, false);
assert(render_pool);
mmal_buffer = mmal_queue_timedwait(render_pool->queue, 500);
if (!mmal_buffer)
CLog::Log(LOGERROR, "%s::%s - mmal_queue_get failed", CLASSNAME, __FUNCTION__);
else
{
mmal_buffer_header_reset(mmal_buffer);
mmal_buffer->cmd = 0;
mmal_buffer->offset = 0;
mmal_buffer->flags = 0;
mmal_buffer->user_data = NULL;
mmal_buffer->data = (uint8_t *)gmem->vc_handle;
mmal_buffer->alloc_size = mmal_buffer->length = gmem->numbytes;
}
}

CMMALYUVBuffer::CMMALYUVBuffer(const CBufferPoolPtr &pool, unsigned int width, unsigned int height, unsigned int aligned_width, unsigned int aligned_height)
: m_pool(pool)
{
Expand All @@ -68,7 +49,7 @@ CMMALYUVBuffer::CMMALYUVBuffer(const CBufferPoolPtr &pool, unsigned int width, u
m_aligned_height = aligned_height;
m_aspect_ratio = 0.0f;
m_refs = 0;

mmal_buffer = nullptr;
unsigned int size_pic = (m_aligned_width * m_aligned_height * 3) >> 1;
gmem = new GPU_MEM_PTR_T;
if (g_RBP.gpu_malloc_cached(size_pic, gmem) != 0)
Expand Down Expand Up @@ -214,7 +195,6 @@ CMMALYUVBuffer *CBufferPool::GetBuffer(const CBufferPoolPtr &pool, unsigned int
AlignedSize(avctx, aligned_width, aligned_height);
buffer = new CMMALYUVBuffer(pool, width, height, aligned_width, aligned_height);
}
buffer->GetMmal();
m_usedBuffers.push_back(buffer);
return buffer;
}
Expand Down Expand Up @@ -367,20 +347,47 @@ int CDecoder::Decode(AVCodecContext* avctx, AVFrame* frame)
return VC_BUFFER;
}

MMAL_BUFFER_HEADER_T *CDecoder::GetMmal()
{
MMAL_POOL_T *render_pool = m_renderer->GetPool(RENDER_FMT_MMAL, false);
assert(render_pool);
MMAL_BUFFER_HEADER_T *mmal_buffer = mmal_queue_timedwait(render_pool->queue, 500);
if (!mmal_buffer)
{
CLog::Log(LOGERROR, "%s::%s - mmal_queue_get failed", CLASSNAME, __FUNCTION__);
return nullptr;
}
mmal_buffer_header_reset(mmal_buffer);
mmal_buffer->cmd = 0;
mmal_buffer->offset = 0;
mmal_buffer->flags = 0;
mmal_buffer->user_data = NULL;
return mmal_buffer;
}

bool CDecoder::GetPicture(AVCodecContext* avctx, AVFrame* frame, DVDVideoPicture* picture)
{
CDVDVideoCodecFFmpeg* ctx = (CDVDVideoCodecFFmpeg*)avctx->opaque;
bool ret = ctx->GetPictureCommon(picture);
if (!ret)
return false;

MMAL_BUFFER_HEADER_T *mmal_buffer = GetMmal();
if (!mmal_buffer)
return false;

CSingleLock lock(m_section);

AVBufferRef *buf = frame->buf[0];
GPU_MEM_PTR_T *gmem = (GPU_MEM_PTR_T *)av_buffer_get_opaque(buf);
mmal_buffer->data = (uint8_t *)gmem->vc_handle;
mmal_buffer->alloc_size = mmal_buffer->length = gmem->numbytes;

picture->MMALBuffer = (CMMALYUVBuffer *)gmem->opaque;
assert(picture->MMALBuffer);
picture->format = RENDER_FMT_MMAL;
assert(!picture->MMALBuffer->mmal_buffer);
picture->MMALBuffer->mmal_buffer = mmal_buffer;

// need to flush ARM cache so GPU can see it (HEVC will have already done this)
if (avctx->codec_id != AV_CODEC_ID_HEVC)
Expand Down
2 changes: 1 addition & 1 deletion xbmc/cores/VideoPlayer/DVDCodecs/Video/MMALFFmpeg.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ class CMMALYUVBuffer : public CMMALBuffer
// reference counting
CMMALYUVBuffer* Acquire();
long Release();
void GetMmal();
private:
CBufferPoolPtr m_pool;
};
Expand Down Expand Up @@ -90,6 +89,7 @@ class CDecoder
static int FFGetBuffer(AVCodecContext *avctx, AVFrame *pic, int flags);

protected:
MMAL_BUFFER_HEADER_T *GetMmal();
AVCodecContext *m_avctx;
unsigned int m_shared;
CCriticalSection m_section;
Expand Down
12 changes: 2 additions & 10 deletions xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/MMALRenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -148,16 +148,8 @@ bool CMMALRenderer::init_vout(ERenderFormat format, bool opaque)
return false;
}

if (m_opaque)
{
m_vout_input->buffer_num = std::max(m_vout_input->buffer_num_recommended, (uint32_t)m_NumYV12Buffers);
m_vout_input->buffer_size = m_vout_input->buffer_size_recommended;
}
else
{
m_vout_input->buffer_num = 32;
m_vout_input->buffer_size = m_vout_input->buffer_size_recommended;
}
m_vout_input->buffer_num = std::max(m_vout_input->buffer_num_recommended, (uint32_t)m_NumYV12Buffers+1);
m_vout_input->buffer_size = m_vout_input->buffer_size_recommended;

status = mmal_port_enable(m_vout_input, vout_input_port_cb_static);
if(status != MMAL_SUCCESS)
Expand Down

0 comments on commit c8bddc0

Please sign in to comment.