diff --git a/inc/mpp_buffer.h b/inc/mpp_buffer.h index e9f9eb25..90935b26 100644 --- a/inc/mpp_buffer.h +++ b/inc/mpp_buffer.h @@ -213,13 +213,13 @@ typedef struct MppBufferInfo_t { * imported buffer is leak or not and trace its usage inside mpp process. So we attach this kind * of buffer to default misc buffer group for management. */ -#define mpp_buffer_commit(group, info, ...) \ +#define mpp_buffer_commit(group, info) \ mpp_buffer_import_with_tag(group, info, NULL, MODULE_TAG, __FUNCTION__) -#define mpp_buffer_import(buffer, info, ...) \ +#define mpp_buffer_import(buffer, info) \ mpp_buffer_import_with_tag(NULL, info, buffer, MODULE_TAG, __FUNCTION__) -#define mpp_buffer_get(group, buffer, size, ...) \ +#define mpp_buffer_get(group, buffer, size) \ mpp_buffer_get_with_tag(group, buffer, size, MODULE_TAG, __FUNCTION__) #define mpp_buffer_put(buffer) \ @@ -228,6 +228,24 @@ typedef struct MppBufferInfo_t { #define mpp_buffer_inc_ref(buffer) \ mpp_buffer_inc_ref_with_caller(buffer, __FUNCTION__) +#define mpp_buffer_info_get(buffer, info) \ + mpp_buffer_info_get_with_caller(buffer, info, __FUNCTION__) + +#define mpp_buffer_read(buffer, offset, data, size) \ + mpp_buffer_read_with_caller(buffer, offset, data, size, __FUNCTION__) + +#define mpp_buffer_write(buffer, offset, data, size) \ + mpp_buffer_write_with_caller(buffer, offset, data, size, __FUNCTION__) + +#define mpp_buffer_get_ptr(buffer) \ + mpp_buffer_get_ptr_with_caller(buffer, __FUNCTION__) + +#define mpp_buffer_get_fd(buffer) \ + mpp_buffer_get_fd_with_caller(buffer, __FUNCTION__) + +#define mpp_buffer_get_size(buffer) \ + mpp_buffer_get_size_with_caller(buffer, __FUNCTION__) + #define mpp_buffer_group_get_internal(group, type, ...) \ mpp_buffer_group_get(group, type, MPP_BUFFER_INTERNAL, MODULE_TAG, __FUNCTION__) @@ -254,12 +272,12 @@ MPP_RET mpp_buffer_get_with_tag(MppBufferGroup group, MppBuffer *buffer, size_t MPP_RET mpp_buffer_put_with_caller(MppBuffer buffer, const char *caller); MPP_RET mpp_buffer_inc_ref_with_caller(MppBuffer buffer, const char *caller); -MPP_RET mpp_buffer_info_get(MppBuffer buffer, MppBufferInfo *info); -MPP_RET mpp_buffer_read(MppBuffer buffer, size_t offset, void *data, size_t size); -MPP_RET mpp_buffer_write(MppBuffer buffer, size_t offset, void *data, size_t size); -void *mpp_buffer_get_ptr(MppBuffer buffer); -int mpp_buffer_get_fd(MppBuffer buffer); -size_t mpp_buffer_get_size(MppBuffer buffer); +MPP_RET mpp_buffer_info_get_with_caller(MppBuffer buffer, MppBufferInfo *info, const char *caller); +MPP_RET mpp_buffer_read_with_caller(MppBuffer buffer, size_t offset, void *data, size_t size, const char *caller); +MPP_RET mpp_buffer_write_with_caller(MppBuffer buffer, size_t offset, void *data, size_t size, const char *caller); +void *mpp_buffer_get_ptr_with_caller(MppBuffer buffer, const char *caller); +int mpp_buffer_get_fd_with_caller(MppBuffer buffer, const char *caller); +size_t mpp_buffer_get_size_with_caller(MppBuffer buffer, const char *caller); MPP_RET mpp_buffer_group_get(MppBufferGroup *group, MppBufferType type, MppBufferMode mode, const char *tag, const char *caller); diff --git a/mpp/base/inc/mpp_buffer_impl.h b/mpp/base/inc/mpp_buffer_impl.h index 4ac09cfa..43e7eb44 100644 --- a/mpp/base/inc/mpp_buffer_impl.h +++ b/mpp/base/inc/mpp_buffer_impl.h @@ -114,7 +114,9 @@ extern RK_U32 mpp_buffer_debug; * if input buffer is NULL then buffer will be register to unused list * otherwise the buffer will be register to used list and set to paramter buffer * - * mpp_buffer_destroy : destroy a buffer, it must be on unused status + * mpp_buffer_mmap : The created mpp_buffer can not be accessed directly. + * It required map to access. This is an optimization + * for reducing virtual memory usage. * * mpp_buffer_get_unused : get unused buffer with size. it will first search * the unused list. if failed it will create on from @@ -134,6 +136,7 @@ extern RK_U32 mpp_buffer_debug; * mpp_buffer_destory - destroy the buffer */ MPP_RET mpp_buffer_create(const char *tag, const char *caller, MppBufferGroupImpl *group, MppBufferInfo *info, MppBufferImpl **buffer); +MPP_RET mpp_buffer_mmap(MppBufferImpl *buffer, const char* caller); MPP_RET mpp_buffer_ref_inc(MppBufferImpl *buffer, const char* caller); MPP_RET mpp_buffer_ref_dec(MppBufferImpl *buffer, const char* caller); MppBufferImpl *mpp_buffer_get_unused(MppBufferGroupImpl *p, size_t size); diff --git a/mpp/base/mpp_buffer.cpp b/mpp/base/mpp_buffer.cpp index ad25c96d..9ae6c87e 100644 --- a/mpp/base/mpp_buffer.cpp +++ b/mpp/base/mpp_buffer.cpp @@ -114,7 +114,7 @@ MPP_RET mpp_buffer_inc_ref_with_caller(MppBuffer buffer, const char *caller) return mpp_buffer_ref_inc((MppBufferImpl*)buffer, caller); } -MPP_RET mpp_buffer_read(MppBuffer buffer, size_t offset, void *data, size_t size) +MPP_RET mpp_buffer_read_with_caller(MppBuffer buffer, size_t offset, void *data, size_t size, const char *caller) { if (NULL == buffer || NULL == data) { mpp_err_f("invalid input: buffer %p data %p\n", buffer, data); @@ -125,13 +125,18 @@ MPP_RET mpp_buffer_read(MppBuffer buffer, size_t offset, void *data, size_t size return MPP_OK; MppBufferImpl *p = (MppBufferImpl*)buffer; + if (NULL == p->info.ptr) + mpp_buffer_mmap(p, caller); + void *src = p->info.ptr; mpp_assert(src != NULL); - memcpy(data, (char*)src + offset, size); + if (src) + memcpy(data, (char*)src + offset, size); + return MPP_OK; } -MPP_RET mpp_buffer_write(MppBuffer buffer, size_t offset, void *data, size_t size) +MPP_RET mpp_buffer_write_with_caller(MppBuffer buffer, size_t offset, void *data, size_t size, const char *caller) { if (NULL == buffer || NULL == data) { mpp_err_f("invalid input: buffer %p data %p\n", buffer, data); @@ -142,13 +147,18 @@ MPP_RET mpp_buffer_write(MppBuffer buffer, size_t offset, void *data, size_t siz return MPP_OK; MppBufferImpl *p = (MppBufferImpl*)buffer; + if (NULL == p->info.ptr) + mpp_buffer_mmap(p, caller); + void *dst = p->info.ptr; mpp_assert(dst != NULL); - memcpy((char*)dst + offset, data, size); + if (dst) + memcpy((char*)dst + offset, data, size); + return MPP_OK; } -void *mpp_buffer_get_ptr(MppBuffer buffer) +void *mpp_buffer_get_ptr_with_caller(MppBuffer buffer, const char *caller) { if (NULL == buffer) { mpp_err_f("invalid NULL input\n"); @@ -156,12 +166,17 @@ void *mpp_buffer_get_ptr(MppBuffer buffer) } MppBufferImpl *p = (MppBufferImpl*)buffer; - void *ptr = p->info.ptr; - mpp_assert(ptr != NULL); - return ptr; + if (NULL == p->info.ptr) + mpp_buffer_mmap(p, caller); + + mpp_assert(p->info.ptr != NULL); + if (NULL == p->info.ptr) + mpp_err("mpp_buffer_get_ptr buffer %p ret NULL caller\n", buffer, caller); + + return p->info.ptr; } -int mpp_buffer_get_fd(MppBuffer buffer) +int mpp_buffer_get_fd_with_caller(MppBuffer buffer, const char *caller) { if (NULL == buffer) { mpp_err_f("invalid NULL input\n"); @@ -173,12 +188,14 @@ int mpp_buffer_get_fd(MppBuffer buffer) #ifdef RKPLATFORM mpp_assert(fd >= 0); + if (fd < 0) + mpp_err("mpp_buffer_get_fd buffer %p fd %d caller %s\n", buffer, fd, caller); #endif return fd; } -size_t mpp_buffer_get_size(MppBuffer buffer) +size_t mpp_buffer_get_size_with_caller(MppBuffer buffer, const char *caller) { if (NULL == buffer) { mpp_err_f("invalid NULL input\n"); @@ -186,17 +203,25 @@ size_t mpp_buffer_get_size(MppBuffer buffer) } MppBufferImpl *p = (MppBufferImpl*)buffer; + if (p->info.size == 0) + mpp_err("mpp_buffer_get_size buffer %p ret zero size caller %s\n", buffer, caller); + return p->info.size; } -MPP_RET mpp_buffer_info_get(MppBuffer buffer, MppBufferInfo *info) +MPP_RET mpp_buffer_info_get_with_caller(MppBuffer buffer, MppBufferInfo *info, const char *caller) { if (NULL == buffer || NULL == info) { mpp_err_f("invalid input: buffer %p info %p\n", buffer, info); return MPP_ERR_UNKNOW; } - *info = ((MppBufferImpl*)buffer)->info; + MppBufferImpl *p = (MppBufferImpl*)buffer; + if (NULL == p->info.ptr) + mpp_buffer_mmap(p, caller); + + *info = p->info; + (void)caller; return MPP_OK; } diff --git a/mpp/base/mpp_buffer_impl.cpp b/mpp/base/mpp_buffer_impl.cpp index 18e51bfb..adc43167 100644 --- a/mpp/base/mpp_buffer_impl.cpp +++ b/mpp/base/mpp_buffer_impl.cpp @@ -38,6 +38,7 @@ typedef enum MppBufOps_e { GRP_OPS_BUTT = GRP_DESTROY, BUF_COMMIT, BUF_CREATE, + BUF_MMAP, BUF_REF_INC, BUF_REF_DEC, BUF_DESTROY, @@ -113,6 +114,7 @@ static const char *ops2str[BUF_OPS_BUTT] = { "grp destroy", "buf commit ", "buf create ", + "buf mmap ", "buf ref inc", "buf ref dec", "buf destroy", @@ -306,6 +308,28 @@ RET: return ret; } +MPP_RET mpp_buffer_mmap(MppBufferImpl *buffer, const char* caller) +{ + AutoMutex auto_lock(MppBufferService::get_lock()); + MPP_BUF_FUNCTION_ENTER(); + + MPP_RET ret = MPP_NOK; + MppBufferGroupImpl *group = SEARCH_GROUP_BY_ID(buffer->group_id); + + if (group && group->alloc_api && group->alloc_api->mmap) { + ret = group->alloc_api->mmap(group->allocator, &buffer->info); + + buffer_group_add_log(group, buffer, BUF_MMAP, caller); + } + + if (ret) + mpp_err_f("buffer %p group %p fd %d map failed caller %s\n", + buffer, group, buffer->info.fd, caller); + + MPP_BUF_FUNCTION_LEAVE(); + return ret; +} + MPP_RET mpp_buffer_ref_inc(MppBufferImpl *buffer, const char* caller) { AutoMutex auto_lock(MppBufferService::get_lock()); @@ -718,8 +742,6 @@ MppBufferGroupImpl *MppBufferService::get_group_by_id(RK_U32 id) } } - mpp_err_f("can not find group with id %d\n", id); - return NULL; } diff --git a/osal/inc/mpp_allocator.h b/osal/inc/mpp_allocator.h index 8a2a71aa..664f29ea 100644 --- a/osal/inc/mpp_allocator.h +++ b/osal/inc/mpp_allocator.h @@ -30,6 +30,7 @@ typedef struct MppAllocatorApi_t { MPP_RET (*free)(MppAllocator allocator, MppBufferInfo *data); MPP_RET (*import)(MppAllocator allocator, MppBufferInfo *data); MPP_RET (*release)(MppAllocator allocator, MppBufferInfo *data); + MPP_RET (*mmap)(MppAllocator allocator, MppBufferInfo *data); } MppAllocatorApi; #ifdef __cplusplus diff --git a/osal/mpp_allocator.cpp b/osal/mpp_allocator.cpp index 22a65762..8eed8337 100644 --- a/osal/mpp_allocator.cpp +++ b/osal/mpp_allocator.cpp @@ -107,6 +107,7 @@ static MppAllocatorApi mpp_allocator_api = { mpp_allocator_free, mpp_allocator_import, mpp_allocator_release, + NULL, }; MPP_RET mpp_allocator_get(MppAllocator *allocator, MppAllocatorApi **api, MppBufferType type)