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