From 218354e0885180eb9bc474ce9f87d33f84790e52 Mon Sep 17 00:00:00 2001 From: ChenHengming Date: Tue, 7 Jun 2016 09:36:27 +0000 Subject: [PATCH] [osal]: fix import failed on window and linux [mpp_buffer]: add mpp_buffer function git-svn-id: https://10.10.10.66:8443/svn/MediaProcessPlatform/trunk/mpp@884 6e48237b-75ef-9749-8fc9-41990f28c85a --- mpp/base/inc/mpp_buffer_impl.h | 2 +- mpp/base/mpp_buffer_impl.cpp | 105 ++++++++++++++++++++++----------- osal/linux/os_allocator.c | 26 +++++++- osal/window/os_allocator.c | 26 +++++++- 4 files changed, 118 insertions(+), 41 deletions(-) diff --git a/mpp/base/inc/mpp_buffer_impl.h b/mpp/base/inc/mpp_buffer_impl.h index f4ae234c..4884c2ab 100644 --- a/mpp/base/inc/mpp_buffer_impl.h +++ b/mpp/base/inc/mpp_buffer_impl.h @@ -27,7 +27,7 @@ #define MPP_BUF_DBG_CLR_ON_EXIT (0x00000008) #define mpp_buf_dbg(flag, fmt, ...) _mpp_dbg(mpp_buffer_debug, flag, fmt, ## __VA_ARGS__) -#define mpp_buf_dbg_f(flag, fmt, ...) _mpp_dbg(mpp_buffer_debug, flag, fmt, ## __VA_ARGS__) +#define mpp_buf_dbg_f(flag, fmt, ...) _mpp_dbg_f(mpp_buffer_debug, flag, fmt, ## __VA_ARGS__) #define MPP_BUF_FUNCTION_ENTER() mpp_buf_dbg_f(MPP_BUF_DBG_FUNCTION, "enter\n") #define MPP_BUF_FUNCTION_LEAVE() mpp_buf_dbg_f(MPP_BUF_DBG_FUNCTION, "leave\n") diff --git a/mpp/base/mpp_buffer_impl.cpp b/mpp/base/mpp_buffer_impl.cpp index d82c86b9..8cd6bc04 100644 --- a/mpp/base/mpp_buffer_impl.cpp +++ b/mpp/base/mpp_buffer_impl.cpp @@ -208,38 +208,47 @@ static void dump_buffer_info(MppBufferImpl *buffer) MPP_RET mpp_buffer_create(const char *tag, const char *caller, RK_U32 group_id, MppBufferInfo *info) { + MPP_RET ret = MPP_OK; AutoMutex auto_lock(&service.mLock); + MPP_BUF_FUNCTION_ENTER(); + + BufferOp func = NULL; + MppBufferImpl *p = NULL; MppBufferGroupImpl *group = SEARCH_GROUP_NORMAL(group_id); if (NULL == group) { mpp_err_f("can not create buffer without group\n"); - return MPP_NOK; + ret = MPP_NOK; + goto RET; } if (group->limit_count && group->count >= group->limit_count) { mpp_err_f("reach group count limit %d\n", group->limit_count); - return MPP_NOK; + ret = MPP_NOK; + goto RET; } if (group->limit_size && info->size > group->limit_size) { mpp_err_f("required size %d reach group size limit %d\n", info->size, group->limit_size); - return MPP_NOK; + ret = MPP_NOK; + goto RET; } - MppBufferImpl *p = mpp_calloc(MppBufferImpl, 1); + p = mpp_calloc(MppBufferImpl, 1); if (NULL == p) { mpp_err_f("failed to allocate context\n"); - return MPP_ERR_MALLOC; + ret = MPP_ERR_MALLOC; + goto RET; } - BufferOp func = (group->mode == MPP_BUFFER_INTERNAL) ? - (group->alloc_api->alloc) : - (group->alloc_api->import); - MPP_RET ret = func(group->allocator, info); + func = (group->mode == MPP_BUFFER_INTERNAL) ? + (group->alloc_api->alloc) : (group->alloc_api->import); + ret = func(group->allocator, info); if (MPP_OK != ret) { mpp_err_f("failed to create buffer with size %d\n", info->size); mpp_free(p); - return MPP_ERR_MALLOC; + ret = MPP_ERR_MALLOC; + goto RET; } p->info = *info; @@ -256,59 +265,72 @@ MPP_RET mpp_buffer_create(const char *tag, const char *caller, RK_U32 group_id, group->usage += info->size; group->count++; group->count_unused++; - return MPP_OK; +RET: + MPP_BUF_FUNCTION_LEAVE(); + return ret; } MPP_RET mpp_buffer_destroy(MppBufferImpl *buffer) { AutoMutex auto_lock(&service.mLock); + MPP_BUF_FUNCTION_ENTER(); - deinit_buffer_no_lock(buffer); + MPP_RET ret = deinit_buffer_no_lock(buffer); - return MPP_OK; + MPP_BUF_FUNCTION_LEAVE(); + return ret; } MPP_RET mpp_buffer_ref_inc(MppBufferImpl *buffer) { AutoMutex auto_lock(&service.mLock); - return inc_buffer_ref_no_lock(buffer); + MPP_BUF_FUNCTION_ENTER(); + + MPP_RET ret = inc_buffer_ref_no_lock(buffer); + + MPP_BUF_FUNCTION_LEAVE(); + return ret; } MPP_RET mpp_buffer_ref_dec(MppBufferImpl *buffer) { + MPP_RET ret = MPP_OK; AutoMutex auto_lock(&service.mLock); + MPP_BUF_FUNCTION_ENTER(); if (buffer->ref_count <= 0) { - mpp_err_f("found non-positive ref_count %d caller %s\n", buffer->ref_count, buffer->caller); - return MPP_NOK; - } - - buffer->ref_count--; - if (0 == buffer->ref_count) { - buffer->used = 0; - list_del_init(&buffer->list_status); - MppBufferGroupImpl *group = SEARCH_GROUP_NORMAL(buffer->group_id); - if (group) { - if (group == service.mLegacyGroup) { - deinit_buffer_no_lock(buffer); - } else { - if (buffer->discard) { + mpp_err_f("found non-positive ref_count %d caller %s\n", + buffer->ref_count, buffer->caller); + ret = MPP_NOK; + } else { + buffer->ref_count--; + if (0 == buffer->ref_count) { + buffer->used = 0; + list_del_init(&buffer->list_status); + MppBufferGroupImpl *group = SEARCH_GROUP_NORMAL(buffer->group_id); + if (group) { + if (group == service.mLegacyGroup) { deinit_buffer_no_lock(buffer); } else { - list_add_tail(&buffer->list_status, &group->list_unused); - group->count_unused++; + if (buffer->discard) { + deinit_buffer_no_lock(buffer); + } else { + list_add_tail(&buffer->list_status, &group->list_unused); + group->count_unused++; + } + } + group->count_used--; + if (group->listener) { + MppThread *thread = (MppThread *)group->listener; + thread->signal(); } - } - group->count_used--; - if (group->listener) { - MppThread *thread = (MppThread *)group->listener; - thread->signal(); } } } - return MPP_OK; + MPP_BUF_FUNCTION_LEAVE(); + return ret; } MppBufferImpl *mpp_buffer_get_unused(MppBufferGroupImpl *p, size_t size) @@ -316,6 +338,7 @@ MppBufferImpl *mpp_buffer_get_unused(MppBufferGroupImpl *p, size_t size) MppBufferImpl *buffer = NULL; AutoMutex auto_lock(&service.mLock); + MPP_BUF_FUNCTION_ENTER(); if (!list_empty(&p->list_unused)) { MppBufferImpl *pos, *n; @@ -334,6 +357,7 @@ MppBufferImpl *mpp_buffer_get_unused(MppBufferGroupImpl *p, size_t size) } } + MPP_BUF_FUNCTION_LEAVE(); return buffer; } @@ -350,6 +374,7 @@ MPP_RET mpp_buffer_group_init(MppBufferGroupImpl **group, const char *tag, const mpp_assert(caller); AutoMutex auto_lock(&service.mLock); + MPP_BUF_FUNCTION_ENTER(); INIT_LIST_HEAD(&p->list_group); INIT_LIST_HEAD(&p->list_used); @@ -387,6 +412,7 @@ MPP_RET mpp_buffer_group_init(MppBufferGroupImpl **group, const char *tag, const *group = p; + MPP_BUF_FUNCTION_LEAVE(); return MPP_OK; } @@ -418,6 +444,7 @@ MPP_RET mpp_buffer_group_deinit(MppBufferGroupImpl *p) } AutoMutex auto_lock(&service.mLock); + MPP_BUF_FUNCTION_ENTER(); // remove unused list if (!list_empty(&p->list_unused)) { @@ -446,6 +473,7 @@ MPP_RET mpp_buffer_group_deinit(MppBufferGroupImpl *p) } } + MPP_BUF_FUNCTION_LEAVE(); return MPP_OK; } @@ -457,6 +485,7 @@ MPP_RET mpp_buffer_group_reset(MppBufferGroupImpl *p) } AutoMutex auto_lock(&service.mLock); + MPP_BUF_FUNCTION_ENTER(); if (!list_empty(&p->list_used)) { MppBufferImpl *pos, *n; @@ -475,6 +504,7 @@ MPP_RET mpp_buffer_group_reset(MppBufferGroupImpl *p) } } + MPP_BUF_FUNCTION_LEAVE(); return MPP_OK; } @@ -486,8 +516,11 @@ MPP_RET mpp_buffer_group_set_listener(MppBufferGroupImpl *p, void *listener) } AutoMutex auto_lock(&service.mLock); + MPP_BUF_FUNCTION_ENTER(); + p->listener = listener; + MPP_BUF_FUNCTION_LEAVE(); return MPP_OK; } diff --git a/osal/linux/os_allocator.c b/osal/linux/os_allocator.c index f7207283..bb7ebded 100644 --- a/osal/linux/os_allocator.c +++ b/osal/linux/os_allocator.c @@ -74,6 +74,28 @@ MPP_RET os_allocator_normal_free(void *ctx, MppBufferInfo *info) return MPP_OK; } +MPP_RET os_allocator_normal_import(void *ctx, MppBufferInfo *info) +{ + (void) ctx; + mpp_assert(info->ptr); + mpp_assert(info->size); + info->hnd = NULL; + info->fd = -1; + return MPP_OK; +} + +MPP_RET os_allocator_normal_release(void *ctx, MppBufferInfo *info) +{ + (void) ctx; + mpp_assert(info->ptr); + mpp_assert(info->size); + info->ptr = NULL; + info->size = 0; + info->hnd = NULL; + info->fd = -1; + return MPP_OK; +} + MPP_RET os_allocator_normal_close(void *ctx) { if (ctx) { @@ -88,8 +110,8 @@ static os_allocator allocator_normal = { os_allocator_normal_open, os_allocator_normal_alloc, os_allocator_normal_free, - NULL, - NULL, + os_allocator_normal_import, + os_allocator_normal_release, os_allocator_normal_close, }; diff --git a/osal/window/os_allocator.c b/osal/window/os_allocator.c index aa3f8669..9839e797 100644 --- a/osal/window/os_allocator.c +++ b/osal/window/os_allocator.c @@ -70,6 +70,28 @@ MPP_RET os_allocator_free(void *ctx, MppBufferInfo *info) return MPP_OK; } +MPP_RET os_allocator_import(void *ctx, MppBufferInfo *info) +{ + (void) ctx; + mpp_assert(info->ptr); + mpp_assert(info->size); + info->hnd = NULL; + info->fd = -1; + return MPP_OK; +} + +MPP_RET os_allocator_release(void *ctx, MppBufferInfo *info) +{ + (void) ctx; + mpp_assert(info->ptr); + mpp_assert(info->size); + info->ptr = NULL; + info->size = 0; + info->hnd = NULL; + info->fd = -1; + return MPP_OK; +} + MPP_RET os_allocator_close(void *ctx) { if (ctx) { @@ -84,8 +106,8 @@ static os_allocator allocator_window = { os_allocator_open, os_allocator_alloc, os_allocator_free, - NULL, - NULL, + os_allocator_import, + os_allocator_release, os_allocator_close, };