singe/thirdparty/rockchip-mpp/utils/mpi_enc_utils.h
2026-09-10 20:17:28 -05:00

247 lines
7.1 KiB
C

/*
* Copyright 2015 Rockchip Electronics Co. LTD
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef MPI_ENC_UTILS_H
#define MPI_ENC_UTILS_H
#include <stdio.h>
#include "iniparser.h"
#include "utils.h"
#include "mpp_enc_args.h"
#include "rk_mpi.h"
#include "rk_venc_kcfg.h"
#include "camera_source.h"
#include "mpp_enc_roi_utils.h"
#define MPI_ENC_MAX_CHN 30
typedef struct MpiEncTestArgs_t {
char *file_input;
char *file_output;
char *file_args;
char *file_cfg;
char *file_ref_cfg;
dictionary *cfg_ini;
MppCodingType type;
MppCodingType type_src; /* for file source input */
MppFrameFormat format;
RK_S32 frame_num;
RK_S32 loop_cnt;
RK_S32 nthreads;
RK_S32 frm_step;
RK_S32 width;
RK_S32 height;
RK_S32 hor_stride;
RK_S32 ver_stride;
/* -rc */
RK_S32 rc_mode;
/* -bps */
RK_S32 bps_target;
RK_S32 bps_max;
RK_S32 bps_min;
/* -fps */
RK_S32 fps_in_flex;
RK_S32 fps_in_num;
RK_S32 fps_in_den;
RK_S32 fps_out_flex;
RK_S32 fps_out_num;
RK_S32 fps_out_den;
/* -qc */
RK_S32 qp_init;
RK_S32 qp_min;
RK_S32 qp_max;
RK_S32 qp_min_i;
RK_S32 qp_max_i;
/* -fqc */
RK_S32 fqp_min_i;
RK_S32 fqp_min_p;
RK_S32 fqp_max_i;
RK_S32 fqp_max_p;
/* -g gop mode */
RK_S32 gop_mode;
RK_S32 gop_len;
RK_S32 vi_len;
/* -sm scene_mode */
RK_S32 scene_mode;
RK_S32 rc_container;
RK_S32 bias_i;
RK_S32 bias_p;
/* -qpdd cu_qp_delta_depth */
RK_S32 cu_qp_delta_depth;
RK_S32 atf_str;
RK_S32 atr_str_i;
RK_S32 atr_str_p;
RK_S32 atl_str;
RK_S32 sao_str_i;
RK_S32 sao_str_p;
RK_S32 lambda_idx_p;
RK_S32 lambda_idx_i;
RK_S32 speed;
/* -dbe deblur enable flag
* -dbs deblur strength
*/
RK_S32 deblur_en;
RK_S32 deblur_str;
/* -v q runtime log disable flag */
RK_U32 quiet;
/* -v f runtime fps log flag */
RK_U32 trace_fps;
FpsCalc fps;
RK_U32 psnr_en;
RK_U32 ssim_en;
char *file_slt;
RK_U32 kmpp_mode;
RK_U32 split_mode;
RK_U32 split_arg;
RK_U32 split_out;
RK_U32 osd_enable;
RK_U32 osd_mode;
RK_U32 user_data_enable;
RK_U32 roi_enable;
RK_U32 roi_jpeg_enable;
RK_U32 jpeg_osd_case;
RK_U32 mirroring;
RK_U32 rotation;
RK_U32 flip;
RK_U32 constraint_set;
RK_U32 sei_mode;
} MpiEncTestArgs;
typedef struct MppEncTestObjSet_t {
MppEncArgs cmd_obj;
MpiEncTestArgs *cmd;
MppEncCfg cfg_obj;
} MppEncTestObjSet;
typedef struct {
// base flow context
MppCtx ctx;
MppApi *mpi;
RK_S32 chn;
// global flow control flag
RK_U32 frm_eos;
RK_U32 pkt_eos;
RK_U32 frm_pkt_cnt;
RK_S32 frame_num;
RK_S32 frm_cnt_in;
RK_S32 frm_cnt_out;
RK_S32 frm_step;
RK_U64 stream_size;
/* end of encoding flag when set quit the loop */
volatile RK_U32 loop_end;
// src and dst
FILE *fp_input;
FILE *fp_output[MPI_ENC_MAX_CHN];
FILE *fp_verify;
/* encoder config set */
MppEncCfg cfg;
MppEncOSDPltCfg osd_plt_cfg;
MppEncOSDPlt osd_plt;
MppEncOSDData osd_data;
RoiRegionCfg roi_region;
MppEncROICfg roi_cfg;
MppJpegROICfg roi_jpeg_cfg;
// input / output
MppBufferGroup buf_grp;
MppEncHeaderMode header_mode;
// paramter for resource malloc
RK_U32 width;
RK_U32 height;
RK_U32 hor_stride;
RK_U32 ver_stride;
MppFrameFormat fmt;
MppCodingType type;
RK_S32 loop_times;
CamSource *cam_ctx;
MppEncRoiCtx roi_ctx;
MppVencKcfg init_kcfg;
// resources
size_t header_size;
size_t frame_size;
/* NOTE: packet buffer may overflow */
size_t packet_size;
RK_S64 first_frm;
RK_S64 first_pkt;
RK_S64 last_pkt;
MppEncOSDData3 osd_data3;
KmppBuffer osd_buffer;
RK_U8 *osd_pattern;
} MpiEncTestData;
#ifdef __cplusplus
extern "C" {
#endif
RK_S32 mpi_enc_width_default_stride(RK_S32 width, MppFrameFormat fmt);
/*
* gop_mode
* 0 - default IPPPP gop
* 1 ~ 3 - tsvc2 ~ tsvc4
* >= 4 - smart gop mode
*/
MPP_RET mpi_enc_gen_ref_cfg(MppEncRefCfg ref, RK_S32 gop_mode);
MPP_RET mpi_enc_gen_smart_gop_ref_cfg(MppEncRefCfg ref, RK_S32 gop_len, RK_S32 vi_len);
MPP_RET mpi_enc_gen_ref_cfg_legacy(MppEncRefCfg ref, MppEncRefParam *para, RK_S32 to_ref);
MPP_RET mpi_enc_load_ref_cfg(MppEncRefCfg ref, const char *path);
MPP_RET mpi_enc_ref_cfg_setup(MpiEncTestData *p, MpiEncTestArgs *cmd, MppEncRefCfg ref);
MPP_RET mpi_enc_gen_osd_data(MppEncOSDData *osd_data, MppBufferGroup group,
RK_U32 width, RK_U32 height, RK_U32 frame_cnt);
MPP_RET mpi_enc_gen_osd_plt(MppEncOSDPlt *osd_plt, RK_U32 frame_cnt);
MPP_RET mpi_enc_test_objset_update_by_args(MppEncTestObjSet *obj_set, int argc, char **argv, const char *module_tag);
MPP_RET mpi_enc_ctx_init(MpiEncTestData *p, MpiEncTestArgs *cmd, RK_S32 chn);
MPP_RET mpi_enc_ctx_deinit(MpiEncTestData *p);
MPP_RET mpi_enc_cfg_setup(MpiEncTestData *p, MpiEncTestArgs *cmd, MppEncCfg cfg_obj);
MPP_RET mpi_enc_test_objset_get(MppEncTestObjSet **obj_set);
MPP_RET mpi_enc_test_objset_put(MppEncTestObjSet *obj_set);
#ifdef __cplusplus
}
#endif
#endif /* MPI_ENC_UTILS_H */