[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
This commit is contained in:
ChenSiyong
2015-10-28 00:00:07 +00:00
parent 932e7f761c
commit ef5f95d9e0
5 changed files with 21 additions and 4 deletions

View File

@@ -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
*/

View File

@@ -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;

View File

@@ -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)

View File

@@ -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,9 +207,13 @@ 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;
}
}

View File

@@ -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;