From 3d530016fbf87d397d6db1af39c92314d6ce3c2b Mon Sep 17 00:00:00 2001 From: Herman Chen Date: Wed, 11 Jun 2025 17:34:11 +0800 Subject: [PATCH] feat[mpp_buffer]: Add mpp_buffer discard function Mark a single buffer to discard status. Signed-off-by: Herman Chen Change-Id: I86e9501ace8c2b11c60360905e9f6c9466e38eea --- inc/mpp_buffer.h | 4 ++++ mpp/base/inc/mpp_buffer_impl.h | 1 + mpp/base/mpp_buffer.c | 10 ++++++++++ mpp/base/mpp_buffer_impl.c | 26 ++++++++++++++++++++++++++ 4 files changed, 41 insertions(+) diff --git a/inc/mpp_buffer.h b/inc/mpp_buffer.h index d7794ed6..e738ecb2 100644 --- a/inc/mpp_buffer.h +++ b/inc/mpp_buffer.h @@ -258,6 +258,9 @@ typedef struct MppBufferInfo_t { #define mpp_buffer_set_offset(buffer, offset) \ mpp_buffer_set_offset_with_caller(buffer, offset, __FUNCTION__) +#define mpp_buffer_set_discard(buffer) \ + mpp_buffer_discard_with_caller(buffer, __FUNCTION__) + #define mpp_buffer_sync_begin(buffer) \ mpp_buffer_sync_begin_f(buffer, 0, __FUNCTION__) #define mpp_buffer_sync_end(buffer) \ @@ -301,6 +304,7 @@ MPP_RET mpp_buffer_get_with_tag(MppBufferGroup group, MppBuffer *buffer, size_t const char *tag, const char *caller); MPP_RET mpp_buffer_put_with_caller(MppBuffer buffer, const char *caller); MPP_RET mpp_buffer_inc_ref_with_caller(MppBuffer buffer, const char *caller); +MPP_RET mpp_buffer_discard_with_caller(MppBuffer buffer, const char *caller); MPP_RET mpp_buffer_info_get_with_caller(MppBuffer buffer, MppBufferInfo *info, const char *caller); MPP_RET mpp_buffer_read_with_caller(MppBuffer buffer, size_t offset, void *data, size_t size, const char *caller); diff --git a/mpp/base/inc/mpp_buffer_impl.h b/mpp/base/inc/mpp_buffer_impl.h index a6a3291f..35f462f6 100644 --- a/mpp/base/inc/mpp_buffer_impl.h +++ b/mpp/base/inc/mpp_buffer_impl.h @@ -194,6 +194,7 @@ MPP_RET mpp_buffer_create(const char *tag, const char *caller, MppBufferGroupImp MPP_RET mpp_buffer_mmap(MppBufferImpl *buffer, const char* caller); MPP_RET mpp_buffer_ref_inc(MppBufferImpl *buffer, const char* caller); MPP_RET mpp_buffer_ref_dec(MppBufferImpl *buffer, const char* caller); +MPP_RET mpp_buffer_discard(MppBufferImpl *buffer, const char* caller); MppBufferImpl *mpp_buffer_get_unused(MppBufferGroupImpl *p, size_t size, const char* caller); RK_U32 mpp_buffer_to_addr(MppBuffer buffer, size_t offset); MPP_RET mpp_buffer_attach_dev_f(const char *caller, MppBuffer buffer, MppDev dev); diff --git a/mpp/base/mpp_buffer.c b/mpp/base/mpp_buffer.c index 5a1ba711..f0049600 100644 --- a/mpp/base/mpp_buffer.c +++ b/mpp/base/mpp_buffer.c @@ -105,6 +105,16 @@ MPP_RET mpp_buffer_inc_ref_with_caller(MppBuffer buffer, const char *caller) return mpp_buffer_ref_inc((MppBufferImpl*)buffer, caller); } +MPP_RET mpp_buffer_discard_with_caller(MppBuffer buffer, const char *caller) +{ + if (NULL == buffer) { + mpp_err("mpp_buffer_discard invalid input: buffer NULL from %s\n", caller); + return MPP_ERR_UNKNOW; + } + + return mpp_buffer_discard((MppBufferImpl*)buffer, caller); +} + MPP_RET mpp_buffer_read_with_caller(MppBuffer buffer, size_t offset, void *data, size_t size, const char *caller) { if (NULL == buffer || NULL == data) { diff --git a/mpp/base/mpp_buffer_impl.c b/mpp/base/mpp_buffer_impl.c index cd33b77f..f12e789a 100644 --- a/mpp/base/mpp_buffer_impl.c +++ b/mpp/base/mpp_buffer_impl.c @@ -614,6 +614,32 @@ done: return ret; } +MPP_RET mpp_buffer_discard(MppBufferImpl *buffer, const char* caller) +{ + MppBufferService *srv = get_srv_buffer(); + MppBufferGroupImpl *group = NULL; + + MPP_BUF_FUNCTION_ENTER(); + + if (srv) { + mpp_mutex_lock(&srv->lock); + group = SEARCH_GROUP_BY_ID(srv, buffer->group_id); + mpp_mutex_unlock(&srv->lock); + } + + mpp_assert(group); + if (group) { + pthread_mutex_lock(&group->buf_lock); + buffer->discard = 1; + buf_add_log(buffer, BUF_DISCARD, caller); + pthread_mutex_unlock(&group->buf_lock); + } + + MPP_BUF_FUNCTION_LEAVE(); + + return MPP_OK; +} + MppBufferImpl *mpp_buffer_get_unused(MppBufferGroupImpl *p, size_t size, const char* caller) { MppBufferImpl *buffer = NULL;