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#define MODULE_TAG "mpi_enc_test" 183d0407baSopenharmony_ci 193d0407baSopenharmony_ci#include <string.h> 203d0407baSopenharmony_ci#include "rk_mpi.h" 213d0407baSopenharmony_ci 223d0407baSopenharmony_ci#include "mpp_env.h" 233d0407baSopenharmony_ci#include "mpp_mem.h" 243d0407baSopenharmony_ci#include "mpp_time.h" 253d0407baSopenharmony_ci#include "mpp_debug.h" 263d0407baSopenharmony_ci#include "mpp_common.h" 273d0407baSopenharmony_ci#include "securec.h" 283d0407baSopenharmony_ci#include "utils_mpp.h" 293d0407baSopenharmony_ci#include "mpi_enc_utils.h" 303d0407baSopenharmony_ci//#include "camera.h" 313d0407baSopenharmony_ci 323d0407baSopenharmony_ciMPP_RET test_ctx_init(MpiEncMultiCtxInfo *info) 333d0407baSopenharmony_ci{ 343d0407baSopenharmony_ci MpiEncTestArgs *cmd = info->cmd; 353d0407baSopenharmony_ci MpiEncTestData *p = &info->ctx; 363d0407baSopenharmony_ci MPP_RET ret = MPP_OK; 373d0407baSopenharmony_ci 383d0407baSopenharmony_ci // get paramter from cmd 393d0407baSopenharmony_ci p->width = cmd->width; 403d0407baSopenharmony_ci p->height = cmd->height; 413d0407baSopenharmony_ci p->hor_stride = (cmd->hor_stride) ? (cmd->hor_stride) : 423d0407baSopenharmony_ci (MPP_ALIGN(cmd->width, 16)); 433d0407baSopenharmony_ci p->ver_stride = (cmd->ver_stride) ? (cmd->ver_stride) : 443d0407baSopenharmony_ci (MPP_ALIGN(cmd->height, 16)); 453d0407baSopenharmony_ci p->fmt = cmd->format; 463d0407baSopenharmony_ci p->type = cmd->type; 473d0407baSopenharmony_ci p->bps = cmd->bps_target; 483d0407baSopenharmony_ci p->bps_min = cmd->bps_min; 493d0407baSopenharmony_ci p->bps_max = cmd->bps_max; 503d0407baSopenharmony_ci p->rc_mode = cmd->rc_mode; 513d0407baSopenharmony_ci p->frame_num = cmd->frame_num; 523d0407baSopenharmony_ci if (cmd->type == MPP_VIDEO_CodingMJPEG && p->frame_num == 0) { 533d0407baSopenharmony_ci mpp_log("jpege default encode only one frame. Use -n [num] for rc case\n"); 543d0407baSopenharmony_ci p->frame_num = 1; 553d0407baSopenharmony_ci } 563d0407baSopenharmony_ci p->gop_mode = cmd->gop_mode; 573d0407baSopenharmony_ci p->gop_len = cmd->gop_len; 583d0407baSopenharmony_ci p->vi_len = cmd->vi_len; 593d0407baSopenharmony_ci 603d0407baSopenharmony_ci p->fps_in_flex = cmd->fps_in_flex; 613d0407baSopenharmony_ci p->fps_in_den = cmd->fps_in_den; 623d0407baSopenharmony_ci p->fps_in_num = cmd->fps_in_num; 633d0407baSopenharmony_ci p->fps_out_flex = cmd->fps_out_flex; 643d0407baSopenharmony_ci p->fps_out_den = cmd->fps_out_den; 653d0407baSopenharmony_ci p->fps_out_num = cmd->fps_out_num; 663d0407baSopenharmony_ci p->mdinfo_size = (MPP_VIDEO_CodingHEVC == cmd->type) ? 673d0407baSopenharmony_ci (MPP_ALIGN(p->hor_stride, 64) >> 6) * 683d0407baSopenharmony_ci (MPP_ALIGN(p->ver_stride, 64) >> 6) * 32 : 693d0407baSopenharmony_ci (MPP_ALIGN(p->hor_stride, 64) >> 6) * 703d0407baSopenharmony_ci (MPP_ALIGN(p->ver_stride, 16) >> 4) * 8; 713d0407baSopenharmony_ci 723d0407baSopenharmony_ci if (cmd->file_input) { 733d0407baSopenharmony_ci if (!strncmp(cmd->file_input, "/dev/video", 10)) { 743d0407baSopenharmony_ci mpp_log("open camera device"); 753d0407baSopenharmony_ci p->cam_ctx = camera_source_init(cmd->file_input, 4, p->width, p->height, p->fmt); 763d0407baSopenharmony_ci mpp_log("new framecap ok"); 773d0407baSopenharmony_ci if (p->cam_ctx == NULL) 783d0407baSopenharmony_ci mpp_err("open %s fail", cmd->file_input); 793d0407baSopenharmony_ci } else { 803d0407baSopenharmony_ci p->fp_input = fopen(cmd->file_input, "rb"); 813d0407baSopenharmony_ci if (NULL == p->fp_input) { 823d0407baSopenharmony_ci mpp_err("failed to open input file %s\n", cmd->file_input); 833d0407baSopenharmony_ci mpp_err("create default yuv image for test\n"); 843d0407baSopenharmony_ci } 853d0407baSopenharmony_ci } 863d0407baSopenharmony_ci } 873d0407baSopenharmony_ci 883d0407baSopenharmony_ci if (cmd->file_output) { 893d0407baSopenharmony_ci p->fp_output = fopen(cmd->file_output, "w+b"); 903d0407baSopenharmony_ci if (NULL == p->fp_output) { 913d0407baSopenharmony_ci mpp_err("failed to open output file %s\n", cmd->file_output); 923d0407baSopenharmony_ci ret = MPP_ERR_OPEN_FILE; 933d0407baSopenharmony_ci } 943d0407baSopenharmony_ci } 953d0407baSopenharmony_ci 963d0407baSopenharmony_ci p->fp_output = fopen("/data/genan.h264", "w+b"); 973d0407baSopenharmony_ci 983d0407baSopenharmony_ci if (cmd->file_slt) { 993d0407baSopenharmony_ci p->fp_verify = fopen(cmd->file_slt, "wt"); 1003d0407baSopenharmony_ci if (!p->fp_verify) 1013d0407baSopenharmony_ci mpp_err("failed to open verify file %s\n", cmd->file_slt); 1023d0407baSopenharmony_ci } 1033d0407baSopenharmony_ci 1043d0407baSopenharmony_ci // update resource parameter 1053d0407baSopenharmony_ci switch (p->fmt & MPP_FRAME_FMT_MASK) { 1063d0407baSopenharmony_ci case MPP_FMT_YUV420SP: 1073d0407baSopenharmony_ci case MPP_FMT_YUV420P: { 1083d0407baSopenharmony_ci p->frame_size = MPP_ALIGN(p->hor_stride, 64) * MPP_ALIGN(p->ver_stride, 64) * 3 / 2; 1093d0407baSopenharmony_ci } break; 1103d0407baSopenharmony_ci 1113d0407baSopenharmony_ci case MPP_FMT_YUV422_YUYV : 1123d0407baSopenharmony_ci case MPP_FMT_YUV422_YVYU : 1133d0407baSopenharmony_ci case MPP_FMT_YUV422_UYVY : 1143d0407baSopenharmony_ci case MPP_FMT_YUV422_VYUY : 1153d0407baSopenharmony_ci case MPP_FMT_YUV422P : 1163d0407baSopenharmony_ci case MPP_FMT_YUV422SP : { 1173d0407baSopenharmony_ci p->frame_size = MPP_ALIGN(p->hor_stride, 64) * MPP_ALIGN(p->ver_stride, 64) * 2; 1183d0407baSopenharmony_ci } break; 1193d0407baSopenharmony_ci case MPP_FMT_RGB444 : 1203d0407baSopenharmony_ci case MPP_FMT_BGR444 : 1213d0407baSopenharmony_ci case MPP_FMT_RGB555 : 1223d0407baSopenharmony_ci case MPP_FMT_BGR555 : 1233d0407baSopenharmony_ci case MPP_FMT_RGB565 : 1243d0407baSopenharmony_ci case MPP_FMT_BGR565 : 1253d0407baSopenharmony_ci case MPP_FMT_RGB888 : 1263d0407baSopenharmony_ci case MPP_FMT_BGR888 : 1273d0407baSopenharmony_ci case MPP_FMT_RGB101010 : 1283d0407baSopenharmony_ci case MPP_FMT_BGR101010 : 1293d0407baSopenharmony_ci case MPP_FMT_ARGB8888 : 1303d0407baSopenharmony_ci case MPP_FMT_ABGR8888 : 1313d0407baSopenharmony_ci case MPP_FMT_BGRA8888 : 1323d0407baSopenharmony_ci case MPP_FMT_RGBA8888 : { 1333d0407baSopenharmony_ci p->frame_size = MPP_ALIGN(p->hor_stride, 64) * MPP_ALIGN(p->ver_stride, 64); 1343d0407baSopenharmony_ci } break; 1353d0407baSopenharmony_ci 1363d0407baSopenharmony_ci default: { 1373d0407baSopenharmony_ci p->frame_size = MPP_ALIGN(p->hor_stride, 64) * MPP_ALIGN(p->ver_stride, 64) * 4; 1383d0407baSopenharmony_ci } break; 1393d0407baSopenharmony_ci } 1403d0407baSopenharmony_ci 1413d0407baSopenharmony_ci if (MPP_FRAME_FMT_IS_FBC(p->fmt)) { 1423d0407baSopenharmony_ci if ((p->fmt & MPP_FRAME_FBC_MASK) == MPP_FRAME_FBC_AFBC_V1) 1433d0407baSopenharmony_ci p->header_size = MPP_ALIGN(MPP_ALIGN(p->width, 16) * MPP_ALIGN(p->height, 16) / 16, SZ_4K); 1443d0407baSopenharmony_ci else 1453d0407baSopenharmony_ci p->header_size = MPP_ALIGN(p->width, 16) * MPP_ALIGN(p->height, 16) / 16; 1463d0407baSopenharmony_ci } else { 1473d0407baSopenharmony_ci p->header_size = 0; 1483d0407baSopenharmony_ci } 1493d0407baSopenharmony_ci 1503d0407baSopenharmony_ci return ret; 1513d0407baSopenharmony_ci} 1523d0407baSopenharmony_ci 1533d0407baSopenharmony_ciMPP_RET test_ctx_deinit(MpiEncTestData *p) 1543d0407baSopenharmony_ci{ 1553d0407baSopenharmony_ci if (p) { 1563d0407baSopenharmony_ci if (p->cam_ctx) { 1573d0407baSopenharmony_ci camera_source_deinit(p->cam_ctx); 1583d0407baSopenharmony_ci p->cam_ctx = NULL; 1593d0407baSopenharmony_ci } 1603d0407baSopenharmony_ci if (p->fp_input) { 1613d0407baSopenharmony_ci fclose(p->fp_input); 1623d0407baSopenharmony_ci p->fp_input = NULL; 1633d0407baSopenharmony_ci } 1643d0407baSopenharmony_ci if (p->fp_output) { 1653d0407baSopenharmony_ci fclose(p->fp_output); 1663d0407baSopenharmony_ci p->fp_output = NULL; 1673d0407baSopenharmony_ci } 1683d0407baSopenharmony_ci if (p->fp_verify) { 1693d0407baSopenharmony_ci fclose(p->fp_verify); 1703d0407baSopenharmony_ci p->fp_verify = NULL; 1713d0407baSopenharmony_ci } 1723d0407baSopenharmony_ci } 1733d0407baSopenharmony_ci return MPP_OK; 1743d0407baSopenharmony_ci} 1753d0407baSopenharmony_ci 1763d0407baSopenharmony_ciMPP_RET test_mpp_enc_cfg_setup(MpiEncMultiCtxInfo *info) 1773d0407baSopenharmony_ci{ 1783d0407baSopenharmony_ci MpiEncTestArgs *cmd = info->cmd; 1793d0407baSopenharmony_ci MpiEncTestData *p = &info->ctx; 1803d0407baSopenharmony_ci MppApi *mpi = p->mpi; 1813d0407baSopenharmony_ci MppCtx ctx = p->ctx; 1823d0407baSopenharmony_ci MppEncCfg cfg = p->cfg; 1833d0407baSopenharmony_ci RK_U32 quiet = cmd->quiet; 1843d0407baSopenharmony_ci MPP_RET ret; 1853d0407baSopenharmony_ci 1863d0407baSopenharmony_ci /* setup default parameter */ 1873d0407baSopenharmony_ci if (p->fps_in_den == 0) 1883d0407baSopenharmony_ci p->fps_in_den = 1; 1893d0407baSopenharmony_ci if (p->fps_in_num == 0) 1903d0407baSopenharmony_ci p->fps_in_num = 30; 1913d0407baSopenharmony_ci if (p->fps_out_den == 0) 1923d0407baSopenharmony_ci p->fps_out_den = 1; 1933d0407baSopenharmony_ci if (p->fps_out_num == 0) 1943d0407baSopenharmony_ci p->fps_out_num = 30; 1953d0407baSopenharmony_ci 1963d0407baSopenharmony_ci if (!p->bps) 1973d0407baSopenharmony_ci p->bps = p->width * p->height / 8 * (p->fps_out_num / p->fps_out_den); 1983d0407baSopenharmony_ci 1993d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "prep:width", p->width); 2003d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "prep:height", p->height); 2013d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "prep:hor_stride", p->hor_stride); 2023d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "prep:ver_stride", p->ver_stride); 2033d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "prep:format", p->fmt); 2043d0407baSopenharmony_ci 2053d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "rc:mode", p->rc_mode); 2063d0407baSopenharmony_ci 2073d0407baSopenharmony_ci /* fix input / output frame rate */ 2083d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "rc:fps_in_flex", p->fps_in_flex); 2093d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "rc:fps_in_num", p->fps_in_num); 2103d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "rc:fps_in_denorm", p->fps_in_den); 2113d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "rc:fps_out_flex", p->fps_out_flex); 2123d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "rc:fps_out_num", p->fps_out_num); 2133d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "rc:fps_out_denorm", p->fps_out_den); 2143d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "rc:gop", p->gop_len ? p->gop_len : p->fps_out_num * 2); 2153d0407baSopenharmony_ci 2163d0407baSopenharmony_ci /* drop frame or not when bitrate overflow */ 2173d0407baSopenharmony_ci mpp_enc_cfg_set_u32(cfg, "rc:drop_mode", MPP_ENC_RC_DROP_FRM_DISABLED); 2183d0407baSopenharmony_ci mpp_enc_cfg_set_u32(cfg, "rc:drop_thd", 20); /* 20% of max bps */ 2193d0407baSopenharmony_ci mpp_enc_cfg_set_u32(cfg, "rc:drop_gap", 1); /* Do not continuous drop frame */ 2203d0407baSopenharmony_ci 2213d0407baSopenharmony_ci /* setup bitrate for different rc_mode */ 2223d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "rc:bps_target", p->bps); 2233d0407baSopenharmony_ci switch (p->rc_mode) { 2243d0407baSopenharmony_ci case MPP_ENC_RC_MODE_FIXQP : { 2253d0407baSopenharmony_ci /* do not setup bitrate on FIXQP mode */ 2263d0407baSopenharmony_ci } break; 2273d0407baSopenharmony_ci case MPP_ENC_RC_MODE_CBR : { 2283d0407baSopenharmony_ci /* CBR mode has narrow bound */ 2293d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "rc:bps_max", p->bps_max ? p->bps_max : p->bps * 17 / 16); 2303d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "rc:bps_min", p->bps_min ? p->bps_min : p->bps * 15 / 16); 2313d0407baSopenharmony_ci } break; 2323d0407baSopenharmony_ci case MPP_ENC_RC_MODE_VBR : 2333d0407baSopenharmony_ci case MPP_ENC_RC_MODE_AVBR : { 2343d0407baSopenharmony_ci /* VBR mode has wide bound */ 2353d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "rc:bps_max", p->bps_max ? p->bps_max : p->bps * 17 / 16); 2363d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "rc:bps_min", p->bps_min ? p->bps_min : p->bps * 1 / 16); 2373d0407baSopenharmony_ci } break; 2383d0407baSopenharmony_ci default : { 2393d0407baSopenharmony_ci /* default use CBR mode */ 2403d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "rc:bps_max", p->bps_max ? p->bps_max : p->bps * 17 / 16); 2413d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "rc:bps_min", p->bps_min ? p->bps_min : p->bps * 15 / 16); 2423d0407baSopenharmony_ci } break; 2433d0407baSopenharmony_ci } 2443d0407baSopenharmony_ci 2453d0407baSopenharmony_ci /* setup qp for different codec and rc_mode */ 2463d0407baSopenharmony_ci switch (p->type) { 2473d0407baSopenharmony_ci case MPP_VIDEO_CodingAVC : 2483d0407baSopenharmony_ci case MPP_VIDEO_CodingHEVC : { 2493d0407baSopenharmony_ci switch (p->rc_mode) { 2503d0407baSopenharmony_ci case MPP_ENC_RC_MODE_FIXQP : { 2513d0407baSopenharmony_ci RK_S32 fix_qp = cmd->qp_init; 2523d0407baSopenharmony_ci 2533d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "rc:qp_init", fix_qp); 2543d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "rc:qp_max", fix_qp); 2553d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "rc:qp_min", fix_qp); 2563d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "rc:qp_max_i", fix_qp); 2573d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "rc:qp_min_i", fix_qp); 2583d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "rc:qp_ip", 0); 2593d0407baSopenharmony_ci } break; 2603d0407baSopenharmony_ci case MPP_ENC_RC_MODE_CBR : 2613d0407baSopenharmony_ci case MPP_ENC_RC_MODE_VBR : 2623d0407baSopenharmony_ci case MPP_ENC_RC_MODE_AVBR : { 2633d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "rc:qp_init", -1); 2643d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "rc:qp_max", 51); 2653d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "rc:qp_min", 10); 2663d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "rc:qp_max_i", 51); 2673d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "rc:qp_min_i", 10); 2683d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "rc:qp_ip", 2); 2693d0407baSopenharmony_ci } break; 2703d0407baSopenharmony_ci default : { 2713d0407baSopenharmony_ci mpp_err_f("unsupport encoder rc mode %d\n", p->rc_mode); 2723d0407baSopenharmony_ci } break; 2733d0407baSopenharmony_ci } 2743d0407baSopenharmony_ci } break; 2753d0407baSopenharmony_ci case MPP_VIDEO_CodingVP8 : { 2763d0407baSopenharmony_ci /* vp8 only setup base qp range */ 2773d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "rc:qp_init", 40); 2783d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "rc:qp_max", 127); 2793d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "rc:qp_min", 0); 2803d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "rc:qp_max_i", 127); 2813d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "rc:qp_min_i", 0); 2823d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "rc:qp_ip", 6); 2833d0407baSopenharmony_ci } break; 2843d0407baSopenharmony_ci case MPP_VIDEO_CodingMJPEG : { 2853d0407baSopenharmony_ci /* jpeg use special codec config to control qtable */ 2863d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "jpeg:q_factor", 80); 2873d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "jpeg:qf_max", 99); 2883d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "jpeg:qf_min", 1); 2893d0407baSopenharmony_ci } break; 2903d0407baSopenharmony_ci default : { 2913d0407baSopenharmony_ci } break; 2923d0407baSopenharmony_ci } 2933d0407baSopenharmony_ci 2943d0407baSopenharmony_ci /* setup codec */ 2953d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "codec:type", p->type); 2963d0407baSopenharmony_ci switch (p->type) { 2973d0407baSopenharmony_ci case MPP_VIDEO_CodingAVC : { 2983d0407baSopenharmony_ci /* 2993d0407baSopenharmony_ci * H.264 profile_idc parameter 3003d0407baSopenharmony_ci * 66 - Baseline profile 3013d0407baSopenharmony_ci * 77 - Main profile 3023d0407baSopenharmony_ci * 100 - High profile 3033d0407baSopenharmony_ci */ 3043d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "h264:profile", 100); 3053d0407baSopenharmony_ci /* 3063d0407baSopenharmony_ci * H.264 level_idc parameter 3073d0407baSopenharmony_ci * 10 / 11 / 12 / 13 - qcif@15fps / cif@7.5fps / cif@15fps / cif@30fps 3083d0407baSopenharmony_ci * 20 / 21 / 22 - cif@30fps / half-D1@@25fps / D1@12.5fps 3093d0407baSopenharmony_ci * 30 / 31 / 32 - D1@25fps / 720p@30fps / 720p@60fps 3103d0407baSopenharmony_ci * 40 / 41 / 42 - 1080p@30fps / 1080p@30fps / 1080p@60fps 3113d0407baSopenharmony_ci * 50 / 51 / 52 - 4K@30fps 3123d0407baSopenharmony_ci */ 3133d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "h264:level", 40); 3143d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "h264:cabac_en", 1); 3153d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "h264:cabac_idc", 0); 3163d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "h264:trans8x8", 1); 3173d0407baSopenharmony_ci } break; 3183d0407baSopenharmony_ci case MPP_VIDEO_CodingHEVC : 3193d0407baSopenharmony_ci case MPP_VIDEO_CodingMJPEG : 3203d0407baSopenharmony_ci case MPP_VIDEO_CodingVP8 : { 3213d0407baSopenharmony_ci } break; 3223d0407baSopenharmony_ci default : { 3233d0407baSopenharmony_ci mpp_err_f("unsupport encoder coding type %d\n", p->type); 3243d0407baSopenharmony_ci } break; 3253d0407baSopenharmony_ci } 3263d0407baSopenharmony_ci 3273d0407baSopenharmony_ci p->split_mode = 0; 3283d0407baSopenharmony_ci p->split_arg = 0; 3293d0407baSopenharmony_ci p->split_out = 0; 3303d0407baSopenharmony_ci 3313d0407baSopenharmony_ci mpp_env_get_u32("split_mode", &p->split_mode, MPP_ENC_SPLIT_NONE); 3323d0407baSopenharmony_ci mpp_env_get_u32("split_arg", &p->split_arg, 0); 3333d0407baSopenharmony_ci mpp_env_get_u32("split_out", &p->split_out, 0); 3343d0407baSopenharmony_ci 3353d0407baSopenharmony_ci if (p->split_mode) { 3363d0407baSopenharmony_ci mpp_log_q(quiet, "%p split mode %d arg %d out %d\n", ctx, 3373d0407baSopenharmony_ci p->split_mode, p->split_arg, p->split_out); 3383d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "split:mode", p->split_mode); 3393d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "split:arg", p->split_arg); 3403d0407baSopenharmony_ci mpp_enc_cfg_set_s32(cfg, "split:out", p->split_out); 3413d0407baSopenharmony_ci } 3423d0407baSopenharmony_ci 3433d0407baSopenharmony_ci ret = mpi->control(ctx, MPP_ENC_SET_CFG, cfg); 3443d0407baSopenharmony_ci if (ret) { 3453d0407baSopenharmony_ci mpp_err("mpi control enc set cfg failed ret %d\n", ret); 3463d0407baSopenharmony_ci goto RET; 3473d0407baSopenharmony_ci } 3483d0407baSopenharmony_ci 3493d0407baSopenharmony_ci /* optional */ 3503d0407baSopenharmony_ci p->sei_mode = MPP_ENC_SEI_MODE_ONE_FRAME; 3513d0407baSopenharmony_ci ret = mpi->control(ctx, MPP_ENC_SET_SEI_CFG, &p->sei_mode); 3523d0407baSopenharmony_ci if (ret) { 3533d0407baSopenharmony_ci mpp_err("mpi control enc set sei cfg failed ret %d\n", ret); 3543d0407baSopenharmony_ci goto RET; 3553d0407baSopenharmony_ci } 3563d0407baSopenharmony_ci 3573d0407baSopenharmony_ci if (p->type == MPP_VIDEO_CodingAVC || p->type == MPP_VIDEO_CodingHEVC) { 3583d0407baSopenharmony_ci p->header_mode = MPP_ENC_HEADER_MODE_EACH_IDR; 3593d0407baSopenharmony_ci ret = mpi->control(ctx, MPP_ENC_SET_HEADER_MODE, &p->header_mode); 3603d0407baSopenharmony_ci if (ret) { 3613d0407baSopenharmony_ci mpp_err("mpi control enc set header mode failed ret %d\n", ret); 3623d0407baSopenharmony_ci goto RET; 3633d0407baSopenharmony_ci } 3643d0407baSopenharmony_ci } 3653d0407baSopenharmony_ci 3663d0407baSopenharmony_ci RK_U32 gop_mode = p->gop_mode; 3673d0407baSopenharmony_ci 3683d0407baSopenharmony_ci mpp_env_get_u32("gop_mode", &gop_mode, gop_mode); 3693d0407baSopenharmony_ci if (gop_mode) { 3703d0407baSopenharmony_ci MppEncRefCfg ref; 3713d0407baSopenharmony_ci 3723d0407baSopenharmony_ci mpp_enc_ref_cfg_init(&ref); 3733d0407baSopenharmony_ci 3743d0407baSopenharmony_ci if (p->gop_mode < 4) 3753d0407baSopenharmony_ci mpi_enc_gen_ref_cfg(ref, gop_mode); 3763d0407baSopenharmony_ci else 3773d0407baSopenharmony_ci mpi_enc_gen_smart_gop_ref_cfg(ref, p->gop_len, p->vi_len); 3783d0407baSopenharmony_ci 3793d0407baSopenharmony_ci ret = mpi->control(ctx, MPP_ENC_SET_REF_CFG, ref); 3803d0407baSopenharmony_ci if (ret) { 3813d0407baSopenharmony_ci mpp_err("mpi control enc set ref cfg failed ret %d\n", ret); 3823d0407baSopenharmony_ci goto RET; 3833d0407baSopenharmony_ci } 3843d0407baSopenharmony_ci mpp_enc_ref_cfg_deinit(&ref); 3853d0407baSopenharmony_ci } 3863d0407baSopenharmony_ci 3873d0407baSopenharmony_ci /* setup test mode by env */ 3883d0407baSopenharmony_ci mpp_env_get_u32("osd_enable", &p->osd_enable, 0); 3893d0407baSopenharmony_ci mpp_env_get_u32("osd_mode", &p->osd_mode, MPP_ENC_OSD_PLT_TYPE_DEFAULT); 3903d0407baSopenharmony_ci mpp_env_get_u32("roi_enable", &p->roi_enable, 0); 3913d0407baSopenharmony_ci mpp_env_get_u32("user_data_enable", &p->user_data_enable, 0); 3923d0407baSopenharmony_ci 3933d0407baSopenharmony_ci if (p->roi_enable) { 3943d0407baSopenharmony_ci mpp_enc_roi_init(&p->roi_ctx, p->width, p->height, p->type, 4); 3953d0407baSopenharmony_ci mpp_assert(p->roi_ctx); 3963d0407baSopenharmony_ci } 3973d0407baSopenharmony_ci 3983d0407baSopenharmony_ciRET: 3993d0407baSopenharmony_ci return ret; 4003d0407baSopenharmony_ci} 4013d0407baSopenharmony_ci 4023d0407baSopenharmony_ciint hal_mpp_get_sps(void *ctxs, unsigned char *buf, size_t *buf_size) 4033d0407baSopenharmony_ci{ 4043d0407baSopenharmony_ci MpiEncTestData *p = &((MpiEncMultiCtxInfo *)ctxs)->ctx; 4053d0407baSopenharmony_ci MppApi *mpi = p->mpi; 4063d0407baSopenharmony_ci MppCtx ctx = p->ctx; 4073d0407baSopenharmony_ci int ret; 4083d0407baSopenharmony_ci 4093d0407baSopenharmony_ci if (!p) { 4103d0407baSopenharmony_ci mpp_err("mpi control enc get extra info failed\n"); 4113d0407baSopenharmony_ci return MPP_NOK; 4123d0407baSopenharmony_ci } 4133d0407baSopenharmony_ci 4143d0407baSopenharmony_ci if (p->type == MPP_VIDEO_CodingAVC || p->type == MPP_VIDEO_CodingHEVC) { 4153d0407baSopenharmony_ci MppPacket packet = NULL; 4163d0407baSopenharmony_ci 4173d0407baSopenharmony_ci /* 4183d0407baSopenharmony_ci * Can use packet with normal malloc buffer as input not pkt_buf. 4193d0407baSopenharmony_ci * Please refer to vpu_api_legacy.cpp for normal buffer case. 4203d0407baSopenharmony_ci * Using pkt_buf buffer here is just for simplifing demo. 4213d0407baSopenharmony_ci */ 4223d0407baSopenharmony_ci mpp_packet_init_with_buffer(&packet, p->pkt_buf); 4233d0407baSopenharmony_ci /* NOTE: It is important to clear output packet length!! */ 4243d0407baSopenharmony_ci mpp_packet_set_length(packet, 0); 4253d0407baSopenharmony_ci 4263d0407baSopenharmony_ci ret = mpi->control(ctx, MPP_ENC_GET_HDR_SYNC, packet); 4273d0407baSopenharmony_ci if (ret) { 4283d0407baSopenharmony_ci mpp_err("mpi control enc get extra info failed\n"); 4293d0407baSopenharmony_ci return MPP_NOK; 4303d0407baSopenharmony_ci } else { 4313d0407baSopenharmony_ci /* get and write sps/pps for H.264 */ 4323d0407baSopenharmony_ci void *ptr = mpp_packet_get_pos(packet); 4333d0407baSopenharmony_ci size_t len = mpp_packet_get_length(packet); 4343d0407baSopenharmony_ci 4353d0407baSopenharmony_ci if (*buf_size < len) { 4363d0407baSopenharmony_ci mpp_err("mpi buffer size too small\n"); 4373d0407baSopenharmony_ci ret = MPP_NOK; 4383d0407baSopenharmony_ci mpp_packet_deinit(&packet); 4393d0407baSopenharmony_ci return ret; 4403d0407baSopenharmony_ci } 4413d0407baSopenharmony_ci 4423d0407baSopenharmony_ci errno_t eok = memcpy_s(buf, len, ptr, len); 4433d0407baSopenharmony_ci if (eok != EOK) { 4443d0407baSopenharmony_ci mpp_err("memcpy_s failed\n"); 4453d0407baSopenharmony_ci return MPP_NOK; 4463d0407baSopenharmony_ci } 4473d0407baSopenharmony_ci 4483d0407baSopenharmony_ci *buf_size = len; 4493d0407baSopenharmony_ci 4503d0407baSopenharmony_ci } 4513d0407baSopenharmony_ci mpp_packet_deinit(&packet); 4523d0407baSopenharmony_ci } 4533d0407baSopenharmony_ci 4543d0407baSopenharmony_ci ret = MPP_OK; 4553d0407baSopenharmony_ci return ret; 4563d0407baSopenharmony_ci} 4573d0407baSopenharmony_ci 4583d0407baSopenharmony_ciint hal_mpp_encode(void *ctxs, int dma_fd, unsigned char *buf, size_t *buf_size) 4593d0407baSopenharmony_ci{ 4603d0407baSopenharmony_ci MpiEncMultiCtxInfo *info = (MpiEncMultiCtxInfo *)ctxs; 4613d0407baSopenharmony_ci MpiEncTestArgs *cmd = info->cmd; 4623d0407baSopenharmony_ci MpiEncMultiCtxRet *enc_ret = &info->ret; 4633d0407baSopenharmony_ci MpiEncTestData *p = &info->ctx; 4643d0407baSopenharmony_ci MppApi *mpi = p->mpi; 4653d0407baSopenharmony_ci MppCtx ctx = p->ctx; 4663d0407baSopenharmony_ci RK_U32 quiet = cmd->quiet; 4673d0407baSopenharmony_ci RK_S32 chn = info->chn; 4683d0407baSopenharmony_ci DataCrc checkcrc; 4693d0407baSopenharmony_ci RK_S64 t_s = 0; 4703d0407baSopenharmony_ci RK_S64 t_e = 0; 4713d0407baSopenharmony_ci size_t bufPos = 0; 4723d0407baSopenharmony_ci 4733d0407baSopenharmony_ci t_s = mpp_time(); 4743d0407baSopenharmony_ci 4753d0407baSopenharmony_ci MppBuffer hbuf = NULL; 4763d0407baSopenharmony_ci MppBufferInfo inf; 4773d0407baSopenharmony_ci memset(&inf, 0, sizeof(MppBufferInfo)); 4783d0407baSopenharmony_ci inf.type = MPP_BUFFER_TYPE_EXT_DMA; 4793d0407baSopenharmony_ci inf.fd = dma_fd; 4803d0407baSopenharmony_ci inf.size = p->frame_size & 0x07ffffff; 4813d0407baSopenharmony_ci inf.index = (p->frame_size & 0xf8000000) >> 27; 4823d0407baSopenharmony_ci mpp_buffer_import(&hbuf, &inf); 4833d0407baSopenharmony_ci 4843d0407baSopenharmony_ci memset(&checkcrc, 0, sizeof(checkcrc)); 4853d0407baSopenharmony_ci checkcrc.sum = mpp_malloc(RK_ULONG, 512); 4863d0407baSopenharmony_ci 4873d0407baSopenharmony_ci //while (!p->pkt_eos) { 4883d0407baSopenharmony_ci MppMeta meta = NULL; 4893d0407baSopenharmony_ci MppFrame frame = NULL; 4903d0407baSopenharmony_ci MppPacket packet = NULL; 4913d0407baSopenharmony_ci RK_U32 eoi = 1; 4923d0407baSopenharmony_ci 4933d0407baSopenharmony_ci MPP_RET ret = mpp_frame_init(&frame); 4943d0407baSopenharmony_ci if (ret) { 4953d0407baSopenharmony_ci mpp_err_f("mpp_frame_init failed\n"); 4963d0407baSopenharmony_ci goto RET; 4973d0407baSopenharmony_ci } 4983d0407baSopenharmony_ci 4993d0407baSopenharmony_ci mpp_frame_set_width(frame, p->width); 5003d0407baSopenharmony_ci mpp_frame_set_height(frame, p->height); 5013d0407baSopenharmony_ci mpp_frame_set_hor_stride(frame, p->hor_stride); 5023d0407baSopenharmony_ci mpp_frame_set_ver_stride(frame, p->ver_stride); 5033d0407baSopenharmony_ci mpp_frame_set_fmt(frame, p->fmt); 5043d0407baSopenharmony_ci mpp_frame_set_eos(frame, p->frm_eos); 5053d0407baSopenharmony_ci 5063d0407baSopenharmony_ci //mpp_frame_set_buffer(frame, p->frm_buf); 5073d0407baSopenharmony_ci mpp_frame_set_buffer(frame, hbuf); 5083d0407baSopenharmony_ci 5093d0407baSopenharmony_ci meta = mpp_frame_get_meta(frame); 5103d0407baSopenharmony_ci mpp_packet_init_with_buffer(&packet, p->pkt_buf); 5113d0407baSopenharmony_ci /* NOTE: It is important to clear output packet length!! */ 5123d0407baSopenharmony_ci mpp_packet_set_length(packet, 0); 5133d0407baSopenharmony_ci mpp_meta_set_packet(meta, KEY_OUTPUT_PACKET, packet); 5143d0407baSopenharmony_ci mpp_meta_set_buffer(meta, KEY_MOTION_INFO, p->md_info); 5153d0407baSopenharmony_ci 5163d0407baSopenharmony_ci if (p->osd_enable || p->user_data_enable || p->roi_enable) { 5173d0407baSopenharmony_ci if (p->user_data_enable) { 5183d0407baSopenharmony_ci MppEncUserData user_data; 5193d0407baSopenharmony_ci char *str = "this is user data\n"; 5203d0407baSopenharmony_ci 5213d0407baSopenharmony_ci if ((p->frame_count & 10) == 0) { 5223d0407baSopenharmony_ci user_data.pdata = str; 5233d0407baSopenharmony_ci user_data.len = strlen(str) + 1; 5243d0407baSopenharmony_ci mpp_meta_set_ptr(meta, KEY_USER_DATA, &user_data); 5253d0407baSopenharmony_ci } 5263d0407baSopenharmony_ci static RK_U8 uuid_debug_info[16] = { 5273d0407baSopenharmony_ci 0x57, 0x68, 0x97, 0x80, 0xe7, 0x0c, 0x4b, 0x65, 5283d0407baSopenharmony_ci 0xa9, 0x06, 0xae, 0x29, 0x94, 0x11, 0xcd, 0x9a 5293d0407baSopenharmony_ci }; 5303d0407baSopenharmony_ci 5313d0407baSopenharmony_ci MppEncUserDataSet data_group; 5323d0407baSopenharmony_ci MppEncUserDataFull datas[2]; 5333d0407baSopenharmony_ci char *str1 = "this is user data 1\n"; 5343d0407baSopenharmony_ci char *str2 = "this is user data 2\n"; 5353d0407baSopenharmony_ci data_group.count = 2; 5363d0407baSopenharmony_ci datas[0].len = strlen(str1) + 1; 5373d0407baSopenharmony_ci datas[0].pdata = str1; 5383d0407baSopenharmony_ci datas[0].uuid = uuid_debug_info; 5393d0407baSopenharmony_ci 5403d0407baSopenharmony_ci datas[1].len = strlen(str2) + 1; 5413d0407baSopenharmony_ci datas[1].pdata = str2; 5423d0407baSopenharmony_ci datas[1].uuid = uuid_debug_info; 5433d0407baSopenharmony_ci 5443d0407baSopenharmony_ci data_group.datas = datas; 5453d0407baSopenharmony_ci 5463d0407baSopenharmony_ci mpp_meta_set_ptr(meta, KEY_USER_DATAS, &data_group); 5473d0407baSopenharmony_ci } 5483d0407baSopenharmony_ci 5493d0407baSopenharmony_ci if (p->osd_enable) { 5503d0407baSopenharmony_ci /* gen and cfg osd plt */ 5513d0407baSopenharmony_ci mpi_enc_gen_osd_plt(&p->osd_plt, p->frame_count); 5523d0407baSopenharmony_ci 5533d0407baSopenharmony_ci p->osd_plt_cfg.change = MPP_ENC_OSD_PLT_CFG_CHANGE_ALL; 5543d0407baSopenharmony_ci p->osd_plt_cfg.type = MPP_ENC_OSD_PLT_TYPE_USERDEF; 5553d0407baSopenharmony_ci p->osd_plt_cfg.plt = &p->osd_plt; 5563d0407baSopenharmony_ci 5573d0407baSopenharmony_ci ret = mpi->control(ctx, MPP_ENC_SET_OSD_PLT_CFG, &p->osd_plt_cfg); 5583d0407baSopenharmony_ci if (ret) { 5593d0407baSopenharmony_ci mpp_err("mpi control enc set osd plt failed ret %d\n", ret); 5603d0407baSopenharmony_ci goto RET; 5613d0407baSopenharmony_ci } 5623d0407baSopenharmony_ci 5633d0407baSopenharmony_ci /* gen and cfg osd plt */ 5643d0407baSopenharmony_ci mpi_enc_gen_osd_data(&p->osd_data, p->buf_grp, p->width, 5653d0407baSopenharmony_ci p->height, p->frame_count); 5663d0407baSopenharmony_ci mpp_meta_set_ptr(meta, KEY_OSD_DATA, (void*)&p->osd_data); 5673d0407baSopenharmony_ci } 5683d0407baSopenharmony_ci 5693d0407baSopenharmony_ci if (p->roi_enable) { 5703d0407baSopenharmony_ci RoiRegionCfg *region = &p->roi_region; 5713d0407baSopenharmony_ci 5723d0407baSopenharmony_ci /* calculated in pixels */ 5733d0407baSopenharmony_ci region->x = MPP_ALIGN(p->width / 8, 16); 5743d0407baSopenharmony_ci region->y = MPP_ALIGN(p->height / 8, 16); 5753d0407baSopenharmony_ci region->w = 128; 5763d0407baSopenharmony_ci region->h = 256; 5773d0407baSopenharmony_ci region->force_intra = 0; 5783d0407baSopenharmony_ci region->qp_mode = 1; 5793d0407baSopenharmony_ci region->qp_val = 24; 5803d0407baSopenharmony_ci 5813d0407baSopenharmony_ci mpp_enc_roi_add_region(p->roi_ctx, region); 5823d0407baSopenharmony_ci 5833d0407baSopenharmony_ci region->x = MPP_ALIGN(p->width / 2, 16); 5843d0407baSopenharmony_ci region->y = MPP_ALIGN(p->height / 4, 16); 5853d0407baSopenharmony_ci region->w = 256; 5863d0407baSopenharmony_ci region->h = 128; 5873d0407baSopenharmony_ci region->force_intra = 1; 5883d0407baSopenharmony_ci region->qp_mode = 1; 5893d0407baSopenharmony_ci region->qp_val = 10; 5903d0407baSopenharmony_ci 5913d0407baSopenharmony_ci mpp_enc_roi_add_region(p->roi_ctx, region); 5923d0407baSopenharmony_ci 5933d0407baSopenharmony_ci /* send roi info by metadata */ 5943d0407baSopenharmony_ci mpp_enc_roi_setup_meta(p->roi_ctx, meta); 5953d0407baSopenharmony_ci } 5963d0407baSopenharmony_ci } 5973d0407baSopenharmony_ci 5983d0407baSopenharmony_ci if (!p->first_frm) 5993d0407baSopenharmony_ci p->first_frm = mpp_time(); 6003d0407baSopenharmony_ci /* 6013d0407baSopenharmony_ci * NOTE: in non-block mode the frame can be resent. 6023d0407baSopenharmony_ci * The default input timeout mode is block. 6033d0407baSopenharmony_ci * 6043d0407baSopenharmony_ci * User should release the input frame to meet the requirements of 6053d0407baSopenharmony_ci * resource creator must be the resource destroyer. 6063d0407baSopenharmony_ci */ 6073d0407baSopenharmony_ci ret = mpi->encode_put_frame(ctx, frame); 6083d0407baSopenharmony_ci if (ret) { 6093d0407baSopenharmony_ci mpp_err("chn %d encode put frame failed\n", chn); 6103d0407baSopenharmony_ci mpp_frame_deinit(&frame); 6113d0407baSopenharmony_ci if (hbuf) { 6123d0407baSopenharmony_ci mpp_buffer_put(hbuf); 6133d0407baSopenharmony_ci } 6143d0407baSopenharmony_ci goto RET; 6153d0407baSopenharmony_ci } 6163d0407baSopenharmony_ci 6173d0407baSopenharmony_ci mpp_frame_deinit(&frame); 6183d0407baSopenharmony_ci 6193d0407baSopenharmony_ci do { 6203d0407baSopenharmony_ci ret = mpi->encode_get_packet(ctx, &packet); 6213d0407baSopenharmony_ci if (ret) { 6223d0407baSopenharmony_ci if (hbuf) { 6233d0407baSopenharmony_ci mpp_buffer_put(hbuf); 6243d0407baSopenharmony_ci } 6253d0407baSopenharmony_ci mpp_err("chn %d encode get packet failed\n", chn); 6263d0407baSopenharmony_ci goto RET; 6273d0407baSopenharmony_ci } 6283d0407baSopenharmony_ci mpp_assert(packet); 6293d0407baSopenharmony_ci 6303d0407baSopenharmony_ci if (packet) { 6313d0407baSopenharmony_ci // write packet to file here 6323d0407baSopenharmony_ci void *ptr = mpp_packet_get_pos(packet); 6333d0407baSopenharmony_ci size_t len = mpp_packet_get_length(packet); 6343d0407baSopenharmony_ci memcpy_s(&buf[bufPos], len, ptr, len); 6353d0407baSopenharmony_ci bufPos += len; 6363d0407baSopenharmony_ci char log_buf[256]; 6373d0407baSopenharmony_ci RK_S32 log_size = sizeof(log_buf) - 1; 6383d0407baSopenharmony_ci RK_S32 log_len = 0; 6393d0407baSopenharmony_ci 6403d0407baSopenharmony_ci if (!p->first_pkt) 6413d0407baSopenharmony_ci p->first_pkt = mpp_time(); 6423d0407baSopenharmony_ci 6433d0407baSopenharmony_ci p->pkt_eos = mpp_packet_get_eos(packet); 6443d0407baSopenharmony_ci if (p->fp_output) 6453d0407baSopenharmony_ci fwrite(ptr, 1, len, p->fp_output); 6463d0407baSopenharmony_ci 6473d0407baSopenharmony_ci log_len += snprintf(log_buf + log_len, log_size - log_len, 6483d0407baSopenharmony_ci "encoded frame %-4d", p->frame_count); 6493d0407baSopenharmony_ci 6503d0407baSopenharmony_ci /* for low delay partition encoding */ 6513d0407baSopenharmony_ci if (mpp_packet_is_partition(packet)) { 6523d0407baSopenharmony_ci eoi = mpp_packet_is_eoi(packet); 6533d0407baSopenharmony_ci 6543d0407baSopenharmony_ci log_len += snprintf(log_buf + log_len, log_size - log_len, 6553d0407baSopenharmony_ci " pkt %d", p->frm_pkt_cnt); 6563d0407baSopenharmony_ci p->frm_pkt_cnt = (eoi) ? (0) : (p->frm_pkt_cnt + 1); 6573d0407baSopenharmony_ci } 6583d0407baSopenharmony_ci 6593d0407baSopenharmony_ci log_len += snprintf(log_buf + log_len, log_size - log_len, 6603d0407baSopenharmony_ci " size %-7zu", len); 6613d0407baSopenharmony_ci 6623d0407baSopenharmony_ci if (mpp_packet_has_meta(packet)) { 6633d0407baSopenharmony_ci meta = mpp_packet_get_meta(packet); 6643d0407baSopenharmony_ci RK_S32 temporal_id = 0; 6653d0407baSopenharmony_ci RK_S32 lt_idx = -1; 6663d0407baSopenharmony_ci RK_S32 avg_qp = -1; 6673d0407baSopenharmony_ci 6683d0407baSopenharmony_ci if (MPP_OK == mpp_meta_get_s32(meta, KEY_TEMPORAL_ID, &temporal_id)) 6693d0407baSopenharmony_ci log_len += snprintf(log_buf + log_len, log_size - log_len, 6703d0407baSopenharmony_ci " tid %d", temporal_id); 6713d0407baSopenharmony_ci 6723d0407baSopenharmony_ci if (MPP_OK == mpp_meta_get_s32(meta, KEY_LONG_REF_IDX, <_idx)) 6733d0407baSopenharmony_ci log_len += snprintf(log_buf + log_len, log_size - log_len, 6743d0407baSopenharmony_ci " lt %d", lt_idx); 6753d0407baSopenharmony_ci 6763d0407baSopenharmony_ci if (MPP_OK == mpp_meta_get_s32(meta, KEY_ENC_AVERAGE_QP, &avg_qp)) 6773d0407baSopenharmony_ci log_len += snprintf(log_buf + log_len, log_size - log_len, 6783d0407baSopenharmony_ci " qp %d", avg_qp); 6793d0407baSopenharmony_ci } 6803d0407baSopenharmony_ci 6813d0407baSopenharmony_ci mpp_log_q(quiet, "chn %d %s\n", chn, log_buf); 6823d0407baSopenharmony_ci 6833d0407baSopenharmony_ci //mpp_packet_deinit(&packet); 6843d0407baSopenharmony_ci fps_calc_inc(cmd->fps); 6853d0407baSopenharmony_ci 6863d0407baSopenharmony_ci p->stream_size += len; 6873d0407baSopenharmony_ci p->frame_count += eoi; 6883d0407baSopenharmony_ci 6893d0407baSopenharmony_ci if (p->pkt_eos) { 6903d0407baSopenharmony_ci mpp_log_q(quiet, "chn %d found last packet\n", chn); 6913d0407baSopenharmony_ci mpp_assert(p->frm_eos); 6923d0407baSopenharmony_ci } 6933d0407baSopenharmony_ci } 6943d0407baSopenharmony_ci } while (!eoi); 6953d0407baSopenharmony_ci 6963d0407baSopenharmony_ciRET: 6973d0407baSopenharmony_ci MPP_FREE(checkcrc.sum); 6983d0407baSopenharmony_ci t_e = mpp_time(); 6993d0407baSopenharmony_ci 7003d0407baSopenharmony_ci if (hbuf) { 7013d0407baSopenharmony_ci mpp_buffer_put(hbuf); 7023d0407baSopenharmony_ci } 7033d0407baSopenharmony_ci mpp_packet_deinit(&packet); 7043d0407baSopenharmony_ci 7053d0407baSopenharmony_ci enc_ret->elapsed_time = t_e - t_s; 7063d0407baSopenharmony_ci enc_ret->frame_count = p->frame_count; 7073d0407baSopenharmony_ci enc_ret->stream_size = p->stream_size; 7083d0407baSopenharmony_ci enc_ret->frame_rate = (float)p->frame_count * 1000000 / enc_ret->elapsed_time; 7093d0407baSopenharmony_ci enc_ret->bit_rate = (p->stream_size * 8 * (p->fps_out_num / p->fps_out_den)) / p->frame_count; 7103d0407baSopenharmony_ci enc_ret->delay = p->first_pkt - p->first_frm; 7113d0407baSopenharmony_ci 7123d0407baSopenharmony_ci *buf_size = bufPos; 7133d0407baSopenharmony_ci 7143d0407baSopenharmony_ci return ret; 7153d0407baSopenharmony_ci} 7163d0407baSopenharmony_ci 7173d0407baSopenharmony_civoid hal_mpp_ctx_delete(void *ctx) 7183d0407baSopenharmony_ci{ 7193d0407baSopenharmony_ci MpiEncMultiCtxInfo *info = (MpiEncMultiCtxInfo *)ctx; 7203d0407baSopenharmony_ci MpiEncTestData *p = &info->ctx; 7213d0407baSopenharmony_ci MpiEncTestArgs* cmd = info->cmd; 7223d0407baSopenharmony_ci int ret = 0; 7233d0407baSopenharmony_ci 7243d0407baSopenharmony_ci ret = p->mpi->reset(p->ctx); 7253d0407baSopenharmony_ci if (ret) { 7263d0407baSopenharmony_ci mpp_err("mpi->reset failed\n"); 7273d0407baSopenharmony_ci } 7283d0407baSopenharmony_ci 7293d0407baSopenharmony_ci if (p->ctx) { 7303d0407baSopenharmony_ci mpp_destroy(p->ctx); 7313d0407baSopenharmony_ci p->ctx = NULL; 7323d0407baSopenharmony_ci } 7333d0407baSopenharmony_ci 7343d0407baSopenharmony_ci if (p->cfg) { 7353d0407baSopenharmony_ci mpp_enc_cfg_deinit(p->cfg); 7363d0407baSopenharmony_ci p->cfg = NULL; 7373d0407baSopenharmony_ci } 7383d0407baSopenharmony_ci 7393d0407baSopenharmony_ci if (p->frm_buf) { 7403d0407baSopenharmony_ci mpp_buffer_put(p->frm_buf); 7413d0407baSopenharmony_ci p->frm_buf = NULL; 7423d0407baSopenharmony_ci } 7433d0407baSopenharmony_ci 7443d0407baSopenharmony_ci if (p->pkt_buf) { 7453d0407baSopenharmony_ci mpp_buffer_put(p->pkt_buf); 7463d0407baSopenharmony_ci p->pkt_buf = NULL; 7473d0407baSopenharmony_ci } 7483d0407baSopenharmony_ci 7493d0407baSopenharmony_ci if (p->md_info) { 7503d0407baSopenharmony_ci mpp_buffer_put(p->md_info); 7513d0407baSopenharmony_ci p->md_info = NULL; 7523d0407baSopenharmony_ci } 7533d0407baSopenharmony_ci 7543d0407baSopenharmony_ci if (p->osd_data.buf) { 7553d0407baSopenharmony_ci mpp_buffer_put(p->osd_data.buf); 7563d0407baSopenharmony_ci p->osd_data.buf = NULL; 7573d0407baSopenharmony_ci } 7583d0407baSopenharmony_ci 7593d0407baSopenharmony_ci if (p->buf_grp) { 7603d0407baSopenharmony_ci mpp_buffer_group_put(p->buf_grp); 7613d0407baSopenharmony_ci p->buf_grp = NULL; 7623d0407baSopenharmony_ci } 7633d0407baSopenharmony_ci 7643d0407baSopenharmony_ci if (p->roi_ctx) { 7653d0407baSopenharmony_ci mpp_enc_roi_deinit(p->roi_ctx); 7663d0407baSopenharmony_ci p->roi_ctx = NULL; 7673d0407baSopenharmony_ci } 7683d0407baSopenharmony_ci 7693d0407baSopenharmony_ci test_ctx_deinit(p); 7703d0407baSopenharmony_ci MPP_FREE(info); 7713d0407baSopenharmony_ci 7723d0407baSopenharmony_ci if (NULL == cmd) 7733d0407baSopenharmony_ci return; 7743d0407baSopenharmony_ci 7753d0407baSopenharmony_ci if (cmd->cfg_ini) { 7763d0407baSopenharmony_ci iniparser_freedict(cmd->cfg_ini); 7773d0407baSopenharmony_ci cmd->cfg_ini = NULL; 7783d0407baSopenharmony_ci } 7793d0407baSopenharmony_ci 7803d0407baSopenharmony_ci if (cmd->fps) { 7813d0407baSopenharmony_ci fps_calc_deinit(cmd->fps); 7823d0407baSopenharmony_ci cmd->fps = NULL; 7833d0407baSopenharmony_ci } 7843d0407baSopenharmony_ci MPP_FREE(cmd); 7853d0407baSopenharmony_ci 7863d0407baSopenharmony_ci return; 7873d0407baSopenharmony_ci} 7883d0407baSopenharmony_ci 7893d0407baSopenharmony_civoid *hal_mpp_ctx_create(MpiEncTestArgs *args) 7903d0407baSopenharmony_ci{ 7913d0407baSopenharmony_ci MpiEncMultiCtxInfo *ctxs = mpp_calloc(MpiEncMultiCtxInfo, args->nthreads); 7923d0407baSopenharmony_ci if (NULL == ctxs) { 7933d0407baSopenharmony_ci mpp_err("failed to alloc context for instances\n"); 7943d0407baSopenharmony_ci return NULL; 7953d0407baSopenharmony_ci } 7963d0407baSopenharmony_ci ctxs[0].cmd = args; 7973d0407baSopenharmony_ci ctxs[0].chn = 0; 7983d0407baSopenharmony_ci ctxs[0].name = "rk_camera"; 7993d0407baSopenharmony_ci 8003d0407baSopenharmony_ci MpiEncMultiCtxInfo *info = ctxs; 8013d0407baSopenharmony_ci MpiEncTestArgs *cmd = info->cmd; 8023d0407baSopenharmony_ci MpiEncTestData *p = &info->ctx; 8033d0407baSopenharmony_ci MppPollType timeout = MPP_POLL_BLOCK; 8043d0407baSopenharmony_ci RK_U32 quiet = cmd->quiet; 8053d0407baSopenharmony_ci 8063d0407baSopenharmony_ci MPP_RET ret = test_ctx_init(info); 8073d0407baSopenharmony_ci if (ret) { 8083d0407baSopenharmony_ci mpp_err_f("test data init failed ret %d\n", ret); 8093d0407baSopenharmony_ci goto MPP_TEST_OUT; 8103d0407baSopenharmony_ci } 8113d0407baSopenharmony_ci 8123d0407baSopenharmony_ci ret = mpp_buffer_group_get_internal(&p->buf_grp, MPP_BUFFER_TYPE_DRM); 8133d0407baSopenharmony_ci if (ret) { 8143d0407baSopenharmony_ci mpp_err_f("failed to get mpp buffer group ret %d\n", ret); 8153d0407baSopenharmony_ci goto MPP_TEST_OUT; 8163d0407baSopenharmony_ci } 8173d0407baSopenharmony_ci 8183d0407baSopenharmony_ci ret = mpp_buffer_get(p->buf_grp, &p->frm_buf, p->frame_size + p->header_size); 8193d0407baSopenharmony_ci if (ret) { 8203d0407baSopenharmony_ci mpp_err_f("failed to get buffer for input frame ret %d\n", ret); 8213d0407baSopenharmony_ci goto MPP_TEST_OUT; 8223d0407baSopenharmony_ci } 8233d0407baSopenharmony_ci 8243d0407baSopenharmony_ci ret = mpp_buffer_get(p->buf_grp, &p->pkt_buf, p->frame_size); 8253d0407baSopenharmony_ci if (ret) { 8263d0407baSopenharmony_ci mpp_err_f("failed to get buffer for output packet ret %d\n", ret); 8273d0407baSopenharmony_ci goto MPP_TEST_OUT; 8283d0407baSopenharmony_ci } 8293d0407baSopenharmony_ci 8303d0407baSopenharmony_ci ret = mpp_buffer_get(p->buf_grp, &p->md_info, p->mdinfo_size); 8313d0407baSopenharmony_ci if (ret) { 8323d0407baSopenharmony_ci mpp_err_f("failed to get buffer for motion info output packet ret %d\n", ret); 8333d0407baSopenharmony_ci goto MPP_TEST_OUT; 8343d0407baSopenharmony_ci } 8353d0407baSopenharmony_ci 8363d0407baSopenharmony_ci // encoder demo 8373d0407baSopenharmony_ci ret = mpp_create(&p->ctx, &p->mpi); 8383d0407baSopenharmony_ci if (ret) { 8393d0407baSopenharmony_ci mpp_err("mpp_create failed ret %d\n", ret); 8403d0407baSopenharmony_ci goto MPP_TEST_OUT; 8413d0407baSopenharmony_ci } 8423d0407baSopenharmony_ci 8433d0407baSopenharmony_ci mpp_log_q(quiet, "%p encoder test start w %d h %d type %d\n", 8443d0407baSopenharmony_ci p->ctx, p->width, p->height, p->type); 8453d0407baSopenharmony_ci 8463d0407baSopenharmony_ci ret = p->mpi->control(p->ctx, MPP_SET_OUTPUT_TIMEOUT, &timeout); 8473d0407baSopenharmony_ci if (MPP_OK != ret) { 8483d0407baSopenharmony_ci mpp_err("mpi control set output timeout %d ret %d\n", timeout, ret); 8493d0407baSopenharmony_ci goto MPP_TEST_OUT; 8503d0407baSopenharmony_ci } 8513d0407baSopenharmony_ci 8523d0407baSopenharmony_ci ret = mpp_init(p->ctx, MPP_CTX_ENC, p->type); 8533d0407baSopenharmony_ci if (ret) { 8543d0407baSopenharmony_ci mpp_err("mpp_init failed ret %d\n", ret); 8553d0407baSopenharmony_ci goto MPP_TEST_OUT; 8563d0407baSopenharmony_ci } 8573d0407baSopenharmony_ci 8583d0407baSopenharmony_ci ret = mpp_enc_cfg_init(&p->cfg); 8593d0407baSopenharmony_ci if (ret) { 8603d0407baSopenharmony_ci mpp_err_f("mpp_enc_cfg_init failed ret %d\n", ret); 8613d0407baSopenharmony_ci goto MPP_TEST_OUT; 8623d0407baSopenharmony_ci } 8633d0407baSopenharmony_ci 8643d0407baSopenharmony_ci ret = test_mpp_enc_cfg_setup(info); 8653d0407baSopenharmony_ci if (ret) { 8663d0407baSopenharmony_ci mpp_err_f("test mpp setup failed ret %d\n", ret); 8673d0407baSopenharmony_ci goto MPP_TEST_OUT; 8683d0407baSopenharmony_ci } 8693d0407baSopenharmony_ci 8703d0407baSopenharmony_ci return info; 8713d0407baSopenharmony_ci 8723d0407baSopenharmony_ciMPP_TEST_OUT: 8733d0407baSopenharmony_ci if (p->ctx) { 8743d0407baSopenharmony_ci mpp_destroy(p->ctx); 8753d0407baSopenharmony_ci p->ctx = NULL; 8763d0407baSopenharmony_ci } 8773d0407baSopenharmony_ci 8783d0407baSopenharmony_ci if (p->cfg) { 8793d0407baSopenharmony_ci mpp_enc_cfg_deinit(p->cfg); 8803d0407baSopenharmony_ci p->cfg = NULL; 8813d0407baSopenharmony_ci } 8823d0407baSopenharmony_ci 8833d0407baSopenharmony_ci if (p->frm_buf) { 8843d0407baSopenharmony_ci mpp_buffer_put(p->frm_buf); 8853d0407baSopenharmony_ci p->frm_buf = NULL; 8863d0407baSopenharmony_ci } 8873d0407baSopenharmony_ci 8883d0407baSopenharmony_ci if (p->pkt_buf) { 8893d0407baSopenharmony_ci mpp_buffer_put(p->pkt_buf); 8903d0407baSopenharmony_ci p->pkt_buf = NULL; 8913d0407baSopenharmony_ci } 8923d0407baSopenharmony_ci 8933d0407baSopenharmony_ci if (p->md_info) { 8943d0407baSopenharmony_ci mpp_buffer_put(p->md_info); 8953d0407baSopenharmony_ci p->md_info = NULL; 8963d0407baSopenharmony_ci } 8973d0407baSopenharmony_ci 8983d0407baSopenharmony_ci if (p->osd_data.buf) { 8993d0407baSopenharmony_ci mpp_buffer_put(p->osd_data.buf); 9003d0407baSopenharmony_ci p->osd_data.buf = NULL; 9013d0407baSopenharmony_ci } 9023d0407baSopenharmony_ci 9033d0407baSopenharmony_ci if (p->buf_grp) { 9043d0407baSopenharmony_ci mpp_buffer_group_put(p->buf_grp); 9053d0407baSopenharmony_ci p->buf_grp = NULL; 9063d0407baSopenharmony_ci } 9073d0407baSopenharmony_ci 9083d0407baSopenharmony_ci if (p->roi_ctx) { 9093d0407baSopenharmony_ci mpp_enc_roi_deinit(p->roi_ctx); 9103d0407baSopenharmony_ci p->roi_ctx = NULL; 9113d0407baSopenharmony_ci } 9123d0407baSopenharmony_ci 9133d0407baSopenharmony_ci return NULL; 9143d0407baSopenharmony_ci} 915