From 98c46b2209dcdb427a53407c4e7394bbf2ce6e2b Mon Sep 17 00:00:00 2001 From: ChenSiyong Date: Thu, 15 Oct 2015 22:15:41 +0000 Subject: [PATCH] [mpp buf]:release internal unused buf when require a big buf [mpp_dec]:discard the task when parser task invalid git-svn-id: https://10.10.10.66:8443/svn/MediaProcessPlatform/trunk/mpp@384 6e48237b-75ef-9749-8fc9-41990f28c85a --- mpp/codec/mpp_dec.cpp | 31 ++++++++++++++++++++++++++----- mpp/mpp_buffer_impl.cpp | 3 +++ 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/mpp/codec/mpp_dec.cpp b/mpp/codec/mpp_dec.cpp index 292a9473..995955a0 100644 --- a/mpp/codec/mpp_dec.cpp +++ b/mpp/codec/mpp_dec.cpp @@ -90,6 +90,7 @@ void *mpp_dec_parser_thread(void *data) prev_task_done = 1; hal_task_hnd_set_status(task_prev, TASK_IDLE); task_prev = NULL; + wait_on_prev = 0; } else { usleep(5000); wait_on_prev = 1; @@ -240,6 +241,7 @@ void *mpp_dec_parser_thread(void *data) hal_task_get_hnd(tasks, TASK_PROC_DONE, &task_prev); if (task_prev) { prev_task_done = 1; + wait_on_prev = 0; hal_task_hnd_set_status(task_prev, TASK_IDLE); task_prev = NULL; } else { @@ -276,6 +278,24 @@ void *mpp_dec_parser_thread(void *data) info_task_done = 0; task_dec->flags.info_change = 0; + if(task_dec->output < 0){ + hal_task_hnd_set_status(task, TASK_IDLE); + mpp->mTaskPutCount++; + task = NULL; + if (pkt_buf_copyied) { + mpp_buf_slot_get_prop(packet_slots, task_dec->input, SLOT_BUFFER, &buffer); + if (buffer) { + mpp_buffer_put(buffer); + buffer = NULL; + } + mpp_buf_slot_clr_flag(packet_slots, task_dec->input, SLOT_HAL_INPUT); + pkt_buf_copyied = 0; + } + curr_task_ready = 0; + curr_task_parsed = 0; + hal_task_info_init(&task_local, MPP_CTX_DEC); + continue; + } /* * 5. chekc frame buffer group is internal or external */ @@ -403,10 +423,6 @@ void *mpp_dec_hal_thread(void *data) mpp_hal_hw_wait(dec->hal, &task_info); - // TODO: may have risk here - hal_task_hnd_set_status(task, TASK_PROC_DONE); - task = NULL; - mpp->mThreadCodec->signal(); /* @@ -423,6 +439,11 @@ void *mpp_dec_hal_thread(void *data) } mpp_buf_slot_clr_flag(packet_slots, task_dec->input, SLOT_HAL_INPUT); + // TODO: may have risk here + hal_task_hnd_set_status(task, TASK_PROC_DONE); + task = NULL; + mpp->mThreadCodec->signal(); + mpp_buf_slot_clr_flag(frame_slots, task_dec->output, SLOT_HAL_OUTPUT); for (RK_U32 i = 0; i < MPP_ARRAY_ELEMS(task_dec->refer); i++) { RK_S32 index = task_dec->refer[i]; @@ -439,7 +460,7 @@ void *mpp_dec_hal_thread(void *data) MppFrame frame; mpp_buf_slot_get_prop(frame_slots, index, SLOT_FRAME, &frame); if (!dec->reset_flag) { - mpp_put_frame(mpp, frame); + mpp_put_frame(mpp, frame); } else { mpp_frame_deinit(&frame); } diff --git a/mpp/mpp_buffer_impl.cpp b/mpp/mpp_buffer_impl.cpp index 020988aa..c473631a 100644 --- a/mpp/mpp_buffer_impl.cpp +++ b/mpp/mpp_buffer_impl.cpp @@ -222,6 +222,9 @@ MppBufferImpl *mpp_buffer_get_unused(MppBufferGroupImpl *p, size_t size) buffer = pos; inc_buffer_ref_no_lock(buffer); break; + }else{ + if(MPP_BUFFER_INTERNAL == p->mode) + deinit_buffer_no_lock(pos); } } }