[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
This commit is contained in:
ChenHengming
2016-06-07 09:36:27 +00:00
parent f3822e7828
commit 218354e088
4 changed files with 118 additions and 41 deletions

View File

@@ -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")

View File

@@ -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,34 +265,45 @@ 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;
}
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;
@@ -307,8 +327,10 @@ MPP_RET mpp_buffer_ref_dec(MppBufferImpl *buffer)
}
}
}
}
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;
}

View File

@@ -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,
};

View File

@@ -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,
};