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