From ef5f95d9e05246cea1098c6e5604155c53f8e9d7 Mon Sep 17 00:00:00 2001 From: ChenSiyong Date: Wed, 28 Oct 2015 00:00:07 +0000 Subject: [PATCH] [mpp_dec]: check wait frame first,if no frame in group,will no generate task, fix seek case in deadloop for wait frame buf [mpp_buffer]: add a discard value when group reset,post release used buffer git-svn-id: https://10.10.10.66:8443/svn/MediaProcessPlatform/trunk/mpp@431 6e48237b-75ef-9749-8fc9-41990f28c85a --- mpp/codec/mpp_dec.cpp | 6 +++++- mpp/legacy/vpu_mem_legacy.c | 2 +- mpp/mpp_buffer.cpp | 2 +- mpp/mpp_buffer_impl.cpp | 9 ++++++++- mpp/mpp_buffer_impl.h | 6 ++++++ 5 files changed, 21 insertions(+), 4 deletions(-) diff --git a/mpp/codec/mpp_dec.cpp b/mpp/codec/mpp_dec.cpp index 3ea32958..169e2fb1 100644 --- a/mpp/codec/mpp_dec.cpp +++ b/mpp/codec/mpp_dec.cpp @@ -171,7 +171,7 @@ void *mpp_dec_parser_thread(void *data) /* * wait for stream input */ - if (dec->reset_flag && !wait.dec_pic_buf) { + if (dec->reset_flag) { if (reset_dec_task(mpp, task_dec, &wait, &status)) continue; } @@ -182,6 +182,10 @@ void *mpp_dec_parser_thread(void *data) parser->wait(); parser->unlock(); + wait.dec_pic_buf = (mpp_buffer_group_unused(mpp->mFrameGroup) < 1); + + if(wait.dec_pic_buf) + continue; /* * 1. get task handle from hal for parsing one frame */ diff --git a/mpp/legacy/vpu_mem_legacy.c b/mpp/legacy/vpu_mem_legacy.c index 255a097f..d20615e4 100644 --- a/mpp/legacy/vpu_mem_legacy.c +++ b/mpp/legacy/vpu_mem_legacy.c @@ -96,7 +96,7 @@ static RK_S32 get_free_memory_num(vpu_display_mem_pool *p) static RK_S32 reset_vpu_mem_pool(vpu_display_mem_pool *p) { - mpp_err("reset_vpu_mem_pool xxxxxxxxxxxxxxx"); + vpu_display_mem_pool_impl *p_mempool = (vpu_display_mem_pool_impl *)p; mpp_buffer_group_clear(p_mempool->group); return 0; diff --git a/mpp/mpp_buffer.cpp b/mpp/mpp_buffer.cpp index f1b1a431..45f65b08 100644 --- a/mpp/mpp_buffer.cpp +++ b/mpp/mpp_buffer.cpp @@ -209,7 +209,7 @@ RK_S32 mpp_buffer_group_unused(MppBufferGroup group) } MppBufferGroupImpl *p = (MppBufferGroupImpl *)group; - return p->count_unused; + return (p->mode == MPP_BUFFER_INTERNAL ? 1 : p->count_unused); } MppBufferMode mpp_buffer_group_mode(MppBufferGroup group) diff --git a/mpp/mpp_buffer_impl.cpp b/mpp/mpp_buffer_impl.cpp index f4a6b743..13df9eb4 100644 --- a/mpp/mpp_buffer_impl.cpp +++ b/mpp/mpp_buffer_impl.cpp @@ -81,6 +81,8 @@ MPP_RET deinit_buffer_no_lock(MppBufferImpl *buffer) func(group->allocator, &buffer->info); group->usage -= buffer->info.size; group->count--; + if(!buffer->discard) + group->count_unused--; } else { group = SEARCH_GROUP_ORPHAN(buffer->group_id); mpp_assert(group); @@ -205,8 +207,12 @@ MPP_RET mpp_buffer_ref_dec(MppBufferImpl *buffer) if (group == service.mLegacyGroup) { deinit_buffer_no_lock(buffer); } else { + if(buffer->discard){ + deinit_buffer_no_lock(buffer); + }else{ list_add_tail(&buffer->list_status, &group->list_unused); group->count_unused++; + } } group->count_used--; } @@ -324,7 +330,8 @@ MPP_RET mpp_buffer_group_reset(MppBufferGroupImpl *p) if (!list_empty(&p->list_used)) { MppBufferImpl *pos, *n; list_for_each_entry_safe(pos, n, &p->list_used, MppBufferImpl, list_status) { - mpp_buffer_ref_dec(pos); + // mpp_buffer_ref_dec(pos); + pos->discard = 1; } } diff --git a/mpp/mpp_buffer_impl.h b/mpp/mpp_buffer_impl.h index 91d14473..67bfe211 100644 --- a/mpp/mpp_buffer_impl.h +++ b/mpp/mpp_buffer_impl.h @@ -42,6 +42,12 @@ struct MppBufferImpl_t { MppBufferInfo info; + /* used for buf on group reset mode + set disard value to 1 when frame refcount no zero , + we will delay relesase buffer after refcount to zero, + not put this buf to unused list + */ + RK_S32 discard; // used flag is for used/unused list detection RK_U32 used; RK_U32 internal;