[allocator]: Transform allocator normal to std

1. Use allocator std to replace default normal allocator on all OS.
2. Use wrapper to simplify mpp_allocator.

Change-Id: I13314a9eec3c5b39bc5ad8ddb3033ac2da79ba8f
Signed-off-by: Herman Chen <herman.chen@rock-chips.com>
This commit is contained in:
Herman Chen
2016-12-15 17:10:44 +08:00
parent 249f83f35b
commit e2f0da0a89
10 changed files with 223 additions and 372 deletions

View File

@@ -14,145 +14,40 @@
* limitations under the License.
*/
#include <stdio.h>
#include "os_mem.h"
#include "os_allocator.h"
#include "mpp_log.h"
#include "allocator_std.h"
#include "allocator_drm.h"
#include "allocator_ion.h"
#include "mpp_mem.h"
#include "mpp_log.h"
/*
* Linux only support MPP_BUFFER_TYPE_NORMAL so far
* we can support MPP_BUFFER_TYPE_V4L2 later
*/
typedef struct {
size_t alignment;
RK_S32 fd_count;
} allocator_ctx;
MPP_RET os_allocator_normal_open(void **ctx, size_t alignment)
{
MPP_RET ret = MPP_OK;
allocator_ctx *p = NULL;
if (NULL == ctx) {
mpp_err("os_allocator_open Linux do not accept NULL input\n");
return MPP_ERR_NULL_PTR;
}
p = mpp_malloc(allocator_ctx, 1);
if (NULL == p) {
mpp_err("os_allocator_open Linux failed to allocate context\n");
ret = MPP_ERR_MALLOC;
} else
p->alignment = alignment;
p->fd_count = 0;
*ctx = p;
return ret;
}
MPP_RET os_allocator_normal_alloc(void *ctx, MppBufferInfo *info)
{
allocator_ctx *p = NULL;
if (NULL == ctx) {
mpp_err("os_allocator_alloc Linux found NULL context input\n");
return MPP_ERR_NULL_PTR;
}
p = (allocator_ctx *)ctx;
info->fd = p->fd_count++;
return os_malloc(&info->ptr, p->alignment, info->size);
}
MPP_RET os_allocator_normal_free(void *ctx, MppBufferInfo *info)
{
(void) ctx;
if (info->ptr)
os_free(info->ptr);
return MPP_OK;
}
MPP_RET os_allocator_normal_import(void *ctx, MppBufferInfo *info)
{
allocator_ctx *p = (allocator_ctx *)ctx;
mpp_assert(ctx);
mpp_assert(info->ptr);
mpp_assert(info->size);
info->hnd = NULL;
info->fd = p->fd_count++;
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) {
mpp_free(ctx);
return MPP_OK;
}
mpp_err("os_allocator_close Linux found NULL context input\n");
return MPP_NOK;
}
static os_allocator allocator_normal = {
os_allocator_normal_open,
os_allocator_normal_alloc,
os_allocator_normal_free,
os_allocator_normal_import,
os_allocator_normal_release,
os_allocator_normal_close,
};
static os_allocator allocator_v4l2 = {
os_allocator_normal_open,
os_allocator_normal_alloc,
os_allocator_normal_free,
os_allocator_normal_import,
os_allocator_normal_release,
os_allocator_normal_close,
};
MPP_RET os_allocator_get(os_allocator *api, MppBufferType type)
{
MPP_RET ret = MPP_OK;
switch (type) {
case MPP_BUFFER_TYPE_NORMAL : {
*api = allocator_normal;
*api = allocator_std;
} break;
case MPP_BUFFER_TYPE_ION : {
#ifdef RKPLATFORM
*api = allocator_ion;
#else
*api = allocator_normal;
*api = allocator_std;
#endif
} break;
case MPP_BUFFER_TYPE_V4L2 : {
mpp_err("os_allocator_get Linux MPP_BUFFER_TYPE_V4L2 do not implement yet\n");
*api = allocator_v4l2;
*api = allocator_std;
} break;
case MPP_BUFFER_TYPE_DRM : {
#ifdef HAVE_DRM
*api = allocator_drm;
#else
*api = allocator_normal;
*api = allocator_std;
#endif
} break;
default : {