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 __MPI_ENC_UTILS_H__ 183d0407baSopenharmony_ci#define __MPI_ENC_UTILS_H__ 193d0407baSopenharmony_ci 203d0407baSopenharmony_ci#include <stdio.h> 213d0407baSopenharmony_ci 223d0407baSopenharmony_ci#include "rk_venc_cmd.h" 233d0407baSopenharmony_ci#include "iniparser.h" 243d0407baSopenharmony_ci#include "utils_mpp.h" 253d0407baSopenharmony_ci#include "mpp_enc_roi_utils.h" 263d0407baSopenharmony_ci#include "camera_source.h" 273d0407baSopenharmony_ci 283d0407baSopenharmony_citypedef struct MpiEncTestArgs_t { 293d0407baSopenharmony_ci char *file_input; 303d0407baSopenharmony_ci char *file_output; 313d0407baSopenharmony_ci char *file_cfg; 323d0407baSopenharmony_ci dictionary *cfg_ini; 333d0407baSopenharmony_ci 343d0407baSopenharmony_ci MppCodingType type; 353d0407baSopenharmony_ci MppCodingType type_src; /* for file source input */ 363d0407baSopenharmony_ci MppFrameFormat format; 373d0407baSopenharmony_ci RK_S32 frame_num; 383d0407baSopenharmony_ci RK_S32 loop_cnt; 393d0407baSopenharmony_ci RK_S32 nthreads; 403d0407baSopenharmony_ci 413d0407baSopenharmony_ci RK_S32 width; 423d0407baSopenharmony_ci RK_S32 height; 433d0407baSopenharmony_ci RK_S32 hor_stride; 443d0407baSopenharmony_ci RK_S32 ver_stride; 453d0407baSopenharmony_ci 463d0407baSopenharmony_ci /* -rc */ 473d0407baSopenharmony_ci RK_S32 rc_mode; 483d0407baSopenharmony_ci 493d0407baSopenharmony_ci /* -bps */ 503d0407baSopenharmony_ci RK_S32 bps_target; 513d0407baSopenharmony_ci RK_S32 bps_max; 523d0407baSopenharmony_ci RK_S32 bps_min; 533d0407baSopenharmony_ci 543d0407baSopenharmony_ci /* -fps */ 553d0407baSopenharmony_ci RK_S32 fps_in_flex; 563d0407baSopenharmony_ci RK_S32 fps_in_num; 573d0407baSopenharmony_ci RK_S32 fps_in_den; 583d0407baSopenharmony_ci RK_S32 fps_out_flex; 593d0407baSopenharmony_ci RK_S32 fps_out_num; 603d0407baSopenharmony_ci RK_S32 fps_out_den; 613d0407baSopenharmony_ci 623d0407baSopenharmony_ci /* -qc */ 633d0407baSopenharmony_ci RK_S32 qp_init; 643d0407baSopenharmony_ci RK_S32 qp_min; 653d0407baSopenharmony_ci RK_S32 qp_max; 663d0407baSopenharmony_ci RK_S32 qp_min_i; 673d0407baSopenharmony_ci RK_S32 qp_max_i; 683d0407baSopenharmony_ci 693d0407baSopenharmony_ci /* -g gop mode */ 703d0407baSopenharmony_ci RK_S32 gop_mode; 713d0407baSopenharmony_ci RK_S32 gop_len; 723d0407baSopenharmony_ci RK_S32 vi_len; 733d0407baSopenharmony_ci 743d0407baSopenharmony_ci /* -v q runtime log disable flag */ 753d0407baSopenharmony_ci RK_U32 quiet; 763d0407baSopenharmony_ci /* -v f runtime fps log flag */ 773d0407baSopenharmony_ci RK_U32 trace_fps; 783d0407baSopenharmony_ci FpsCalc fps; 793d0407baSopenharmony_ci RK_U32 psnr_en; 803d0407baSopenharmony_ci RK_U32 ssim_en; 813d0407baSopenharmony_ci char *file_slt; 823d0407baSopenharmony_ci unsigned char *buf; 833d0407baSopenharmony_ci size_t *buf_size; 843d0407baSopenharmony_ci} MpiEncTestArgs; 853d0407baSopenharmony_ci 863d0407baSopenharmony_ci#ifdef __cplusplus 873d0407baSopenharmony_ciextern "C" { 883d0407baSopenharmony_ci#endif 893d0407baSopenharmony_ci 903d0407baSopenharmony_ciRK_S32 mpi_enc_width_default_stride(RK_S32 width, MppFrameFormat fmt); 913d0407baSopenharmony_ci 923d0407baSopenharmony_ci/* 933d0407baSopenharmony_ci * gop_mode 943d0407baSopenharmony_ci * 0 - default IPPPP gop 953d0407baSopenharmony_ci * 1 ~ 3 - tsvc2 ~ tsvc4 963d0407baSopenharmony_ci * >= 4 - smart gop mode 973d0407baSopenharmony_ci */ 983d0407baSopenharmony_ciMPP_RET mpi_enc_gen_ref_cfg(MppEncRefCfg ref, RK_S32 gop_mode); 993d0407baSopenharmony_ciMPP_RET mpi_enc_gen_smart_gop_ref_cfg(MppEncRefCfg ref, RK_S32 gop_len, RK_S32 vi_len); 1003d0407baSopenharmony_ciMPP_RET mpi_enc_gen_osd_data(MppEncOSDData *osd_data, MppBufferGroup group, 1013d0407baSopenharmony_ci RK_U32 width, RK_U32 height, RK_U32 frame_cnt); 1023d0407baSopenharmony_ciMPP_RET mpi_enc_gen_osd_plt(MppEncOSDPlt *osd_plt, RK_U32 frame_cnt); 1033d0407baSopenharmony_ci 1043d0407baSopenharmony_ciMpiEncTestArgs *mpi_enc_test_cmd_get(void); 1053d0407baSopenharmony_ciMPP_RET mpi_enc_test_cmd_update_by_args(MpiEncTestArgs* cmd, int argc, char **argv); 1063d0407baSopenharmony_ciMPP_RET mpi_enc_test_cmd_put(MpiEncTestArgs* cmd); 1073d0407baSopenharmony_ci 1083d0407baSopenharmony_ciMPP_RET mpi_enc_test_cmd_show_opt(MpiEncTestArgs* cmd); 1093d0407baSopenharmony_ci 1103d0407baSopenharmony_ci//int RKYuvToH264(unsigned char *buf, size_t *buf_size, int width, 1113d0407baSopenharmony_ci// int height, MppFrameFormat format, MppCodingType type); 1123d0407baSopenharmony_ciint hal_mpp_encode(void *ctxs, int dma_fd, unsigned char *buf, size_t *buf_size); 1133d0407baSopenharmony_civoid *hal_mpp_ctx_create(MpiEncTestArgs *args); 1143d0407baSopenharmony_civoid hal_mpp_ctx_delete(void *ctx); 1153d0407baSopenharmony_ci 1163d0407baSopenharmony_citypedef struct { 1173d0407baSopenharmony_ci // base flow context 1183d0407baSopenharmony_ci MppCtx ctx; 1193d0407baSopenharmony_ci MppApi *mpi; 1203d0407baSopenharmony_ci RK_S32 chn; 1213d0407baSopenharmony_ci 1223d0407baSopenharmony_ci // global flow control flag 1233d0407baSopenharmony_ci RK_U32 frm_eos; 1243d0407baSopenharmony_ci RK_U32 pkt_eos; 1253d0407baSopenharmony_ci RK_U32 frm_pkt_cnt; 1263d0407baSopenharmony_ci RK_S32 frame_num; 1273d0407baSopenharmony_ci RK_S32 frame_count; 1283d0407baSopenharmony_ci RK_U64 stream_size; 1293d0407baSopenharmony_ci /* end of encoding flag when set quit the loop */ 1303d0407baSopenharmony_ci volatile RK_U32 loop_end; 1313d0407baSopenharmony_ci 1323d0407baSopenharmony_ci // src and dst 1333d0407baSopenharmony_ci FILE *fp_input; 1343d0407baSopenharmony_ci FILE *fp_output; 1353d0407baSopenharmony_ci FILE *fp_verify; 1363d0407baSopenharmony_ci 1373d0407baSopenharmony_ci /* encoder config set */ 1383d0407baSopenharmony_ci MppEncCfg cfg; 1393d0407baSopenharmony_ci MppEncPrepCfg prep_cfg; 1403d0407baSopenharmony_ci MppEncRcCfg rc_cfg; 1413d0407baSopenharmony_ci MppEncCodecCfg codec_cfg; 1423d0407baSopenharmony_ci MppEncSliceSplit split_cfg; 1433d0407baSopenharmony_ci MppEncOSDPltCfg osd_plt_cfg; 1443d0407baSopenharmony_ci MppEncOSDPlt osd_plt; 1453d0407baSopenharmony_ci MppEncOSDData osd_data; 1463d0407baSopenharmony_ci RoiRegionCfg roi_region; 1473d0407baSopenharmony_ci MppEncROICfg roi_cfg; 1483d0407baSopenharmony_ci 1493d0407baSopenharmony_ci // input / output 1503d0407baSopenharmony_ci MppBufferGroup buf_grp; 1513d0407baSopenharmony_ci MppBuffer frm_buf; 1523d0407baSopenharmony_ci MppBuffer pkt_buf; 1533d0407baSopenharmony_ci MppBuffer md_info; 1543d0407baSopenharmony_ci MppEncSeiMode sei_mode; 1553d0407baSopenharmony_ci MppEncHeaderMode header_mode; 1563d0407baSopenharmony_ci 1573d0407baSopenharmony_ci // paramter for resource malloc 1583d0407baSopenharmony_ci RK_U32 width; 1593d0407baSopenharmony_ci RK_U32 height; 1603d0407baSopenharmony_ci RK_U32 hor_stride; 1613d0407baSopenharmony_ci RK_U32 ver_stride; 1623d0407baSopenharmony_ci MppFrameFormat fmt; 1633d0407baSopenharmony_ci MppCodingType type; 1643d0407baSopenharmony_ci RK_S32 loop_times; 1653d0407baSopenharmony_ci CamSource *cam_ctx; 1663d0407baSopenharmony_ci MppEncRoiCtx roi_ctx; 1673d0407baSopenharmony_ci 1683d0407baSopenharmony_ci // resources 1693d0407baSopenharmony_ci size_t header_size; 1703d0407baSopenharmony_ci size_t frame_size; 1713d0407baSopenharmony_ci size_t mdinfo_size; 1723d0407baSopenharmony_ci /* NOTE: packet buffer may overflow */ 1733d0407baSopenharmony_ci size_t packet_size; 1743d0407baSopenharmony_ci 1753d0407baSopenharmony_ci RK_U32 osd_enable; 1763d0407baSopenharmony_ci RK_U32 osd_mode; 1773d0407baSopenharmony_ci RK_U32 split_mode; 1783d0407baSopenharmony_ci RK_U32 split_arg; 1793d0407baSopenharmony_ci RK_U32 split_out; 1803d0407baSopenharmony_ci 1813d0407baSopenharmony_ci RK_U32 user_data_enable; 1823d0407baSopenharmony_ci RK_U32 roi_enable; 1833d0407baSopenharmony_ci 1843d0407baSopenharmony_ci // rate control runtime parameter 1853d0407baSopenharmony_ci RK_S32 fps_in_flex; 1863d0407baSopenharmony_ci RK_S32 fps_in_den; 1873d0407baSopenharmony_ci RK_S32 fps_in_num; 1883d0407baSopenharmony_ci RK_S32 fps_out_flex; 1893d0407baSopenharmony_ci RK_S32 fps_out_den; 1903d0407baSopenharmony_ci RK_S32 fps_out_num; 1913d0407baSopenharmony_ci RK_S32 bps; 1923d0407baSopenharmony_ci RK_S32 bps_max; 1933d0407baSopenharmony_ci RK_S32 bps_min; 1943d0407baSopenharmony_ci RK_S32 rc_mode; 1953d0407baSopenharmony_ci RK_S32 gop_mode; 1963d0407baSopenharmony_ci RK_S32 gop_len; 1973d0407baSopenharmony_ci RK_S32 vi_len; 1983d0407baSopenharmony_ci 1993d0407baSopenharmony_ci RK_S64 first_frm; 2003d0407baSopenharmony_ci RK_S64 first_pkt; 2013d0407baSopenharmony_ci} MpiEncTestData; 2023d0407baSopenharmony_ci 2033d0407baSopenharmony_ci/* For each instance thread return value */ 2043d0407baSopenharmony_citypedef struct { 2053d0407baSopenharmony_ci float frame_rate; 2063d0407baSopenharmony_ci RK_U64 bit_rate; 2073d0407baSopenharmony_ci RK_S64 elapsed_time; 2083d0407baSopenharmony_ci RK_S32 frame_count; 2093d0407baSopenharmony_ci RK_S64 stream_size; 2103d0407baSopenharmony_ci RK_S64 delay; 2113d0407baSopenharmony_ci} MpiEncMultiCtxRet; 2123d0407baSopenharmony_ci 2133d0407baSopenharmony_citypedef struct { 2143d0407baSopenharmony_ci MpiEncTestArgs *cmd; // pointer to global command line info 2153d0407baSopenharmony_ci const char *name; 2163d0407baSopenharmony_ci RK_S32 chn; 2173d0407baSopenharmony_ci 2183d0407baSopenharmony_ci pthread_t thd; // thread for for each instance 2193d0407baSopenharmony_ci MpiEncTestData ctx; // context of encoder 2203d0407baSopenharmony_ci MpiEncMultiCtxRet ret; // return of encoder 2213d0407baSopenharmony_ci} MpiEncMultiCtxInfo; 2223d0407baSopenharmony_ci 2233d0407baSopenharmony_ci#ifdef __cplusplus 2243d0407baSopenharmony_ci} 2253d0407baSopenharmony_ci#endif 2263d0407baSopenharmony_ci 2273d0407baSopenharmony_ci#endif /*__MPI_ENC_UTILS_H__*/ 228