mirror of
https://github.com/nyanmisaka/mpp.git
synced 2025-10-06 01:26:49 +08:00
[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:
@@ -134,8 +134,8 @@ typedef void* MppBufferGroup;
|
||||
* limit mode is recommanded to work with commit flow, working with normal mode is not.
|
||||
*/
|
||||
typedef enum {
|
||||
MPP_BUFFER_MODE_NORMAL,
|
||||
MPP_BUFFER_MODE_LIMIT,
|
||||
MPP_BUFFER_INTERNAL,
|
||||
MPP_BUFFER_EXTERNAL,
|
||||
MPP_BUFFER_MODE_BUTT,
|
||||
} MppBufferMode;
|
||||
|
||||
@@ -185,10 +185,10 @@ typedef struct MppBufferInfo_t {
|
||||
mpp_buffer_get_with_tag(MODULE_TAG, ## __VA_ARGS__)
|
||||
|
||||
#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(...) \
|
||||
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
|
||||
extern "C" {
|
||||
|
@@ -67,10 +67,10 @@ Mpp::Mpp(MppCtxType type, MppCodingType coding)
|
||||
|
||||
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_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);
|
||||
} break;
|
||||
case MPP_CTX_ENC : {
|
||||
|
@@ -31,9 +31,10 @@ MPP_RET mpp_buffer_commit(MppBufferGroup group, MppBufferInfo *info)
|
||||
}
|
||||
|
||||
MppBufferGroupImpl *p = (MppBufferGroupImpl *)group;
|
||||
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->type, info->type);
|
||||
if (p->type != info->type || p->type >= MPP_BUFFER_TYPE_BUTT ||
|
||||
p->mode != MPP_BUFFER_EXTERNAL) {
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -48,12 +49,12 @@ MPP_RET mpp_buffer_get_with_tag(const char *tag, MppBufferGroup group, MppBuffer
|
||||
return MPP_ERR_UNKNOW;
|
||||
}
|
||||
|
||||
MppBufferGroupImpl *tmp = (MppBufferGroupImpl *)group;
|
||||
MppBufferGroupImpl *p = (MppBufferGroupImpl *)group;
|
||||
// try unused buffer first
|
||||
MppBufferImpl *buf = mpp_buffer_get_unused(tmp, size);
|
||||
if (NULL == buf) {
|
||||
MppBufferImpl *buf = mpp_buffer_get_unused(p, size);
|
||||
if (NULL == buf && MPP_BUFFER_INTERNAL == p->mode) {
|
||||
MppBufferInfo info = {
|
||||
tmp->type,
|
||||
p->type,
|
||||
size,
|
||||
NULL,
|
||||
NULL,
|
||||
@@ -61,8 +62,8 @@ MPP_RET mpp_buffer_get_with_tag(const char *tag, MppBufferGroup group, MppBuffer
|
||||
NULL,
|
||||
};
|
||||
// if failed try init a new buffer
|
||||
mpp_buffer_create(tag, tmp->group_id, &info);
|
||||
buf = mpp_buffer_get_unused(tmp, size);
|
||||
mpp_buffer_create(tag, p->group_id, &info);
|
||||
buf = mpp_buffer_get_unused(p, size);
|
||||
}
|
||||
*buffer = buf;
|
||||
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;
|
||||
mpp_assert(p->mode == MPP_BUFFER_MODE_LIMIT);
|
||||
mpp_assert(p->mode == MPP_BUFFER_INTERNAL);
|
||||
p->limit_size = size;
|
||||
p->limit_count = count;
|
||||
return MPP_OK;
|
||||
|
@@ -25,6 +25,8 @@
|
||||
#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)
|
||||
|
||||
typedef MPP_RET (*BufferOp)(MppAllocator allocator, MppBufferInfo *data);
|
||||
|
||||
class MppBufferService
|
||||
{
|
||||
public:
|
||||
@@ -71,17 +73,16 @@ MPP_RET deinit_buffer_no_lock(MppBufferImpl *buffer)
|
||||
list_del_init(&buffer->list_status);
|
||||
MppBufferGroupImpl *group = SEARCH_GROUP_NORMAL(buffer->group_id);
|
||||
if (group) {
|
||||
if (buffer->internal)
|
||||
group->alloc_api->free(group->allocator, &buffer->info);
|
||||
else
|
||||
group->alloc_api->release(group->allocator, &buffer->info);
|
||||
|
||||
BufferOp func = (group->mode == MPP_BUFFER_INTERNAL) ?
|
||||
(group->alloc_api->free) :
|
||||
(group->alloc_api->release);
|
||||
func(group->allocator, &buffer->info);
|
||||
group->usage -= buffer->info.size;
|
||||
group->count--;
|
||||
} else {
|
||||
group = SEARCH_GROUP_ORPHAN(buffer->group_id);
|
||||
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->usage -= buffer->info.size;
|
||||
group->count--;
|
||||
@@ -120,7 +121,7 @@ static MPP_RET inc_buffer_ref_no_lock(MppBufferImpl *buffer)
|
||||
group->count_used++;
|
||||
group->count_unused--;
|
||||
} else {
|
||||
mpp_err("mpp_buffer_ref_inc unused buffer without group\n");
|
||||
mpp_err_f("unused buffer without group\n");
|
||||
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);
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -140,22 +141,15 @@ MPP_RET mpp_buffer_create(const char *tag, RK_U32 group_id, MppBufferInfo *info)
|
||||
|
||||
MppBufferGroupImpl *group = SEARCH_GROUP_NORMAL(group_id);
|
||||
if (group) {
|
||||
if (info->fd == -1) {
|
||||
MPP_RET ret = group->alloc_api->alloc(group->allocator, info);
|
||||
BufferOp func = (group->mode == MPP_BUFFER_INTERNAL) ?
|
||||
(group->alloc_api->alloc) :
|
||||
(group->alloc_api->import);
|
||||
MPP_RET ret = func(group->allocator, info);
|
||||
if (MPP_OK != ret) {
|
||||
mpp_err("mpp_buffer_create failed to create buffer with size %d\n", info->size);
|
||||
mpp_err_f("failed to create buffer with size %d\n", info->size);
|
||||
mpp_free(p);
|
||||
return MPP_ERR_MALLOC;
|
||||
}
|
||||
p->internal = 1;
|
||||
} 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->mode = group->mode;
|
||||
@@ -171,7 +165,7 @@ MPP_RET mpp_buffer_create(const char *tag, RK_U32 group_id, MppBufferInfo *info)
|
||||
group->count++;
|
||||
group->count_unused++;
|
||||
} 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);
|
||||
p = NULL;
|
||||
}
|
||||
@@ -198,7 +192,7 @@ MPP_RET mpp_buffer_ref_inc(MppBufferImpl *buffer)
|
||||
MPP_RET mpp_buffer_ref_dec(MppBufferImpl *buffer)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -244,7 +238,7 @@ MPP_RET mpp_buffer_group_init(MppBufferGroupImpl **group, const char *tag, MppBu
|
||||
{
|
||||
MppBufferGroupImpl *p = mpp_calloc(MppBufferGroupImpl, 1);
|
||||
if (NULL == p) {
|
||||
mpp_err("mpp_buffer_group_get failed to allocate context\n");
|
||||
mpp_err_f("failed to allocate context\n");
|
||||
*group = NULL;
|
||||
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)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -302,7 +296,7 @@ MPP_RET mpp_buffer_group_deinit(MppBufferGroupImpl *p)
|
||||
// otherwise move the group to list_orphan and wait for buffer release
|
||||
list_del_init(&p->list_group);
|
||||
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
|
||||
MppBufferImpl *pos, *n;
|
||||
list_for_each_entry_safe(pos, n, &p->list_used, MppBufferImpl, list_status) {
|
||||
|
@@ -49,8 +49,6 @@ int main()
|
||||
goto MPP_BUFFER_failed;
|
||||
}
|
||||
|
||||
mpp_buffer_group_limit_config(group, size, count);
|
||||
|
||||
mpp_log("mpp_buffer_test commit mode start\n");
|
||||
|
||||
commit.type = MPP_BUFFER_TYPE_NORMAL;
|
||||
@@ -110,7 +108,11 @@ int main()
|
||||
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);
|
||||
if (MPP_OK != ret) {
|
||||
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]) {
|
||||
ret = mpp_buffer_put(normal_buffer[i]);
|
||||
if (MPP_OK != ret) {
|
||||
|
Reference in New Issue
Block a user