mirror of
https://github.com/nyanmisaka/mpp.git
synced 2025-12-26 11:17:44 +01:00
feat[kmpp_obj]: Refactor kmpp_obj helper
1. Integrate simple element and struct element to one macro. 2. Resolve different update flag mode. 3. Support hierarchy definition for future config file registration. Signed-off-by: Herman Chen <herman.chen@rock-chips.com> Change-Id: I691a99aafec3f4e9d4e883e172d2b82ace44e379
This commit is contained in:
parent
21095a1bb9
commit
f662bfc1c1
6 changed files with 536 additions and 352 deletions
|
|
@ -8,31 +8,29 @@
|
|||
|
||||
#include "mpp_frame.h"
|
||||
|
||||
#define KMPP_FRAME_ENTRY_TABLE(ENTRY, prefix) \
|
||||
ENTRY(prefix, u32, rk_u32, width) \
|
||||
ENTRY(prefix, u32, rk_u32, height) \
|
||||
ENTRY(prefix, u32, rk_u32, hor_stride) \
|
||||
ENTRY(prefix, u32, rk_u32, ver_stride) \
|
||||
ENTRY(prefix, u32, rk_u32, hor_stride_pixel) \
|
||||
ENTRY(prefix, u32, rk_u32, offset_x) \
|
||||
ENTRY(prefix, u32, rk_u32, offset_y) \
|
||||
ENTRY(prefix, u32, rk_u32, poc) \
|
||||
ENTRY(prefix, s64, rk_s64, pts) \
|
||||
ENTRY(prefix, s64, rk_s64, dts) \
|
||||
ENTRY(prefix, u32, rk_u32, eos) \
|
||||
ENTRY(prefix, u32, rk_u32, color_range) \
|
||||
ENTRY(prefix, u32, rk_u32, color_primaries) \
|
||||
ENTRY(prefix, u32, rk_u32, color_trc) \
|
||||
ENTRY(prefix, u32, rk_u32, colorspace) \
|
||||
ENTRY(prefix, u32, rk_u32, chroma_location) \
|
||||
ENTRY(prefix, u32, rk_u32, fmt) \
|
||||
ENTRY(prefix, u32, rk_u32, buf_size) \
|
||||
ENTRY(prefix, u32, rk_u32, is_gray)
|
||||
|
||||
#define KMPP_FRAME_STRUCT_TABLE(ENTRY, prefix) \
|
||||
ENTRY(prefix, shm, KmppShmPtr, meta) \
|
||||
ENTRY(prefix, shm, KmppShmPtr, buffer) \
|
||||
ENTRY(prefix, st, MppFrameRational, sar)
|
||||
#define KMPP_FRAME_ENTRY_TABLE(prefix, ENTRY, STRCT, EHOOK, SHOOK, ALIAS) \
|
||||
ENTRY(prefix, u32, rk_u32, width, ELEM_FLAG_NONE, width) \
|
||||
ENTRY(prefix, u32, rk_u32, height, ELEM_FLAG_NONE, height) \
|
||||
ENTRY(prefix, u32, rk_u32, hor_stride, ELEM_FLAG_NONE, hor_stride) \
|
||||
ENTRY(prefix, u32, rk_u32, ver_stride, ELEM_FLAG_NONE, ver_stride) \
|
||||
ENTRY(prefix, u32, rk_u32, hor_stride_pixel, ELEM_FLAG_NONE, hor_stride_pixel) \
|
||||
ENTRY(prefix, u32, rk_u32, offset_x, ELEM_FLAG_NONE, offset_x) \
|
||||
ENTRY(prefix, u32, rk_u32, offset_y, ELEM_FLAG_NONE, offset_y) \
|
||||
ENTRY(prefix, u32, rk_u32, poc, ELEM_FLAG_NONE, poc) \
|
||||
ENTRY(prefix, s64, rk_s64, pts, ELEM_FLAG_NONE, pts) \
|
||||
ENTRY(prefix, s64, rk_s64, dts, ELEM_FLAG_NONE, dts) \
|
||||
ENTRY(prefix, u32, rk_u32, eos, ELEM_FLAG_NONE, eos) \
|
||||
ENTRY(prefix, u32, rk_u32, color_range, ELEM_FLAG_NONE, color_range) \
|
||||
ENTRY(prefix, u32, rk_u32, color_primaries, ELEM_FLAG_NONE, color_primaries) \
|
||||
ENTRY(prefix, u32, rk_u32, color_trc, ELEM_FLAG_NONE, color_trc) \
|
||||
ENTRY(prefix, u32, rk_u32, colorspace, ELEM_FLAG_NONE, colorspace) \
|
||||
ENTRY(prefix, u32, rk_u32, chroma_location, ELEM_FLAG_NONE, chroma_location) \
|
||||
ENTRY(prefix, u32, rk_u32, fmt, ELEM_FLAG_NONE, fmt) \
|
||||
ENTRY(prefix, u32, rk_u32, buf_size, ELEM_FLAG_NONE, buf_size) \
|
||||
ENTRY(prefix, u32, rk_u32, is_gray, ELEM_FLAG_NONE, is_gray) \
|
||||
STRCT(prefix, shm, KmppShmPtr, meta, ELEM_FLAG_NONE, meta) \
|
||||
STRCT(prefix, shm, KmppShmPtr, buffer, ELEM_FLAG_NONE, buffer) \
|
||||
STRCT(prefix, st, MppFrameRational, sar, ELEM_FLAG_NONE, sar)
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
|
@ -41,7 +39,6 @@ extern "C" {
|
|||
#define KMPP_OBJ_NAME kmpp_frame
|
||||
#define KMPP_OBJ_INTF_TYPE KmppFrame
|
||||
#define KMPP_OBJ_ENTRY_TABLE KMPP_FRAME_ENTRY_TABLE
|
||||
#define KMPP_OBJ_STRUCT_TABLE KMPP_FRAME_STRUCT_TABLE
|
||||
#include "kmpp_obj_func.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
|||
|
|
@ -3,6 +3,8 @@
|
|||
* Copyright (c) 2024 Rockchip Electronics Co., Ltd.
|
||||
*/
|
||||
|
||||
#include "kmpp_obj_macro.h"
|
||||
|
||||
#ifndef KMPP_OBJ_NAME
|
||||
#error "KMPP_OBJ_NAME must be defined on using kmpp_obj_func.h"
|
||||
#endif
|
||||
|
|
@ -11,111 +13,55 @@
|
|||
#error "KMPP_OBJ_INTF_TYPE must be defined on using kmpp_obj_func.h"
|
||||
#endif
|
||||
|
||||
#ifndef KMPP_OBJ_CONCAT2
|
||||
#define KMPP_OBJ_CONCAT2(a, b) a##_##b
|
||||
#endif
|
||||
#ifndef KMPP_OBJ_CONCAT3
|
||||
#define KMPP_OBJ_CONCAT3(a, b, c) a##_##b##_##c
|
||||
#endif
|
||||
#ifndef KMPP_OBJ_CONCAT4
|
||||
#define KMPP_OBJ_CONCAT4(a, b, c, d) a##_##b##_##c##_##d
|
||||
#endif
|
||||
#include "rk_type.h"
|
||||
|
||||
/* always define object common function */
|
||||
#define KMPP_OBJ_FUNC_DEFINE(prefix) \
|
||||
rk_s32 KMPP_OBJ_CONCAT2(prefix, size)(void); \
|
||||
rk_s32 KMPP_OBJ_CONCAT2(prefix, get)(KMPP_OBJ_INTF_TYPE *p); \
|
||||
rk_s32 KMPP_OBJ_CONCAT2(prefix, put)(KMPP_OBJ_INTF_TYPE p); \
|
||||
rk_s32 KMPP_OBJ_CONCAT2(prefix, dump)(KMPP_OBJ_INTF_TYPE p, const char *caller);
|
||||
rk_s32 CONCAT_US(prefix, init)(void); \
|
||||
rk_s32 CONCAT_US(prefix, deinit)(void); \
|
||||
rk_s32 CONCAT_US(prefix, size)(void); \
|
||||
rk_s32 CONCAT_US(prefix, get)(KMPP_OBJ_INTF_TYPE *p); \
|
||||
rk_s32 CONCAT_US(prefix, assign)(KMPP_OBJ_INTF_TYPE *p, void *buf, rk_s32 size); \
|
||||
rk_s32 CONCAT_US(prefix, put)(KMPP_OBJ_INTF_TYPE p); \
|
||||
rk_s32 CONCAT_US(prefix, dump)(KMPP_OBJ_INTF_TYPE p, const char *caller);
|
||||
|
||||
KMPP_OBJ_FUNC_DEFINE(KMPP_OBJ_NAME)
|
||||
#undef KMPP_OBJ_FUNC_DEFINE
|
||||
|
||||
/* simple entry access funcitons */
|
||||
/* entry and hook access funcitons */
|
||||
#ifdef KMPP_OBJ_ENTRY_TABLE
|
||||
#define ENTRY_TO_DECLARE(prefix, ftype, type, f1, ...) \
|
||||
rk_s32 KMPP_OBJ_CONCAT3(prefix, set, f1)(KMPP_OBJ_INTF_TYPE p, type val); \
|
||||
rk_s32 KMPP_OBJ_CONCAT3(prefix, get, f1)(KMPP_OBJ_INTF_TYPE p, type* val); \
|
||||
rk_s32 KMPP_OBJ_CONCAT3(prefix, test, f1)(KMPP_OBJ_INTF_TYPE p);
|
||||
/* disable all hierarchy macro in header */
|
||||
#define CFG_DEF_START(...)
|
||||
#define CFG_DEF_END(...)
|
||||
#define STRUCT_START(...)
|
||||
#define STRUCT_END(...)
|
||||
|
||||
KMPP_OBJ_ENTRY_TABLE(ENTRY_TO_DECLARE, KMPP_OBJ_NAME)
|
||||
#define ENTRY_DECLARE(prefix, ftype, type, name, flag, ...) \
|
||||
rk_s32 CONCAT_US(prefix, set, __VA_ARGS__)(KMPP_OBJ_INTF_TYPE p, type val); \
|
||||
rk_s32 CONCAT_US(prefix, get, __VA_ARGS__)(KMPP_OBJ_INTF_TYPE p, type* val); \
|
||||
rk_s32 CONCAT_US(prefix, test, __VA_ARGS__)(KMPP_OBJ_INTF_TYPE p);
|
||||
|
||||
#undef KMPP_OBJ_ENTRY_TABLE
|
||||
#undef ENTRY_TO_DECLARE
|
||||
#endif
|
||||
#define STRCT_DECLARE(prefix, ftype, type, name, flag, ...) \
|
||||
rk_s32 CONCAT_US(prefix, set, __VA_ARGS__)(KMPP_OBJ_INTF_TYPE p, type* val); \
|
||||
rk_s32 CONCAT_US(prefix, get, __VA_ARGS__)(KMPP_OBJ_INTF_TYPE p, type* val); \
|
||||
rk_s32 CONCAT_US(prefix, test, __VA_ARGS__)(KMPP_OBJ_INTF_TYPE p);
|
||||
|
||||
/* simple entry read-only access funcitons */
|
||||
#ifdef KMPP_OBJ_ENTRY_RO_TABLE
|
||||
#define ENTRY_TO_DECLARE(prefix, ftype, type, f1, ...) \
|
||||
rk_s32 KMPP_OBJ_CONCAT3(prefix, get, f1)(KMPP_OBJ_INTF_TYPE p, type* val);
|
||||
#define ALIAS_DECLARE(prefix, ftype, type, name, flag, ...)
|
||||
|
||||
KMPP_OBJ_ENTRY_RO_TABLE(ENTRY_TO_DECLARE, KMPP_OBJ_NAME)
|
||||
KMPP_OBJ_ENTRY_TABLE(KMPP_OBJ_NAME, ENTRY_DECLARE, STRCT_DECLARE,
|
||||
ENTRY_DECLARE, STRCT_DECLARE, ALIAS_DECLARE)
|
||||
|
||||
#undef KMPP_OBJ_ENTRY_RO_TABLE
|
||||
#undef ENTRY_TO_DECLARE
|
||||
#endif
|
||||
#undef ENTRY_DECLARE
|
||||
#undef ENTRY_TO_ALIAS
|
||||
#undef STRCT_DECLARE
|
||||
|
||||
/* structure entry access funcitons */
|
||||
#ifdef KMPP_OBJ_STRUCT_TABLE
|
||||
#define STRUCT_TO_DECLARE(prefix, ftype, type, f1, ...) \
|
||||
rk_s32 KMPP_OBJ_CONCAT3(prefix, set, f1)(KMPP_OBJ_INTF_TYPE p, type* val); \
|
||||
rk_s32 KMPP_OBJ_CONCAT3(prefix, get, f1)(KMPP_OBJ_INTF_TYPE p, type* val); \
|
||||
rk_s32 KMPP_OBJ_CONCAT3(prefix, test, f1)(KMPP_OBJ_INTF_TYPE p);
|
||||
#undef CFG_DEF_START
|
||||
#undef CFG_DEF_END
|
||||
#undef STRUCT_START
|
||||
#undef STRUCT_END
|
||||
|
||||
KMPP_OBJ_STRUCT_TABLE(STRUCT_TO_DECLARE, KMPP_OBJ_NAME)
|
||||
|
||||
#undef KMPP_OBJ_STRUCT_TABLE
|
||||
#undef STRUCT_TO_DECLARE
|
||||
#endif
|
||||
|
||||
/* simple entry hook access funcitons */
|
||||
#ifdef KMPP_OBJ_ENTRY_HOOK
|
||||
#define STRUCT_TO_DECLARE(prefix, ftype, type, f1, ...) \
|
||||
rk_s32 KMPP_OBJ_CONCAT3(prefix, set, f1)(KMPP_OBJ_INTF_TYPE p, type val); \
|
||||
rk_s32 KMPP_OBJ_CONCAT3(prefix, get, f1)(KMPP_OBJ_INTF_TYPE p, type* val);
|
||||
|
||||
KMPP_OBJ_ENTRY_HOOK(STRUCT_TO_DECLARE, KMPP_OBJ_NAME)
|
||||
|
||||
#undef KMPP_OBJ_ENTRY_HOOK
|
||||
#undef STRUCT_TO_DECLARE
|
||||
#endif
|
||||
|
||||
/* structure entry hook access funcitons */
|
||||
#ifdef KMPP_OBJ_STRUCT_HOOK
|
||||
#define STRUCT_TO_DECLARE(prefix, ftype, type, f1, ...) \
|
||||
rk_s32 KMPP_OBJ_CONCAT3(prefix, set, f1)(KMPP_OBJ_INTF_TYPE p, type* val); \
|
||||
rk_s32 KMPP_OBJ_CONCAT3(prefix, get, f1)(KMPP_OBJ_INTF_TYPE p, type* val);
|
||||
|
||||
KMPP_OBJ_STRUCT_HOOK(STRUCT_TO_DECLARE, KMPP_OBJ_NAME)
|
||||
|
||||
#undef KMPP_OBJ_STRUCT_HOOK
|
||||
#undef STRUCT_TO_DECLARE
|
||||
#endif
|
||||
|
||||
/* internal structure simple entry access funcitons */
|
||||
#ifdef KMPP_OBJ_ENTRY_TABLE2
|
||||
#define ENTRY_TO_DECLARE(prefix, ftype, type, f1, f2, ...) \
|
||||
rk_s32 KMPP_OBJ_CONCAT4(prefix, set, f1, f2)(KMPP_OBJ_INTF_TYPE p, type val); \
|
||||
rk_s32 KMPP_OBJ_CONCAT4(prefix, get, f1, f2)(KMPP_OBJ_INTF_TYPE p, type* val); \
|
||||
rk_s32 KMPP_OBJ_CONCAT4(prefix, test, f1, f2)(KMPP_OBJ_INTF_TYPE p);
|
||||
|
||||
KMPP_OBJ_ENTRY_TABLE2(ENTRY_TO_DECLARE, KMPP_OBJ_NAME)
|
||||
|
||||
#undef KMPP_OBJ_ENTRY_TABLE2
|
||||
#undef ENTRY_TO_DECLARE
|
||||
#endif
|
||||
|
||||
/* internal structure entry access funcitons */
|
||||
#ifdef KMPP_OBJ_STRUCT_TABLE2
|
||||
#define ENTRY_TO_DECLARE(prefix, ftype, type, f1, f2, ...) \
|
||||
rk_s32 KMPP_OBJ_CONCAT4(prefix, set, f1, f2)(KMPP_OBJ_INTF_TYPE p, type* val); \
|
||||
rk_s32 KMPP_OBJ_CONCAT4(prefix, get, f1, f2)(KMPP_OBJ_INTF_TYPE p, type* val); \
|
||||
rk_s32 KMPP_OBJ_CONCAT4(prefix, test, f1, f2)(KMPP_OBJ_INTF_TYPE p);
|
||||
|
||||
KMPP_OBJ_STRUCT_TABLE2(ENTRY_TO_DECLARE, KMPP_OBJ_NAME)
|
||||
|
||||
#undef KMPP_OBJ_STRUCT_TABLE2
|
||||
#undef ENTRY_TO_DECLARE
|
||||
#endif
|
||||
|
||||
#undef KMPP_OBJ_NAME
|
||||
#undef KMPP_OBJ_INTF_TYPE
|
||||
#undef KMPP_OBJ_FUNC_DEFINE
|
||||
#undef KMPP_OBJ_ENTRY_TABLE
|
||||
|
|
|
|||
|
|
@ -3,8 +3,14 @@
|
|||
* Copyright (c) 2024 Rockchip Electronics Co., Ltd.
|
||||
*/
|
||||
|
||||
#ifndef __KMPP_OBJ_HERLPER_H__
|
||||
#define __KMPP_OBJ_HERLPER_H__
|
||||
#include "kmpp_obj_macro.h"
|
||||
|
||||
#ifdef __OBJECT_HERLPER_H__
|
||||
#error “MUST NOT include obj_helper.h within obj_helper.h“
|
||||
#endif
|
||||
|
||||
/* define object helper for loop include detection */
|
||||
#define __OBJECT_HERLPER_H__
|
||||
|
||||
#if !defined(KMPP_OBJ_NAME) || \
|
||||
!defined(KMPP_OBJ_INTF_TYPE) || \
|
||||
|
|
@ -15,12 +21,16 @@
|
|||
#warning "KMPP_OBJ_INTF_TYPE - object interface type"
|
||||
#warning "KMPP_OBJ_IMPL_TYPE - object implement type"
|
||||
#warning "option macro:"
|
||||
#warning "KMPP_OBJ_EXTRA_SIZE - object extra size in bytes"
|
||||
#warning "KMPP_OBJ_ENTRY_TABLE - object element value / pointer entry table"
|
||||
#warning "KMPP_OBJ_STRUCT_TABLE - object element structure / array / share memory table"
|
||||
#warning "KMPP_OBJ_ENTRY_TABLE2 - object element value / pointer entry 2 level table"
|
||||
#warning "KMPP_OBJ_STRUCT_TABLE2 - object element structure / array / share memory 2 level table"
|
||||
#warning "KMPP_OBJ_FUNC_IOCTL - object element ioctl cmd and function table"
|
||||
#warning "KMPP_OBJ_FUNC_STUB_ENABLE - enable function stub mode by define empty function"
|
||||
#warning "KMPP_OBJ_FUNC_INIT - add object init function"
|
||||
#warning "KMPP_OBJ_FUNC_DEINIT - add object deinit function"
|
||||
#warning "KMPP_OBJ_FUNC_DUMP - add object dump function"
|
||||
#warning "KMPP_OBJ_FUNC_EXPORT_DISABLE - disable function exprot by EXPORT_SYMBOL"
|
||||
#warning "KMPP_OBJ_ACCESS_DISABLE - disable access function creation"
|
||||
#warning "KMPP_OBJ_SHARE_DISABLE - disable object sharing by /dev/kmpp_objs to userspace"
|
||||
#warning "KMPP_OBJ_HIERARCHY_ENABLE - enable hierarchy name creation"
|
||||
|
||||
#ifndef KMPP_OBJ_NAME
|
||||
#error "KMPP_OBJ_NAME not defined"
|
||||
|
|
@ -34,252 +44,398 @@
|
|||
|
||||
#else /* all input macro defined */
|
||||
|
||||
#include <string.h>
|
||||
#include <linux/stddef.h>
|
||||
|
||||
#define KMPP_OBJ_DEF(x) CONCAT_US(x, def)
|
||||
#define KMPP_OBJ_DEF_NAME(x) TO_STR(x)
|
||||
|
||||
#ifndef KMPP_OBJ_EXTRA_SIZE
|
||||
#define KMPP_OBJ_EXTRA_SIZE 0
|
||||
#endif
|
||||
|
||||
#ifndef KMPP_OBJ_ENTRY_TABLE
|
||||
#define KMPP_OBJ_ENTRY_TABLE(prefix, ENTRY, STRCT, EHOOK, SHOOK, ALIAS)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* macro for register structure fiedl to trie
|
||||
* type -> struct base type
|
||||
* f1 -> struct:name1 name segment 1 the name1 part
|
||||
* f2 -> struct:name1:name2 name segment 2 the name2 part
|
||||
* ftype -> name type as ElemType
|
||||
* flag -> name update flag type
|
||||
*/
|
||||
#define FLAG_TYPE_TO_OFFSET(flag) \
|
||||
({ \
|
||||
rk_u16 __offset; \
|
||||
rk_s32 __flag_op = flag & ELEM_FLAG_OP_MASK; \
|
||||
switch (__flag_op) { \
|
||||
case ELEM_FLAG_NONE : __offset = 0; break; \
|
||||
case ELEM_FLAG_START : __flag_base = ((__flag_base + 31) & (~31)); __offset = __flag_base++; break; \
|
||||
case ELEM_FLAG_UPDATE : __offset = __flag_base++; break; \
|
||||
case ELEM_FLAG_HOLD : __offset = __flag_base; break; \
|
||||
default : __offset = 0; break; \
|
||||
}; \
|
||||
if (flag & (ELEM_FLAG_RECORD | ELEM_FLAG_REPLAY)) { \
|
||||
rk_s32 __flag_idx = flag & ELEM_FLAG_IDX_MASK; \
|
||||
if (flag & ELEM_FLAG_RECORD) \
|
||||
__flag_record[__flag_idx] = __offset; \
|
||||
else \
|
||||
__offset = __flag_record[__flag_idx]; \
|
||||
} \
|
||||
__offset; \
|
||||
})
|
||||
|
||||
#define ENTRY_TO_TRIE(prefix, ftype, type, name, flag, ...) \
|
||||
do { \
|
||||
KmppEntry tbl = { \
|
||||
.tbl.elem_offset = ((size_t)&(((KMPP_OBJ_IMPL_TYPE *)0)->CONCAT_DOT(__VA_ARGS__))), \
|
||||
.tbl.elem_size = sizeof(((KMPP_OBJ_IMPL_TYPE *)0)->CONCAT_DOT(__VA_ARGS__)), \
|
||||
.tbl.elem_type = ELEM_TYPE_##ftype, \
|
||||
.tbl.flag_offset = FLAG_TYPE_TO_OFFSET(flag), \
|
||||
}; \
|
||||
kmpp_objdef_add_entry(KMPP_OBJ_DEF(prefix), ENTRY_TO_NAME_START(name), &tbl); \
|
||||
ENTRY_TO_NAME_END(name); \
|
||||
} while (0);
|
||||
|
||||
#define ENTRY_NOTHING(prefix, ftype, type, name, flag, ...)
|
||||
|
||||
#if !defined(KMPP_OBJ_ACCESS_DISABLE)
|
||||
#define VAL_ENTRY_TBL(prefix, ftype, type, name, flag, ...) \
|
||||
static KmppEntry *CONCAT_US(tbl, prefix, __VA_ARGS__) = NULL;
|
||||
|
||||
#define VAL_HOOK_IDX(prefix, ftype, type, name, flag, ...) \
|
||||
static rk_s32 CONCAT_US(hook, prefix, get, __VA_ARGS__) = -1; \
|
||||
static rk_s32 CONCAT_US(hook, prefix, set, __VA_ARGS__) = -1;
|
||||
|
||||
#define ENTRY_QUERY(prefix, ftype, type, name, flag, ...) \
|
||||
do { \
|
||||
kmpp_objdef_get_entry(KMPP_OBJ_DEF(prefix), ENTRY_TO_NAME_START(name), &CONCAT_US(tbl, prefix, __VA_ARGS__)); \
|
||||
} while (0);
|
||||
|
||||
#define HOOK_QUERY(prefix, ftype, type, name, flag, ...) \
|
||||
do { \
|
||||
CONCAT_US(hook, prefix, set, __VA_ARGS__) = \
|
||||
kmpp_objdef_get_hook(KMPP_OBJ_DEF(prefix), CONCAT_STR(set, __VA_ARGS__)); \
|
||||
CONCAT_US(hook, prefix, get, __VA_ARGS__) = \
|
||||
kmpp_objdef_get_hook(KMPP_OBJ_DEF(prefix), CONCAT_STR(get, __VA_ARGS__)); \
|
||||
} while (0);
|
||||
|
||||
#define ENTRY_TO_FUNC(prefix, ftype, type, name, flag, ...) \
|
||||
rk_s32 CONCAT_US(prefix, get, __VA_ARGS__)(KMPP_OBJ_INTF_TYPE s, type *v) \
|
||||
{ \
|
||||
rk_s32 ret = kmpp_obj_check(s, __FUNCTION__); \
|
||||
if (ret) return ret; \
|
||||
if (CONCAT_US(tbl, prefix, __VA_ARGS__)) \
|
||||
ret = kmpp_obj_tbl_get_##ftype(s, CONCAT_US(tbl, prefix, __VA_ARGS__), v); \
|
||||
else \
|
||||
*v = ((KMPP_OBJ_IMPL_TYPE*)kmpp_obj_to_entry(s))->CONCAT_DOT(__VA_ARGS__); \
|
||||
return ret; \
|
||||
} \
|
||||
rk_s32 CONCAT_US(prefix, set, __VA_ARGS__)(KMPP_OBJ_INTF_TYPE s, type v) \
|
||||
{ \
|
||||
rk_s32 ret = kmpp_obj_check(s, __FUNCTION__); \
|
||||
if (ret) return ret; \
|
||||
if (CONCAT_US(tbl, prefix, __VA_ARGS__)) \
|
||||
ret = kmpp_obj_tbl_set_##ftype(s, CONCAT_US(tbl, prefix, __VA_ARGS__), v); \
|
||||
else \
|
||||
((KMPP_OBJ_IMPL_TYPE*)kmpp_obj_to_entry(s))->CONCAT_DOT(__VA_ARGS__) = v; \
|
||||
return ret; \
|
||||
} \
|
||||
rk_s32 CONCAT_US(prefix, test, __VA_ARGS__)(KMPP_OBJ_INTF_TYPE s) \
|
||||
{ \
|
||||
if (kmpp_obj_check(s, __FUNCTION__)) return 0; \
|
||||
return kmpp_obj_tbl_test(s, CONCAT_US(tbl, prefix, __VA_ARGS__)); \
|
||||
}
|
||||
|
||||
#define STRUCT_TO_FUNC(prefix, ftype, type, name, flag, ...) \
|
||||
rk_s32 CONCAT_US(prefix, get, __VA_ARGS__)(KMPP_OBJ_INTF_TYPE s, type *v) \
|
||||
{ \
|
||||
rk_s32 ret = kmpp_obj_check(s, __FUNCTION__); \
|
||||
if (ret) return ret; \
|
||||
if (CONCAT_US(tbl, prefix, __VA_ARGS__)) \
|
||||
ret = kmpp_obj_tbl_get_##ftype(s, CONCAT_US(tbl, prefix, __VA_ARGS__), v); \
|
||||
else \
|
||||
memcpy(v, &((KMPP_OBJ_IMPL_TYPE*)kmpp_obj_to_entry(s))->CONCAT_DOT(__VA_ARGS__), \
|
||||
sizeof(((KMPP_OBJ_IMPL_TYPE*)0)->CONCAT_DOT(__VA_ARGS__))); \
|
||||
return ret; \
|
||||
} \
|
||||
rk_s32 CONCAT_US(prefix, set, __VA_ARGS__)(KMPP_OBJ_INTF_TYPE s, type *v) \
|
||||
{ \
|
||||
rk_s32 ret = kmpp_obj_check(s, __FUNCTION__); \
|
||||
if (ret) return ret; \
|
||||
if (CONCAT_US(tbl, prefix, __VA_ARGS__)) \
|
||||
ret = kmpp_obj_tbl_set_##ftype(s, CONCAT_US(tbl, prefix, __VA_ARGS__), v); \
|
||||
else \
|
||||
memcpy(&((KMPP_OBJ_IMPL_TYPE*)kmpp_obj_to_entry(s))->CONCAT_DOT(__VA_ARGS__), v, \
|
||||
sizeof(((KMPP_OBJ_IMPL_TYPE*)0)->CONCAT_DOT(__VA_ARGS__))); \
|
||||
return ret; \
|
||||
} \
|
||||
rk_s32 CONCAT_US(prefix, test, __VA_ARGS__)(KMPP_OBJ_INTF_TYPE s) \
|
||||
{ \
|
||||
if (kmpp_obj_check(s, __FUNCTION__)) return 0; \
|
||||
return kmpp_obj_tbl_test(s, CONCAT_US(tbl, prefix, __VA_ARGS__)); \
|
||||
}
|
||||
|
||||
#define EHOOK_TO_FUNC(prefix, ftype, type, name, flag, ...) \
|
||||
rk_s32 CONCAT_US(prefix, get, __VA_ARGS__)(KMPP_OBJ_INTF_TYPE s, type *v) \
|
||||
{ \
|
||||
rk_s32 ret = kmpp_obj_check(s, __FUNCTION__); \
|
||||
if (ret) return ret; \
|
||||
if (CONCAT_US(hook, prefix, get, __VA_ARGS__) >= 0) \
|
||||
ret = kmpp_obj_idx_run(s, CONCAT_US(hook, prefix, get, __VA_ARGS__), (void *)v, __FUNCTION__); \
|
||||
return ret; \
|
||||
} \
|
||||
rk_s32 CONCAT_US(prefix, set, __VA_ARGS__)(KMPP_OBJ_INTF_TYPE s, type v) \
|
||||
{ \
|
||||
rk_s32 ret = kmpp_obj_check(s, __FUNCTION__); \
|
||||
if (ret) return ret; \
|
||||
if (CONCAT_US(hook, prefix, set, __VA_ARGS__) >= 0) \
|
||||
ret = kmpp_obj_idx_run(s, CONCAT_US(hook, prefix, set, __VA_ARGS__), (void *)&v, __FUNCTION__); \
|
||||
return ret; \
|
||||
}
|
||||
|
||||
#define SHOOK_TO_FUNC(prefix, ftype, type, name, flag, ...) \ \
|
||||
rk_s32 CONCAT_US(prefix, get, __VA_ARGS__)(KMPP_OBJ_INTF_TYPE s, type *v) \
|
||||
{ \
|
||||
rk_s32 ret = kmpp_obj_check(s, __FUNCTION__); \
|
||||
if (ret) return ret; \
|
||||
if (CONCAT_US(hook, prefix, get, __VA_ARGS__) >= 0) \
|
||||
ret = kmpp_obj_idx_run(s, CONCAT_US(hook, prefix, get, __VA_ARGS__), (void *)v, __FUNCTION__); \
|
||||
return ret; \
|
||||
} \
|
||||
rk_s32 CONCAT_US(prefix, set, __VA_ARGS__)(KMPP_OBJ_INTF_TYPE s, type *v) \
|
||||
{ \
|
||||
rk_s32 ret = kmpp_obj_check(s, __FUNCTION__); \
|
||||
if (ret) return ret; \
|
||||
if (CONCAT_US(hook, prefix, set, __VA_ARGS__) >= 0) \
|
||||
ret = kmpp_obj_idx_run(s, CONCAT_US(prefix, set, __VA_ARGS__), (void *)v, __FUNCTION__); \
|
||||
return ret; \
|
||||
}
|
||||
|
||||
#else
|
||||
#define VAL_ENTRY_TBL ENTRY_NOTHING
|
||||
#define VAL_HOOK_IDX ENTRY_NOTHING
|
||||
#define ENTRY_QUERY ENTRY_NOTHING
|
||||
#define HOOK_QUERY ENTRY_NOTHING
|
||||
#define ENTRY_TO_FUNC ENTRY_NOTHING
|
||||
#define STRUCT_TO_FUNC ENTRY_NOTHING
|
||||
#define EHOOK_TO_FUNC ENTRY_NOTHING
|
||||
#define SHOOK_TO_FUNC ENTRY_NOTHING
|
||||
#endif
|
||||
|
||||
/* disable structure layout macro for global variable definition */
|
||||
#undef CFG_DEF_START
|
||||
#undef CFG_DEF_END
|
||||
#undef STRUCT_START
|
||||
#undef STRUCT_END
|
||||
#undef ENTRY_TO_NAME_START
|
||||
#undef ENTRY_TO_NAME_END
|
||||
|
||||
#define CFG_DEF_START(...)
|
||||
#define CFG_DEF_END(...)
|
||||
#define STRUCT_START(...)
|
||||
#define STRUCT_END(...)
|
||||
#define ENTRY_TO_NAME_START(name, ...) TO_STR(name)
|
||||
#define ENTRY_TO_NAME_END(...)
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "mpp_debug.h"
|
||||
#include "kmpp_obj.h"
|
||||
|
||||
#define KMPP_OBJ_TO_STR(x) #x
|
||||
#define KMPP_OBJ_DEF(x) x##_def
|
||||
#define KMPP_OBJ_DEF_NAME(x) KMPP_OBJ_TO_STR(x)
|
||||
/* object definition common functions */
|
||||
static KmppObjDef KMPP_OBJ_DEF(KMPP_OBJ_NAME) = NULL;
|
||||
/* globla variable definitions */
|
||||
KMPP_OBJ_ENTRY_TABLE(KMPP_OBJ_NAME, VAL_ENTRY_TBL, VAL_ENTRY_TBL,
|
||||
VAL_HOOK_IDX, VAL_HOOK_IDX, ENTRY_NOTHING)
|
||||
|
||||
/* enable structure layout macro for objdef registration */
|
||||
#ifdef KMPP_OBJ_HIERARCHY_ENABLE
|
||||
#undef CFG_DEF_START
|
||||
#undef CFG_DEF_END
|
||||
#undef STRUCT_START
|
||||
#undef STRUCT_END
|
||||
#undef ENTRY_TO_NAME_START
|
||||
#undef ENTRY_TO_NAME_END
|
||||
|
||||
#define CFG_DEF_START(...) \
|
||||
{ \
|
||||
char str_buf[256] = {0}; \
|
||||
rk_s32 str_pos = 0; \
|
||||
rk_s32 str_size = sizeof(str_buf) - 1;
|
||||
|
||||
#define CFG_DEF_END(...) \
|
||||
}
|
||||
|
||||
#define STRUCT_START(...) \
|
||||
{ \
|
||||
rk_s32 CONCAT_US(pos, __VA_ARGS__, root) = str_pos; \
|
||||
str_pos += snprintf(str_buf + str_pos, str_size - str_pos, str_pos ? ":%s" : "%s", CONCAT_STR(__VA_ARGS__));
|
||||
|
||||
#define STRUCT_END(...) \
|
||||
str_pos = CONCAT_US(pos, __VA_ARGS__, root); \
|
||||
str_buf[str_pos] = '\0'; \
|
||||
}
|
||||
|
||||
#define ENTRY_TO_NAME_START(name, ...) \
|
||||
({ \
|
||||
snprintf(str_buf + str_pos, str_size - str_pos, str_pos ? ":%s" : "%s", TO_STR(name)); \
|
||||
str_buf; \
|
||||
})
|
||||
|
||||
#define ENTRY_TO_NAME_END(...) \
|
||||
str_buf[str_pos] = '\0';
|
||||
|
||||
#ifndef KMPP_OBJ_ENTRY_TABLE
|
||||
#define KMPP_OBJ_ENTRY_TABLE(ENTRY, prefix)
|
||||
#endif
|
||||
#ifndef KMPP_OBJ_ENTRY_RO_TABLE
|
||||
#define KMPP_OBJ_ENTRY_RO_TABLE(ENTRY, prefix)
|
||||
#endif
|
||||
#ifndef KMPP_OBJ_STRUCT_TABLE
|
||||
#define KMPP_OBJ_STRUCT_TABLE(ENTRY, prefix)
|
||||
#endif
|
||||
#ifndef KMPP_OBJ_ENTRY_TABLE2
|
||||
#define KMPP_OBJ_ENTRY_TABLE2(ENTRY, prefix)
|
||||
#endif
|
||||
#ifndef KMPP_OBJ_STRUCT_TABLE2
|
||||
#define KMPP_OBJ_STRUCT_TABLE2(ENTRY, prefix)
|
||||
#endif
|
||||
|
||||
#define ENTRY_QUERY(prefix, ftype, type, f1, ...) \
|
||||
do { \
|
||||
kmpp_objdef_get_entry(KMPP_OBJ_DEF(prefix), #f1, &tbl_##prefix##_##f1); \
|
||||
} while (0);
|
||||
void CONCAT_US(KMPP_OBJ_NAME, register)(void)
|
||||
{
|
||||
rk_s32 impl_size = (sizeof(KMPP_OBJ_IMPL_TYPE) + KMPP_OBJ_EXTRA_SIZE + 3) & ~3;
|
||||
rk_s32 __flag_base = impl_size << 3;
|
||||
rk_s32 __flag_record[ELEM_FLAG_RECORD_MAX];
|
||||
(void) __flag_base;
|
||||
(void) __flag_record;
|
||||
|
||||
#define ENTRY_QUERY2(prefix, ftype, type, f1, f2, ...) \
|
||||
do { \
|
||||
kmpp_objdef_get_entry(KMPP_OBJ_DEF(prefix), #f1":"#f2, &tbl_##prefix##_##f1##_##f2); \
|
||||
} while (0);
|
||||
mpp_logi_f("enter\n");
|
||||
|
||||
#define KMPP_OBJ_FUNC2(a, b) a##_##b
|
||||
#define KMPP_OBJ_FUNC3(a, b, c) a##_##b##_##c
|
||||
#define KMPP_OBJ_FUNC4(a, b, c, d) a##_##b##_##c##_##d
|
||||
kmpp_objdef_register(&KMPP_OBJ_DEF(KMPP_OBJ_NAME), impl_size, KMPP_OBJ_DEF_NAME(KMPP_OBJ_INTF_TYPE));
|
||||
if (!KMPP_OBJ_DEF(KMPP_OBJ_NAME)) {
|
||||
mpp_loge_f(TO_STR(KMPP_OBJ_NAME) " init failed\n");
|
||||
return;
|
||||
}
|
||||
|
||||
KMPP_OBJ_ENTRY_TABLE(KMPP_OBJ_NAME, ENTRY_TO_TRIE, ENTRY_TO_TRIE,
|
||||
ENTRY_TO_TRIE, ENTRY_TO_TRIE, ENTRY_TO_TRIE)
|
||||
kmpp_objdef_add_entry(KMPP_OBJ_DEF(KMPP_OBJ_NAME), NULL, NULL);
|
||||
KMPP_OBJ_ENTRY_TABLE(KMPP_OBJ_NAME, ENTRY_QUERY, ENTRY_QUERY,
|
||||
HOOK_QUERY, HOOK_QUERY, ENTRY_NOTHING);
|
||||
|
||||
#if defined(KMPP_OBJ_FUNC_INIT)
|
||||
kmpp_objdef_add_init(KMPP_OBJ_DEF(KMPP_OBJ_NAME), KMPP_OBJ_FUNC_INIT);
|
||||
#endif
|
||||
#if defined(KMPP_OBJ_FUNC_DEINIT)
|
||||
kmpp_objdef_add_deinit(KMPP_OBJ_DEF(KMPP_OBJ_NAME), KMPP_OBJ_FUNC_DEINIT);
|
||||
#endif
|
||||
#if defined(KMPP_OBJ_FUNC_IOCTL)
|
||||
#define KMPP_OBJ_ADD_IOCTL(x) kmpp_objdef_add_ioctl(KMPP_OBJ_DEF(x), &KMPP_OBJ_FUNC_IOCTL)
|
||||
#else
|
||||
#define KMPP_OBJ_ADD_IOCTL(x)
|
||||
kmpp_objdef_add_ioctl(KMPP_OBJ_DEF(KMPP_OBJ_NAME), &KMPP_OBJ_FUNC_IOCTL);
|
||||
#endif
|
||||
|
||||
#define KMPP_OBJ_ENTRY_FUNC(prefix, ftype, type, field, ...) \
|
||||
static KmppEntry *tbl_##prefix##_##field = NULL; \
|
||||
rk_s32 KMPP_OBJ_FUNC3(prefix, get, field)(KMPP_OBJ_INTF_TYPE s, type *v) \
|
||||
{ \
|
||||
rk_s32 ret = kmpp_obj_check(s, __FUNCTION__); \
|
||||
if (ret) return ret; \
|
||||
if (tbl_##prefix##_##field) \
|
||||
ret = kmpp_obj_tbl_get_##ftype(s, tbl_##prefix##_##field, v); \
|
||||
else \
|
||||
*v = ((KMPP_OBJ_IMPL_TYPE*)kmpp_obj_to_entry(s))->field; \
|
||||
return ret; \
|
||||
} \
|
||||
rk_s32 KMPP_OBJ_FUNC3(prefix, set, field)(KMPP_OBJ_INTF_TYPE s, type v) \
|
||||
{ \
|
||||
rk_s32 ret = kmpp_obj_check(s, __FUNCTION__); \
|
||||
if (ret) return ret; \
|
||||
if (tbl_##prefix##_##field) \
|
||||
ret = kmpp_obj_tbl_set_##ftype(s, tbl_##prefix##_##field, v); \
|
||||
else \
|
||||
((KMPP_OBJ_IMPL_TYPE*)kmpp_obj_to_entry(s))->field = v; \
|
||||
return ret; \
|
||||
} \
|
||||
rk_s32 KMPP_OBJ_FUNC3(prefix, test, field)(KMPP_OBJ_INTF_TYPE s) \
|
||||
{ \
|
||||
if (kmpp_obj_check(s, __FUNCTION__)) return 0; \
|
||||
return kmpp_obj_tbl_test(s, tbl_##prefix##_##field); \
|
||||
}
|
||||
|
||||
#define KMPP_OBJ_ENTRY_RO_FUNC(prefix, ftype, type, field, ...) \
|
||||
static KmppEntry *tbl_##prefix##_##field = NULL; \
|
||||
rk_s32 KMPP_OBJ_FUNC3(prefix, get, field)(KMPP_OBJ_INTF_TYPE s, type *v) \
|
||||
{ \
|
||||
rk_s32 ret = kmpp_obj_check(s, __FUNCTION__); \
|
||||
if (ret) return ret; \
|
||||
if (tbl_##prefix##_##field) \
|
||||
ret = kmpp_obj_tbl_get_##ftype(s, tbl_##prefix##_##field, v); \
|
||||
else \
|
||||
*v = ((KMPP_OBJ_IMPL_TYPE*)kmpp_obj_to_entry(s))->field; \
|
||||
return ret; \
|
||||
}
|
||||
|
||||
#define KMPP_OBJ_STRUCT_FUNC(prefix, ftype, type, field, ...) \
|
||||
static KmppEntry *tbl_##prefix##_##field = NULL; \
|
||||
rk_s32 KMPP_OBJ_FUNC3(prefix, get, field)(KMPP_OBJ_INTF_TYPE s, type *v) \
|
||||
{ \
|
||||
rk_s32 ret = kmpp_obj_check(s, __FUNCTION__); \
|
||||
if (ret) return ret; \
|
||||
if (tbl_##prefix##_##field) \
|
||||
ret = kmpp_obj_tbl_get_##ftype(s, tbl_##prefix##_##field, v); \
|
||||
else \
|
||||
memcpy(v, &((KMPP_OBJ_IMPL_TYPE*)kmpp_obj_to_entry(s))->field, \
|
||||
sizeof(((KMPP_OBJ_IMPL_TYPE*)0)->field)); \
|
||||
return ret; \
|
||||
} \
|
||||
rk_s32 KMPP_OBJ_FUNC3(prefix, set, field)(KMPP_OBJ_INTF_TYPE s, type *v) \
|
||||
{ \
|
||||
rk_s32 ret = kmpp_obj_check(s, __FUNCTION__); \
|
||||
if (ret) return ret; \
|
||||
if (tbl_##prefix##_##field) \
|
||||
ret = kmpp_obj_tbl_set_##ftype(s, tbl_##prefix##_##field, v); \
|
||||
else \
|
||||
memcpy(&((KMPP_OBJ_IMPL_TYPE*)kmpp_obj_to_entry(s))->field, v, \
|
||||
sizeof(((KMPP_OBJ_IMPL_TYPE*)0)->field)); \
|
||||
return ret; \
|
||||
} \
|
||||
rk_s32 KMPP_OBJ_FUNC3(prefix, test, field)(KMPP_OBJ_INTF_TYPE s) \
|
||||
{ \
|
||||
if (kmpp_obj_check(s, __FUNCTION__)) return 0; \
|
||||
return kmpp_obj_tbl_test(s, tbl_##prefix##_##field); \
|
||||
}
|
||||
|
||||
#define KMPP_OBJ_ENTRY_FUNC2(prefix, ftype, type, f1, f2, ...) \
|
||||
static KmppEntry *tbl_##prefix##_##f1##_##f2 = NULL; \
|
||||
rk_s32 KMPP_OBJ_FUNC4(prefix, get, f1, f2)(KMPP_OBJ_INTF_TYPE s, type *v) \
|
||||
{ \
|
||||
rk_s32 ret = kmpp_obj_check(s, __FUNCTION__); \
|
||||
if (ret) return ret; \
|
||||
if (tbl_##prefix##_##f1##_##f2) \
|
||||
ret = kmpp_obj_tbl_get_##ftype(s, tbl_##prefix##_##f1##_##f2, v); \
|
||||
else \
|
||||
*v = ((KMPP_OBJ_IMPL_TYPE*)kmpp_obj_to_entry(s))->f1.f2; \
|
||||
return ret; \
|
||||
} \
|
||||
rk_s32 KMPP_OBJ_FUNC4(prefix, set, f1, f2)(KMPP_OBJ_INTF_TYPE s, type v) \
|
||||
{ \
|
||||
rk_s32 ret = kmpp_obj_check(s, __FUNCTION__); \
|
||||
if (ret) return ret; \
|
||||
if (tbl_##prefix##_##f1##_##f2) \
|
||||
ret = kmpp_obj_tbl_set_##ftype(s, tbl_##prefix##_##f1##_##f2, v); \
|
||||
else \
|
||||
((KMPP_OBJ_IMPL_TYPE*)kmpp_obj_to_entry(s))->f1.f2 = v; \
|
||||
return ret; \
|
||||
} \
|
||||
rk_s32 KMPP_OBJ_FUNC4(prefix, test, f1, f2)(KMPP_OBJ_INTF_TYPE s) \
|
||||
{ \
|
||||
if (kmpp_obj_check(s, __FUNCTION__)) return 0; \
|
||||
return kmpp_obj_tbl_test(s, tbl_##prefix##_##f1##_##f2); \
|
||||
}
|
||||
|
||||
#define KMPP_OBJ_STRUCT_FUNC2(prefix, ftype, type, f1, f2, ...) \
|
||||
static KmppEntry *tbl_##prefix##_##f1##_##f2 = NULL; \
|
||||
rk_s32 KMPP_OBJ_FUNC4(prefix, get, f1, f2)(KMPP_OBJ_INTF_TYPE s, type *v) \
|
||||
{ \
|
||||
rk_s32 ret = kmpp_obj_check(s, __FUNCTION__); \
|
||||
if (ret) return ret; \
|
||||
if (tbl_##prefix##_##f1##_##f2) \
|
||||
ret = kmpp_obj_tbl_get_##ftype(s, tbl_##prefix##_##f1##_##f2, v); \
|
||||
else \
|
||||
memcpy(v, &((KMPP_OBJ_IMPL_TYPE*)kmpp_obj_to_entry(s))->f1.f2, \
|
||||
sizeof(((KMPP_OBJ_IMPL_TYPE*)0)->f1.f2)); \
|
||||
return ret; \
|
||||
} \
|
||||
rk_s32 KMPP_OBJ_FUNC4(prefix, set, f1, f2)(KMPP_OBJ_INTF_TYPE s, type *v) \
|
||||
{ \
|
||||
rk_s32 ret = kmpp_obj_check(s, __FUNCTION__); \
|
||||
if (ret) return ret; \
|
||||
if (tbl_##prefix##_##f1##_##f2) \
|
||||
ret = kmpp_obj_tbl_set_##ftype(s, tbl_##prefix##_##f1##_##f2, v); \
|
||||
else \
|
||||
memcpy(&((KMPP_OBJ_IMPL_TYPE*)kmpp_obj_to_entry(s))->f1.f2, v, \
|
||||
sizeof(((KMPP_OBJ_IMPL_TYPE*)0)->f1.f2)); \
|
||||
return ret; \
|
||||
} \
|
||||
rk_s32 KMPP_OBJ_FUNC4(prefix, test, f1, f2)(KMPP_OBJ_INTF_TYPE s) \
|
||||
{ \
|
||||
if (kmpp_obj_check(s, __FUNCTION__)) return 0; \
|
||||
return kmpp_obj_tbl_test(s, tbl_##prefix##_##f1##_##f2); \
|
||||
}
|
||||
|
||||
#define KMPP_OBJS_USAGE_SET(prefix) \
|
||||
static KmppObjDef KMPP_OBJ_DEF(prefix) = NULL; \
|
||||
KMPP_OBJ_ENTRY_TABLE(KMPP_OBJ_ENTRY_FUNC, prefix) \
|
||||
KMPP_OBJ_ENTRY_RO_TABLE(KMPP_OBJ_ENTRY_RO_FUNC, prefix) \
|
||||
KMPP_OBJ_STRUCT_TABLE(KMPP_OBJ_STRUCT_FUNC, prefix) \
|
||||
KMPP_OBJ_ENTRY_TABLE2(KMPP_OBJ_ENTRY_FUNC2, prefix) \
|
||||
KMPP_OBJ_STRUCT_TABLE2(KMPP_OBJ_STRUCT_FUNC2, prefix) \
|
||||
rk_s32 KMPP_OBJ_FUNC2(prefix, init)(void) __attribute__((constructor)); \
|
||||
rk_s32 KMPP_OBJ_FUNC2(prefix, init)(void) \
|
||||
{ \
|
||||
kmpp_objdef_get(&KMPP_OBJ_DEF(prefix), KMPP_OBJ_DEF_NAME(KMPP_OBJ_INTF_TYPE)); \
|
||||
if (!KMPP_OBJ_DEF(prefix)) \
|
||||
return rk_nok; \
|
||||
KMPP_OBJ_ADD_IOCTL(prefix); \
|
||||
KMPP_OBJ_ENTRY_TABLE(ENTRY_QUERY, prefix) \
|
||||
KMPP_OBJ_ENTRY_RO_TABLE(ENTRY_QUERY, prefix) \
|
||||
KMPP_OBJ_STRUCT_TABLE(ENTRY_QUERY, prefix) \
|
||||
KMPP_OBJ_ENTRY_TABLE2(ENTRY_QUERY2, prefix) \
|
||||
KMPP_OBJ_STRUCT_TABLE2(ENTRY_QUERY2, prefix) \
|
||||
return rk_ok; \
|
||||
} \
|
||||
rk_s32 KMPP_OBJ_FUNC2(prefix, deinit)(void) __attribute__((destructor)); \
|
||||
rk_s32 KMPP_OBJ_FUNC2(prefix, deinit)(void) \
|
||||
{ \
|
||||
KmppObjDef def = __sync_fetch_and_and(&KMPP_OBJ_DEF(prefix), NULL); \
|
||||
return kmpp_objdef_put(def); \
|
||||
} \
|
||||
rk_s32 KMPP_OBJ_FUNC2(prefix, size)(void) \
|
||||
{ \
|
||||
return kmpp_objdef_get_entry_size(KMPP_OBJ_DEF(prefix)); \
|
||||
} \
|
||||
rk_s32 KMPP_OBJ_FUNC2(prefix, get)(KMPP_OBJ_INTF_TYPE *obj) \
|
||||
{ \
|
||||
return kmpp_obj_get_f((KmppObj *)obj, KMPP_OBJ_DEF(prefix)); \
|
||||
} \
|
||||
rk_s32 KMPP_OBJ_FUNC2(prefix, put)(KMPP_OBJ_INTF_TYPE obj) \
|
||||
{ \
|
||||
return kmpp_obj_put_f(obj); \
|
||||
} \
|
||||
rk_s32 KMPP_OBJ_FUNC2(prefix, dump)(KMPP_OBJ_INTF_TYPE obj, const char *caller) \
|
||||
{ \
|
||||
return kmpp_obj_udump_f(obj, caller); \
|
||||
#if defined(KMPP_OBJ_FUNC_DUMP)
|
||||
kmpp_objdef_add_dump(KMPP_OBJ_DEF(KMPP_OBJ_NAME), KMPP_OBJ_FUNC_DUMP);
|
||||
#endif
|
||||
#if !defined(KMPP_OBJ_SHARE_DISABLE) && defined(__KERNEL__)
|
||||
kmpp_objdef_share(KMPP_OBJ_DEF(KMPP_OBJ_NAME));
|
||||
#endif
|
||||
mpp_logi_f("leave\n");
|
||||
}
|
||||
|
||||
KMPP_OBJS_USAGE_SET(KMPP_OBJ_NAME);
|
||||
void CONCAT_US(KMPP_OBJ_NAME, unregister)(void)
|
||||
{
|
||||
KmppObjDef def = __sync_fetch_and_and(&KMPP_OBJ_DEF(KMPP_OBJ_NAME), NULL);
|
||||
|
||||
kmpp_objdef_unregister(def);
|
||||
}
|
||||
|
||||
#include "mpp_singleton.h"
|
||||
|
||||
MPP_SINGLETON(KMPP_OBJ_SGLN_ID, TO_STR(KMPP_OBJ_NAME), CONCAT_US(KMPP_OBJ_NAME, register), CONCAT_US(KMPP_OBJ_NAME, unregister));
|
||||
|
||||
rk_s32 CONCAT_US(KMPP_OBJ_NAME, size)(void)
|
||||
{
|
||||
return kmpp_objdef_get_entry_size(KMPP_OBJ_DEF(KMPP_OBJ_NAME));
|
||||
}
|
||||
|
||||
rk_s32 CONCAT_US(KMPP_OBJ_NAME, get)(KMPP_OBJ_INTF_TYPE *obj)
|
||||
{
|
||||
return kmpp_obj_get_f((KmppObj *)obj, KMPP_OBJ_DEF(KMPP_OBJ_NAME));
|
||||
}
|
||||
|
||||
rk_s32 CONCAT_US(KMPP_OBJ_NAME, put)(KMPP_OBJ_INTF_TYPE obj)
|
||||
{
|
||||
return kmpp_obj_put_f(obj);
|
||||
}
|
||||
|
||||
rk_s32 CONCAT_US(KMPP_OBJ_NAME, dump)(KMPP_OBJ_INTF_TYPE obj, const char *caller)
|
||||
{
|
||||
return kmpp_obj_kdump_f(obj, caller);
|
||||
}
|
||||
|
||||
#if !defined(KMPP_OBJ_FUNC_EXPORT_DISABLE) && defined(__KERNEL__)
|
||||
#include <linux/export.h>
|
||||
|
||||
EXPORT_SYMBOL(CONCAT_US(KMPP_OBJ_NAME, size));
|
||||
EXPORT_SYMBOL(CONCAT_US(KMPP_OBJ_NAME, get));
|
||||
EXPORT_SYMBOL(CONCAT_US(KMPP_OBJ_NAME, put));
|
||||
EXPORT_SYMBOL(CONCAT_US(KMPP_OBJ_NAME, dump));
|
||||
#endif
|
||||
|
||||
/* disable structure layout macro for access function definition */
|
||||
#undef CFG_DEF_START
|
||||
#undef CFG_DEF_END
|
||||
#undef STRUCT_START
|
||||
#undef STRUCT_END
|
||||
#undef ENTRY_TO_NAME_START
|
||||
#undef ENTRY_TO_NAME_END
|
||||
|
||||
#define CFG_DEF_START(...)
|
||||
#define CFG_DEF_END(...)
|
||||
#define STRUCT_START(...)
|
||||
#define STRUCT_END(...)
|
||||
|
||||
#if !defined(KMPP_OBJ_ACCESS_DISABLE)
|
||||
/* object element access functions */
|
||||
KMPP_OBJ_ENTRY_TABLE(KMPP_OBJ_NAME, ENTRY_TO_FUNC, STRUCT_TO_FUNC,
|
||||
EHOOK_TO_FUNC, SHOOK_TO_FUNC, ENTRY_NOTHING)
|
||||
|
||||
#if !defined(KMPP_OBJ_FUNC_EXPORT_DISABLE) && defined(__KERNEL__)
|
||||
#define KMPP_OBJ_EXPORT(prefix, ftype, type, name, flag, ...) \
|
||||
EXPORT_SYMBOL(CONCAT_US(prefix, get, __VA_ARGS__)); \
|
||||
EXPORT_SYMBOL(CONCAT_US(prefix, set, __VA_ARGS__));
|
||||
|
||||
#define KMPP_OBJ_EXPORT_NONE(prefix, ftype, type, name, flag, ...)
|
||||
|
||||
KMPP_OBJ_ENTRY_TABLE(KMPP_OBJ_NAME, KMPP_OBJ_EXPORT, KMPP_OBJ_EXPORT,
|
||||
KMPP_OBJ_EXPORT, KMPP_OBJ_EXPORT, KMPP_OBJ_EXPORT_NONE)
|
||||
#undef KMPP_OBJ_EXPORT
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* restore layout definition */
|
||||
#undef CFG_DEF_START
|
||||
#undef CFG_DEF_END
|
||||
#undef STRUCT_START
|
||||
#undef STRUCT_END
|
||||
|
||||
|
||||
#undef KMPP_OBJ_TO_STR
|
||||
#undef KMPP_OBJ_DEF
|
||||
|
||||
#undef KMPP_OBJ_DEF_NAME
|
||||
#undef KMPP_OBJ_NAME
|
||||
#undef KMPP_OBJ_INTF_TYPE
|
||||
#undef KMPP_OBJ_IMPL_TYPE
|
||||
#undef KMPP_OBJ_EXTRA_SIZE
|
||||
#undef KMPP_OBJ_ENTRY_TABLE
|
||||
#undef KMPP_OBJ_ENTRY_RO_TABLE
|
||||
#undef KMPP_OBJ_STRUCT_TABLE
|
||||
#undef KMPP_OBJ_ENTRY_TABLE2
|
||||
#undef KMPP_OBJ_STRUCT_TABLE2
|
||||
#undef KMPP_OBJ_FUNC_INIT
|
||||
#undef KMPP_OBJ_FUNC_DEINIT
|
||||
#undef KMPP_OBJ_FUNC_IOCTL
|
||||
#undef KMPP_OBJ_FUNC_DUMP
|
||||
#undef KMPP_OBJ_FUNC_EXPORT_DISABLE
|
||||
#undef KMPP_OBJ_ACCESS_DISABLE
|
||||
#undef KMPP_OBJ_SHARE_DISABLE
|
||||
#undef KMPP_OBJ_HIERARCHY_ENABLE
|
||||
|
||||
#undef KMPP_OBJ_FUNC2
|
||||
#undef KMPP_OBJ_FUNC3
|
||||
#undef KMPP_OBJ_FUNC4
|
||||
#undef KMPP_OBJ_ENTRY_FUNC
|
||||
#undef KMPP_OBJ_ENTRY_RO_FUNC
|
||||
#undef KMPP_OBJ_ENTRY_FUNC2
|
||||
#undef KMPP_OBJ_STRUCT_FUNC
|
||||
#undef KMPP_OBJ_STRUCT_FUNC2
|
||||
#undef KMPP_OBJ_ADD_IOCTL
|
||||
/* undef tmp macro */
|
||||
#undef FLAG_TYPE_TO_OFFSET
|
||||
#undef ENTRY_TO_TRIE
|
||||
#undef ENTRY_TO_FUNC
|
||||
#undef ENTRY_NOTHING
|
||||
#undef STRUCT_TO_FUNC
|
||||
#undef EHOOK_TO_FUNC
|
||||
#undef SHOOK_TO_FUNC
|
||||
#undef VAL_ENTRY_TBL
|
||||
#undef VAL_HOOK_IDX
|
||||
#undef ENTRY_QUERY
|
||||
#undef HOOK_QUERY
|
||||
|
||||
#undef __KMPP_OBJ_HERLPER_H__
|
||||
#undef __OBJECT_HERLPER_H__
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* __KMPP_OBJ_HERLPER_H__ */
|
||||
|
|
|
|||
44
kmpp/base/inc/kmpp_obj_macro.h
Normal file
44
kmpp/base/inc/kmpp_obj_macro.h
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
/* SPDX-License-Identifier: Apache-2.0 OR MIT */
|
||||
/*
|
||||
* Copyright (c) 2024 Rockchip Electronics Co., Ltd.
|
||||
*/
|
||||
|
||||
#ifndef __KMPP_OBJ_MACRO_H__
|
||||
#define __KMPP_OBJ_MACRO_H__
|
||||
|
||||
#define TO_STR(x) #x
|
||||
|
||||
/* concat by underscore */
|
||||
#define CONCAT_US1(a) a
|
||||
#define CONCAT_US2(a,b) a##_##b
|
||||
#define CONCAT_US3(a,b,c) a##_##b##_##c
|
||||
#define CONCAT_US4(a,b,c,d) a##_##b##_##c##_##d
|
||||
#define CONCAT_US5(a,b,c,d,e) a##_##b##_##c##_##d##_##e
|
||||
#define CONCAT_US6(a,b,c,d,e,f) a##_##b##_##c##_##d##_##e##_##f
|
||||
|
||||
#define CONCAT_US_HELPER(_1, _2, _3, _4, _5, _6, NAME, ...) NAME
|
||||
#define CONCAT_US(...) CONCAT_US_HELPER(__VA_ARGS__, CONCAT_US6, CONCAT_US5, CONCAT_US4, CONCAT_US3, CONCAT_US2, CONCAT_US1)(__VA_ARGS__)
|
||||
|
||||
/* concat by dot */
|
||||
#define CONCAT_DOT1(a) a
|
||||
#define CONCAT_DOT2(a,b) a.b
|
||||
#define CONCAT_DOT3(a,b,c) a.b.c
|
||||
#define CONCAT_DOT4(a,b,c,d) a.b.c.d
|
||||
#define CONCAT_DOT5(a,b,c,d,e) a.b.c.d.e
|
||||
#define CONCAT_DOT6(a,b,c,d,e,f) a.b.c.d.e.f
|
||||
|
||||
#define CONCAT_DOT_HELPER(_1, _2, _3, _4, _5, _6, NAME, ...) NAME
|
||||
#define CONCAT_DOT(...) CONCAT_DOT_HELPER(__VA_ARGS__, CONCAT_DOT6, CONCAT_DOT5, CONCAT_DOT4, CONCAT_DOT3, CONCAT_DOT2, CONCAT_DOT1)(__VA_ARGS__)
|
||||
|
||||
/* concat to string connect with colon */
|
||||
#define CONCAT_STR1(a) TO_STR(a)
|
||||
#define CONCAT_STR2(a,b) TO_STR(a:b)
|
||||
#define CONCAT_STR3(a,b,c) TO_STR(a:b:c)
|
||||
#define CONCAT_STR4(a,b,c,d) TO_STR(a:b:c:d)
|
||||
#define CONCAT_STR5(a,b,c,d,e) TO_STR(a:b:c:d:e)
|
||||
#define CONCAT_STR6(a,b,c,d,e,f) TO_STR(a:b:c:d:e:f)
|
||||
|
||||
#define CONCAT_STR_HELPER(_1, _2, _3, _4, _5, _6, NAME, ...) NAME
|
||||
#define CONCAT_STR(...) CONCAT_STR_HELPER(__VA_ARGS__, CONCAT_STR6, CONCAT_STR5, CONCAT_STR4, CONCAT_STR3, CONCAT_STR2, CONCAT_STR1)(__VA_ARGS__)
|
||||
|
||||
#endif /* __KMPP_OBJ_MACRO_H__ */
|
||||
|
|
@ -10,6 +10,6 @@
|
|||
#define KMPP_OBJ_NAME kmpp_frame
|
||||
#define KMPP_OBJ_INTF_TYPE KmppFrame
|
||||
#define KMPP_OBJ_IMPL_TYPE KmppFrameImpl
|
||||
#define KMPP_OBJ_SGLN_ID MPP_SGLN_FRAME
|
||||
#define KMPP_OBJ_ENTRY_TABLE KMPP_FRAME_ENTRY_TABLE
|
||||
#define KMPP_OBJ_STRUCT_TABLE KMPP_FRAME_STRUCT_TABLE
|
||||
#include "kmpp_obj_helper.h"
|
||||
|
|
|
|||
|
|
@ -151,12 +151,53 @@ typedef enum ElemType_e {
|
|||
ELEM_TYPE_BUTT = 0xf,
|
||||
} ElemType;
|
||||
|
||||
/* element update flag type */
|
||||
#define ELEM_FLAG_OP_SHIFT 8
|
||||
#define ELEM_FLAG_IDX_MASK ((1 << ELEM_FLAG_OP_SHIFT) - 1)
|
||||
/*
|
||||
* element update flag bits usage:
|
||||
* bit 0 - 7 record / replay operation index bit
|
||||
* bit 8 - 9 record / replay operation bit
|
||||
* bit 10 - 11 update flag update operation invalid / start / update / hold
|
||||
*/
|
||||
typedef enum ElemFlagType_e {
|
||||
ELEM_FLAG_NONE, /* element without update flag */
|
||||
ELEM_FLAG_START, /* element update flag will align to new 32bit */
|
||||
ELEM_FLAG_UPDATE, /* element flag increase by one */
|
||||
ELEM_FLAG_HOLD, /* element flag equal to previous one */
|
||||
/* element without update flag (not available) */
|
||||
ELEM_FLAG_NONE = (1 << ELEM_FLAG_OP_SHIFT),
|
||||
/* element update flag will align to new 32bit */
|
||||
ELEM_FLAG_START = (2 << ELEM_FLAG_OP_SHIFT),
|
||||
/* element flag increase by one */
|
||||
ELEM_FLAG_UPDATE = (3 << ELEM_FLAG_OP_SHIFT),
|
||||
/* element flag equal to previous one */
|
||||
ELEM_FLAG_HOLD = (4 << ELEM_FLAG_OP_SHIFT),
|
||||
ELEM_FLAG_OP_MASK = (7 << ELEM_FLAG_OP_SHIFT),
|
||||
|
||||
/* index for record element update flag */
|
||||
ELEM_FLAG_RECORD = (8 << ELEM_FLAG_OP_SHIFT),
|
||||
ELEM_FLAG_RECORD_0 = (ELEM_FLAG_RECORD + 0),
|
||||
ELEM_FLAG_RECORD_1 = (ELEM_FLAG_RECORD + 1),
|
||||
ELEM_FLAG_RECORD_2 = (ELEM_FLAG_RECORD + 2),
|
||||
ELEM_FLAG_RECORD_3 = (ELEM_FLAG_RECORD + 3),
|
||||
ELEM_FLAG_RECORD_4 = (ELEM_FLAG_RECORD + 4),
|
||||
ELEM_FLAG_RECORD_5 = (ELEM_FLAG_RECORD + 5),
|
||||
ELEM_FLAG_RECORD_6 = (ELEM_FLAG_RECORD + 6),
|
||||
ELEM_FLAG_RECORD_7 = (ELEM_FLAG_RECORD + 7),
|
||||
ELEM_FLAG_RECORD_8 = (ELEM_FLAG_RECORD + 8),
|
||||
ELEM_FLAG_RECORD_9 = (ELEM_FLAG_RECORD + 9),
|
||||
ELEM_FLAG_RECORD_BUT,
|
||||
ELEM_FLAG_RECORD_MAX = (ELEM_FLAG_RECORD_BUT - ELEM_FLAG_RECORD),
|
||||
|
||||
/* index for replay element update flag */
|
||||
ELEM_FLAG_REPLAY = (16 << ELEM_FLAG_OP_SHIFT),
|
||||
ELEM_FLAG_REPLAY_0 = (ELEM_FLAG_REPLAY + 0),
|
||||
ELEM_FLAG_REPLAY_1 = (ELEM_FLAG_REPLAY + 1),
|
||||
ELEM_FLAG_REPLAY_2 = (ELEM_FLAG_REPLAY + 2),
|
||||
ELEM_FLAG_REPLAY_3 = (ELEM_FLAG_REPLAY + 3),
|
||||
ELEM_FLAG_REPLAY_4 = (ELEM_FLAG_REPLAY + 4),
|
||||
ELEM_FLAG_REPLAY_5 = (ELEM_FLAG_REPLAY + 5),
|
||||
ELEM_FLAG_REPLAY_6 = (ELEM_FLAG_REPLAY + 6),
|
||||
ELEM_FLAG_REPLAY_7 = (ELEM_FLAG_REPLAY + 7),
|
||||
ELEM_FLAG_REPLAY_8 = (ELEM_FLAG_REPLAY + 8),
|
||||
ELEM_FLAG_REPLAY_9 = (ELEM_FLAG_REPLAY + 9),
|
||||
ELEM_FLAG_REPLAY_BUT,
|
||||
} ElemFlagType;
|
||||
|
||||
typedef union KmppEntry_u {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue