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