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, &lt_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