[mpp_buffer]: change buffer group mode to internal/external

git-svn-id: https://10.10.10.66:8443/svn/MediaProcessPlatform/trunk/mpp@341 6e48237b-75ef-9749-8fc9-41990f28c85a
This commit is contained in:
ChenHengming
2015-10-09 23:21:18 +00:00
parent a9209858fc
commit ea3f8b6f0d
5 changed files with 45 additions and 48 deletions

View File

@@ -134,8 +134,8 @@ typedef void* MppBufferGroup;
* limit mode is recommanded to work with commit flow, working with normal mode is not. * limit mode is recommanded to work with commit flow, working with normal mode is not.
*/ */
typedef enum { typedef enum {
MPP_BUFFER_MODE_NORMAL, MPP_BUFFER_INTERNAL,
MPP_BUFFER_MODE_LIMIT, MPP_BUFFER_EXTERNAL,
MPP_BUFFER_MODE_BUTT, MPP_BUFFER_MODE_BUTT,
} MppBufferMode; } MppBufferMode;
@@ -185,10 +185,10 @@ typedef struct MppBufferInfo_t {
mpp_buffer_get_with_tag(MODULE_TAG, ## __VA_ARGS__) mpp_buffer_get_with_tag(MODULE_TAG, ## __VA_ARGS__)
#define mpp_buffer_group_normal_get(...) \ #define mpp_buffer_group_normal_get(...) \
mpp_buffer_group_get(MODULE_TAG, MPP_BUFFER_MODE_NORMAL, ## __VA_ARGS__) mpp_buffer_group_get(MODULE_TAG, MPP_BUFFER_INTERNAL, ## __VA_ARGS__)
#define mpp_buffer_group_limited_get(...) \ #define mpp_buffer_group_limited_get(...) \
mpp_buffer_group_get(MODULE_TAG, MPP_BUFFER_MODE_LIMIT, ## __VA_ARGS__) mpp_buffer_group_get(MODULE_TAG, MPP_BUFFER_EXTERNAL, ## __VA_ARGS__)
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {

View File

@@ -67,10 +67,10 @@ Mpp::Mpp(MppCtxType type, MppCodingType coding)
mpp_buffer_group_normal_get(&mInternalGroup, MPP_BUFFER_TYPE_ION); mpp_buffer_group_normal_get(&mInternalGroup, MPP_BUFFER_TYPE_ION);
mpp_buffer_group_limited_get(&mPacketGroup, MPP_BUFFER_TYPE_ION); mpp_buffer_group_normal_get(&mPacketGroup, MPP_BUFFER_TYPE_ION);
mpp_buffer_group_limit_config(mPacketGroup, MPP_TEST_PACKET_SIZE, 4); mpp_buffer_group_limit_config(mPacketGroup, MPP_TEST_PACKET_SIZE, 4);
mpp_buffer_group_limited_get(&mFrameGroup, MPP_BUFFER_TYPE_ION); mpp_buffer_group_normal_get(&mFrameGroup, MPP_BUFFER_TYPE_ION);
mpp_buffer_group_limit_config(mFrameGroup, MPP_TEST_FRAME_SIZE, 4); mpp_buffer_group_limit_config(mFrameGroup, MPP_TEST_FRAME_SIZE, 4);
} break; } break;
case MPP_CTX_ENC : { case MPP_CTX_ENC : {

View File

@@ -31,9 +31,10 @@ MPP_RET mpp_buffer_commit(MppBufferGroup group, MppBufferInfo *info)
} }
MppBufferGroupImpl *p = (MppBufferGroupImpl *)group; MppBufferGroupImpl *p = (MppBufferGroupImpl *)group;
if (p->type != info->type || p->type >= MPP_BUFFER_TYPE_BUTT) { if (p->type != info->type || p->type >= MPP_BUFFER_TYPE_BUTT ||
mpp_err("mpp_buffer_commit invalid type found group %d info %d\n", p->mode != MPP_BUFFER_EXTERNAL) {
p->type, info->type); mpp_err("mpp_buffer_commit invalid type found group %d info %d group mode %d\n",
p->type, info->type, p->mode);
return MPP_ERR_UNKNOW; return MPP_ERR_UNKNOW;
} }
@@ -48,12 +49,12 @@ MPP_RET mpp_buffer_get_with_tag(const char *tag, MppBufferGroup group, MppBuffer
return MPP_ERR_UNKNOW; return MPP_ERR_UNKNOW;
} }
MppBufferGroupImpl *tmp = (MppBufferGroupImpl *)group; MppBufferGroupImpl *p = (MppBufferGroupImpl *)group;
// try unused buffer first // try unused buffer first
MppBufferImpl *buf = mpp_buffer_get_unused(tmp, size); MppBufferImpl *buf = mpp_buffer_get_unused(p, size);
if (NULL == buf) { if (NULL == buf && MPP_BUFFER_INTERNAL == p->mode) {
MppBufferInfo info = { MppBufferInfo info = {
tmp->type, p->type,
size, size,
NULL, NULL,
NULL, NULL,
@@ -61,8 +62,8 @@ MPP_RET mpp_buffer_get_with_tag(const char *tag, MppBufferGroup group, MppBuffer
NULL, NULL,
}; };
// if failed try init a new buffer // if failed try init a new buffer
mpp_buffer_create(tag, tmp->group_id, &info); mpp_buffer_create(tag, p->group_id, &info);
buf = mpp_buffer_get_unused(tmp, size); buf = mpp_buffer_get_unused(p, size);
} }
*buffer = buf; *buffer = buf;
return (buf) ? (MPP_OK) : (MPP_NOK); return (buf) ? (MPP_OK) : (MPP_NOK);
@@ -203,7 +204,7 @@ MPP_RET mpp_buffer_group_limit_config(MppBufferGroup group, size_t size, RK_S32
} }
MppBufferGroupImpl *p = (MppBufferGroupImpl *)group; MppBufferGroupImpl *p = (MppBufferGroupImpl *)group;
mpp_assert(p->mode == MPP_BUFFER_MODE_LIMIT); mpp_assert(p->mode == MPP_BUFFER_INTERNAL);
p->limit_size = size; p->limit_size = size;
p->limit_count = count; p->limit_count = count;
return MPP_OK; return MPP_OK;

View File

@@ -25,6 +25,8 @@
#define SEARCH_GROUP_NORMAL(id) search_group_by_id_no_lock(&service.mListGroup, id) #define SEARCH_GROUP_NORMAL(id) search_group_by_id_no_lock(&service.mListGroup, id)
#define SEARCH_GROUP_ORPHAN(id) search_group_by_id_no_lock(&service.mListOrphan, id) #define SEARCH_GROUP_ORPHAN(id) search_group_by_id_no_lock(&service.mListOrphan, id)
typedef MPP_RET (*BufferOp)(MppAllocator allocator, MppBufferInfo *data);
class MppBufferService class MppBufferService
{ {
public: public:
@@ -71,17 +73,16 @@ MPP_RET deinit_buffer_no_lock(MppBufferImpl *buffer)
list_del_init(&buffer->list_status); list_del_init(&buffer->list_status);
MppBufferGroupImpl *group = SEARCH_GROUP_NORMAL(buffer->group_id); MppBufferGroupImpl *group = SEARCH_GROUP_NORMAL(buffer->group_id);
if (group) { if (group) {
if (buffer->internal) BufferOp func = (group->mode == MPP_BUFFER_INTERNAL) ?
group->alloc_api->free(group->allocator, &buffer->info); (group->alloc_api->free) :
else (group->alloc_api->release);
group->alloc_api->release(group->allocator, &buffer->info); func(group->allocator, &buffer->info);
group->usage -= buffer->info.size; group->usage -= buffer->info.size;
group->count--; group->count--;
} else { } else {
group = SEARCH_GROUP_ORPHAN(buffer->group_id); group = SEARCH_GROUP_ORPHAN(buffer->group_id);
mpp_assert(group); mpp_assert(group);
mpp_assert(buffer->mode == MPP_BUFFER_MODE_NORMAL); mpp_assert(buffer->mode == MPP_BUFFER_INTERNAL);
group->alloc_api->free(group->allocator, &buffer->info); group->alloc_api->free(group->allocator, &buffer->info);
group->usage -= buffer->info.size; group->usage -= buffer->info.size;
group->count--; group->count--;
@@ -120,7 +121,7 @@ static MPP_RET inc_buffer_ref_no_lock(MppBufferImpl *buffer)
group->count_used++; group->count_used++;
group->count_unused--; group->count_unused--;
} else { } else {
mpp_err("mpp_buffer_ref_inc unused buffer without group\n"); mpp_err_f("unused buffer without group\n");
ret = MPP_NOK; ret = MPP_NOK;
} }
} }
@@ -132,7 +133,7 @@ MPP_RET mpp_buffer_create(const char *tag, RK_U32 group_id, MppBufferInfo *info)
{ {
MppBufferImpl *p = mpp_calloc(MppBufferImpl, 1); MppBufferImpl *p = mpp_calloc(MppBufferImpl, 1);
if (NULL == p) { if (NULL == p) {
mpp_err("mpp_buffer_create failed to allocate context\n"); mpp_err_f("failed to allocate context\n");
return MPP_ERR_MALLOC; return MPP_ERR_MALLOC;
} }
@@ -140,21 +141,14 @@ MPP_RET mpp_buffer_create(const char *tag, RK_U32 group_id, MppBufferInfo *info)
MppBufferGroupImpl *group = SEARCH_GROUP_NORMAL(group_id); MppBufferGroupImpl *group = SEARCH_GROUP_NORMAL(group_id);
if (group) { if (group) {
if (info->fd == -1) { BufferOp func = (group->mode == MPP_BUFFER_INTERNAL) ?
MPP_RET ret = group->alloc_api->alloc(group->allocator, info); (group->alloc_api->alloc) :
if (MPP_OK != ret) { (group->alloc_api->import);
mpp_err("mpp_buffer_create failed to create buffer with size %d\n", info->size); MPP_RET ret = func(group->allocator, info);
mpp_free(p); if (MPP_OK != ret) {
return MPP_ERR_MALLOC; mpp_err_f("failed to create buffer with size %d\n", info->size);
} mpp_free(p);
p->internal = 1; return MPP_ERR_MALLOC;
} else {
MPP_RET ret = group->alloc_api->import(group->allocator, info);
if (MPP_OK != ret) {
mpp_err("mpp_buffer_create failed to create buffer with size %d\n", info->size);
mpp_free(p);
return MPP_ERR_MALLOC;
}
} }
p->info = *info; p->info = *info;
@@ -171,7 +165,7 @@ MPP_RET mpp_buffer_create(const char *tag, RK_U32 group_id, MppBufferInfo *info)
group->count++; group->count++;
group->count_unused++; group->count_unused++;
} else { } else {
mpp_err("mpp_buffer_create can not create buffer without group\n"); mpp_err_f("can not create buffer without group\n");
mpp_free(p); mpp_free(p);
p = NULL; p = NULL;
} }
@@ -198,7 +192,7 @@ MPP_RET mpp_buffer_ref_inc(MppBufferImpl *buffer)
MPP_RET mpp_buffer_ref_dec(MppBufferImpl *buffer) MPP_RET mpp_buffer_ref_dec(MppBufferImpl *buffer)
{ {
if (buffer->ref_count <= 0) { if (buffer->ref_count <= 0) {
mpp_err("mpp_buffer_ref_dec found non-positive ref_count %d\n", buffer->ref_count); mpp_err_f("found non-positive ref_count %d\n", buffer->ref_count);
return MPP_NOK; return MPP_NOK;
} }
@@ -244,7 +238,7 @@ MPP_RET mpp_buffer_group_init(MppBufferGroupImpl **group, const char *tag, MppBu
{ {
MppBufferGroupImpl *p = mpp_calloc(MppBufferGroupImpl, 1); MppBufferGroupImpl *p = mpp_calloc(MppBufferGroupImpl, 1);
if (NULL == p) { if (NULL == p) {
mpp_err("mpp_buffer_group_get failed to allocate context\n"); mpp_err_f("failed to allocate context\n");
*group = NULL; *group = NULL;
return MPP_ERR_MALLOC; return MPP_ERR_MALLOC;
} }
@@ -282,7 +276,7 @@ MPP_RET mpp_buffer_group_init(MppBufferGroupImpl **group, const char *tag, MppBu
MPP_RET mpp_buffer_group_deinit(MppBufferGroupImpl *p) MPP_RET mpp_buffer_group_deinit(MppBufferGroupImpl *p)
{ {
if (NULL == p) { if (NULL == p) {
mpp_err("mpp_buffer_group_deinit found NULL pointer\n"); mpp_err_f("found NULL pointer\n");
return MPP_ERR_NULL_PTR; return MPP_ERR_NULL_PTR;
} }
@@ -302,7 +296,7 @@ MPP_RET mpp_buffer_group_deinit(MppBufferGroupImpl *p)
// otherwise move the group to list_orphan and wait for buffer release // otherwise move the group to list_orphan and wait for buffer release
list_del_init(&p->list_group); list_del_init(&p->list_group);
list_add_tail(&p->list_group, &service.mListOrphan); list_add_tail(&p->list_group, &service.mListOrphan);
mpp_err("mpp_group %p tag %s deinit with %d bytes buffer not released\n", p, p->tag, p->usage); mpp_err_f("mpp_group %p tag %s deinit with %d bytes buffer not released\n", p, p->tag, p->usage);
// if any buffer with mode MPP_BUFFER_MODE_COMMIT found it should be error // if any buffer with mode MPP_BUFFER_MODE_COMMIT found it should be error
MppBufferImpl *pos, *n; MppBufferImpl *pos, *n;
list_for_each_entry_safe(pos, n, &p->list_used, MppBufferImpl, list_status) { list_for_each_entry_safe(pos, n, &p->list_used, MppBufferImpl, list_status) {

View File

@@ -49,8 +49,6 @@ int main()
goto MPP_BUFFER_failed; goto MPP_BUFFER_failed;
} }
mpp_buffer_group_limit_config(group, size, count);
mpp_log("mpp_buffer_test commit mode start\n"); mpp_log("mpp_buffer_test commit mode start\n");
commit.type = MPP_BUFFER_TYPE_NORMAL; commit.type = MPP_BUFFER_TYPE_NORMAL;
@@ -110,7 +108,11 @@ int main()
goto MPP_BUFFER_failed; goto MPP_BUFFER_failed;
} }
for (i = 0; i < MPP_BUFFER_TEST_NORMAL_COUNT; i++) { count = MPP_BUFFER_TEST_NORMAL_COUNT;
mpp_buffer_group_limit_config(group, size, count);
for (i = 0; i < count; i++) {
ret = mpp_buffer_get(group, &normal_buffer[i], (i + 1) * SZ_1K); ret = mpp_buffer_get(group, &normal_buffer[i], (i + 1) * SZ_1K);
if (MPP_OK != ret) { if (MPP_OK != ret) {
mpp_err("mpp_buffer_test mpp_buffer_get mode normal failed\n"); mpp_err("mpp_buffer_test mpp_buffer_get mode normal failed\n");
@@ -118,7 +120,7 @@ int main()
} }
} }
for (i = 0; i < MPP_BUFFER_TEST_NORMAL_COUNT; i++) { for (i = 0; i < count; i++) {
if (normal_buffer[i]) { if (normal_buffer[i]) {
ret = mpp_buffer_put(normal_buffer[i]); ret = mpp_buffer_put(normal_buffer[i]);
if (MPP_OK != ret) { if (MPP_OK != ret) {