diff --git a/kmpp/base/inc/kmpp_frame.h b/kmpp/base/inc/kmpp_frame.h index def35684..e1d8ff6a 100644 --- a/kmpp/base/inc/kmpp_frame.h +++ b/kmpp/base/inc/kmpp_frame.h @@ -9,28 +9,28 @@ #include "mpp_frame.h" #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) + ENTRY(prefix, u32, rk_u32, width, FLAG_NONE, width) \ + ENTRY(prefix, u32, rk_u32, height, FLAG_NONE, height) \ + ENTRY(prefix, u32, rk_u32, hor_stride, FLAG_NONE, hor_stride) \ + ENTRY(prefix, u32, rk_u32, ver_stride, FLAG_NONE, ver_stride) \ + ENTRY(prefix, u32, rk_u32, hor_stride_pixel, FLAG_NONE, hor_stride_pixel) \ + ENTRY(prefix, u32, rk_u32, offset_x, FLAG_NONE, offset_x) \ + ENTRY(prefix, u32, rk_u32, offset_y, FLAG_NONE, offset_y) \ + ENTRY(prefix, u32, rk_u32, poc, FLAG_NONE, poc) \ + ENTRY(prefix, s64, rk_s64, pts, FLAG_NONE, pts) \ + ENTRY(prefix, s64, rk_s64, dts, FLAG_NONE, dts) \ + ENTRY(prefix, u32, rk_u32, eos, FLAG_NONE, eos) \ + ENTRY(prefix, u32, rk_u32, color_range, FLAG_NONE, color_range) \ + ENTRY(prefix, u32, rk_u32, color_primaries, FLAG_NONE, color_primaries) \ + ENTRY(prefix, u32, rk_u32, color_trc, FLAG_NONE, color_trc) \ + ENTRY(prefix, u32, rk_u32, colorspace, FLAG_NONE, colorspace) \ + ENTRY(prefix, u32, rk_u32, chroma_location, FLAG_NONE, chroma_location) \ + ENTRY(prefix, u32, rk_u32, fmt, FLAG_NONE, fmt) \ + ENTRY(prefix, u32, rk_u32, buf_size, FLAG_NONE, buf_size) \ + ENTRY(prefix, u32, rk_u32, is_gray, FLAG_NONE, is_gray) \ + STRCT(prefix, shm, KmppShmPtr, meta, FLAG_NONE, meta) \ + STRCT(prefix, shm, KmppShmPtr, buffer, FLAG_NONE, buffer) \ + STRCT(prefix, st, MppFrameRational, sar, FLAG_NONE, sar) #ifdef __cplusplus extern "C" { diff --git a/kmpp/base/inc/kmpp_obj_helper.h b/kmpp/base/inc/kmpp_obj_helper.h index 36eb8e58..b4d5ebc9 100644 --- a/kmpp/base/inc/kmpp_obj_helper.h +++ b/kmpp/base/inc/kmpp_obj_helper.h @@ -60,7 +60,7 @@ .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), \ + .tbl.flag_offset = FLAG_TYPE_TO_OFFSET(name, flag, #flag), \ }; \ kmpp_objdef_add_entry(KMPP_OBJ_DEF(prefix), ENTRY_TO_NAME_START(name), &tbl); \ ENTRY_TO_NAME_END(name); \ @@ -205,13 +205,10 @@ #define ENTRY_TO_NAME_START(name, ...) TO_STR(name) #define ENTRY_TO_NAME_END(...) -#include - -#include "mpp_debug.h" -#include "kmpp_obj.h" - /* object definition common functions */ static KmppObjDef KMPP_OBJ_DEF(KMPP_OBJ_NAME) = NULL; +static rk_u32 KMPP_OBJ_DEF_DEUBG(KMPP_OBJ_NAME) = 0; + /* globla variable definitions */ KMPP_OBJ_ENTRY_TABLE(KMPP_OBJ_NAME, VAL_ENTRY_TBL, VAL_ENTRY_TBL, VAL_HOOK_IDX, VAL_HOOK_IDX, ENTRY_NOTHING) @@ -259,13 +256,19 @@ 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_step = 0; + rk_s32 __flag_prev = 0; rk_s32 __flag_record[ELEM_FLAG_RECORD_MAX]; (void) __flag_base; + (void) __flag_step; + (void) __flag_prev; (void) __flag_record; - mpp_logd_f("enter\n"); + mpp_env_get_u32(TO_STR(CONCAT_US(KMPP_OBJ_NAME, debug)), &KMPP_OBJ_DEF_DEUBG(KMPP_OBJ_NAME), 1); - kmpp_objdef_register(&KMPP_OBJ_DEF(KMPP_OBJ_NAME), impl_size, KMPP_OBJ_DEF_NAME(KMPP_OBJ_INTF_TYPE)); + KMPP_OBJ_DBG_LOG("register enter\n"); + + kmpp_objdef_register(&KMPP_OBJ_DEF(KMPP_OBJ_NAME), impl_size, TO_STR(KMPP_OBJ_INTF_TYPE)); if (!KMPP_OBJ_DEF(KMPP_OBJ_NAME)) { mpp_loge_f(TO_STR(KMPP_OBJ_NAME) " init failed\n"); return; @@ -292,18 +295,18 @@ void CONCAT_US(KMPP_OBJ_NAME, register)(void) #if !defined(KMPP_OBJ_SHARE_DISABLE) && defined(__KERNEL__) kmpp_objdef_share(KMPP_OBJ_DEF(KMPP_OBJ_NAME)); #endif - mpp_logd_f("leave\n"); + KMPP_OBJ_DBG_LOG("register leave\n"); } void CONCAT_US(KMPP_OBJ_NAME, unregister)(void) { KmppObjDef def = __sync_fetch_and_and(&KMPP_OBJ_DEF(KMPP_OBJ_NAME), NULL); + KMPP_OBJ_DBG_LOG("unregister enter\n"); kmpp_objdef_unregister(def); + KMPP_OBJ_DBG_LOG("unregister leave\n"); } -#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) diff --git a/kmpp/base/inc/kmpp_obj_macro.h b/kmpp/base/inc/kmpp_obj_macro.h index ff6945a0..7147c339 100644 --- a/kmpp/base/inc/kmpp_obj_macro.h +++ b/kmpp/base/inc/kmpp_obj_macro.h @@ -6,6 +6,14 @@ #ifndef __KMPP_OBJ_MACRO_H__ #define __KMPP_OBJ_MACRO_H__ +#include + +#include "mpp_env.h" +#include "mpp_debug.h" +#include "mpp_singleton.h" + +#include "kmpp_obj.h" + #define TO_STR(x) #x /* concat by underscore */ @@ -43,7 +51,8 @@ /* objdef struct name */ #define KMPP_OBJ_DEF(x) CONCAT_US(x, def) -#define KMPP_OBJ_DEF_NAME(x) TO_STR(x) +#define KMPP_OBJ_DEF_DEUBG(x) CONCAT_US(x, debug) +#define KMPP_OBJ_DBG_LOG(...) mpp_logi_c(KMPP_OBJ_DEF_DEUBG(KMPP_OBJ_NAME), __VA_ARGS__) /* * element update flag bits usage: @@ -51,74 +60,98 @@ * bit 8 - 9 record / replay operation bit * bit 10 - 11 update flag update operation invalid / start / update / hold */ +typedef union ElemFlagDef_u { + rk_u32 val; + struct { + rk_u32 idx : 8; + rk_u32 slot : 4; + rk_u32 op : 4; + rk_u32 record : 1; + rk_u32 replay : 1; + rk_u32 reserved : 10; + }; +} ElemFlagDef; + #define ELEM_FLAG_OP_SHIFT 8 #define ELEM_FLAG_IDX_MASK ((1 << ELEM_FLAG_OP_SHIFT) - 1) typedef enum ElemFlagType_e { /* element without update flag (not available) */ - ELEM_FLAG_NONE = (1 << ELEM_FLAG_OP_SHIFT), + ELEM_FLAG_NONE, /* element update flag will align to new 32bit */ - ELEM_FLAG_START = (2 << ELEM_FLAG_OP_SHIFT), + ELEM_FLAG_START, /* element flag align up to 64bit */ - ELEM_FLAG_START64 = (3 << ELEM_FLAG_OP_SHIFT), + ELEM_FLAG_START64, /* element flag increase by one */ - ELEM_FLAG_UPDATE = (4 << ELEM_FLAG_OP_SHIFT), + ELEM_FLAG_OFFSET, + /* element flag increase by one */ + ELEM_FLAG_INCR, /* element flag equal to previous one */ - ELEM_FLAG_HOLD = (5 << ELEM_FLAG_OP_SHIFT), - ELEM_FLAG_OP_MASK = (7 << ELEM_FLAG_OP_SHIFT), + ELEM_FLAG_PREV, - /* 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, + ELEM_FLAG_RECORD_MAX = 16, } ElemFlagType; +#define FLAG_NONE ((0 & 0xff) | ((0 & 0xf) << 8) | (ELEM_FLAG_NONE << 12) | (0 << 16) | (0 << 17)) +#define FLAG_BASE(x) ((0 & 0xff) | ((0 & 0xf) << 8) | (ELEM_FLAG_START << 12) | (0 << 16) | (0 << 17)) +#define FLAG_AT(x) ((x & 0xff) | ((0 & 0xf) << 8) | (ELEM_FLAG_OFFSET << 12) | (0 << 16) | (0 << 17)) +#define FLAG_INCR ((0 & 0xff) | ((0 & 0xf) << 8) | (ELEM_FLAG_INCR << 12) | (0 << 16) | (0 << 17)) +#define FLAG_PREV ((0 & 0xff) | ((0 & 0xf) << 8) | (ELEM_FLAG_PREV << 12) | (0 << 16) | (0 << 17)) +#define FLAG_REC(s, x) ((x & 0xff) | ((s & 0xf) << 8) | (ELEM_FLAG_OFFSET << 12) | (1 << 16) | (0 << 17)) +#define FLAG_REC_INC(s) ((0 & 0xff) | ((s & 0xf) << 8) | (ELEM_FLAG_INCR << 12) | (1 << 16) | (0 << 17)) +#define FLAG_REPLAY(s) ((0 & 0xff) | ((s & 0xf) << 8) | (ELEM_FLAG_OFFSET << 12) | (0 << 16) | (1 << 17)) + /* macro for register structure update flag type to offset */ -#define FLAG_TYPE_TO_OFFSET(flag) \ +#define FLAG_TYPE_TO_OFFSET(name, flag, flag_str) \ ({ \ + ElemFlagDef __flag = { .val = flag, }; \ rk_u16 __offset; \ - rk_u32 __flag = flag; \ - 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_START64 : __flag_base = ((__flag_base + 63) & (~63)); __offset = __flag_base; break; \ - case ELEM_FLAG_UPDATE : __offset = ++__flag_base; break; \ - case ELEM_FLAG_HOLD : __offset = __flag_base; break; \ - default : __offset = 0; break; \ + switch (__flag.op) { \ + case ELEM_FLAG_START : { \ + /* NOTE: increase to next 32bit */ \ + if (__flag_prev > __flag_base) \ + __flag_base = (__flag_prev + 31) & (~31); \ + else if (__flag_prev == __flag_base) \ + __flag_base = ((__flag_base + 32) & (~31)); \ + __flag_step = 0; \ + __offset = __flag_prev = __flag_base; \ + } break; \ + case ELEM_FLAG_START64 : { \ + /* NOTE: increase to next 64bit */ \ + if (__flag_prev > __flag_base) \ + __flag_base = (__flag_prev + 63) & (~63); \ + else if (__flag_prev == __flag_base) \ + __flag_base = ((__flag_base + 64) & (~63)); \ + __flag_step = 0; \ + __offset = __flag_prev = __flag_base; \ + } break; \ + case ELEM_FLAG_OFFSET : { \ + /* define offset to the base */ \ + __offset = __flag_prev = __flag_base + __flag.idx; \ + if (__flag.idx > __flag_step) \ + __flag_step = __flag.idx; \ + } break; \ + case ELEM_FLAG_INCR : { \ + /* increase from the max step */ \ + __flag_step++; \ + __offset = __flag_prev = __flag_base + __flag_step; \ + } break; \ + case ELEM_FLAG_PREV : { \ + __offset = __flag_prev; \ + } 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]; \ - } \ + if (__flag.record) { \ + __flag_record[__flag.slot] = __offset; \ } \ + if (__flag.replay) { \ + __offset = __flag_record[__flag.slot]; \ + } \ + KMPP_OBJ_DBG_LOG("%-20s - (%x:%x:%02x) -> %#4x (%2d) - %s\n", \ + TO_STR(name), __flag_base, __flag_prev, __flag_step, \ + __offset, __offset ? __offset - __flag_base : 0, flag_str); \ __offset; \ })