diff --git a/mpp/base/mpp_buf_slot.cpp b/mpp/base/mpp_buf_slot.cpp index 87da0c44..e14ea18a 100644 --- a/mpp/base/mpp_buf_slot.cpp +++ b/mpp/base/mpp_buf_slot.cpp @@ -492,9 +492,11 @@ static void clear_slots_impl(MppBufSlotsImpl *impl) MppBufSlotEntry *slot = (MppBufSlotEntry *)impl->slots; RK_S32 i; for (i = 0; i < impl->buf_count; i++, slot++) { - if (slot->status.on_used) - dump_slots(impl); mpp_assert(!slot->status.on_used); + if (slot->status.on_used) { + dump_slots(impl); + mpp_buf_slot_reset(impl, i); + } } impl->used_count = 0; diff --git a/mpp/codec/mpp_dec.cpp b/mpp/codec/mpp_dec.cpp index 60447ae1..5ee08ba4 100644 --- a/mpp/codec/mpp_dec.cpp +++ b/mpp/codec/mpp_dec.cpp @@ -393,6 +393,25 @@ static void mpp_dec_put_task(Mpp *mpp, DecTask *task) task->hnd = NULL; } +static void reset_hal_thread(Mpp *mpp) +{ + MppDec *dec = mpp->mDec; + MppBufSlots frame_slots = dec->frame_slots; + HalDecTaskFlag flag; + RK_S32 index = -1; + + /* when hal thread reset output all frames */ + flag.val = 0; + mpp_dec_flush(dec); + + mpp->mThreadHal->lock(THREAD_OUTPUT); + while (MPP_OK == mpp_buf_slot_dequeue(frame_slots, &index, QUEUE_DISPLAY)) { + mpp_dec_put_frame(mpp, index, flag); + mpp_buf_slot_clr_flag(frame_slots, index, SLOT_QUEUE_USE); + } + mpp->mThreadHal->unlock(THREAD_OUTPUT); +} + static MPP_RET try_proc_dec_task(Mpp *mpp, DecTask *task) { MppDec *dec = mpp->mDec; @@ -823,6 +842,8 @@ void *mpp_dec_hal_thread(void *data) // process all task then do reset process if (dec->reset_flag && !dec->hal_reset_done) { AutoMutex ctrl_lock(hal->mutex(THREAD_CONTROL)); + + reset_hal_thread(mpp); dec->hal_reset_done = 1; hal->signal(THREAD_CONTROL); continue;