From 4f8f63d16faf1ad388ada26744d50003681bd5a9 Mon Sep 17 00:00:00 2001 From: "herman.chen" Date: Tue, 23 Aug 2016 19:41:12 +0800 Subject: [PATCH] [mpp_buffer]: fix issue of destroy external commit frame buffer group twice Change-Id: I496f493fbeb038ca72425d946c65a4e7cce6b684 Signed-off-by: herman.chen --- mpp/base/mpp_buffer_impl.cpp | 1 + mpp/mpp.cpp | 18 +++++++++++------- mpp/mpp.h | 1 + 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/mpp/base/mpp_buffer_impl.cpp b/mpp/base/mpp_buffer_impl.cpp index d9b5d1ff..1e8c37df 100644 --- a/mpp/base/mpp_buffer_impl.cpp +++ b/mpp/base/mpp_buffer_impl.cpp @@ -683,6 +683,7 @@ void MppBufferService::destroy_group(MppBufferGroupImpl *group) mpp_assert(group->log_count == 0); } + mpp_assert(group->allocator); mpp_allocator_put(&group->allocator); list_del_init(&group->list_group); mpp_free(group); diff --git a/mpp/mpp.cpp b/mpp/mpp.cpp index 1e44f899..6aaea5f7 100644 --- a/mpp/mpp.cpp +++ b/mpp/mpp.cpp @@ -45,6 +45,7 @@ Mpp::Mpp() mTaskGetCount(0), mPacketGroup(NULL), mFrameGroup(NULL), + mExternalFrameGroup(0), mInputPort(NULL), mOutputPort(NULL), mInputTaskQueue(NULL), @@ -213,11 +214,8 @@ void Mpp::clear() mpp_buffer_group_put(mPacketGroup); mPacketGroup = NULL; } - if (mFrameGroup) { - MppBufferMode mode = mpp_buffer_group_mode(mFrameGroup); - if (MPP_BUFFER_INTERNAL == mode) { - mpp_buffer_group_put(mFrameGroup); - } + if (mFrameGroup && !mExternalFrameGroup) { + mpp_buffer_group_put(mFrameGroup); mFrameGroup = NULL; } } @@ -607,8 +605,14 @@ MPP_RET Mpp::control_dec(MpiCmd cmd, MppParam param) } break; case MPP_DEC_SET_EXT_BUF_GROUP: { mFrameGroup = (MppBufferGroup)param; - ret = mpp_buffer_group_set_listener((MppBufferGroupImpl *)param, (void *)mThreadCodec); - mThreadCodec->signal(); + if (param) { + mExternalFrameGroup = 1; + ret = mpp_buffer_group_set_listener((MppBufferGroupImpl *)param, (void *)mThreadCodec); + mThreadCodec->signal(); + } else { + mExternalFrameGroup = 0; + ret = mpp_buffer_group_set_listener(NULL, (void *)mThreadCodec); + } } break; case MPP_DEC_SET_INFO_CHANGE_READY: { ret = mpp_buf_slot_ready(mDec->frame_slots); diff --git a/mpp/mpp.h b/mpp/mpp.h index f4b07b50..541eac1c 100644 --- a/mpp/mpp.h +++ b/mpp/mpp.h @@ -97,6 +97,7 @@ public: */ MppBufferGroup mPacketGroup; MppBufferGroup mFrameGroup; + RK_U32 mExternalFrameGroup; /* * Mpp task queue for advance task mode