diff --git a/inc/mpp_buffer.h b/inc/mpp_buffer.h index f1d6335c..f7d89058 100644 --- a/inc/mpp_buffer.h +++ b/inc/mpp_buffer.h @@ -251,6 +251,12 @@ typedef struct MppBufferInfo_t { #define mpp_buffer_set_index(buffer, index) \ mpp_buffer_set_index_with_caller(buffer, index, __FUNCTION__) +#define mpp_buffer_get_offset(buffer) \ + mpp_buffer_get_offset_with_caller(buffer, __FUNCTION__) + +#define mpp_buffer_set_offset(buffer, offset) \ + mpp_buffer_set_offset_with_caller(buffer, offset, __FUNCTION__) + #define mpp_buffer_group_get_internal(group, type, ...) \ mpp_buffer_group_get(group, type, MPP_BUFFER_INTERNAL, MODULE_TAG, __FUNCTION__) @@ -285,6 +291,8 @@ 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); int mpp_buffer_get_index_with_caller(MppBuffer buffer, const char *caller); MPP_RET mpp_buffer_set_index_with_caller(MppBuffer buffer, int index, const char *caller); +size_t mpp_buffer_get_offset_with_caller(MppBuffer buffer, const char *caller); +MPP_RET mpp_buffer_set_offset_with_caller(MppBuffer buffer, size_t offset, 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 1c6ff496..76b6fb41 100644 --- a/mpp/base/inc/mpp_buffer_impl.h +++ b/mpp/base/inc/mpp_buffer_impl.h @@ -49,6 +49,7 @@ struct MppBufferImpl_t { MppBufferMode mode; MppBufferInfo info; + size_t offset; /* used for buf on group reset mode set disard value to 1 when frame refcount no zero , @@ -143,6 +144,7 @@ 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); +RK_U32 mpp_buffer_to_addr(MppBuffer buffer, size_t offset); MPP_RET mpp_buffer_group_init(MppBufferGroupImpl **group, const char *tag, const char *caller, MppBufferMode mode, MppBufferType type); MPP_RET mpp_buffer_group_deinit(MppBufferGroupImpl *p); diff --git a/mpp/base/mpp_buffer.cpp b/mpp/base/mpp_buffer.cpp index 521a701d..5076c0c7 100644 --- a/mpp/base/mpp_buffer.cpp +++ b/mpp/base/mpp_buffer.cpp @@ -235,6 +235,30 @@ MPP_RET mpp_buffer_set_index_with_caller(MppBuffer buffer, int index, return MPP_OK; } +size_t mpp_buffer_get_offset_with_caller(MppBuffer buffer, const char *caller) +{ + if (NULL == buffer) { + mpp_err_f("invalid NULL input\n"); + return -1; + } + + MppBufferImpl *p = (MppBufferImpl*)buffer; + (void)caller; + return p->offset; +} + +MPP_RET mpp_buffer_set_offset_with_caller(MppBuffer buffer, size_t offset, const char *caller) +{ + if (NULL == buffer) { + mpp_err_f("invalid NULL input\n"); + return MPP_ERR_UNKNOW; + } + + MppBufferImpl *p = (MppBufferImpl*)buffer; + p->offset = offset; + (void)caller; + return MPP_OK; +} MPP_RET mpp_buffer_info_get_with_caller(MppBuffer buffer, MppBufferInfo *info, const char *caller) { diff --git a/mpp/base/mpp_buffer_impl.cpp b/mpp/base/mpp_buffer_impl.cpp index 7edee8db..39d8c8b0 100644 --- a/mpp/base/mpp_buffer_impl.cpp +++ b/mpp/base/mpp_buffer_impl.cpp @@ -446,6 +446,30 @@ MppBufferImpl *mpp_buffer_get_unused(MppBufferGroupImpl *p, size_t size) return buffer; } +RK_U32 mpp_buffer_to_addr(MppBuffer buffer, size_t offset) +{ + MppBufferImpl *impl = (MppBufferImpl *)buffer; + + if (NULL == impl) { + mpp_err_f("NULL buffer convert to zero address\n"); + return 0; + } + + if (impl->info.fd >= (1 << 10)) { + mpp_err_f("buffer fd %d is too large\n"); + return 0; + } + + if (impl->offset + offset >= SZ_4M) { + mpp_err_f("offset %d + %d is larger than 4M use extra info to send offset\n"); + return 0; + } + + RK_U32 addr = impl->info.fd + ((impl->offset + offset) << 10); + + return addr; +} + MPP_RET mpp_buffer_group_init(MppBufferGroupImpl **group, const char *tag, const char *caller, MppBufferMode mode, MppBufferType type) {