13d0407baSopenharmony_ci/*
23d0407baSopenharmony_ci * Copyright (c) 2021 Rockchip Electronics Co., Ltd.
33d0407baSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
43d0407baSopenharmony_ci * you may not use this file except in compliance with the License.
53d0407baSopenharmony_ci * You may obtain a copy of the License at
63d0407baSopenharmony_ci *
73d0407baSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
83d0407baSopenharmony_ci *
93d0407baSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
103d0407baSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
113d0407baSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
123d0407baSopenharmony_ci * See the License for the specific language governing permissions and
133d0407baSopenharmony_ci * limitations under the License.
143d0407baSopenharmony_ci */
153d0407baSopenharmony_ci
163d0407baSopenharmony_ci#ifndef __MPP_META_H__
173d0407baSopenharmony_ci#define __MPP_META_H__
183d0407baSopenharmony_ci
193d0407baSopenharmony_ci#include <stdint.h>
203d0407baSopenharmony_ci#include "rk_type.h"
213d0407baSopenharmony_ci
223d0407baSopenharmony_ci#define FOURCC_META(a, b, c, d)                                                                                        \
233d0407baSopenharmony_ci    (((unsigned int)(a) << 24) | ((unsigned int)(b) << 16) | ((unsigned int)(c) << 8) | ((unsigned int)(d) << 0))
243d0407baSopenharmony_ci
253d0407baSopenharmony_ci/*
263d0407baSopenharmony_ci * Mpp Metadata definition
273d0407baSopenharmony_ci *
283d0407baSopenharmony_ci * Metadata is for information transmision in mpp.
293d0407baSopenharmony_ci * Mpp task will contain two meta data:
303d0407baSopenharmony_ci *
313d0407baSopenharmony_ci * 1. Data flow metadata
323d0407baSopenharmony_ci *    This metadata contains information of input / output data flow. For example
333d0407baSopenharmony_ci *    A. decoder input side task the input packet must be defined and output frame
343d0407baSopenharmony_ci *    may not be defined. Then decoder will try malloc or use committed buffer to
353d0407baSopenharmony_ci *    complete decoding.
363d0407baSopenharmony_ci *    B. decoder output side task
373d0407baSopenharmony_ci *
383d0407baSopenharmony_ci *
393d0407baSopenharmony_ci * 2. Flow control metadata
403d0407baSopenharmony_ci *
413d0407baSopenharmony_ci */
423d0407baSopenharmony_citypedef enum MppMetaDataType_e {
433d0407baSopenharmony_ci    /*
443d0407baSopenharmony_ci     * mpp meta data of data flow
453d0407baSopenharmony_ci     * reference counter will be used for these meta data type
463d0407baSopenharmony_ci     */
473d0407baSopenharmony_ci    TYPE_FRAME = FOURCC_META('m', 'f', 'r', 'm'),
483d0407baSopenharmony_ci    TYPE_PACKET = FOURCC_META('m', 'p', 'k', 't'),
493d0407baSopenharmony_ci    TYPE_BUFFER = FOURCC_META('m', 'b', 'u', 'f'),
503d0407baSopenharmony_ci
513d0407baSopenharmony_ci    /* mpp meta data of normal data type */
523d0407baSopenharmony_ci    TYPE_S32 = FOURCC_META('s', '3', '2', ' '),
533d0407baSopenharmony_ci    TYPE_S64 = FOURCC_META('s', '6', '4', ' '),
543d0407baSopenharmony_ci    TYPE_PTR = FOURCC_META('p', 't', 'r', ' '),
553d0407baSopenharmony_ci} MppMetaType;
563d0407baSopenharmony_ci
573d0407baSopenharmony_citypedef enum MppMetaKey_e {
583d0407baSopenharmony_ci    /* data flow key */
593d0407baSopenharmony_ci    KEY_INPUT_FRAME = FOURCC_META('i', 'f', 'r', 'm'),
603d0407baSopenharmony_ci    KEY_INPUT_PACKET = FOURCC_META('i', 'p', 'k', 't'),
613d0407baSopenharmony_ci    KEY_OUTPUT_FRAME = FOURCC_META('o', 'f', 'r', 'm'),
623d0407baSopenharmony_ci    KEY_OUTPUT_PACKET = FOURCC_META('o', 'p', 'k', 't'),
633d0407baSopenharmony_ci    /* output motion information for motion detection */
643d0407baSopenharmony_ci    KEY_MOTION_INFO = FOURCC_META('m', 'v', 'i', 'f'),
653d0407baSopenharmony_ci    KEY_HDR_INFO = FOURCC_META('h', 'd', 'r', ' '),
663d0407baSopenharmony_ci
673d0407baSopenharmony_ci    /* flow control key */
683d0407baSopenharmony_ci    KEY_INPUT_BLOCK = FOURCC_META('i', 'b', 'l', 'k'),
693d0407baSopenharmony_ci    KEY_OUTPUT_BLOCK = FOURCC_META('o', 'b', 'l', 'k'),
703d0407baSopenharmony_ci    KEY_INPUT_IDR_REQ = FOURCC_META('i', 'i', 'd', 'r'), /* input idr frame request flag */
713d0407baSopenharmony_ci    KEY_OUTPUT_INTRA = FOURCC_META('o', 'i', 'd', 'r'),  /* output intra frame indicator */
723d0407baSopenharmony_ci
733d0407baSopenharmony_ci    /* mpp_frame / mpp_packet meta data info key */
743d0407baSopenharmony_ci    KEY_TEMPORAL_ID = FOURCC_META('t', 'l', 'i', 'd'),
753d0407baSopenharmony_ci    KEY_LONG_REF_IDX = FOURCC_META('l', 't', 'i', 'd'),
763d0407baSopenharmony_ci    KEY_ENC_AVERAGE_QP = FOURCC_META('a', 'v', 'g', 'q'),
773d0407baSopenharmony_ci    KEY_ROI_DATA = FOURCC_META('r', 'o', 'i', ' '),
783d0407baSopenharmony_ci    KEY_OSD_DATA = FOURCC_META('o', 's', 'd', ' '),
793d0407baSopenharmony_ci    KEY_OSD_DATA2 = FOURCC_META('o', 's', 'd', '2'),
803d0407baSopenharmony_ci    KEY_USER_DATA = FOURCC_META('u', 's', 'r', 'd'),
813d0407baSopenharmony_ci    KEY_USER_DATAS = FOURCC_META('u', 'r', 'd', 's'),
823d0407baSopenharmony_ci
833d0407baSopenharmony_ci    /* input motion list for smart p rate control */
843d0407baSopenharmony_ci    KEY_MV_LIST = FOURCC_META('m', 'v', 'l', 't'),
853d0407baSopenharmony_ci
863d0407baSopenharmony_ci    /* frame long-term reference frame operation */
873d0407baSopenharmony_ci    KEY_ENC_MARK_LTR = FOURCC_META('m', 'l', 't', 'r'),
883d0407baSopenharmony_ci    KEY_ENC_USE_LTR = FOURCC_META('u', 'l', 't', 'r'),
893d0407baSopenharmony_ci
903d0407baSopenharmony_ci    /* MLVEC specified encoder feature  */
913d0407baSopenharmony_ci    KEY_ENC_FRAME_QP = FOURCC_META('f', 'r', 'm', 'q'),
923d0407baSopenharmony_ci    KEY_ENC_BASE_LAYER_PID = FOURCC_META('b', 'p', 'i', 'd'),
933d0407baSopenharmony_ci} MppMetaKey;
943d0407baSopenharmony_ci
953d0407baSopenharmony_ci#define mpp_meta_get(meta) mpp_meta_get_with_tag(meta, MODULE_TAG, __FUNCTION__)
963d0407baSopenharmony_ci
973d0407baSopenharmony_ci#include "mpp_frame.h"
983d0407baSopenharmony_ci
993d0407baSopenharmony_ci#ifdef __cplusplus
1003d0407baSopenharmony_ciextern "C" {
1013d0407baSopenharmony_ci#endif
1023d0407baSopenharmony_ci
1033d0407baSopenharmony_ciMPP_RET mpp_meta_get_with_tag(MppMeta *meta, const char *tag, const char *caller);
1043d0407baSopenharmony_ciMPP_RET mpp_meta_put(MppMeta meta);
1053d0407baSopenharmony_cisigned int mpp_meta_size(MppMeta meta);
1063d0407baSopenharmony_ci
1073d0407baSopenharmony_ciMPP_RET mpp_meta_set_s32(MppMeta meta, MppMetaKey key, signed int val);
1083d0407baSopenharmony_ciMPP_RET mpp_meta_set_s64(MppMeta meta, MppMetaKey key, RK_S64 val);
1093d0407baSopenharmony_ciMPP_RET mpp_meta_set_ptr(MppMeta meta, MppMetaKey key, void *val);
1103d0407baSopenharmony_ciMPP_RET mpp_meta_get_s32(MppMeta meta, MppMetaKey key, signed int *val);
1113d0407baSopenharmony_ciMPP_RET mpp_meta_get_s64(MppMeta meta, MppMetaKey key, RK_S64 *val);
1123d0407baSopenharmony_ciMPP_RET mpp_meta_get_ptr(MppMeta meta, MppMetaKey key, void **val);
1133d0407baSopenharmony_ci
1143d0407baSopenharmony_ciMPP_RET mpp_meta_set_frame(MppMeta meta, MppMetaKey key, MppFrame frame);
1153d0407baSopenharmony_ciMPP_RET mpp_meta_set_packet(MppMeta meta, MppMetaKey key, MppPacket packet);
1163d0407baSopenharmony_ciMPP_RET mpp_meta_set_buffer(MppMeta meta, MppMetaKey key, MppBuffer buffer);
1173d0407baSopenharmony_ciMPP_RET mpp_meta_get_frame(MppMeta meta, MppMetaKey key, MppFrame *frame);
1183d0407baSopenharmony_ciMPP_RET mpp_meta_get_packet(MppMeta meta, MppMetaKey key, MppPacket *packet);
1193d0407baSopenharmony_ciMPP_RET mpp_meta_get_buffer(MppMeta meta, MppMetaKey key, MppBuffer *buffer);
1203d0407baSopenharmony_ci
1213d0407baSopenharmony_ci#ifdef __cplusplus
1223d0407baSopenharmony_ci}
1233d0407baSopenharmony_ci#endif
1243d0407baSopenharmony_ci
1253d0407baSopenharmony_ci#endif /* __MPP_META_H__ */
126