xref: /rockchip-linux_mpp/inc/mpp_meta.h (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2*437bfbebSnyanmisaka /*
3*437bfbebSnyanmisaka  * Copyright (c) 2015 Rockchip Electronics Co., Ltd.
4*437bfbebSnyanmisaka  */
5*437bfbebSnyanmisaka 
6*437bfbebSnyanmisaka #ifndef __MPP_META_H__
7*437bfbebSnyanmisaka #define __MPP_META_H__
8*437bfbebSnyanmisaka 
9*437bfbebSnyanmisaka #include <stdint.h>
10*437bfbebSnyanmisaka #include "rk_type.h"
11*437bfbebSnyanmisaka 
12*437bfbebSnyanmisaka #define FOURCC_META(a, b, c, d) ((RK_U32)(a) << 24  | \
13*437bfbebSnyanmisaka                                 ((RK_U32)(b) << 16) | \
14*437bfbebSnyanmisaka                                 ((RK_U32)(c) << 8)  | \
15*437bfbebSnyanmisaka                                 ((RK_U32)(d) << 0))
16*437bfbebSnyanmisaka 
17*437bfbebSnyanmisaka /*
18*437bfbebSnyanmisaka  * Mpp Metadata definition
19*437bfbebSnyanmisaka  *
20*437bfbebSnyanmisaka  * Metadata is for information transmision in mpp.
21*437bfbebSnyanmisaka  * Mpp task will contain two meta data:
22*437bfbebSnyanmisaka  *
23*437bfbebSnyanmisaka  * 1. Data flow metadata
24*437bfbebSnyanmisaka  *    This metadata contains information of input / output data flow. For example
25*437bfbebSnyanmisaka  *    A. decoder input side task the input packet must be defined and output frame
26*437bfbebSnyanmisaka  *    may not be defined. Then decoder will try malloc or use committed buffer to
27*437bfbebSnyanmisaka  *    complete decoding.
28*437bfbebSnyanmisaka  *    B. decoder output side task
29*437bfbebSnyanmisaka  *
30*437bfbebSnyanmisaka  *
31*437bfbebSnyanmisaka  * 2. Flow control metadata
32*437bfbebSnyanmisaka  *
33*437bfbebSnyanmisaka  */
34*437bfbebSnyanmisaka typedef enum MppMetaKey_e {
35*437bfbebSnyanmisaka     /* data flow key */
36*437bfbebSnyanmisaka     KEY_INPUT_FRAME             = FOURCC_META('i', 'f', 'r', 'm'),
37*437bfbebSnyanmisaka     KEY_INPUT_PACKET            = FOURCC_META('i', 'p', 'k', 't'),
38*437bfbebSnyanmisaka     KEY_OUTPUT_FRAME            = FOURCC_META('o', 'f', 'r', 'm'),
39*437bfbebSnyanmisaka     KEY_OUTPUT_PACKET           = FOURCC_META('o', 'p', 'k', 't'),
40*437bfbebSnyanmisaka     /* output motion information for motion detection */
41*437bfbebSnyanmisaka     KEY_MOTION_INFO             = FOURCC_META('m', 'v', 'i', 'f'),
42*437bfbebSnyanmisaka     KEY_HDR_INFO                = FOURCC_META('h', 'd', 'r', ' '),
43*437bfbebSnyanmisaka     KEY_HDR_META_OFFSET         = FOURCC_META('h', 'd', 'r', 'o'),
44*437bfbebSnyanmisaka     KEY_HDR_META_SIZE           = FOURCC_META('h', 'd', 'r', 'l'),
45*437bfbebSnyanmisaka 
46*437bfbebSnyanmisaka     /* flow control key */
47*437bfbebSnyanmisaka     KEY_INPUT_BLOCK             = FOURCC_META('i', 'b', 'l', 'k'),
48*437bfbebSnyanmisaka     KEY_OUTPUT_BLOCK            = FOURCC_META('o', 'b', 'l', 'k'),
49*437bfbebSnyanmisaka     KEY_INPUT_IDR_REQ           = FOURCC_META('i', 'i', 'd', 'r'),   /* input idr frame request flag */
50*437bfbebSnyanmisaka     KEY_OUTPUT_INTRA            = FOURCC_META('o', 'i', 'd', 'r'),   /* output intra frame indicator */
51*437bfbebSnyanmisaka 
52*437bfbebSnyanmisaka     /* mpp_frame / mpp_packet meta data info key */
53*437bfbebSnyanmisaka     KEY_TEMPORAL_ID             = FOURCC_META('t', 'l', 'i', 'd'),
54*437bfbebSnyanmisaka     KEY_LONG_REF_IDX            = FOURCC_META('l', 't', 'i', 'd'),
55*437bfbebSnyanmisaka     KEY_ENC_AVERAGE_QP          = FOURCC_META('a', 'v', 'g', 'q'),
56*437bfbebSnyanmisaka     KEY_ENC_START_QP            = FOURCC_META('s', 't', 'r', 'q'),
57*437bfbebSnyanmisaka     KEY_ENC_BPS_RT              = FOURCC_META('r', 't', 'b', 'r'),   /* realtime bps */
58*437bfbebSnyanmisaka     KEY_ROI_DATA                = FOURCC_META('r', 'o', 'i', ' '),
59*437bfbebSnyanmisaka     KEY_JPEG_ROI_DATA           = FOURCC_META('j', 'r', 'o', 'i'),
60*437bfbebSnyanmisaka     KEY_OSD_DATA                = FOURCC_META('o', 's', 'd', ' '),
61*437bfbebSnyanmisaka     KEY_OSD_DATA2               = FOURCC_META('o', 's', 'd', '2'),
62*437bfbebSnyanmisaka     KEY_OSD_DATA3               = FOURCC_META('o', 's', 'd', '3'),
63*437bfbebSnyanmisaka     KEY_USER_DATA               = FOURCC_META('u', 's', 'r', 'd'),
64*437bfbebSnyanmisaka     KEY_USER_DATAS              = FOURCC_META('u', 'r', 'd', 's'),
65*437bfbebSnyanmisaka 
66*437bfbebSnyanmisaka     /* num of inter different size predicted block */
67*437bfbebSnyanmisaka     KEY_LVL64_INTER_NUM         = FOURCC_META('l', '6', '4', 'p'),
68*437bfbebSnyanmisaka     KEY_LVL32_INTER_NUM         = FOURCC_META('l', '3', '2', 'p'),
69*437bfbebSnyanmisaka     KEY_LVL16_INTER_NUM         = FOURCC_META('l', '1', '6', 'p'),
70*437bfbebSnyanmisaka     KEY_LVL8_INTER_NUM          = FOURCC_META('l', '8', 'p', ' '),
71*437bfbebSnyanmisaka     /* num of intra different size predicted block */
72*437bfbebSnyanmisaka     KEY_LVL32_INTRA_NUM         = FOURCC_META('l', '3', '2', 'i'),
73*437bfbebSnyanmisaka     KEY_LVL16_INTRA_NUM         = FOURCC_META('l', '1', '6', 'i'),
74*437bfbebSnyanmisaka     KEY_LVL8_INTRA_NUM          = FOURCC_META('l', '8', 'i', ' '),
75*437bfbebSnyanmisaka     KEY_LVL4_INTRA_NUM          = FOURCC_META('l', '4', 'i', ' '),
76*437bfbebSnyanmisaka     /* output P skip frame indicator */
77*437bfbebSnyanmisaka     KEY_OUTPUT_PSKIP            = FOURCC_META('o', 'p', 's', 'p'),
78*437bfbebSnyanmisaka     /*
79*437bfbebSnyanmisaka      * Input P-skip frame request
80*437bfbebSnyanmisaka      * KEY_INPUT_PSKIP: The skip frame will be referenced in the next frame.
81*437bfbebSnyanmisaka      * KEY_INPUT_PSKIP_NON_REF: The skip frame will not be referenced as a frame.
82*437bfbebSnyanmisaka      */
83*437bfbebSnyanmisaka     KEY_INPUT_PSKIP             = FOURCC_META('i', 'p', 's', 'p'),
84*437bfbebSnyanmisaka     KEY_INPUT_PSKIP_NON_REF     = FOURCC_META('i', 'p', 'n', 'r'),
85*437bfbebSnyanmisaka     KEY_ENC_SSE                 = FOURCC_META('e', 's', 's', 'e'),
86*437bfbebSnyanmisaka 
87*437bfbebSnyanmisaka     /*
88*437bfbebSnyanmisaka      * For vepu580 roi buffer config mode
89*437bfbebSnyanmisaka      * The encoder roi structure is so complex that we should provide a buffer
90*437bfbebSnyanmisaka      * tunnel for externl user to config encoder hardware by direct sending
91*437bfbebSnyanmisaka      * roi data buffer.
92*437bfbebSnyanmisaka      * This way can reduce the config parsing and roi buffer data generating
93*437bfbebSnyanmisaka      * overhead in mpp.
94*437bfbebSnyanmisaka      */
95*437bfbebSnyanmisaka     KEY_ROI_DATA2               = FOURCC_META('r', 'o', 'i', '2'),
96*437bfbebSnyanmisaka 
97*437bfbebSnyanmisaka     /*
98*437bfbebSnyanmisaka      * qpmap for rv1109/1126 encoder qpmap config
99*437bfbebSnyanmisaka      * Input data is a MppBuffer which contains an array of 16bit Vepu541RoiCfg.
100*437bfbebSnyanmisaka      * And each 16bit represents a 16x16 block qp info.
101*437bfbebSnyanmisaka      *
102*437bfbebSnyanmisaka      * H.264 - 16x16 block qp is arranged in raster order:
103*437bfbebSnyanmisaka      * each value is a 16bit data
104*437bfbebSnyanmisaka      * 00 01 02 03 04 05 06 07 -> 00 01 02 03 04 05 06 07
105*437bfbebSnyanmisaka      * 10 11 12 13 14 15 16 17    10 11 12 13 14 15 16 17
106*437bfbebSnyanmisaka      * 20 21 22 23 24 25 26 27    20 21 22 23 24 25 26 27
107*437bfbebSnyanmisaka      * 30 31 32 33 34 35 36 37    30 31 32 33 34 35 36 37
108*437bfbebSnyanmisaka      *
109*437bfbebSnyanmisaka      * H.265 - 16x16 block qp is reorder to 64x64/32x32 ctu order then 64x64 / 32x32 ctu raster order
110*437bfbebSnyanmisaka      * 64x64 ctu
111*437bfbebSnyanmisaka      * 00 01 02 03 04 05 06 07 -> 00 01 02 03 10 11 12 13 20 21 22 23 30 31 32 33 04 05 06 07 14 15 16 17 24 25 26 27 34 35 36 37
112*437bfbebSnyanmisaka      * 10 11 12 13 14 15 16 17
113*437bfbebSnyanmisaka      * 20 21 22 23 24 25 26 27
114*437bfbebSnyanmisaka      * 30 31 32 33 34 35 36 37
115*437bfbebSnyanmisaka      * 32x32 ctu
116*437bfbebSnyanmisaka      * 00 01 02 03 04 05 06 07 -> 00 01 10 11 02 03 12 13 04 05 14 15 06 07 16 17
117*437bfbebSnyanmisaka      * 10 11 12 13 14 15 16 17    20 21 30 31 22 23 32 33 24 25 34 35 26 27 36 37
118*437bfbebSnyanmisaka      * 20 21 22 23 24 25 26 27
119*437bfbebSnyanmisaka      * 30 31 32 33 34 35 36 37
120*437bfbebSnyanmisaka      */
121*437bfbebSnyanmisaka     KEY_QPMAP0                  = FOURCC_META('e', 'q', 'm', '0'),
122*437bfbebSnyanmisaka 
123*437bfbebSnyanmisaka     /*
124*437bfbebSnyanmisaka      * shared memory buffer for object dectection flag from NPU, for rv1126b
125*437bfbebSnyanmisaka      * Picture width is aligned to 16, each 16x16 block is 8bit data.
126*437bfbebSnyanmisaka      * H.264: 16x16 block is arranged in raster order.
127*437bfbebSnyanmisaka      * H.265: 16x16 block is reordered to ctu order then ctu raster order
128*437bfbebSnyanmisaka      */
129*437bfbebSnyanmisaka     KEY_NPU_SOBJ_FLAG           = FOURCC_META('n', 'p', 'u', 's'),
130*437bfbebSnyanmisaka     /* userspace object dectection flag from NPU, for rk3588 and rk3576 */
131*437bfbebSnyanmisaka     KEY_NPU_UOBJ_FLAG           = FOURCC_META('n', 'p', 'u', 'u'),
132*437bfbebSnyanmisaka 
133*437bfbebSnyanmisaka     /*
134*437bfbebSnyanmisaka      * smart v4 encoder input key
135*437bfbebSnyanmisaka      */
136*437bfbebSnyanmisaka     KEY_BUFFER_UPSCALE          = FOURCC_META('u', 'b', 'u', 'f'),
137*437bfbebSnyanmisaka     KEY_BUFFER_DOWNSCALE        = FOURCC_META('d', 'b', 'u', 'f'),
138*437bfbebSnyanmisaka 
139*437bfbebSnyanmisaka     /* frame long-term reference frame operation */
140*437bfbebSnyanmisaka     KEY_ENC_MARK_LTR            = FOURCC_META('m', 'l', 't', 'r'),
141*437bfbebSnyanmisaka     KEY_ENC_USE_LTR             = FOURCC_META('u', 'l', 't', 'r'),
142*437bfbebSnyanmisaka 
143*437bfbebSnyanmisaka     /* MLVEC specified encoder feature  */
144*437bfbebSnyanmisaka     KEY_ENC_FRAME_QP            = FOURCC_META('f', 'r', 'm', 'q'),
145*437bfbebSnyanmisaka     KEY_ENC_BASE_LAYER_PID      = FOURCC_META('b', 'p', 'i', 'd'),
146*437bfbebSnyanmisaka 
147*437bfbebSnyanmisaka     /* Thumbnail info for decoder output frame */
148*437bfbebSnyanmisaka     KEY_DEC_TBN_EN              = FOURCC_META('t', 'b', 'e', 'n'),
149*437bfbebSnyanmisaka     KEY_DEC_TBN_Y_OFFSET        = FOURCC_META('t', 'b', 'y', 'o'),
150*437bfbebSnyanmisaka     KEY_DEC_TBN_UV_OFFSET       = FOURCC_META('t', 'b', 'c', 'o'),
151*437bfbebSnyanmisaka 
152*437bfbebSnyanmisaka     /* combo frame */
153*437bfbebSnyanmisaka     KEY_COMBO_FRAME             = FOURCC_META('c', 'f', 'r', 'm'),
154*437bfbebSnyanmisaka     KEY_CHANNEL_ID              = FOURCC_META('c', 'h', 'a', 'n'),
155*437bfbebSnyanmisaka 
156*437bfbebSnyanmisaka     /* Preprocess (pp) operation metat data */
157*437bfbebSnyanmisaka     /* Motion Detection output buffer */
158*437bfbebSnyanmisaka     KEY_PP_MD_BUF               = FOURCC_META('m', 'd', 'b', 'f'),
159*437bfbebSnyanmisaka     /* Occlusion Detection output buffer */
160*437bfbebSnyanmisaka     KEY_PP_OD_BUF               = FOURCC_META('o', 'd', 'b', 'f'),
161*437bfbebSnyanmisaka     /* pp output data */
162*437bfbebSnyanmisaka     KEY_PP_OUT                  = FOURCC_META('o', 'p', 'p', ' '),
163*437bfbebSnyanmisaka } MppMetaKey;
164*437bfbebSnyanmisaka 
165*437bfbebSnyanmisaka #define mpp_meta_get(meta) mpp_meta_get_with_tag(meta, MODULE_TAG, __FUNCTION__)
166*437bfbebSnyanmisaka 
167*437bfbebSnyanmisaka #include "mpp_frame.h"
168*437bfbebSnyanmisaka #include "mpp_packet.h"
169*437bfbebSnyanmisaka 
170*437bfbebSnyanmisaka #ifdef __cplusplus
171*437bfbebSnyanmisaka extern "C" {
172*437bfbebSnyanmisaka #endif
173*437bfbebSnyanmisaka 
174*437bfbebSnyanmisaka MPP_RET mpp_meta_get_with_tag(MppMeta *meta, const char *tag, const char *caller);
175*437bfbebSnyanmisaka MPP_RET mpp_meta_put(MppMeta meta);
176*437bfbebSnyanmisaka RK_S32  mpp_meta_size(MppMeta meta);
177*437bfbebSnyanmisaka MppMeta mpp_meta_dup(MppMeta meta);
178*437bfbebSnyanmisaka 
179*437bfbebSnyanmisaka MPP_RET mpp_meta_set_s32(MppMeta meta, MppMetaKey key, RK_S32 val);
180*437bfbebSnyanmisaka MPP_RET mpp_meta_set_s64(MppMeta meta, MppMetaKey key, RK_S64 val);
181*437bfbebSnyanmisaka MPP_RET mpp_meta_set_ptr(MppMeta meta, MppMetaKey key, void  *val);
182*437bfbebSnyanmisaka MPP_RET mpp_meta_get_s32(MppMeta meta, MppMetaKey key, RK_S32 *val);
183*437bfbebSnyanmisaka MPP_RET mpp_meta_get_s64(MppMeta meta, MppMetaKey key, RK_S64 *val);
184*437bfbebSnyanmisaka MPP_RET mpp_meta_get_ptr(MppMeta meta, MppMetaKey key, void  **val);
185*437bfbebSnyanmisaka 
186*437bfbebSnyanmisaka MPP_RET mpp_meta_set_frame (MppMeta meta, MppMetaKey key, MppFrame  frame);
187*437bfbebSnyanmisaka MPP_RET mpp_meta_set_packet(MppMeta meta, MppMetaKey key, MppPacket packet);
188*437bfbebSnyanmisaka MPP_RET mpp_meta_set_buffer(MppMeta meta, MppMetaKey key, MppBuffer buffer);
189*437bfbebSnyanmisaka MPP_RET mpp_meta_get_frame (MppMeta meta, MppMetaKey key, MppFrame  *frame);
190*437bfbebSnyanmisaka MPP_RET mpp_meta_get_packet(MppMeta meta, MppMetaKey key, MppPacket *packet);
191*437bfbebSnyanmisaka MPP_RET mpp_meta_get_buffer(MppMeta meta, MppMetaKey key, MppBuffer *buffer);
192*437bfbebSnyanmisaka 
193*437bfbebSnyanmisaka MPP_RET mpp_meta_get_s32_d(MppMeta meta, MppMetaKey key, RK_S32 *val, RK_S32 def);
194*437bfbebSnyanmisaka MPP_RET mpp_meta_get_s64_d(MppMeta meta, MppMetaKey key, RK_S64 *val, RK_S64 def);
195*437bfbebSnyanmisaka MPP_RET mpp_meta_get_ptr_d(MppMeta meta, MppMetaKey key, void  **val, void *def);
196*437bfbebSnyanmisaka MPP_RET mpp_meta_get_frame_d(MppMeta meta, MppMetaKey key, MppFrame *frame, MppFrame def);
197*437bfbebSnyanmisaka MPP_RET mpp_meta_get_packet_d(MppMeta meta, MppMetaKey key, MppPacket *packet, MppPacket def);
198*437bfbebSnyanmisaka MPP_RET mpp_meta_get_buffer_d(MppMeta meta, MppMetaKey key, MppBuffer *buffer, MppBuffer def);
199*437bfbebSnyanmisaka 
200*437bfbebSnyanmisaka #ifdef __cplusplus
201*437bfbebSnyanmisaka }
202*437bfbebSnyanmisaka #endif
203*437bfbebSnyanmisaka 
204*437bfbebSnyanmisaka #endif /*__MPP_META_H__*/
205