13d0407baSopenharmony_ci/*
23d0407baSopenharmony_ci * Copyright 2015 Rockchip Electronics Co. LTD
33d0407baSopenharmony_ci *
43d0407baSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
53d0407baSopenharmony_ci * you may not use this file except in compliance with the License.
63d0407baSopenharmony_ci * You may obtain a copy of the License at
73d0407baSopenharmony_ci *
83d0407baSopenharmony_ci *      http://www.apache.org/licenses/LICENSE-2.0
93d0407baSopenharmony_ci *
103d0407baSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
113d0407baSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
123d0407baSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133d0407baSopenharmony_ci * See the License for the specific language governing permissions and
143d0407baSopenharmony_ci * limitations under the License.
153d0407baSopenharmony_ci */
163d0407baSopenharmony_ci
173d0407baSopenharmony_ci#ifndef __MPP_META_H__
183d0407baSopenharmony_ci#define __MPP_META_H__
193d0407baSopenharmony_ci
203d0407baSopenharmony_ci#include <stdint.h>
213d0407baSopenharmony_ci#include "rk_type.h"
223d0407baSopenharmony_ci
233d0407baSopenharmony_ci#define FOURCC_META(a, b, c, d) ((RK_U32)(a) << 24  | \
243d0407baSopenharmony_ci                                ((RK_U32)(b) << 16) | \
253d0407baSopenharmony_ci                                ((RK_U32)(c) << 8)  | \
263d0407baSopenharmony_ci                                ((RK_U32)(d) << 0))
273d0407baSopenharmony_ci
283d0407baSopenharmony_ci/*
293d0407baSopenharmony_ci * Mpp Metadata definition
303d0407baSopenharmony_ci *
313d0407baSopenharmony_ci * Metadata is for information transmision in mpp.
323d0407baSopenharmony_ci * Mpp task will contain two meta data:
333d0407baSopenharmony_ci *
343d0407baSopenharmony_ci * 1. Data flow metadata
353d0407baSopenharmony_ci *    This metadata contains information of input / output data flow. For example
363d0407baSopenharmony_ci *    A. decoder input side task the input packet must be defined and output frame
373d0407baSopenharmony_ci *    may not be defined. Then decoder will try malloc or use committed buffer to
383d0407baSopenharmony_ci *    complete decoding.
393d0407baSopenharmony_ci *    B. decoder output side task
403d0407baSopenharmony_ci *
413d0407baSopenharmony_ci *
423d0407baSopenharmony_ci * 2. Flow control metadata
433d0407baSopenharmony_ci *
443d0407baSopenharmony_ci */
453d0407baSopenharmony_citypedef enum MppMetaDataType_e {
463d0407baSopenharmony_ci    /*
473d0407baSopenharmony_ci     * mpp meta data of data flow
483d0407baSopenharmony_ci     * reference counter will be used for these meta data type
493d0407baSopenharmony_ci     */
503d0407baSopenharmony_ci    TYPE_FRAME                  = FOURCC_META('m', 'f', 'r', 'm'),
513d0407baSopenharmony_ci    TYPE_PACKET                 = FOURCC_META('m', 'p', 'k', 't'),
523d0407baSopenharmony_ci    TYPE_BUFFER                 = FOURCC_META('m', 'b', 'u', 'f'),
533d0407baSopenharmony_ci
543d0407baSopenharmony_ci    /* mpp meta data of normal data type */
553d0407baSopenharmony_ci    TYPE_S32                    = FOURCC_META('s', '3', '2', ' '),
563d0407baSopenharmony_ci    TYPE_S64                    = FOURCC_META('s', '6', '4', ' '),
573d0407baSopenharmony_ci    TYPE_PTR                    = FOURCC_META('p', 't', 'r', ' '),
583d0407baSopenharmony_ci} MppMetaType;
593d0407baSopenharmony_ci
603d0407baSopenharmony_citypedef enum MppMetaKey_e {
613d0407baSopenharmony_ci    /* data flow key */
623d0407baSopenharmony_ci    KEY_INPUT_FRAME             = FOURCC_META('i', 'f', 'r', 'm'),
633d0407baSopenharmony_ci    KEY_INPUT_PACKET            = FOURCC_META('i', 'p', 'k', 't'),
643d0407baSopenharmony_ci    KEY_OUTPUT_FRAME            = FOURCC_META('o', 'f', 'r', 'm'),
653d0407baSopenharmony_ci    KEY_OUTPUT_PACKET           = FOURCC_META('o', 'p', 'k', 't'),
663d0407baSopenharmony_ci    /* output motion information for motion detection */
673d0407baSopenharmony_ci    KEY_MOTION_INFO             = FOURCC_META('m', 'v', 'i', 'f'),
683d0407baSopenharmony_ci    KEY_HDR_INFO                = FOURCC_META('h', 'd', 'r', ' '),
693d0407baSopenharmony_ci
703d0407baSopenharmony_ci    /* flow control key */
713d0407baSopenharmony_ci    KEY_INPUT_BLOCK             = FOURCC_META('i', 'b', 'l', 'k'),
723d0407baSopenharmony_ci    KEY_OUTPUT_BLOCK            = FOURCC_META('o', 'b', 'l', 'k'),
733d0407baSopenharmony_ci    KEY_INPUT_IDR_REQ           = FOURCC_META('i', 'i', 'd', 'r'),   /* input idr frame request flag */
743d0407baSopenharmony_ci    KEY_OUTPUT_INTRA            = FOURCC_META('o', 'i', 'd', 'r'),   /* output intra frame indicator */
753d0407baSopenharmony_ci
763d0407baSopenharmony_ci    /* mpp_frame / mpp_packet meta data info key */
773d0407baSopenharmony_ci    KEY_TEMPORAL_ID             = FOURCC_META('t', 'l', 'i', 'd'),
783d0407baSopenharmony_ci    KEY_LONG_REF_IDX            = FOURCC_META('l', 't', 'i', 'd'),
793d0407baSopenharmony_ci    KEY_ENC_AVERAGE_QP          = FOURCC_META('a', 'v', 'g', 'q'),
803d0407baSopenharmony_ci    KEY_ROI_DATA                = FOURCC_META('r', 'o', 'i', ' '),
813d0407baSopenharmony_ci    KEY_OSD_DATA                = FOURCC_META('o', 's', 'd', ' '),
823d0407baSopenharmony_ci    KEY_OSD_DATA2               = FOURCC_META('o', 's', 'd', '2'),
833d0407baSopenharmony_ci    KEY_USER_DATA               = FOURCC_META('u', 's', 'r', 'd'),
843d0407baSopenharmony_ci    KEY_USER_DATAS              = FOURCC_META('u', 'r', 'd', 's'),
853d0407baSopenharmony_ci
863d0407baSopenharmony_ci    /*
873d0407baSopenharmony_ci     * For vepu580 roi buffer config mode
883d0407baSopenharmony_ci     * The encoder roi structure is so complex that we should provide a buffer
893d0407baSopenharmony_ci     * tunnel for externl user to config encoder hardware by direct sending
903d0407baSopenharmony_ci     * roi data buffer.
913d0407baSopenharmony_ci     * This way can reduce the config parsing and roi buffer data generating
923d0407baSopenharmony_ci     * overhead in mpp.
933d0407baSopenharmony_ci     */
943d0407baSopenharmony_ci    KEY_ROI_DATA2               = FOURCC_META('r', 'o', 'i', '2'),
953d0407baSopenharmony_ci
963d0407baSopenharmony_ci    /*
973d0407baSopenharmony_ci     * qpmap for rv1109/1126 encoder qpmap config
983d0407baSopenharmony_ci     * Input data is a MppBuffer which contains an array of 16bit Vepu541RoiCfg.
993d0407baSopenharmony_ci     * And each 16bit represents a 16x16 block qp info.
1003d0407baSopenharmony_ci     *
1013d0407baSopenharmony_ci     * H.264 - 16x16 block qp is arranged in raster order:
1023d0407baSopenharmony_ci     * each value is a 16bit data
1033d0407baSopenharmony_ci     * 00 01 02 03 04 05 06 07 -> 00 01 02 03 04 05 06 07
1043d0407baSopenharmony_ci     * 10 11 12 13 14 15 16 17    10 11 12 13 14 15 16 17
1053d0407baSopenharmony_ci     * 20 21 22 23 24 25 26 27    20 21 22 23 24 25 26 27
1063d0407baSopenharmony_ci     * 30 31 32 33 34 35 36 37    30 31 32 33 34 35 36 37
1073d0407baSopenharmony_ci     *
1083d0407baSopenharmony_ci     * H.265 - 16x16 block qp is reorder to 64x64/32x32 ctu order then 64x64 / 32x32 ctu raster order
1093d0407baSopenharmony_ci     * 64x64 ctu
1103d0407baSopenharmony_ci     * 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
1113d0407baSopenharmony_ci     * 10 11 12 13 14 15 16 17
1123d0407baSopenharmony_ci     * 20 21 22 23 24 25 26 27
1133d0407baSopenharmony_ci     * 30 31 32 33 34 35 36 37
1143d0407baSopenharmony_ci     * 32x32 ctu
1153d0407baSopenharmony_ci     * 00 01 02 03 04 05 06 07 -> 00 01 10 11 02 03 12 13 04 05 14 15 06 07 16 17
1163d0407baSopenharmony_ci     * 10 11 12 13 14 15 16 17    20 21 30 31 22 23 32 33 24 25 34 35 26 27 36 37
1173d0407baSopenharmony_ci     * 20 21 22 23 24 25 26 27
1183d0407baSopenharmony_ci     * 30 31 32 33 34 35 36 37
1193d0407baSopenharmony_ci     */
1203d0407baSopenharmony_ci    KEY_QPMAP0                  = FOURCC_META('e', 'q', 'm', '0'),
1213d0407baSopenharmony_ci
1223d0407baSopenharmony_ci    /* input motion list for smart p rate control */
1233d0407baSopenharmony_ci    KEY_MV_LIST                 = FOURCC_META('m', 'v', 'l', 't'),
1243d0407baSopenharmony_ci
1253d0407baSopenharmony_ci    /* frame long-term reference frame operation */
1263d0407baSopenharmony_ci    KEY_ENC_MARK_LTR            = FOURCC_META('m', 'l', 't', 'r'),
1273d0407baSopenharmony_ci    KEY_ENC_USE_LTR             = FOURCC_META('u', 'l', 't', 'r'),
1283d0407baSopenharmony_ci
1293d0407baSopenharmony_ci    /* MLVEC specified encoder feature  */
1303d0407baSopenharmony_ci    KEY_ENC_FRAME_QP            = FOURCC_META('f', 'r', 'm', 'q'),
1313d0407baSopenharmony_ci    KEY_ENC_BASE_LAYER_PID      = FOURCC_META('b', 'p', 'i', 'd'),
1323d0407baSopenharmony_ci} MppMetaKey;
1333d0407baSopenharmony_ci
1343d0407baSopenharmony_ci#define mpp_meta_get(meta) mpp_meta_get_with_tag(meta, MODULE_TAG, __FUNCTION__)
1353d0407baSopenharmony_ci
1363d0407baSopenharmony_ci#include "mpp_frame.h"
1373d0407baSopenharmony_ci#include "mpp_packet.h"
1383d0407baSopenharmony_ci
1393d0407baSopenharmony_ci#ifdef __cplusplus
1403d0407baSopenharmony_ciextern "C" {
1413d0407baSopenharmony_ci#endif
1423d0407baSopenharmony_ci
1433d0407baSopenharmony_ciMPP_RET mpp_meta_get_with_tag(MppMeta *meta, const char *tag, const char *caller);
1443d0407baSopenharmony_ciMPP_RET mpp_meta_put(MppMeta meta);
1453d0407baSopenharmony_ciRK_S32  mpp_meta_size(MppMeta meta);
1463d0407baSopenharmony_ci
1473d0407baSopenharmony_ciMPP_RET mpp_meta_set_s32(MppMeta meta, MppMetaKey key, RK_S32 val);
1483d0407baSopenharmony_ciMPP_RET mpp_meta_set_s64(MppMeta meta, MppMetaKey key, RK_S64 val);
1493d0407baSopenharmony_ciMPP_RET mpp_meta_set_ptr(MppMeta meta, MppMetaKey key, void  *val);
1503d0407baSopenharmony_ciMPP_RET mpp_meta_get_s32(MppMeta meta, MppMetaKey key, RK_S32 *val);
1513d0407baSopenharmony_ciMPP_RET mpp_meta_get_s64(MppMeta meta, MppMetaKey key, RK_S64 *val);
1523d0407baSopenharmony_ciMPP_RET mpp_meta_get_ptr(MppMeta meta, MppMetaKey key, void  **val);
1533d0407baSopenharmony_ci
1543d0407baSopenharmony_ciMPP_RET mpp_meta_set_frame (MppMeta meta, MppMetaKey key, MppFrame  frame);
1553d0407baSopenharmony_ciMPP_RET mpp_meta_set_packet(MppMeta meta, MppMetaKey key, MppPacket packet);
1563d0407baSopenharmony_ciMPP_RET mpp_meta_set_buffer(MppMeta meta, MppMetaKey key, MppBuffer buffer);
1573d0407baSopenharmony_ciMPP_RET mpp_meta_get_frame (MppMeta meta, MppMetaKey key, MppFrame  *frame);
1583d0407baSopenharmony_ciMPP_RET mpp_meta_get_packet(MppMeta meta, MppMetaKey key, MppPacket *packet);
1593d0407baSopenharmony_ciMPP_RET mpp_meta_get_buffer(MppMeta meta, MppMetaKey key, MppBuffer *buffer);
1603d0407baSopenharmony_ci
1613d0407baSopenharmony_ciMPP_RET mpp_meta_get_s32_d(MppMeta meta, MppMetaKey key, RK_S32 *val, RK_S32 def);
1623d0407baSopenharmony_ciMPP_RET mpp_meta_get_s64_d(MppMeta meta, MppMetaKey key, RK_S64 *val, RK_S64 def);
1633d0407baSopenharmony_ciMPP_RET mpp_meta_get_ptr_d(MppMeta meta, MppMetaKey key, void  **val, void *def);
1643d0407baSopenharmony_ciMPP_RET mpp_meta_get_frame_d(MppMeta meta, MppMetaKey key, MppFrame *frame, MppFrame def);
1653d0407baSopenharmony_ciMPP_RET mpp_meta_get_packet_d(MppMeta meta, MppMetaKey key, MppPacket *packet, MppPacket def);
1663d0407baSopenharmony_ciMPP_RET mpp_meta_get_buffer_d(MppMeta meta, MppMetaKey key, MppBuffer *buffer, MppBuffer def);
1673d0407baSopenharmony_ci
1683d0407baSopenharmony_ci#ifdef __cplusplus
1693d0407baSopenharmony_ci}
1703d0407baSopenharmony_ci#endif
1713d0407baSopenharmony_ci
1723d0407baSopenharmony_ci#endif /*__MPP_META_H__*/
173