diff --git a/mpp/mpp.cpp b/mpp/mpp.cpp index 6b978439..cd1d264a 100644 --- a/mpp/mpp.cpp +++ b/mpp/mpp.cpp @@ -25,6 +25,7 @@ #include "mpp_dec.h" #include "mpp_enc.h" #include "mpp_hal.h" +#include "mpp_buffer_impl.h" #include "mpp_frame_impl.h" #include "mpp_packet.h" #include "mpp_packet_impl.h" @@ -242,6 +243,7 @@ MPP_RET Mpp::control(MpiCmd cmd, MppParam param) case MPP_DEC_SET_EXT_BUF_GROUP: { mpp_log("mpi_control group %p\n", param); mFrameGroup = (MppBufferGroup)param; + mpp_buffer_group_set_listener((MppBufferGroupImpl *)param, (void *)mThreadCodec); mpp_log("signal codec thread\n"); mThreadCodec->signal(); break; diff --git a/mpp/mpp_buffer_impl.cpp b/mpp/mpp_buffer_impl.cpp index 6099b92c..2f28a0dc 100644 --- a/mpp/mpp_buffer_impl.cpp +++ b/mpp/mpp_buffer_impl.cpp @@ -279,6 +279,10 @@ MPP_RET mpp_buffer_ref_dec(MppBufferImpl *buffer) } } group->count_used--; + if (group->listener) { + MppThread *thread = (MppThread *)group->listener; + thread->signal(); + } } } @@ -422,6 +426,18 @@ MPP_RET mpp_buffer_group_reset(MppBufferGroupImpl *p) return MPP_OK; } +MPP_RET mpp_buffer_group_set_listener(MppBufferGroupImpl *p, void *listener) +{ + if (NULL == p || NULL == listener) { + mpp_err_f("found NULL pointer\n"); + return MPP_ERR_NULL_PTR; + } + + p->listener = listener; + + return MPP_OK; +} + void mpp_buffer_group_dump(MppBufferGroupImpl *group) { mpp_log("\ndumping buffer group %p id %d\n", group, group->group_id); diff --git a/mpp/mpp_buffer_impl.h b/mpp/mpp_buffer_impl.h index ddf79896..75cf80f0 100644 --- a/mpp/mpp_buffer_impl.h +++ b/mpp/mpp_buffer_impl.h @@ -78,6 +78,9 @@ struct MppBufferGroupImpl_t { RK_S32 count_used; RK_S32 count_unused; + // thread that will be signal on buffer return + void *listener; + // buffer log function RK_U32 log_runtime_en; RK_U32 log_history_en; @@ -129,6 +132,7 @@ MppBufferImpl *mpp_buffer_get_unused(MppBufferGroupImpl *p, size_t size); MPP_RET mpp_buffer_group_init(MppBufferGroupImpl **group, const char *tag, const char *caller, MppBufferMode mode, MppBufferType type); MPP_RET mpp_buffer_group_deinit(MppBufferGroupImpl *p); MPP_RET mpp_buffer_group_reset(MppBufferGroupImpl *p); +MPP_RET mpp_buffer_group_set_listener(MppBufferGroupImpl *p, void *listener); void mpp_buffer_group_dump(MppBufferGroupImpl *p); MppBufferGroupImpl *mpp_buffer_legacy_group();