hc
2023-12-09 b22da3d8526a935aa31e086e63f60ff3246cb61c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/*
 * Copyright 2020 Rockchip Electronics Co. LTD
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
 
#ifndef __MPP_CFG_H__
#define __MPP_CFG_H__
 
#include "rk_type.h"
#include "mpp_err.h"
 
typedef enum CfgType_e {
    CFG_FUNC_TYPE_S32,
    CFG_FUNC_TYPE_U32,
    CFG_FUNC_TYPE_S64,
    CFG_FUNC_TYPE_U64,
    CFG_FUNC_TYPE_St,
    CFG_FUNC_TYPE_Ptr,
    CFG_FUNC_TYPE_BUTT,
} CfgType;
 
typedef struct MppCfgApi_t {
    const char          *name;
    CfgType             data_type;
    RK_U32              flag_offset;
    RK_U32              flag_value;
    RK_U32              data_offset;
    RK_S32              data_size;
} MppCfgApi;
 
typedef struct MppCfgInfo_t {
    /* size for the whole node including name */
    RK_S32          node_size;
    RK_U32          name_len;
    /* CfgType */
    RK_S32          data_type;
    /* update flag info 32bit */
    RK_S32          flag_offset;
    RK_U32          flag_value;
    /* data access info */
    RK_S32          data_offset;
    RK_S32          data_size;
    /* linked next node offset for pointer type */
    RK_S32          node_next;
    /* function pointer for get / put accessor (user filled) */
    RK_U64          set_func;
    RK_U64          get_func;
    /* reserve for extension */
    RK_U64          stuff[2];
    char            name[];
} MppCfgInfoNode;
 
typedef MPP_RET (*CfgSetS32)(MppCfgInfoNode *info, void *cfg, RK_S32 val);
typedef MPP_RET (*CfgGetS32)(MppCfgInfoNode *info, void *cfg, RK_S32 *val);
typedef MPP_RET (*CfgSetU32)(MppCfgInfoNode *info, void *cfg, RK_U32 val);
typedef MPP_RET (*CfgGetU32)(MppCfgInfoNode *info, void *cfg, RK_U32 *val);
typedef MPP_RET (*CfgSetS64)(MppCfgInfoNode *info, void *cfg, RK_S64 val);
typedef MPP_RET (*CfgGetS64)(MppCfgInfoNode *info, void *cfg, RK_S64 *val);
typedef MPP_RET (*CfgSetU64)(MppCfgInfoNode *info, void *cfg, RK_U64 val);
typedef MPP_RET (*CfgGetU64)(MppCfgInfoNode *info, void *cfg, RK_U64 *val);
typedef MPP_RET (*CfgSetSt) (MppCfgInfoNode *info, void *cfg, void *val);
typedef MPP_RET (*CfgGetSt) (MppCfgInfoNode *info, void *cfg, void *val);
typedef MPP_RET (*CfgSetPtr)(MppCfgInfoNode *info, void *cfg, void *val);
typedef MPP_RET (*CfgGetPtr)(MppCfgInfoNode *info, void *cfg, void **val);
 
#define MPP_CFG_SET_S32(info, cfg, val) (mpp_cfg_ops.fp_SetS32)(info, cfg, val)
#define MPP_CFG_GET_S32(info, cfg, val) (mpp_cfg_ops.fp_GetS32)(info, cfg, (RK_S32 *)(val))
#define MPP_CFG_SET_U32(info, cfg, val) (mpp_cfg_ops.fp_SetU32)(info, cfg, val)
#define MPP_CFG_GET_U32(info, cfg, val) (mpp_cfg_ops.fp_GetU32)(info, cfg, (RK_U32 *)(val))
#define MPP_CFG_SET_S64(info, cfg, val) (mpp_cfg_ops.fp_SetS64)(info, cfg, val)
#define MPP_CFG_GET_S64(info, cfg, val) (mpp_cfg_ops.fp_GetS64)(info, cfg, (RK_S64 *)(val))
#define MPP_CFG_SET_U64(info, cfg, val) (mpp_cfg_ops.fp_SetU64)(info, cfg, val)
#define MPP_CFG_GET_U64(info, cfg, val) (mpp_cfg_ops.fp_GetU64)(info, cfg, (RK_U64 *)(val))
#define MPP_CFG_SET_St(info, cfg, val)  (mpp_cfg_ops.fp_SetSt )(info, cfg, val)
#define MPP_CFG_GET_St(info, cfg, val)  (mpp_cfg_ops.fp_GetSt )(info, cfg, (void *)(val))
#define MPP_CFG_SET_Ptr(info, cfg, val) (mpp_cfg_ops.fp_SetPtr)(info, cfg, val)
#define MPP_CFG_GET_Ptr(info, cfg, val) (mpp_cfg_ops.fp_GetPtr)(info, cfg, (void **)(val))
 
/* header size 128 byte */
typedef struct MppCfgInfoHead_t {
    char            version[112];
    RK_S32          info_size;
    RK_S32          info_count;
    RK_S32          node_count;
    RK_S32          cfg_size;
} MppCfgInfoHead;
 
typedef struct MppCfgOps_t {
    CfgSetS32       fp_SetS32;
    CfgGetS32       fp_GetS32;
    CfgSetU32       fp_SetU32;
    CfgGetU32       fp_GetU32;
    CfgSetS64       fp_SetS64;
    CfgGetS64       fp_GetS64;
    CfgSetU64       fp_SetU64;
    CfgGetU64       fp_GetU64;
    CfgSetSt        fp_SetSt;
    CfgGetSt        fp_GetSt;
    CfgSetPtr       fp_SetPtr;
    CfgGetPtr       fp_GetPtr;
} MppCfgOps;
 
#ifdef  __cplusplus
extern "C" {
#endif
 
extern const char *cfg_type_names[];
 
extern MppCfgOps mpp_cfg_ops;
MPP_RET mpp_cfg_node_fixup_func(MppCfgInfoNode *node);
 
#define CHECK_CFG_INFO(node, name, type) \
    check_cfg_info(node, name, type, __FUNCTION__)
 
MPP_RET check_cfg_info(MppCfgInfoNode *node, const char *name, CfgType type,
                       const char *func);
 
#ifdef  __cplusplus
}
#endif
 
#endif /*__MPP_CFG_H__*/