13d0407baSopenharmony_ci/*
23d0407baSopenharmony_ci * Copyright (c) 2022-2023 HiHope Open Source Organization .
33d0407baSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
43d0407baSopenharmony_ci * you may not use this file except in compliance with the License.
53d0407baSopenharmony_ci * You may obtain a copy of the License at
63d0407baSopenharmony_ci *
73d0407baSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
83d0407baSopenharmony_ci *
93d0407baSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
103d0407baSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
113d0407baSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
123d0407baSopenharmony_ci * See the License for the specific language governing permissions and
133d0407baSopenharmony_ci * limitations under the License.
143d0407baSopenharmony_ci */
153d0407baSopenharmony_ci
163d0407baSopenharmony_ci#include "hdi_mpp_config.h"
173d0407baSopenharmony_ci#include <hdf_base.h>
183d0407baSopenharmony_ci#include <hdf_log.h>
193d0407baSopenharmony_ci#include <securec.h>
203d0407baSopenharmony_ci#include "mpp_common.h"
213d0407baSopenharmony_ci
223d0407baSopenharmony_ci#define HDF_LOG_TAG codec_hdi_mpp_config
233d0407baSopenharmony_ci#define MPP_ALIGN_STRIDE_WITH_EIGHT         8
243d0407baSopenharmony_ci#define MPP_ALIGN_STRIDE_WITH_SIXTEEN       16
253d0407baSopenharmony_ci#define MPP_ALIGN_STRIDE_WITH_SIXTY_FOUR    64
263d0407baSopenharmony_ci#define MPP_ALIGN_MULTIPLE_WITH_TWO         2
273d0407baSopenharmony_ci#define MPP_ALIGN_MULTIPLE_WITH_THREE       3
283d0407baSopenharmony_ci#define MPP_ALIGN_MULTIPLE_WITH_FOUR        4
293d0407baSopenharmony_ci#define MPP_ALIGN_DIVISOR_WITH_TWO          2
303d0407baSopenharmony_ci#define MPP_ALIGN_DIVISOR_WITH_THREE        3
313d0407baSopenharmony_ci#define MPP_ALIGN_DIVISOR_WITH_FOUR         4
323d0407baSopenharmony_ci#define MPP_ALIGN_DIVISOR_WITH_SIXTEEN      16
333d0407baSopenharmony_ci#define GOP_MODE_THRESHOLD_VALUE            4
343d0407baSopenharmony_ci
353d0407baSopenharmony_ci#define BPS_BASE                            16
363d0407baSopenharmony_ci#define BPS_MAX                             17
373d0407baSopenharmony_ci#define BPS_MEDIUM                          15
383d0407baSopenharmony_ci#define BPS_MIN                             1
393d0407baSopenharmony_ci#define BPS_TARGET                          2
403d0407baSopenharmony_ci#define FIXQP_INIT_VALUE                    20
413d0407baSopenharmony_ci#define FIXQP_MAX_VALUE                     20
423d0407baSopenharmony_ci#define FIXQP_MIN_VALUE                     20
433d0407baSopenharmony_ci#define FIXQP_MAX_I_VALUE                   20
443d0407baSopenharmony_ci#define FIXQP_MIN_I_VALUE                   20
453d0407baSopenharmony_ci#define FIXQP_IP_VALUE                      2
463d0407baSopenharmony_ci#define OTHER_QP_INIT_VALUE                 26
473d0407baSopenharmony_ci#define OTHER_QP_MAX_VALUE                  51
483d0407baSopenharmony_ci#define OTHER_QP_MIN_VALUE                  10
493d0407baSopenharmony_ci#define OTHER_QP_MAX_I_VALUE                51
503d0407baSopenharmony_ci#define OTHER_QP_MIN_I_VALUE                10
513d0407baSopenharmony_ci#define OTHER_QP_IP_VALUE                   2
523d0407baSopenharmony_ci#define AVC_SETUP_LEVEL_DEFAULT             40
533d0407baSopenharmony_ci#define AVC_SETUP_CABAC_EN_DEFAULT          1
543d0407baSopenharmony_ci#define AVC_SETUP_CABAC_IDC_DEFAULT         0
553d0407baSopenharmony_ci#define AVC_SETUP_TRANS_DEFAULT             1
563d0407baSopenharmony_ci#define AVC_SETUP_PROFILE_DEFAULT           100
573d0407baSopenharmony_ci#define FPS_SETUP_DEFAULT                   24
583d0407baSopenharmony_ci#define DFAULT_ENC_DROP_THD                 20
593d0407baSopenharmony_ci#define DFAULT_ENC_GOP_OPERATOR             2
603d0407baSopenharmony_ci#define DFAULT_BUF_SIZE_OPERATOR            2
613d0407baSopenharmony_ci#define FOUR_BYTE_PIX_BUF_SIZE_OPERATOR     4
623d0407baSopenharmony_ci#define PACKET_SIZE_MULTI                   3
633d0407baSopenharmony_ci#define PACKET_SIZE_OPERATOR                2
643d0407baSopenharmony_ci#define DEFAULT_RESOLUTION_SIZE             (1920 * 1088)
653d0407baSopenharmony_ci#define DEFAULT_PACKET_BUFFER_NUM           4
663d0407baSopenharmony_ci#define DEFAULT_FRAME_BUFFER_NUM            2
673d0407baSopenharmony_ci
683d0407baSopenharmony_ci#define DEFAULT_REF_FRAME_NUM               8
693d0407baSopenharmony_ci#define LEVEL_5P1_MAX_DPB_MBS               184320
703d0407baSopenharmony_ci#define REF_FRAME_DIVISOR                   16
713d0407baSopenharmony_ci#define MAX_REF_FRAME_NUM                   16
723d0407baSopenharmony_ci#define MIN_REF_FRAME_NUM                   6
733d0407baSopenharmony_ci#define WIDTH_OF_4K_VIDEO                   4096
743d0407baSopenharmony_ci#define HEIGHT_OF_4K_HEVC                   2160
753d0407baSopenharmony_ci#define HEIGHT_OF_4K_VP9                    2176
763d0407baSopenharmony_ci#define MAX_REF_FRAME_NUM_VP9               8
773d0407baSopenharmony_ci#define MIN_REF_FRAME_NUM_VP9               4
783d0407baSopenharmony_ci#define BASIC_DEC_FRAME_BUFFER_NUM          5
793d0407baSopenharmony_ci
803d0407baSopenharmony_cistatic const CodecPixelFormatConvertTbl pixelFormatSupportted[] = {
813d0407baSopenharmony_ci    {PIXEL_FMT_RGBA_8888, MPP_FMT_RGBA8888, RK_FORMAT_RGBA_8888},
823d0407baSopenharmony_ci    {PIXEL_FMT_BGRA_8888, MPP_FMT_BGRA8888, RK_FORMAT_BGRA_8888},
833d0407baSopenharmony_ci    {PIXEL_FMT_YCBCR_420_SP, MPP_FMT_YUV420SP, RK_FORMAT_YCbCr_420_SP },
843d0407baSopenharmony_ci    {PIXEL_FMT_YCBCR_420_P, MPP_FMT_YUV420P, RK_FORMAT_YCbCr_420_P},
853d0407baSopenharmony_ci};
863d0407baSopenharmony_ci
873d0407baSopenharmony_ciint32_t InitMppConfig(RKHdiBaseComponent *pBaseComponent)
883d0407baSopenharmony_ci{
893d0407baSopenharmony_ci    int32_t ret = 0;
903d0407baSopenharmony_ci    if (pBaseComponent->ctxType == MPP_CTX_ENC) {
913d0407baSopenharmony_ci        ret = pBaseComponent->mppApi->HdiMppEncCfgInit(&pBaseComponent->cfg);
923d0407baSopenharmony_ci    } else if (pBaseComponent->ctxType == MPP_CTX_DEC) {
933d0407baSopenharmony_ci        ret = pBaseComponent->mppApi->HdiMppDecCfgInit(&pBaseComponent->cfg);
943d0407baSopenharmony_ci    }
953d0407baSopenharmony_ci    return ret;
963d0407baSopenharmony_ci}
973d0407baSopenharmony_ci
983d0407baSopenharmony_ciint32_t DeinitMppConfig(RKHdiBaseComponent *pBaseComponent)
993d0407baSopenharmony_ci{
1003d0407baSopenharmony_ci    int32_t ret = 0;
1013d0407baSopenharmony_ci    if (pBaseComponent->cfg == NULL) {
1023d0407baSopenharmony_ci        return ret;
1033d0407baSopenharmony_ci    }
1043d0407baSopenharmony_ci
1053d0407baSopenharmony_ci    if (pBaseComponent->ctxType == MPP_CTX_ENC) {
1063d0407baSopenharmony_ci        ret = pBaseComponent->mppApi->HdiMppEncCfgDeinit(pBaseComponent->cfg);
1073d0407baSopenharmony_ci    } else if (pBaseComponent->ctxType == MPP_CTX_DEC) {
1083d0407baSopenharmony_ci        ret = pBaseComponent->mppApi->HdiMppDecCfgDeinit(pBaseComponent->cfg);
1093d0407baSopenharmony_ci    }
1103d0407baSopenharmony_ci    pBaseComponent->cfg = NULL;
1113d0407baSopenharmony_ci    return ret;
1123d0407baSopenharmony_ci}
1133d0407baSopenharmony_ci
1143d0407baSopenharmony_civoid SetDefaultFps(RKHdiEncodeSetup *setup)
1153d0407baSopenharmony_ci{
1163d0407baSopenharmony_ci    setup->fps.fpsInFlex = 0;
1173d0407baSopenharmony_ci    setup->fps.fpsInNum = FPS_SETUP_DEFAULT;
1183d0407baSopenharmony_ci    setup->fps.fpsOutNum = FPS_SETUP_DEFAULT;
1193d0407baSopenharmony_ci    setup->fps.fpsInDen = 1;
1203d0407baSopenharmony_ci    setup->fps.fpsOutDen = 1;
1213d0407baSopenharmony_ci    setup->fps.fpsOutFlex = 0;
1223d0407baSopenharmony_ci}
1233d0407baSopenharmony_ci
1243d0407baSopenharmony_civoid SetDefaultDropMode(RKHdiEncodeSetup *setup)
1253d0407baSopenharmony_ci{
1263d0407baSopenharmony_ci    setup->drop.dropMode = MPP_ENC_RC_DROP_FRM_DISABLED;
1273d0407baSopenharmony_ci    setup->drop.dropThd = DFAULT_ENC_DROP_THD;      /* 20% of max bps */
1283d0407baSopenharmony_ci    setup->drop.dropGap = 1;                        /* Do not continuous drop frame */
1293d0407baSopenharmony_ci}
1303d0407baSopenharmony_ci
1313d0407baSopenharmony_civoid SetDefaultGopMode(RKHdiEncodeSetup *setup)
1323d0407baSopenharmony_ci{
1333d0407baSopenharmony_ci    setup->gop.gopMode = VID_CODEC_GOPMODE_INVALID;
1343d0407baSopenharmony_ci    setup->gop.gopLen = 0;
1353d0407baSopenharmony_ci    setup->gop.viLen = 0;
1363d0407baSopenharmony_ci    setup->gop.gop = setup->fps.fpsOutNum * DFAULT_ENC_GOP_OPERATOR;
1373d0407baSopenharmony_ci}
1383d0407baSopenharmony_ci
1393d0407baSopenharmony_cistatic int32_t GetDefaultConfig(RKHdiBaseComponent *pBaseComponent)
1403d0407baSopenharmony_ci{
1413d0407baSopenharmony_ci    MPP_RET ret = MPP_OK;
1423d0407baSopenharmony_ci    MppCtx ctx = pBaseComponent->ctx;
1433d0407baSopenharmony_ci
1443d0407baSopenharmony_ci    if (pBaseComponent->ctxType == MPP_CTX_ENC) {
1453d0407baSopenharmony_ci        ret = pBaseComponent->mpi->control(ctx, MPP_ENC_GET_CFG, pBaseComponent->cfg);
1463d0407baSopenharmony_ci        if (ret != MPP_OK) {
1473d0407baSopenharmony_ci            HDF_LOGE("%{public}s: config MPP_ENC_GET_CFG failed, ret %{public}d", __func__, ret);
1483d0407baSopenharmony_ci            return HDF_FAILURE;
1493d0407baSopenharmony_ci        }
1503d0407baSopenharmony_ci    } else if (pBaseComponent->ctxType == MPP_CTX_ENC) {
1513d0407baSopenharmony_ci        ret = pBaseComponent->mpi->control(ctx, MPP_DEC_GET_CFG, pBaseComponent->cfg);
1523d0407baSopenharmony_ci        if (ret != MPP_OK) {
1533d0407baSopenharmony_ci            HDF_LOGE("%{public}s: config MPP_DEC_GET_CFG failed, ret %{public}d", __func__, ret);
1543d0407baSopenharmony_ci            return HDF_FAILURE;
1553d0407baSopenharmony_ci        }
1563d0407baSopenharmony_ci    }
1573d0407baSopenharmony_ci
1583d0407baSopenharmony_ci    return HDF_SUCCESS;
1593d0407baSopenharmony_ci}
1603d0407baSopenharmony_ci
1613d0407baSopenharmony_cistatic PixelFormat ConvertRKFormat2HdiFormat(MppFrameFormat fmtRK)
1623d0407baSopenharmony_ci{
1633d0407baSopenharmony_ci    if (fmtRK == MPP_FMT_YUV420SP) {
1643d0407baSopenharmony_ci        return PIXEL_FMT_YCBCR_420_SP;
1653d0407baSopenharmony_ci    } else {
1663d0407baSopenharmony_ci        return PIXEL_FMT_BUTT;
1673d0407baSopenharmony_ci    }
1683d0407baSopenharmony_ci}
1693d0407baSopenharmony_ci
1703d0407baSopenharmony_ciMppFrameFormat ConvertHdiFormat2RKFormat(PixelFormat fmtHDI)
1713d0407baSopenharmony_ci{
1723d0407baSopenharmony_ci    MppFrameFormat mppFmt = MPP_FMT_BUTT;
1733d0407baSopenharmony_ci    int32_t count = sizeof(pixelFormatSupportted) / sizeof(CodecPixelFormatConvertTbl);
1743d0407baSopenharmony_ci    for (int i = 0; i < count; i++) {
1753d0407baSopenharmony_ci        if (pixelFormatSupportted[i].pixFormat == fmtHDI) {
1763d0407baSopenharmony_ci            mppFmt = pixelFormatSupportted[i].mppFormat;
1773d0407baSopenharmony_ci            break;
1783d0407baSopenharmony_ci        }
1793d0407baSopenharmony_ci    }
1803d0407baSopenharmony_ci    if (mppFmt == MPP_FMT_BUTT) {
1813d0407baSopenharmony_ci        HDF_LOGE("%{public}s: do not support type %{public}d", __func__, fmtHDI);
1823d0407baSopenharmony_ci    }
1833d0407baSopenharmony_ci    return mppFmt;
1843d0407baSopenharmony_ci}
1853d0407baSopenharmony_ci
1863d0407baSopenharmony_ciRgaSURF_FORMAT ConvertHdiFormat2RgaFormat(PixelFormat fmtHDI)
1873d0407baSopenharmony_ci{
1883d0407baSopenharmony_ci    RgaSURF_FORMAT rgaFmt = RK_FORMAT_UNKNOWN;
1893d0407baSopenharmony_ci    int32_t count = sizeof(pixelFormatSupportted) / sizeof(CodecPixelFormatConvertTbl);
1903d0407baSopenharmony_ci    for (int i = 0; i < count; i++) {
1913d0407baSopenharmony_ci        if (pixelFormatSupportted[i].pixFormat == fmtHDI) {
1923d0407baSopenharmony_ci            rgaFmt = pixelFormatSupportted[i].rgaFormat;
1933d0407baSopenharmony_ci            break;
1943d0407baSopenharmony_ci        }
1953d0407baSopenharmony_ci    }
1963d0407baSopenharmony_ci    if (rgaFmt == RK_FORMAT_UNKNOWN) {
1973d0407baSopenharmony_ci        HDF_LOGE("%{public}s: do not support type %{public}d", __func__, fmtHDI);
1983d0407baSopenharmony_ci    }
1993d0407baSopenharmony_ci    return rgaFmt;
2003d0407baSopenharmony_ci}
2013d0407baSopenharmony_ci
2023d0407baSopenharmony_ciRgaSURF_FORMAT ConvertMppFormat2RgaFormat(MppFrameFormat mppFmt)
2033d0407baSopenharmony_ci{
2043d0407baSopenharmony_ci    RgaSURF_FORMAT rgaFmt = RK_FORMAT_UNKNOWN;
2053d0407baSopenharmony_ci    int32_t count = sizeof(pixelFormatSupportted) / sizeof(CodecPixelFormatConvertTbl);
2063d0407baSopenharmony_ci    for (int i = 0; i < count; i++) {
2073d0407baSopenharmony_ci        if (pixelFormatSupportted[i].mppFormat == mppFmt) {
2083d0407baSopenharmony_ci            rgaFmt = pixelFormatSupportted[i].rgaFormat;
2093d0407baSopenharmony_ci            break;
2103d0407baSopenharmony_ci        }
2113d0407baSopenharmony_ci    }
2123d0407baSopenharmony_ci    if (rgaFmt == RK_FORMAT_UNKNOWN) {
2133d0407baSopenharmony_ci        HDF_LOGE("%{public}s: do not support type %{public}d", __func__, mppFmt);
2143d0407baSopenharmony_ci    }
2153d0407baSopenharmony_ci    return rgaFmt;
2163d0407baSopenharmony_ci}
2173d0407baSopenharmony_ci
2183d0407baSopenharmony_cistatic MppEncRcMode ConvertHdiRcMode2RKRcMode(VideoCodecRcMode hdiRcMode)
2193d0407baSopenharmony_ci{
2203d0407baSopenharmony_ci    MppEncRcMode rkRcMode = MPP_ENC_RC_MODE_VBR;
2213d0407baSopenharmony_ci    switch (hdiRcMode) {
2223d0407baSopenharmony_ci        case VID_CODEC_RC_CBR:
2233d0407baSopenharmony_ci            rkRcMode = MPP_ENC_RC_MODE_CBR;
2243d0407baSopenharmony_ci            break;
2253d0407baSopenharmony_ci        case VID_CODEC_RC_VBR:
2263d0407baSopenharmony_ci            rkRcMode = MPP_ENC_RC_MODE_VBR;
2273d0407baSopenharmony_ci            break;
2283d0407baSopenharmony_ci        case VID_CODEC_RC_AVBR:
2293d0407baSopenharmony_ci            rkRcMode = MPP_ENC_RC_MODE_AVBR;
2303d0407baSopenharmony_ci            break;
2313d0407baSopenharmony_ci        case VID_CODEC_RC_FIXQP:
2323d0407baSopenharmony_ci            rkRcMode = MPP_ENC_RC_MODE_FIXQP;
2333d0407baSopenharmony_ci            break;
2343d0407baSopenharmony_ci        default:
2353d0407baSopenharmony_ci            break;
2363d0407baSopenharmony_ci    }
2373d0407baSopenharmony_ci    return rkRcMode;
2383d0407baSopenharmony_ci}
2393d0407baSopenharmony_ci
2403d0407baSopenharmony_cistatic MppEncRcGopMode ConvertHdiGopMode2RKGopMode(VideoCodecGopMode hdiGopMode)
2413d0407baSopenharmony_ci{
2423d0407baSopenharmony_ci    MppEncRcGopMode rkGopMode = MPP_ENC_RC_NORMAL_P;
2433d0407baSopenharmony_ci    switch (hdiGopMode) {
2443d0407baSopenharmony_ci        case VID_CODEC_GOPMODE_NORMALP:
2453d0407baSopenharmony_ci            rkGopMode = MPP_ENC_RC_NORMAL_P;
2463d0407baSopenharmony_ci            break;
2473d0407baSopenharmony_ci        case VID_CODEC_GOPMODE_SMARTP:
2483d0407baSopenharmony_ci            rkGopMode = MPP_ENC_RC_SMART_P;
2493d0407baSopenharmony_ci            break;
2503d0407baSopenharmony_ci        default:
2513d0407baSopenharmony_ci            break;
2523d0407baSopenharmony_ci    }
2533d0407baSopenharmony_ci    return rkGopMode;
2543d0407baSopenharmony_ci}
2553d0407baSopenharmony_ci
2563d0407baSopenharmony_cistatic MppCodingType ConvertHdiMimeCodecType2RKCodecType(AvCodecMime mime)
2573d0407baSopenharmony_ci{
2583d0407baSopenharmony_ci    MppCodingType type = MPP_VIDEO_CodingMax;
2593d0407baSopenharmony_ci    switch (mime) {
2603d0407baSopenharmony_ci        case MEDIA_MIMETYPE_IMAGE_JPEG:
2613d0407baSopenharmony_ci            type = MPP_VIDEO_CodingMJPEG;
2623d0407baSopenharmony_ci            break;
2633d0407baSopenharmony_ci        case MEDIA_MIMETYPE_VIDEO_AVC:
2643d0407baSopenharmony_ci            type = MPP_VIDEO_CodingAVC;
2653d0407baSopenharmony_ci            break;
2663d0407baSopenharmony_ci        case MEDIA_MIMETYPE_VIDEO_HEVC:
2673d0407baSopenharmony_ci            type = MPP_VIDEO_CodingHEVC;
2683d0407baSopenharmony_ci            break;
2693d0407baSopenharmony_ci        default:
2703d0407baSopenharmony_ci            break;
2713d0407baSopenharmony_ci    }
2723d0407baSopenharmony_ci    if (type == MPP_VIDEO_CodingMax) {
2733d0407baSopenharmony_ci        HDF_LOGE("%{public}s: do not support type %{public}d", __func__, type);
2743d0407baSopenharmony_ci    }
2753d0407baSopenharmony_ci    return type;
2763d0407baSopenharmony_ci}
2773d0407baSopenharmony_ci
2783d0407baSopenharmony_cistatic int32_t GetStrideByWidth(int32_t width, MppFrameFormat fmt)
2793d0407baSopenharmony_ci{
2803d0407baSopenharmony_ci    int32_t stride = 0;
2813d0407baSopenharmony_ci
2823d0407baSopenharmony_ci    switch (fmt & MPP_FRAME_FMT_MASK) {
2833d0407baSopenharmony_ci        case MPP_FMT_YUV420SP:
2843d0407baSopenharmony_ci        case MPP_FMT_YUV420SP_VU:
2853d0407baSopenharmony_ci            stride = MPP_ALIGN(width, MPP_ALIGN_STRIDE_WITH_EIGHT);
2863d0407baSopenharmony_ci            break;
2873d0407baSopenharmony_ci        case MPP_FMT_YUV420P:
2883d0407baSopenharmony_ci            /* NOTE: 420P need to align to 16 so chroma can align to 8 */
2893d0407baSopenharmony_ci            stride = MPP_ALIGN(width, MPP_ALIGN_STRIDE_WITH_SIXTEEN);
2903d0407baSopenharmony_ci            break;
2913d0407baSopenharmony_ci        case MPP_FMT_YUV422P:
2923d0407baSopenharmony_ci        case MPP_FMT_YUV422SP:
2933d0407baSopenharmony_ci        case MPP_FMT_YUV422SP_VU:
2943d0407baSopenharmony_ci            /* NOTE: 422 need to align to 8 so chroma can align to 16 */
2953d0407baSopenharmony_ci            stride = MPP_ALIGN(width, MPP_ALIGN_STRIDE_WITH_EIGHT);
2963d0407baSopenharmony_ci            break;
2973d0407baSopenharmony_ci        case MPP_FMT_RGB565:
2983d0407baSopenharmony_ci        case MPP_FMT_BGR565:
2993d0407baSopenharmony_ci        case MPP_FMT_RGB555:
3003d0407baSopenharmony_ci        case MPP_FMT_BGR555:
3013d0407baSopenharmony_ci        case MPP_FMT_RGB444:
3023d0407baSopenharmony_ci        case MPP_FMT_BGR444:
3033d0407baSopenharmony_ci        case MPP_FMT_YUV422_YUYV:
3043d0407baSopenharmony_ci        case MPP_FMT_YUV422_YVYU:
3053d0407baSopenharmony_ci        case MPP_FMT_YUV422_UYVY:
3063d0407baSopenharmony_ci        case MPP_FMT_YUV422_VYUY:
3073d0407baSopenharmony_ci            /* NOTE: for vepu limitation */
3083d0407baSopenharmony_ci            stride = MPP_ALIGN(width, MPP_ALIGN_STRIDE_WITH_EIGHT) * MPP_ALIGN_MULTIPLE_WITH_TWO;
3093d0407baSopenharmony_ci            break;
3103d0407baSopenharmony_ci        case MPP_FMT_RGB888:
3113d0407baSopenharmony_ci        case MPP_FMT_BGR888:
3123d0407baSopenharmony_ci            /* NOTE: for vepu limitation */
3133d0407baSopenharmony_ci            stride = MPP_ALIGN(width, MPP_ALIGN_STRIDE_WITH_EIGHT) * MPP_ALIGN_MULTIPLE_WITH_THREE;
3143d0407baSopenharmony_ci            break;
3153d0407baSopenharmony_ci        case MPP_FMT_RGB101010:
3163d0407baSopenharmony_ci        case MPP_FMT_BGR101010:
3173d0407baSopenharmony_ci        case MPP_FMT_ARGB8888:
3183d0407baSopenharmony_ci        case MPP_FMT_ABGR8888:
3193d0407baSopenharmony_ci        case MPP_FMT_BGRA8888:
3203d0407baSopenharmony_ci        case MPP_FMT_RGBA8888:
3213d0407baSopenharmony_ci            /* NOTE: for vepu limitation */
3223d0407baSopenharmony_ci            stride = MPP_ALIGN(width, MPP_ALIGN_STRIDE_WITH_EIGHT) * MPP_ALIGN_MULTIPLE_WITH_FOUR;
3233d0407baSopenharmony_ci            break;
3243d0407baSopenharmony_ci        default :
3253d0407baSopenharmony_ci            break;
3263d0407baSopenharmony_ci    }
3273d0407baSopenharmony_ci
3283d0407baSopenharmony_ci    return stride;
3293d0407baSopenharmony_ci}
3303d0407baSopenharmony_ci
3313d0407baSopenharmony_ciint32_t GetDefaultHorStride(int32_t width, PixelFormat fmtHDI)
3323d0407baSopenharmony_ci{
3333d0407baSopenharmony_ci    MppFrameFormat fmt = ConvertHdiFormat2RKFormat(fmtHDI);
3343d0407baSopenharmony_ci    return GetStrideByWidth(width, fmt);
3353d0407baSopenharmony_ci}
3363d0407baSopenharmony_ci
3373d0407baSopenharmony_cistatic uint32_t GetMppFrameBufferSize(RKHdiBaseComponent *pBaseComponent)
3383d0407baSopenharmony_ci{
3393d0407baSopenharmony_ci    uint32_t frameSize = 0;
3403d0407baSopenharmony_ci    switch (pBaseComponent->fmt) {
3413d0407baSopenharmony_ci        case MPP_FMT_YUV420SP:
3423d0407baSopenharmony_ci        case MPP_FMT_YUV420P:
3433d0407baSopenharmony_ci            frameSize = MPP_ALIGN(pBaseComponent->horStride, MPP_ALIGN_STRIDE_WITH_SIXTY_FOUR)
3443d0407baSopenharmony_ci                * MPP_ALIGN(pBaseComponent->verStride, MPP_ALIGN_STRIDE_WITH_SIXTY_FOUR)
3453d0407baSopenharmony_ci                * MPP_ALIGN_MULTIPLE_WITH_THREE / MPP_ALIGN_DIVISOR_WITH_TWO;
3463d0407baSopenharmony_ci            break;
3473d0407baSopenharmony_ci
3483d0407baSopenharmony_ci        case MPP_FMT_YUV422_YUYV:
3493d0407baSopenharmony_ci        case MPP_FMT_YUV422_YVYU:
3503d0407baSopenharmony_ci        case MPP_FMT_YUV422_UYVY:
3513d0407baSopenharmony_ci        case MPP_FMT_YUV422_VYUY:
3523d0407baSopenharmony_ci        case MPP_FMT_YUV422P:
3533d0407baSopenharmony_ci        case MPP_FMT_YUV422SP:
3543d0407baSopenharmony_ci        case MPP_FMT_RGB444:
3553d0407baSopenharmony_ci        case MPP_FMT_BGR444:
3563d0407baSopenharmony_ci        case MPP_FMT_RGB555:
3573d0407baSopenharmony_ci        case MPP_FMT_BGR555:
3583d0407baSopenharmony_ci        case MPP_FMT_RGB565:
3593d0407baSopenharmony_ci        case MPP_FMT_BGR565:
3603d0407baSopenharmony_ci            frameSize = MPP_ALIGN(pBaseComponent->horStride, MPP_ALIGN_STRIDE_WITH_SIXTY_FOUR)
3613d0407baSopenharmony_ci                * MPP_ALIGN(pBaseComponent->verStride, MPP_ALIGN_STRIDE_WITH_SIXTY_FOUR)
3623d0407baSopenharmony_ci                * MPP_ALIGN_MULTIPLE_WITH_TWO;
3633d0407baSopenharmony_ci            break;
3643d0407baSopenharmony_ci
3653d0407baSopenharmony_ci        default:
3663d0407baSopenharmony_ci            frameSize = MPP_ALIGN(pBaseComponent->horStride, MPP_ALIGN_STRIDE_WITH_SIXTY_FOUR)
3673d0407baSopenharmony_ci                * MPP_ALIGN(pBaseComponent->verStride, MPP_ALIGN_STRIDE_WITH_SIXTY_FOUR)
3683d0407baSopenharmony_ci                * MPP_ALIGN_MULTIPLE_WITH_FOUR;
3693d0407baSopenharmony_ci            break;
3703d0407baSopenharmony_ci    }
3713d0407baSopenharmony_ci    return frameSize;
3723d0407baSopenharmony_ci}
3733d0407baSopenharmony_ci
3743d0407baSopenharmony_cistatic uint32_t GetMppFrameHeaderSize(RKHdiBaseComponent *pBaseComponent)
3753d0407baSopenharmony_ci{
3763d0407baSopenharmony_ci    uint32_t headerSize = 0;
3773d0407baSopenharmony_ci    if (MPP_FRAME_FMT_IS_FBC(pBaseComponent->fmt)) {
3783d0407baSopenharmony_ci        headerSize = MPP_ALIGN(MPP_ALIGN(pBaseComponent->setup.width, MPP_ALIGN_STRIDE_WITH_SIXTEEN)
3793d0407baSopenharmony_ci            * MPP_ALIGN(pBaseComponent->setup.height, MPP_ALIGN_STRIDE_WITH_SIXTEEN)
3803d0407baSopenharmony_ci            / MPP_ALIGN_DIVISOR_WITH_SIXTEEN, SZ_4K);
3813d0407baSopenharmony_ci    } else {
3823d0407baSopenharmony_ci        headerSize = 0;
3833d0407baSopenharmony_ci    }
3843d0407baSopenharmony_ci    return headerSize;
3853d0407baSopenharmony_ci}
3863d0407baSopenharmony_ci
3873d0407baSopenharmony_cistatic int32_t GetMppBuffers(RKHdiBaseComponent *pBaseComponent)
3883d0407baSopenharmony_ci{
3893d0407baSopenharmony_ci    MPP_RET ret = MPP_OK;
3903d0407baSopenharmony_ci    RKMppApi *mppApi = pBaseComponent->mppApi;
3913d0407baSopenharmony_ci    ret = mppApi->HdiMppBufferGroupGet(&pBaseComponent->frmGrp,
3923d0407baSopenharmony_ci        MPP_BUFFER_TYPE_DRM, MPP_BUFFER_INTERNAL, NULL, __func__);
3933d0407baSopenharmony_ci    if (ret != MPP_OK) {
3943d0407baSopenharmony_ci        HDF_LOGE("%{public}s: failed to get mpp buffer group ret %{public}d", __func__, ret);
3953d0407baSopenharmony_ci        return HDF_FAILURE;
3963d0407baSopenharmony_ci    }
3973d0407baSopenharmony_ci
3983d0407baSopenharmony_ci    ret = mppApi->HdiMppBufferGetWithTag(pBaseComponent->frmGrp, &pBaseComponent->frmBuf,
3993d0407baSopenharmony_ci        pBaseComponent->frameSize + pBaseComponent->headerSize, MODULE_TAG, __func__);
4003d0407baSopenharmony_ci    if (ret != MPP_OK) {
4013d0407baSopenharmony_ci        HDF_LOGE("%{public}s: failed to get buffer for input frame ret %{public}d", __func__, ret);
4023d0407baSopenharmony_ci        return HDF_FAILURE;
4033d0407baSopenharmony_ci    }
4043d0407baSopenharmony_ci
4053d0407baSopenharmony_ci    ret = mppApi->HdiMppBufferGetWithTag(pBaseComponent->frmGrp, &pBaseComponent->pktBuf,
4063d0407baSopenharmony_ci        pBaseComponent->frameSize, MODULE_TAG, __func__);
4073d0407baSopenharmony_ci    if (ret != MPP_OK) {
4083d0407baSopenharmony_ci        HDF_LOGE("%{public}s: failed to get buffer for output packet ret %{public}d", __func__, ret);
4093d0407baSopenharmony_ci        return HDF_FAILURE;
4103d0407baSopenharmony_ci    }
4113d0407baSopenharmony_ci
4123d0407baSopenharmony_ci    return HDF_SUCCESS;
4133d0407baSopenharmony_ci}
4143d0407baSopenharmony_ci
4153d0407baSopenharmony_cistatic void SetQpValue(RKHdiEncodeSetup *encSetup, MppEncRcMode mppRcMode)
4163d0407baSopenharmony_ci{
4173d0407baSopenharmony_ci    switch (mppRcMode) {
4183d0407baSopenharmony_ci        case MPP_ENC_RC_MODE_FIXQP: {
4193d0407baSopenharmony_ci            encSetup->rc.qpInit = FIXQP_INIT_VALUE;
4203d0407baSopenharmony_ci            encSetup->rc.qpMax = FIXQP_MAX_VALUE;
4213d0407baSopenharmony_ci            encSetup->rc.qpMin = FIXQP_MIN_VALUE;
4223d0407baSopenharmony_ci            encSetup->rc.qpMaxI = FIXQP_MAX_I_VALUE;
4233d0407baSopenharmony_ci            encSetup->rc.qpMinI = FIXQP_MIN_I_VALUE;
4243d0407baSopenharmony_ci            encSetup->rc.qpIp = FIXQP_IP_VALUE;
4253d0407baSopenharmony_ci            break;
4263d0407baSopenharmony_ci        }
4273d0407baSopenharmony_ci        case MPP_ENC_RC_MODE_CBR:
4283d0407baSopenharmony_ci        case MPP_ENC_RC_MODE_VBR:
4293d0407baSopenharmony_ci        case MPP_ENC_RC_MODE_AVBR: {
4303d0407baSopenharmony_ci            encSetup->rc.qpInit = OTHER_QP_INIT_VALUE;
4313d0407baSopenharmony_ci            encSetup->rc.qpMax = OTHER_QP_MAX_VALUE;
4323d0407baSopenharmony_ci            encSetup->rc.qpMin = OTHER_QP_MIN_VALUE;
4333d0407baSopenharmony_ci            encSetup->rc.qpMaxI = OTHER_QP_MAX_I_VALUE;
4343d0407baSopenharmony_ci            encSetup->rc.qpMinI = OTHER_QP_MIN_I_VALUE;
4353d0407baSopenharmony_ci            encSetup->rc.qpIp = OTHER_QP_IP_VALUE;
4363d0407baSopenharmony_ci            break;
4373d0407baSopenharmony_ci        }
4383d0407baSopenharmony_ci        default: {
4393d0407baSopenharmony_ci            HDF_LOGE("%{public}s: not handled or unsupported encoder rc mode %{public}d", __func__, mppRcMode);
4403d0407baSopenharmony_ci            break;
4413d0407baSopenharmony_ci        }
4423d0407baSopenharmony_ci    }
4433d0407baSopenharmony_ci}
4443d0407baSopenharmony_ci
4453d0407baSopenharmony_cistatic void CalcBpsValue(RKHdiBaseComponent *pBaseComponent, MppEncRcMode mppRcMode)
4463d0407baSopenharmony_ci{
4473d0407baSopenharmony_ci    RKHdiEncodeSetup *encSetup = &pBaseComponent->setup;
4483d0407baSopenharmony_ci    encSetup->rc.bpsTarget = encSetup->width * encSetup->height * BPS_TARGET / BPS_BASE *
4493d0407baSopenharmony_ci        (encSetup->fps.fpsOutNum / encSetup->fps.fpsOutDen);
4503d0407baSopenharmony_ci
4513d0407baSopenharmony_ci    switch (mppRcMode) {
4523d0407baSopenharmony_ci        case MPP_ENC_RC_MODE_FIXQP: {
4533d0407baSopenharmony_ci            /* do not setup bitrate on FIXQP mode */
4543d0407baSopenharmony_ci            break;
4553d0407baSopenharmony_ci        }
4563d0407baSopenharmony_ci        case MPP_ENC_RC_MODE_CBR: {
4573d0407baSopenharmony_ci            /* CBR mode has narrow bound */
4583d0407baSopenharmony_ci            encSetup->rc.bpsMax = encSetup->rc.bpsTarget * BPS_MAX / BPS_BASE;
4593d0407baSopenharmony_ci            encSetup->rc.bpsMin = encSetup->rc.bpsTarget * BPS_MEDIUM / BPS_BASE;
4603d0407baSopenharmony_ci            break;
4613d0407baSopenharmony_ci        }
4623d0407baSopenharmony_ci        case MPP_ENC_RC_MODE_VBR:
4633d0407baSopenharmony_ci        case MPP_ENC_RC_MODE_AVBR: {
4643d0407baSopenharmony_ci            /* VBR mode has wide bound */
4653d0407baSopenharmony_ci            encSetup->rc.bpsMax = encSetup->rc.bpsTarget * BPS_MAX / BPS_BASE;
4663d0407baSopenharmony_ci            encSetup->rc.bpsMin = encSetup->rc.bpsTarget * BPS_MIN / BPS_BASE;
4673d0407baSopenharmony_ci            break;
4683d0407baSopenharmony_ci        }
4693d0407baSopenharmony_ci        default: {
4703d0407baSopenharmony_ci            /* default use CBR mode */
4713d0407baSopenharmony_ci            encSetup->rc.bpsMax = encSetup->rc.bpsTarget * BPS_MAX / BPS_BASE;
4723d0407baSopenharmony_ci            encSetup->rc.bpsMin = encSetup->rc.bpsTarget * BPS_MEDIUM / BPS_BASE;
4733d0407baSopenharmony_ci            break;
4743d0407baSopenharmony_ci        }
4753d0407baSopenharmony_ci    }
4763d0407baSopenharmony_ci    /* setup qp for different codec and rc_mode */
4773d0407baSopenharmony_ci    switch (pBaseComponent->codingType) {
4783d0407baSopenharmony_ci        case MPP_VIDEO_CodingAVC:
4793d0407baSopenharmony_ci        case MPP_VIDEO_CodingHEVC: {
4803d0407baSopenharmony_ci            SetQpValue(encSetup, mppRcMode);
4813d0407baSopenharmony_ci            break;
4823d0407baSopenharmony_ci        }
4833d0407baSopenharmony_ci        default: {
4843d0407baSopenharmony_ci            break;
4853d0407baSopenharmony_ci        }
4863d0407baSopenharmony_ci    }
4873d0407baSopenharmony_ci}
4883d0407baSopenharmony_ci
4893d0407baSopenharmony_cistatic void SetMimeSettings(RKHdiCodecMimeSetup *codecMimeSet, MppCodingType codingType)
4903d0407baSopenharmony_ci{
4913d0407baSopenharmony_ci    switch (codingType) {
4923d0407baSopenharmony_ci        case MPP_VIDEO_CodingAVC: {
4933d0407baSopenharmony_ci            /*
4943d0407baSopenharmony_ci            * H.264 profile_idc parameter
4953d0407baSopenharmony_ci            * 66  - Baseline profile
4963d0407baSopenharmony_ci            * 77  - Main profile
4973d0407baSopenharmony_ci            * 100 - High profile
4983d0407baSopenharmony_ci            */
4993d0407baSopenharmony_ci            codecMimeSet->avcSetup.profile = AVC_SETUP_PROFILE_DEFAULT;
5003d0407baSopenharmony_ci            /*
5013d0407baSopenharmony_ci            * H.264 level_idc parameter
5023d0407baSopenharmony_ci            * 10 / 11 / 12 / 13    - qcif@15fps / cif@7.5fps / cif@15fps / cif@30fps
5033d0407baSopenharmony_ci            * 20 / 21 / 22         - cif@30fps / half-D1@@25fps / D1@12.5fps
5043d0407baSopenharmony_ci            * 30 / 31 / 32         - D1@25fps / 720p@30fps / 720p@60fps
5053d0407baSopenharmony_ci            * 40 / 41 / 42         - 1080p@30fps / 1080p@30fps / 1080p@60fps
5063d0407baSopenharmony_ci            * 50 / 51 / 52         - 4K@30fps
5073d0407baSopenharmony_ci            */
5083d0407baSopenharmony_ci            codecMimeSet->avcSetup.level = AVC_SETUP_LEVEL_DEFAULT;
5093d0407baSopenharmony_ci            codecMimeSet->avcSetup.cabacEn = AVC_SETUP_CABAC_EN_DEFAULT;
5103d0407baSopenharmony_ci            codecMimeSet->avcSetup.cabacIdc = AVC_SETUP_CABAC_IDC_DEFAULT;
5113d0407baSopenharmony_ci            codecMimeSet->avcSetup.trans8x8 = AVC_SETUP_TRANS_DEFAULT;
5123d0407baSopenharmony_ci            break;
5133d0407baSopenharmony_ci        }
5143d0407baSopenharmony_ci        case MPP_VIDEO_CodingHEVC: {
5153d0407baSopenharmony_ci            break;
5163d0407baSopenharmony_ci        }
5173d0407baSopenharmony_ci        default: {
5183d0407baSopenharmony_ci            break;
5193d0407baSopenharmony_ci        }
5203d0407baSopenharmony_ci    }
5213d0407baSopenharmony_ci}
5223d0407baSopenharmony_ci
5233d0407baSopenharmony_cistatic int32_t SetGop(RKHdiBaseComponent *pBaseComponent)
5243d0407baSopenharmony_ci{
5253d0407baSopenharmony_ci    MPP_RET ret = MPP_OK;
5263d0407baSopenharmony_ci    RKMppApi *mppApi = pBaseComponent->mppApi;
5273d0407baSopenharmony_ci    RKHdiGopSetup *gopSet = &pBaseComponent->setup.gop;
5283d0407baSopenharmony_ci
5293d0407baSopenharmony_ci    gopSet->gop = gopSet->gopLen ? gopSet->gopLen : pBaseComponent->setup.fps.fpsOutNum * DFAULT_ENC_GOP_OPERATOR;
5303d0407baSopenharmony_ci    ret = mppApi->HdiMppEncCfgSetS32(pBaseComponent->cfg, "rc:gop", gopSet->gop);
5313d0407baSopenharmony_ci    if (ret != MPP_OK) {
5323d0407baSopenharmony_ci        HDF_LOGE("%{public}s: config mpp set gop failed! ret: %{public}d", __func__, ret);
5333d0407baSopenharmony_ci        return HDF_FAILURE;
5343d0407baSopenharmony_ci    }
5353d0407baSopenharmony_ci
5363d0407baSopenharmony_ci    RK_U32 gopMode = 0;
5373d0407baSopenharmony_ci    RK_U32 defaultGopMode = ConvertHdiGopMode2RKGopMode(gopSet->gopMode);
5383d0407baSopenharmony_ci    mppApi->HdiMppEnvGetU32("gop_mode", &gopMode, defaultGopMode);
5393d0407baSopenharmony_ci    if (gopMode) {
5403d0407baSopenharmony_ci        MppEncRefCfg ref = NULL;
5413d0407baSopenharmony_ci        mppApi->HdiMppEncRefCfgInit(&ref);
5423d0407baSopenharmony_ci        if (gopMode < GOP_MODE_THRESHOLD_VALUE) {
5433d0407baSopenharmony_ci            mppApi->HdiMppEncGenRefCfg(ref, gopMode);
5443d0407baSopenharmony_ci        } else {
5453d0407baSopenharmony_ci            mppApi->HdiMppEncGenSmartGopRefCfg(ref, gopSet->gopLen, gopSet->viLen);
5463d0407baSopenharmony_ci        }
5473d0407baSopenharmony_ci        ret = pBaseComponent->mpi->control(pBaseComponent->ctx, MPP_ENC_SET_REF_CFG, ref);
5483d0407baSopenharmony_ci        if (ret != MPP_OK) {
5493d0407baSopenharmony_ci            HDF_LOGE("%{public}s: mpi control enc set ref cfg failed, ret %{public}d", __func__, ret);
5503d0407baSopenharmony_ci            mppApi->HdiMppEncRefCfgDeinit(&ref);
5513d0407baSopenharmony_ci            return HDF_FAILURE;
5523d0407baSopenharmony_ci        }
5533d0407baSopenharmony_ci        mppApi->HdiMppEncRefCfgDeinit(&ref);
5543d0407baSopenharmony_ci    }
5553d0407baSopenharmony_ci    return HDF_SUCCESS;
5563d0407baSopenharmony_ci}
5573d0407baSopenharmony_ci
5583d0407baSopenharmony_ciint32_t SetEncCfg(RKHdiBaseComponent *pBaseComponent)
5593d0407baSopenharmony_ci{
5603d0407baSopenharmony_ci    RKMppApi *mppApi = pBaseComponent->mppApi;
5613d0407baSopenharmony_ci    RKHdiEncodeSetup *setup = &pBaseComponent->setup;
5623d0407baSopenharmony_ci    GetDefaultConfig(pBaseComponent);
5633d0407baSopenharmony_ci
5643d0407baSopenharmony_ci    mppApi->HdiMppEncCfgSetS32(pBaseComponent->cfg, "prep:width", setup->width);
5653d0407baSopenharmony_ci    mppApi->HdiMppEncCfgSetS32(pBaseComponent->cfg, "prep:height", setup->height);
5663d0407baSopenharmony_ci
5673d0407baSopenharmony_ci    mppApi->HdiMppEncCfgSetS32(pBaseComponent->cfg, "prep:format", pBaseComponent->fmt);
5683d0407baSopenharmony_ci
5693d0407baSopenharmony_ci    pBaseComponent->horStride = GetStrideByWidth(setup->width, pBaseComponent->fmt);
5703d0407baSopenharmony_ci    pBaseComponent->verStride = setup->height;
5713d0407baSopenharmony_ci    if (pBaseComponent->horStride == 0 || pBaseComponent->verStride == 0) {
5723d0407baSopenharmony_ci        HDF_LOGE("%{public}s: size or stride incorrect!", __func__);
5733d0407baSopenharmony_ci        return HDF_FAILURE;
5743d0407baSopenharmony_ci    }
5753d0407baSopenharmony_ci    mppApi->HdiMppEncCfgSetS32(pBaseComponent->cfg, "prep:hor_stride", pBaseComponent->horStride);
5763d0407baSopenharmony_ci    mppApi->HdiMppEncCfgSetS32(pBaseComponent->cfg, "prep:ver_stride", pBaseComponent->verStride);
5773d0407baSopenharmony_ci
5783d0407baSopenharmony_ci    mppApi->HdiMppEncCfgSetS32(pBaseComponent->cfg, "rc:fps_in_flex", setup->fps.fpsInFlex);
5793d0407baSopenharmony_ci    mppApi->HdiMppEncCfgSetS32(pBaseComponent->cfg, "rc:fps_in_num", setup->fps.fpsInNum);
5803d0407baSopenharmony_ci    mppApi->HdiMppEncCfgSetS32(pBaseComponent->cfg, "rc:fps_in_denorm", setup->fps.fpsInDen);
5813d0407baSopenharmony_ci    mppApi->HdiMppEncCfgSetS32(pBaseComponent->cfg, "rc:fps_out_flex", setup->fps.fpsOutFlex);
5823d0407baSopenharmony_ci    mppApi->HdiMppEncCfgSetS32(pBaseComponent->cfg, "rc:fps_out_num", setup->fps.fpsOutNum);
5833d0407baSopenharmony_ci    mppApi->HdiMppEncCfgSetS32(pBaseComponent->cfg, "rc:fps_out_denorm", setup->fps.fpsOutDen);
5843d0407baSopenharmony_ci
5853d0407baSopenharmony_ci    MppEncRcMode mppRcMode = ConvertHdiRcMode2RKRcMode(setup->rc.rcMode);
5863d0407baSopenharmony_ci    CalcBpsValue(pBaseComponent, mppRcMode);
5873d0407baSopenharmony_ci    mppApi->HdiMppEncCfgSetS32(pBaseComponent->cfg, "rc:mode", mppRcMode);
5883d0407baSopenharmony_ci    mppApi->HdiMppEncCfgSetS32(pBaseComponent->cfg, "rc:bps_target", setup->rc.bpsTarget);
5893d0407baSopenharmony_ci    if (mppRcMode != MPP_ENC_RC_MODE_FIXQP) {
5903d0407baSopenharmony_ci        mppApi->HdiMppEncCfgSetS32(pBaseComponent->cfg, "rc:bps_max", setup->rc.bpsMax);
5913d0407baSopenharmony_ci        mppApi->HdiMppEncCfgSetS32(pBaseComponent->cfg, "rc:bps_min", setup->rc.bpsMin);
5923d0407baSopenharmony_ci    }
5933d0407baSopenharmony_ci
5943d0407baSopenharmony_ci    mppApi->HdiMppEncCfgSetS32(pBaseComponent->cfg, "rc:qp_init", setup->rc.qpInit);
5953d0407baSopenharmony_ci    mppApi->HdiMppEncCfgSetS32(pBaseComponent->cfg, "rc:qp_max", setup->rc.qpMax);
5963d0407baSopenharmony_ci    mppApi->HdiMppEncCfgSetS32(pBaseComponent->cfg, "rc:qp_min", setup->rc.qpMin);
5973d0407baSopenharmony_ci    mppApi->HdiMppEncCfgSetS32(pBaseComponent->cfg, "rc:qp_max_i", setup->rc.qpMaxI);
5983d0407baSopenharmony_ci    mppApi->HdiMppEncCfgSetS32(pBaseComponent->cfg, "rc:qp_min_i", setup->rc.qpMinI);
5993d0407baSopenharmony_ci    mppApi->HdiMppEncCfgSetS32(pBaseComponent->cfg, "rc:qp_ip", setup->rc.qpIp);
6003d0407baSopenharmony_ci
6013d0407baSopenharmony_ci    mppApi->HdiMppEncCfgSetU32(pBaseComponent->cfg, "rc:drop_mode", setup->drop.dropMode);
6023d0407baSopenharmony_ci    mppApi->HdiMppEncCfgSetU32(pBaseComponent->cfg, "rc:drop_thd", setup->drop.dropThd);
6033d0407baSopenharmony_ci    mppApi->HdiMppEncCfgSetU32(pBaseComponent->cfg, "rc:drop_gap", setup->drop.dropGap);
6043d0407baSopenharmony_ci
6053d0407baSopenharmony_ci    mppApi->HdiMppEncCfgSetS32(pBaseComponent->cfg, "codec:type", pBaseComponent->codingType);
6063d0407baSopenharmony_ci    SetMimeSettings(&setup->codecMime, pBaseComponent->codingType);
6073d0407baSopenharmony_ci    if (pBaseComponent->codingType == MPP_VIDEO_CodingAVC) {
6083d0407baSopenharmony_ci        mppApi->HdiMppEncCfgSetS32(pBaseComponent->cfg, "h264:profile", setup->codecMime.avcSetup.profile);
6093d0407baSopenharmony_ci        mppApi->HdiMppEncCfgSetS32(pBaseComponent->cfg, "h264:level", setup->codecMime.avcSetup.level);
6103d0407baSopenharmony_ci        mppApi->HdiMppEncCfgSetS32(pBaseComponent->cfg, "h264:cabac_en", setup->codecMime.avcSetup.cabacEn);
6113d0407baSopenharmony_ci        mppApi->HdiMppEncCfgSetS32(pBaseComponent->cfg, "h264:cabac_idc", setup->codecMime.avcSetup.cabacIdc);
6123d0407baSopenharmony_ci        mppApi->HdiMppEncCfgSetS32(pBaseComponent->cfg, "h264:trans8x8", setup->codecMime.avcSetup.trans8x8);
6133d0407baSopenharmony_ci    }
6143d0407baSopenharmony_ci    SetGop(pBaseComponent);
6153d0407baSopenharmony_ci    ValidateEncSetup(pBaseComponent, NULL);
6163d0407baSopenharmony_ci    return HDF_SUCCESS;
6173d0407baSopenharmony_ci}
6183d0407baSopenharmony_ci
6193d0407baSopenharmony_ciint32_t SetDecCfg(RKHdiBaseComponent *pBaseComponent)
6203d0407baSopenharmony_ci{
6213d0407baSopenharmony_ci    MPP_RET ret = MPP_OK;
6223d0407baSopenharmony_ci    RKMppApi *mppApi = pBaseComponent->mppApi;
6233d0407baSopenharmony_ci    MppCtx ctx = pBaseComponent->ctx;
6243d0407baSopenharmony_ci
6253d0407baSopenharmony_ci    GetDefaultConfig(pBaseComponent);
6263d0407baSopenharmony_ci    mppApi->HdiMppEncCfgSetS32(pBaseComponent->cfg, "codec:type", pBaseComponent->codingType);
6273d0407baSopenharmony_ci    mppApi->HdiMppDecCfgSetU32(pBaseComponent->cfg, "base:split_parse", pBaseComponent->setup.split);
6283d0407baSopenharmony_ci    ret = pBaseComponent->mpi->control(ctx, MPP_DEC_SET_CFG, pBaseComponent->cfg);
6293d0407baSopenharmony_ci    if (ret != MPP_OK) {
6303d0407baSopenharmony_ci        HDF_LOGE("%{public}s: config MPP_DEC_SET_CFG failed, ret %{public}d", __func__, ret);
6313d0407baSopenharmony_ci        UINTPTR userData = NULL;
6323d0407baSopenharmony_ci        EventType event = EVENT_ERROR;
6333d0407baSopenharmony_ci        uint32_t length = 0;
6343d0407baSopenharmony_ci        int32_t *eventData = NULL;
6353d0407baSopenharmony_ci
6363d0407baSopenharmony_ci        pBaseComponent->pCallbacks->OnEvent(userData, event, length, eventData);
6373d0407baSopenharmony_ci        return HDF_FAILURE;
6383d0407baSopenharmony_ci    }
6393d0407baSopenharmony_ci    return HDF_SUCCESS;
6403d0407baSopenharmony_ci}
6413d0407baSopenharmony_ci
6423d0407baSopenharmony_ciint32_t SetParamWidth(RKHdiBaseComponent *pBaseComponent, Param *param)
6433d0407baSopenharmony_ci{
6443d0407baSopenharmony_ci    pBaseComponent->setup.width = *(RK_S32 *)param->val;
6453d0407baSopenharmony_ci    if (pBaseComponent->setup.width <= 0) {
6463d0407baSopenharmony_ci        HDF_LOGE("%{public}s: invalid width value!", __func__);
6473d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
6483d0407baSopenharmony_ci    }
6493d0407baSopenharmony_ci    return HDF_SUCCESS;
6503d0407baSopenharmony_ci}
6513d0407baSopenharmony_ci
6523d0407baSopenharmony_ciint32_t SetParamHeight(RKHdiBaseComponent *pBaseComponent, Param *param)
6533d0407baSopenharmony_ci{
6543d0407baSopenharmony_ci    pBaseComponent->setup.height = *(RK_S32 *)param->val;
6553d0407baSopenharmony_ci    if (pBaseComponent->setup.height <= 0) {
6563d0407baSopenharmony_ci        HDF_LOGE("%{public}s: invalid height value!", __func__);
6573d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
6583d0407baSopenharmony_ci    }
6593d0407baSopenharmony_ci    return HDF_SUCCESS;
6603d0407baSopenharmony_ci}
6613d0407baSopenharmony_ci
6623d0407baSopenharmony_ciint32_t SetParamPixelFmt(RKHdiBaseComponent *pBaseComponent, Param *param)
6633d0407baSopenharmony_ci{
6643d0407baSopenharmony_ci    RK_S32 *hdiPixFmt = (RK_S32 *)param->val;
6653d0407baSopenharmony_ci    MppFrameFormat mppPixFmt = ConvertHdiFormat2RKFormat(*hdiPixFmt);
6663d0407baSopenharmony_ci    if (mppPixFmt == MPP_FMT_BUTT) {
6673d0407baSopenharmony_ci        HDF_LOGE("%{public}s: invalid pixel format value!", __func__);
6683d0407baSopenharmony_ci        return HDF_FAILURE;
6693d0407baSopenharmony_ci    }
6703d0407baSopenharmony_ci    pBaseComponent->setup.fmt = *hdiPixFmt;
6713d0407baSopenharmony_ci    pBaseComponent->fmt = MPP_FMT_YUV420SP;
6723d0407baSopenharmony_ci    return HDF_SUCCESS;
6733d0407baSopenharmony_ci}
6743d0407baSopenharmony_ci
6753d0407baSopenharmony_ciint32_t SetParamStride(RKHdiBaseComponent *pBaseComponent, Param *param)
6763d0407baSopenharmony_ci{
6773d0407baSopenharmony_ci    pBaseComponent->setup.stride.horStride = *(RK_S32 *)param->val;
6783d0407baSopenharmony_ci    if (pBaseComponent->setup.stride.horStride <= 0) {
6793d0407baSopenharmony_ci        HDF_LOGE("%{public}s: invalid stride value!", __func__);
6803d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
6813d0407baSopenharmony_ci    }
6823d0407baSopenharmony_ci    return HDF_SUCCESS;
6833d0407baSopenharmony_ci}
6843d0407baSopenharmony_ci
6853d0407baSopenharmony_ciint32_t SetParamFps(RKHdiBaseComponent *pBaseComponent, Param *param)
6863d0407baSopenharmony_ci{
6873d0407baSopenharmony_ci    pBaseComponent->setup.fps.fpsInNum = *(RK_S32 *)param->val;
6883d0407baSopenharmony_ci    pBaseComponent->setup.fps.fpsOutNum = *(RK_S32 *)param->val;
6893d0407baSopenharmony_ci    if (pBaseComponent->setup.fps.fpsInNum <= 0) {
6903d0407baSopenharmony_ci        HDF_LOGE("%{public}s: invalid fps value!", __func__);
6913d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
6923d0407baSopenharmony_ci    }
6933d0407baSopenharmony_ci    return HDF_SUCCESS;
6943d0407baSopenharmony_ci}
6953d0407baSopenharmony_ci
6963d0407baSopenharmony_ciint32_t SetParamDrop(RKHdiBaseComponent *pBaseComponent, Param *param)
6973d0407baSopenharmony_ci{
6983d0407baSopenharmony_ci    pBaseComponent->setup.drop.dropMode = *(RK_U32 *)param->val;
6993d0407baSopenharmony_ci    if (pBaseComponent->setup.drop.dropMode < 0 || pBaseComponent->setup.drop.dropMode >= MPP_ENC_RC_DROP_FRM_BUTT) {
7003d0407baSopenharmony_ci        HDF_LOGE("%{public}s: drop stride value!", __func__);
7013d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
7023d0407baSopenharmony_ci    }
7033d0407baSopenharmony_ci    return HDF_SUCCESS;
7043d0407baSopenharmony_ci}
7053d0407baSopenharmony_ci
7063d0407baSopenharmony_ciint32_t SetParamRateControl(RKHdiBaseComponent *pBaseComponent, Param *param)
7073d0407baSopenharmony_ci{
7083d0407baSopenharmony_ci    pBaseComponent->setup.rc.rcMode = *(RK_S32 *)param->val;
7093d0407baSopenharmony_ci    if (pBaseComponent->setup.rc.rcMode < 0) {
7103d0407baSopenharmony_ci        HDF_LOGE("%{public}s: invalid rcMode value!", __func__);
7113d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
7123d0407baSopenharmony_ci    }
7133d0407baSopenharmony_ci    return HDF_SUCCESS;
7143d0407baSopenharmony_ci}
7153d0407baSopenharmony_ci
7163d0407baSopenharmony_ciint32_t SetParamGop(RKHdiBaseComponent *pBaseComponent, Param *param)
7173d0407baSopenharmony_ci{
7183d0407baSopenharmony_ci    pBaseComponent->setup.gop.gopMode = *(VideoCodecGopMode *)param->val;
7193d0407baSopenharmony_ci    if (pBaseComponent->setup.gop.gopMode < 0 || pBaseComponent->setup.gop.gopMode >= VID_CODEC_GOPMODE_INVALID) {
7203d0407baSopenharmony_ci        HDF_LOGE("%{public}s: invalid gop value!", __func__);
7213d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
7223d0407baSopenharmony_ci    }
7233d0407baSopenharmony_ci    return HDF_SUCCESS;
7243d0407baSopenharmony_ci}
7253d0407baSopenharmony_ci
7263d0407baSopenharmony_ciint32_t SetParamMimeCodecType(RKHdiBaseComponent *pBaseComponent, Param *param)
7273d0407baSopenharmony_ci{
7283d0407baSopenharmony_ci    RKHdiCodecMimeSetup *mimeCodecTypeSet = &pBaseComponent->setup.codecMime;
7293d0407baSopenharmony_ci    mimeCodecTypeSet->mimeCodecType = *(RK_S32 *)param->val;
7303d0407baSopenharmony_ci    if (mimeCodecTypeSet->mimeCodecType < 0 || mimeCodecTypeSet->mimeCodecType >= MEDIA_MIMETYPE_INVALID) {
7313d0407baSopenharmony_ci        HDF_LOGE("%{public}s: invalid mime type value!", __func__);
7323d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
7333d0407baSopenharmony_ci    }
7343d0407baSopenharmony_ci
7353d0407baSopenharmony_ci    MppCodingType codingType = ConvertHdiMimeCodecType2RKCodecType(mimeCodecTypeSet->mimeCodecType);
7363d0407baSopenharmony_ci    if (codingType == MPP_VIDEO_CodingMax) {
7373d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
7383d0407baSopenharmony_ci    }
7393d0407baSopenharmony_ci    pBaseComponent->codingType = codingType;
7403d0407baSopenharmony_ci    return HDF_SUCCESS;
7413d0407baSopenharmony_ci}
7423d0407baSopenharmony_ci
7433d0407baSopenharmony_ciint32_t SetParamCodecType(RKHdiBaseComponent *pBaseComponent, Param *param)
7443d0407baSopenharmony_ci{
7453d0407baSopenharmony_ci    pBaseComponent->setup.codecType = *(RK_S32 *)param->val;
7463d0407baSopenharmony_ci    if (pBaseComponent->setup.codecType < 0 || pBaseComponent->setup.codecType >= INVALID_TYPE) {
7473d0407baSopenharmony_ci        HDF_LOGE("%{public}s: invalid codec type value!", __func__);
7483d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
7493d0407baSopenharmony_ci    }
7503d0407baSopenharmony_ci    return HDF_SUCCESS;
7513d0407baSopenharmony_ci}
7523d0407baSopenharmony_ci
7533d0407baSopenharmony_ciint32_t SetParamSplitParse(RKHdiBaseComponent *pBaseComponent, Param *param)
7543d0407baSopenharmony_ci{
7553d0407baSopenharmony_ci    pBaseComponent->setup.split = *(RK_U32 *)param->val;
7563d0407baSopenharmony_ci    return HDF_SUCCESS;
7573d0407baSopenharmony_ci}
7583d0407baSopenharmony_ci
7593d0407baSopenharmony_ciint32_t SetParamCodecFrameNum(RKHdiBaseComponent *pBaseComponent, Param *param)
7603d0407baSopenharmony_ci{
7613d0407baSopenharmony_ci    pBaseComponent->frameNum = *(RK_S32 *)param->val;
7623d0407baSopenharmony_ci    if (pBaseComponent->frameNum < 0) {
7633d0407baSopenharmony_ci        HDF_LOGE("%{public}s: invalid frame num value!", __func__);
7643d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
7653d0407baSopenharmony_ci    }
7663d0407baSopenharmony_ci    return HDF_SUCCESS;
7673d0407baSopenharmony_ci}
7683d0407baSopenharmony_ci
7693d0407baSopenharmony_ciint32_t CheckSetupStride(RKHdiBaseComponent *pBaseComponent)
7703d0407baSopenharmony_ci{
7713d0407baSopenharmony_ci    if (pBaseComponent->setup.width <= 0 || pBaseComponent->setup.height <= 0) {
7723d0407baSopenharmony_ci        HDF_LOGE("%{public}s: width or height invalid!", __func__);
7733d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
7743d0407baSopenharmony_ci    }
7753d0407baSopenharmony_ci    if (pBaseComponent->setup.stride.horStride == 0) {
7763d0407baSopenharmony_ci        pBaseComponent->setup.stride.horStride = MPP_ALIGN(pBaseComponent->setup.width, MPP_ALIGN_STRIDE_WITH_SIXTEEN);
7773d0407baSopenharmony_ci    }
7783d0407baSopenharmony_ci    if (pBaseComponent->setup.stride.verStride == 0) {
7793d0407baSopenharmony_ci        pBaseComponent->setup.stride.verStride = pBaseComponent->setup.height;
7803d0407baSopenharmony_ci    }
7813d0407baSopenharmony_ci    return HDF_SUCCESS;
7823d0407baSopenharmony_ci}
7833d0407baSopenharmony_ci
7843d0407baSopenharmony_ciint32_t ValidateEncSetup(RKHdiBaseComponent *pBaseComponent, Param *param)
7853d0407baSopenharmony_ci{
7863d0407baSopenharmony_ci    MPP_RET ret = MPP_OK;
7873d0407baSopenharmony_ci    RKMppApi *mppApi = pBaseComponent->mppApi;
7883d0407baSopenharmony_ci    RK_U32 splitMode = 0;
7893d0407baSopenharmony_ci    RK_U32 splitArg = 0;
7903d0407baSopenharmony_ci
7913d0407baSopenharmony_ci    int32_t checkResult = CheckSetupStride(pBaseComponent);
7923d0407baSopenharmony_ci    if (checkResult != HDF_SUCCESS) {
7933d0407baSopenharmony_ci        HDF_LOGE("%{public}s: CheckSetupStride failed!", __func__);
7943d0407baSopenharmony_ci        return checkResult;
7953d0407baSopenharmony_ci    }
7963d0407baSopenharmony_ci
7973d0407baSopenharmony_ci    mppApi->HdiMppEnvGetU32("split_mode", &splitMode, MPP_ENC_SPLIT_NONE);
7983d0407baSopenharmony_ci    mppApi->HdiMppEnvGetU32("split_arg", &splitArg, 0);
7993d0407baSopenharmony_ci    if (splitMode) {
8003d0407baSopenharmony_ci        HDF_LOGI("%{public}s: %{public}p splitMode %{public}d splitArg %{public}d",
8013d0407baSopenharmony_ci            __func__, pBaseComponent->ctx, splitMode, splitArg);
8023d0407baSopenharmony_ci        mppApi->HdiMppEncCfgSetS32(pBaseComponent->cfg, "split:mode", splitMode);
8033d0407baSopenharmony_ci        mppApi->HdiMppEncCfgSetS32(pBaseComponent->cfg, "split:arg", splitArg);
8043d0407baSopenharmony_ci    }
8053d0407baSopenharmony_ci
8063d0407baSopenharmony_ci    ret = pBaseComponent->mpi->control(pBaseComponent->ctx, MPP_ENC_SET_CFG, pBaseComponent->cfg);
8073d0407baSopenharmony_ci    if (ret != MPP_OK) {
8083d0407baSopenharmony_ci        HDF_LOGE("%{public}s: mpi control enc set cfg failed ret %{public}d", __func__, ret);
8093d0407baSopenharmony_ci        return HDF_FAILURE;
8103d0407baSopenharmony_ci    }
8113d0407baSopenharmony_ci
8123d0407baSopenharmony_ci    /* optional */
8133d0407baSopenharmony_ci    MppEncSeiMode seiMode = MPP_ENC_SEI_MODE_ONE_FRAME;
8143d0407baSopenharmony_ci    ret = pBaseComponent->mpi->control(pBaseComponent->ctx, MPP_ENC_SET_SEI_CFG, &seiMode);
8153d0407baSopenharmony_ci    if (ret != MPP_OK) {
8163d0407baSopenharmony_ci        HDF_LOGE("%{public}s: mpi control enc set sei cfg failed ret %{public}d", __func__, ret);
8173d0407baSopenharmony_ci        return HDF_FAILURE;
8183d0407baSopenharmony_ci    }
8193d0407baSopenharmony_ci
8203d0407baSopenharmony_ci    if ((pBaseComponent->codingType == MPP_VIDEO_CodingAVC) || (pBaseComponent->codingType == MPP_VIDEO_CodingHEVC)) {
8213d0407baSopenharmony_ci        MppEncHeaderMode headerMode = MPP_ENC_HEADER_MODE_EACH_IDR;
8223d0407baSopenharmony_ci        ret = pBaseComponent->mpi->control(pBaseComponent->ctx, MPP_ENC_SET_HEADER_MODE, &headerMode);
8233d0407baSopenharmony_ci        if (ret != MPP_OK) {
8243d0407baSopenharmony_ci            HDF_LOGE("%{public}s: mpi control enc set header mode failed ret %{public}d", __func__, ret);
8253d0407baSopenharmony_ci            return HDF_FAILURE;
8263d0407baSopenharmony_ci        }
8273d0407baSopenharmony_ci    }
8283d0407baSopenharmony_ci
8293d0407baSopenharmony_ci    pBaseComponent->frameSize = GetMppFrameBufferSize(pBaseComponent);
8303d0407baSopenharmony_ci    pBaseComponent->headerSize = GetMppFrameHeaderSize(pBaseComponent);
8313d0407baSopenharmony_ci    ret = GetMppBuffers(pBaseComponent);
8323d0407baSopenharmony_ci    if (ret != MPP_OK) {
8333d0407baSopenharmony_ci        HDF_LOGE("%{public}s: GetMppBuffers failed ret %{public}d", __func__, ret);
8343d0407baSopenharmony_ci        return HDF_FAILURE;
8353d0407baSopenharmony_ci    }
8363d0407baSopenharmony_ci
8373d0407baSopenharmony_ci    return HDF_SUCCESS;
8383d0407baSopenharmony_ci}
8393d0407baSopenharmony_ci
8403d0407baSopenharmony_ciuint32_t CalculateTotalDecRefFrames(RKHdiBaseComponent *pBaseComponent)
8413d0407baSopenharmony_ci{
8423d0407baSopenharmony_ci    uint32_t refFramesNum = DEFAULT_REF_FRAME_NUM;
8433d0407baSopenharmony_ci    int32_t width = pBaseComponent->setup.width;
8443d0407baSopenharmony_ci    int32_t height = pBaseComponent->setup.height;
8453d0407baSopenharmony_ci
8463d0407baSopenharmony_ci    if (width == 0 || height == 0 || pBaseComponent->codingType < 0 ||
8473d0407baSopenharmony_ci        pBaseComponent->codingType >= MPP_VIDEO_CodingMax) {
8483d0407baSopenharmony_ci        HDF_LOGE("%{public}s: invalid parameters", __func__);
8493d0407baSopenharmony_ci        return refFramesNum;
8503d0407baSopenharmony_ci    }
8513d0407baSopenharmony_ci    switch (pBaseComponent->codingType) {
8523d0407baSopenharmony_ci        case MPP_VIDEO_CodingAVC:
8533d0407baSopenharmony_ci            /* used level 5.1 MaxDpbMbs to compute ref num */
8543d0407baSopenharmony_ci            refFramesNum = LEVEL_5P1_MAX_DPB_MBS / ((width / REF_FRAME_DIVISOR) * (height / REF_FRAME_DIVISOR));
8553d0407baSopenharmony_ci            if (refFramesNum > MAX_REF_FRAME_NUM) {
8563d0407baSopenharmony_ci                /* max ref frame number is 16 */
8573d0407baSopenharmony_ci                refFramesNum = MAX_REF_FRAME_NUM;
8583d0407baSopenharmony_ci            } else if (refFramesNum < MIN_REF_FRAME_NUM) {
8593d0407baSopenharmony_ci                /* min ref frame number is 6 */
8603d0407baSopenharmony_ci                refFramesNum = MIN_REF_FRAME_NUM;
8613d0407baSopenharmony_ci            }
8623d0407baSopenharmony_ci            break;
8633d0407baSopenharmony_ci        case MPP_VIDEO_CodingHEVC:
8643d0407baSopenharmony_ci            /* use 4K resolution to compute ref num */
8653d0407baSopenharmony_ci            refFramesNum = WIDTH_OF_4K_VIDEO * HEIGHT_OF_4K_HEVC * MIN_REF_FRAME_NUM / (width * height);
8663d0407baSopenharmony_ci            if (refFramesNum > MAX_REF_FRAME_NUM) {
8673d0407baSopenharmony_ci                /* max ref frame number is 16 */
8683d0407baSopenharmony_ci                refFramesNum = MAX_REF_FRAME_NUM;
8693d0407baSopenharmony_ci            } else if (refFramesNum < MIN_REF_FRAME_NUM) {
8703d0407baSopenharmony_ci                /* min ref frame number is 6 */
8713d0407baSopenharmony_ci                refFramesNum = MIN_REF_FRAME_NUM;
8723d0407baSopenharmony_ci            }
8733d0407baSopenharmony_ci            break;
8743d0407baSopenharmony_ci        case MPP_VIDEO_CodingVP9:
8753d0407baSopenharmony_ci            refFramesNum = WIDTH_OF_4K_VIDEO * HEIGHT_OF_4K_VP9 * MIN_REF_FRAME_NUM_VP9 / (width * height);
8763d0407baSopenharmony_ci            if (refFramesNum > MAX_REF_FRAME_NUM_VP9) {
8773d0407baSopenharmony_ci                /* max ref frame number is 8 */
8783d0407baSopenharmony_ci                refFramesNum = MAX_REF_FRAME_NUM_VP9;
8793d0407baSopenharmony_ci            } else if (refFramesNum < MIN_REF_FRAME_NUM_VP9) {
8803d0407baSopenharmony_ci                /* min ref frame number is 4 */
8813d0407baSopenharmony_ci                refFramesNum = MIN_REF_FRAME_NUM_VP9;
8823d0407baSopenharmony_ci            }
8833d0407baSopenharmony_ci            break;
8843d0407baSopenharmony_ci        default:
8853d0407baSopenharmony_ci            refFramesNum = DEFAULT_REF_FRAME_NUM;
8863d0407baSopenharmony_ci            break;
8873d0407baSopenharmony_ci    }
8883d0407baSopenharmony_ci
8893d0407baSopenharmony_ci    return refFramesNum;
8903d0407baSopenharmony_ci}
8913d0407baSopenharmony_ci
8923d0407baSopenharmony_ciint32_t GetParamInputBufferCount(RKHdiBaseComponent *pBaseComponent, Param *param)
8933d0407baSopenharmony_ci{
8943d0407baSopenharmony_ci    if (param->val == NULL) {
8953d0407baSopenharmony_ci        param->size = sizeof(RK_U32);
8963d0407baSopenharmony_ci        param->val = malloc(param->size);
8973d0407baSopenharmony_ci    }
8983d0407baSopenharmony_ci
8993d0407baSopenharmony_ci    RK_U32 inputBufferCount = 0;
9003d0407baSopenharmony_ci    if (pBaseComponent->ctxType == MPP_CTX_ENC) {
9013d0407baSopenharmony_ci        inputBufferCount = DEFAULT_FRAME_BUFFER_NUM;
9023d0407baSopenharmony_ci    } else {
9033d0407baSopenharmony_ci        inputBufferCount = DEFAULT_PACKET_BUFFER_NUM;
9043d0407baSopenharmony_ci    }
9053d0407baSopenharmony_ci    int32_t ret = memcpy_s(param->val, param->size, &inputBufferCount, sizeof(RK_U32));
9063d0407baSopenharmony_ci    if (ret != EOK) {
9073d0407baSopenharmony_ci        HDF_LOGE("%{public}s: copy data failed, error code: %{public}d", __func__, ret);
9083d0407baSopenharmony_ci        return HDF_FAILURE;
9093d0407baSopenharmony_ci    }
9103d0407baSopenharmony_ci    return HDF_SUCCESS;
9113d0407baSopenharmony_ci}
9123d0407baSopenharmony_ci
9133d0407baSopenharmony_ciint32_t GetParamOutputBufferCount(RKHdiBaseComponent *pBaseComponent, Param *param)
9143d0407baSopenharmony_ci{
9153d0407baSopenharmony_ci    if (param->val == NULL) {
9163d0407baSopenharmony_ci        param->size = sizeof(RK_U32);
9173d0407baSopenharmony_ci        param->val = malloc(param->size);
9183d0407baSopenharmony_ci    }
9193d0407baSopenharmony_ci
9203d0407baSopenharmony_ci    RK_U32 outputBufferCount = 0;
9213d0407baSopenharmony_ci    if (pBaseComponent->ctxType == MPP_CTX_ENC) {
9223d0407baSopenharmony_ci        outputBufferCount = DEFAULT_PACKET_BUFFER_NUM;
9233d0407baSopenharmony_ci    } else {
9243d0407baSopenharmony_ci        RK_U32 refFramesNum = CalculateTotalDecRefFrames(pBaseComponent);
9253d0407baSopenharmony_ci        outputBufferCount = refFramesNum + BASIC_DEC_FRAME_BUFFER_NUM;
9263d0407baSopenharmony_ci    }
9273d0407baSopenharmony_ci    int32_t ret = memcpy_s(param->val, param->size, &outputBufferCount, sizeof(RK_U32));
9283d0407baSopenharmony_ci    if (ret != EOK) {
9293d0407baSopenharmony_ci        HDF_LOGE("%{public}s: copy data failed, error code: %{public}d", __func__, ret);
9303d0407baSopenharmony_ci        return HDF_FAILURE;
9313d0407baSopenharmony_ci    }
9323d0407baSopenharmony_ci    return HDF_SUCCESS;
9333d0407baSopenharmony_ci}
9343d0407baSopenharmony_ci
9353d0407baSopenharmony_ciint32_t GetParamBufferSize(RKHdiBaseComponent *pBaseComponent, Param *param)
9363d0407baSopenharmony_ci{
9373d0407baSopenharmony_ci    if (param->val == NULL) {
9383d0407baSopenharmony_ci        param->size = sizeof(RK_U32);
9393d0407baSopenharmony_ci        param->val = malloc(param->size);
9403d0407baSopenharmony_ci    }
9413d0407baSopenharmony_ci
9423d0407baSopenharmony_ci    PixelFormat format = pBaseComponent->setup.fmt;
9433d0407baSopenharmony_ci    if (format == PIXEL_FMT_BUTT) {
9443d0407baSopenharmony_ci        HDF_LOGE("%{public}s: pixel format not set!", __func__);
9453d0407baSopenharmony_ci        return HDF_FAILURE;
9463d0407baSopenharmony_ci    }
9473d0407baSopenharmony_ci
9483d0407baSopenharmony_ci    RK_U32 bufferSize = pBaseComponent->setup.width * pBaseComponent->setup.height;
9493d0407baSopenharmony_ci    if (bufferSize == 0) {
9503d0407baSopenharmony_ci        bufferSize = DEFAULT_RESOLUTION_SIZE;
9513d0407baSopenharmony_ci    }
9523d0407baSopenharmony_ci    if (format == PIXEL_FMT_YCBCR_420_SP || format == PIXEL_FMT_YCBCR_420_P) {
9533d0407baSopenharmony_ci        bufferSize = (bufferSize * PACKET_SIZE_MULTI) / PACKET_SIZE_OPERATOR;
9543d0407baSopenharmony_ci    } else if (format == PIXEL_FMT_BGRA_8888 || format == PIXEL_FMT_RGBA_8888) {
9553d0407baSopenharmony_ci        bufferSize = bufferSize * FOUR_BYTE_PIX_BUF_SIZE_OPERATOR;
9563d0407baSopenharmony_ci    } else {
9573d0407baSopenharmony_ci        bufferSize = bufferSize * DFAULT_BUF_SIZE_OPERATOR;
9583d0407baSopenharmony_ci    }
9593d0407baSopenharmony_ci    int32_t ret = memcpy_s(param->val, param->size, &bufferSize, sizeof(RK_U32));
9603d0407baSopenharmony_ci    if (ret != EOK) {
9613d0407baSopenharmony_ci        HDF_LOGE("%{public}s: copy data failed, error code: %{public}d", __func__, ret);
9623d0407baSopenharmony_ci        return HDF_FAILURE;
9633d0407baSopenharmony_ci    }
9643d0407baSopenharmony_ci    return HDF_SUCCESS;
9653d0407baSopenharmony_ci}
9663d0407baSopenharmony_ci
9673d0407baSopenharmony_ciint32_t GetParamWidth(RKHdiBaseComponent *pBaseComponent, Param *param)
9683d0407baSopenharmony_ci{
9693d0407baSopenharmony_ci    if (param->val == NULL) {
9703d0407baSopenharmony_ci        param->size = sizeof(RK_S32);
9713d0407baSopenharmony_ci        param->val = malloc(param->size);
9723d0407baSopenharmony_ci    }
9733d0407baSopenharmony_ci    int32_t ret = memcpy_s(param->val, param->size, &pBaseComponent->setup.width, sizeof(RK_S32));
9743d0407baSopenharmony_ci    if (ret != EOK) {
9753d0407baSopenharmony_ci        HDF_LOGE("%{public}s: copy data failed, error code: %{public}d", __func__, ret);
9763d0407baSopenharmony_ci        return HDF_FAILURE;
9773d0407baSopenharmony_ci    }
9783d0407baSopenharmony_ci    return HDF_SUCCESS;
9793d0407baSopenharmony_ci}
9803d0407baSopenharmony_ci
9813d0407baSopenharmony_ciint32_t GetParamHeight(RKHdiBaseComponent *pBaseComponent, Param *param)
9823d0407baSopenharmony_ci{
9833d0407baSopenharmony_ci    if (param->val == NULL) {
9843d0407baSopenharmony_ci        param->size = sizeof(RK_S32);
9853d0407baSopenharmony_ci        param->val = malloc(param->size);
9863d0407baSopenharmony_ci    }
9873d0407baSopenharmony_ci    int32_t ret = memcpy_s(param->val, param->size, &pBaseComponent->setup.height, sizeof(RK_S32));
9883d0407baSopenharmony_ci    if (ret != EOK) {
9893d0407baSopenharmony_ci        HDF_LOGE("%{public}s: copy data failed, error code: %{public}d", __func__, ret);
9903d0407baSopenharmony_ci        return HDF_FAILURE;
9913d0407baSopenharmony_ci    }
9923d0407baSopenharmony_ci    return HDF_SUCCESS;
9933d0407baSopenharmony_ci}
9943d0407baSopenharmony_ci
9953d0407baSopenharmony_ciint32_t GetParamDecOutputPixelFmt(RKHdiBaseComponent *pBaseComponent, Param *param)
9963d0407baSopenharmony_ci{
9973d0407baSopenharmony_ci    if (param->val == NULL) {
9983d0407baSopenharmony_ci        param->size = sizeof(PixelFormat);
9993d0407baSopenharmony_ci        param->val = malloc(param->size);
10003d0407baSopenharmony_ci    }
10013d0407baSopenharmony_ci
10023d0407baSopenharmony_ci    PixelFormat format = pBaseComponent->setup.fmt;
10033d0407baSopenharmony_ci    if (format == PIXEL_FMT_BUTT) {
10043d0407baSopenharmony_ci        // Rk mpp only support NV12 output (rga can be used for other formats)
10053d0407baSopenharmony_ci        format = PIXEL_FMT_YCBCR_420_SP;
10063d0407baSopenharmony_ci        pBaseComponent->setup.fmt = PIXEL_FMT_YCBCR_420_SP;
10073d0407baSopenharmony_ci        pBaseComponent->fmt = MPP_FMT_YUV420SP;
10083d0407baSopenharmony_ci    }
10093d0407baSopenharmony_ci    int32_t ret = memcpy_s(param->val, param->size, &format, sizeof(PixelFormat));
10103d0407baSopenharmony_ci    if (ret != EOK) {
10113d0407baSopenharmony_ci        HDF_LOGE("%{public}s: copy data failed, error code: %{public}d", __func__, ret);
10123d0407baSopenharmony_ci        return HDF_FAILURE;
10133d0407baSopenharmony_ci    }
10143d0407baSopenharmony_ci    return HDF_SUCCESS;
10153d0407baSopenharmony_ci}
10163d0407baSopenharmony_ci
10173d0407baSopenharmony_ciint32_t GetParamEncInputPixleFmt(RKHdiBaseComponent *pBaseComponent, Param *param)
10183d0407baSopenharmony_ci{
10193d0407baSopenharmony_ci    if (param->val == NULL) {
10203d0407baSopenharmony_ci        param->size = sizeof(PixelFormat);
10213d0407baSopenharmony_ci        param->val = malloc(param->size);
10223d0407baSopenharmony_ci    }
10233d0407baSopenharmony_ci    int32_t ret = memcpy_s(param->val, param->size, &pBaseComponent->setup.fmt, sizeof(PixelFormat));
10243d0407baSopenharmony_ci    if (ret != EOK) {
10253d0407baSopenharmony_ci        HDF_LOGE("%{public}s: copy data failed, error code: %{public}d", __func__, ret);
10263d0407baSopenharmony_ci        return HDF_FAILURE;
10273d0407baSopenharmony_ci    }
10283d0407baSopenharmony_ci    return HDF_SUCCESS;
10293d0407baSopenharmony_ci}
10303d0407baSopenharmony_ci
10313d0407baSopenharmony_ciint32_t GetParamPixleFmt(RKHdiBaseComponent *pBaseComponent, Param *param)
10323d0407baSopenharmony_ci{
10333d0407baSopenharmony_ci    if (pBaseComponent->setup.codecType == VIDEO_DECODER) {
10343d0407baSopenharmony_ci        return GetParamDecOutputPixelFmt(pBaseComponent, param);
10353d0407baSopenharmony_ci    } else if (pBaseComponent->setup.codecType == VIDEO_ENCODER) {
10363d0407baSopenharmony_ci        return GetParamEncInputPixleFmt(pBaseComponent, param);
10373d0407baSopenharmony_ci    } else {
10383d0407baSopenharmony_ci        HDF_LOGE("%{public}s: codec type invalid!", __func__);
10393d0407baSopenharmony_ci        return HDF_FAILURE;
10403d0407baSopenharmony_ci    }
10413d0407baSopenharmony_ci}
10423d0407baSopenharmony_ci
10433d0407baSopenharmony_ciint32_t GetParamStride(RKHdiBaseComponent *pBaseComponent, Param *param)
10443d0407baSopenharmony_ci{
10453d0407baSopenharmony_ci    if (param->val == NULL) {
10463d0407baSopenharmony_ci        param->size = sizeof(RK_S32);
10473d0407baSopenharmony_ci        param->val = malloc(param->size);
10483d0407baSopenharmony_ci    }
10493d0407baSopenharmony_ci    int32_t ret = memcpy_s(param->val, param->size, &pBaseComponent->setup.stride.horStride, sizeof(RK_S32));
10503d0407baSopenharmony_ci    if (ret != EOK) {
10513d0407baSopenharmony_ci        HDF_LOGE("%{public}s: copy data failed, error code: %{public}d", __func__, ret);
10523d0407baSopenharmony_ci        return HDF_FAILURE;
10533d0407baSopenharmony_ci    }
10543d0407baSopenharmony_ci    return HDF_SUCCESS;
10553d0407baSopenharmony_ci}
10563d0407baSopenharmony_ci
10573d0407baSopenharmony_ciint32_t GetParamFps(RKHdiBaseComponent *pBaseComponent, Param *param)
10583d0407baSopenharmony_ci{
10593d0407baSopenharmony_ci    if (param->val == NULL) {
10603d0407baSopenharmony_ci        param->size = sizeof(RK_S32);
10613d0407baSopenharmony_ci        param->val = malloc(param->size);
10623d0407baSopenharmony_ci    }
10633d0407baSopenharmony_ci    int32_t ret = memcpy_s(param->val, param->size, &pBaseComponent->setup.fps.fpsInNum, sizeof(RK_S32));
10643d0407baSopenharmony_ci    if (ret != EOK) {
10653d0407baSopenharmony_ci        HDF_LOGE("%{public}s: copy data failed, error code: %{public}d", __func__, ret);
10663d0407baSopenharmony_ci        return HDF_FAILURE;
10673d0407baSopenharmony_ci    }
10683d0407baSopenharmony_ci    return HDF_SUCCESS;
10693d0407baSopenharmony_ci}
10703d0407baSopenharmony_ci
10713d0407baSopenharmony_ciint32_t GetParamRateControl(RKHdiBaseComponent *pBaseComponent, Param *param)
10723d0407baSopenharmony_ci{
10733d0407baSopenharmony_ci    if (param->val == NULL) {
10743d0407baSopenharmony_ci        param->size = sizeof(RK_S32);
10753d0407baSopenharmony_ci        param->val = malloc(param->size);
10763d0407baSopenharmony_ci    }
10773d0407baSopenharmony_ci    int32_t ret = memcpy_s(param->val, param->size, &pBaseComponent->setup.rc.rcMode, sizeof(RK_S32));
10783d0407baSopenharmony_ci    if (ret != EOK) {
10793d0407baSopenharmony_ci        HDF_LOGE("%{public}s: copy data failed, error code: %{public}d", __func__, ret);
10803d0407baSopenharmony_ci        return HDF_FAILURE;
10813d0407baSopenharmony_ci    }
10823d0407baSopenharmony_ci    return HDF_SUCCESS;
10833d0407baSopenharmony_ci}
10843d0407baSopenharmony_ci
10853d0407baSopenharmony_ciint32_t GetParamGop(RKHdiBaseComponent *pBaseComponent, Param *param)
10863d0407baSopenharmony_ci{
10873d0407baSopenharmony_ci    if (param->val == NULL) {
10883d0407baSopenharmony_ci        param->size = sizeof(RK_S32);
10893d0407baSopenharmony_ci        param->val = malloc(param->size);
10903d0407baSopenharmony_ci    }
10913d0407baSopenharmony_ci    int32_t ret = memcpy_s(param->val, param->size, &pBaseComponent->setup.gop.gopMode, sizeof(RK_S32));
10923d0407baSopenharmony_ci    if (ret != EOK) {
10933d0407baSopenharmony_ci        HDF_LOGE("%{public}s: copy data failed, error code: %{public}d", __func__, ret);
10943d0407baSopenharmony_ci        return HDF_FAILURE;
10953d0407baSopenharmony_ci    }
10963d0407baSopenharmony_ci    return HDF_SUCCESS;
10973d0407baSopenharmony_ci}
10983d0407baSopenharmony_ci
10993d0407baSopenharmony_ciint32_t GetParamMimeCodecType(RKHdiBaseComponent *pBaseComponent, Param *param)
11003d0407baSopenharmony_ci{
11013d0407baSopenharmony_ci    if (param->val == NULL) {
11023d0407baSopenharmony_ci        param->size = sizeof(RK_S32);
11033d0407baSopenharmony_ci        param->val = malloc(param->size);
11043d0407baSopenharmony_ci    }
11053d0407baSopenharmony_ci    int32_t ret = memcpy_s(param->val, param->size, &pBaseComponent->setup.codecMime.mimeCodecType, sizeof(RK_S32));
11063d0407baSopenharmony_ci    if (ret != EOK) {
11073d0407baSopenharmony_ci        HDF_LOGE("%{public}s: copy data failed, error code: %{public}d", __func__, ret);
11083d0407baSopenharmony_ci        return HDF_FAILURE;
11093d0407baSopenharmony_ci    }
11103d0407baSopenharmony_ci    return HDF_SUCCESS;
11113d0407baSopenharmony_ci}
11123d0407baSopenharmony_ci
11133d0407baSopenharmony_ciint32_t GetParamCodecType(RKHdiBaseComponent *pBaseComponent, Param *param)
11143d0407baSopenharmony_ci{
11153d0407baSopenharmony_ci    if (param->val == NULL) {
11163d0407baSopenharmony_ci        param->size = sizeof(RK_S32);
11173d0407baSopenharmony_ci        param->val = malloc(param->size);
11183d0407baSopenharmony_ci    }
11193d0407baSopenharmony_ci    int32_t ret = memcpy_s(param->val, param->size, &pBaseComponent->setup.codecType, sizeof(RK_S32));
11203d0407baSopenharmony_ci    if (ret != EOK) {
11213d0407baSopenharmony_ci        HDF_LOGE("%{public}s: copy data failed, error code: %{public}d", __func__, ret);
11223d0407baSopenharmony_ci        return HDF_FAILURE;
11233d0407baSopenharmony_ci    }
11243d0407baSopenharmony_ci    return HDF_SUCCESS;
11253d0407baSopenharmony_ci}
11263d0407baSopenharmony_ci
11273d0407baSopenharmony_ciint32_t GetParamSplitParse(RKHdiBaseComponent *pBaseComponent, Param *param)
11283d0407baSopenharmony_ci{
11293d0407baSopenharmony_ci    if (param->val == NULL) {
11303d0407baSopenharmony_ci        param->size = sizeof(RK_U32);
11313d0407baSopenharmony_ci        param->val = malloc(param->size);
11323d0407baSopenharmony_ci    }
11333d0407baSopenharmony_ci    int32_t ret = memcpy_s(param->val, param->size, &pBaseComponent->setup.split, sizeof(RK_U32));
11343d0407baSopenharmony_ci    if (ret != EOK) {
11353d0407baSopenharmony_ci        HDF_LOGE("%{public}s: copy data failed, error code: %{public}d", __func__, ret);
11363d0407baSopenharmony_ci        return HDF_FAILURE;
11373d0407baSopenharmony_ci    }
11383d0407baSopenharmony_ci    return HDF_SUCCESS;
11393d0407baSopenharmony_ci}
11403d0407baSopenharmony_ci
11413d0407baSopenharmony_ciint32_t GetParamCodecFrameNum(RKHdiBaseComponent *pBaseComponent, Param *param)
11423d0407baSopenharmony_ci{
11433d0407baSopenharmony_ci    if (param->val == NULL) {
11443d0407baSopenharmony_ci        param->size = sizeof(RK_S32);
11453d0407baSopenharmony_ci        param->val = malloc(param->size);
11463d0407baSopenharmony_ci    }
11473d0407baSopenharmony_ci    int32_t ret = memcpy_s(param->val, param->size, &pBaseComponent->frameNum, sizeof(RK_S32));
11483d0407baSopenharmony_ci    if (ret != EOK) {
11493d0407baSopenharmony_ci        HDF_LOGE("%{public}s: copy data failed, error code: %{public}d", __func__, ret);
11503d0407baSopenharmony_ci        return HDF_FAILURE;
11513d0407baSopenharmony_ci    }
11523d0407baSopenharmony_ci    return HDF_SUCCESS;
11533d0407baSopenharmony_ci}
11543d0407baSopenharmony_ci
11553d0407baSopenharmony_ciint32_t GetParamDrop(RKHdiBaseComponent *pBaseComponent, Param *param)
11563d0407baSopenharmony_ci{
11573d0407baSopenharmony_ci    if (param->val == NULL) {
11583d0407baSopenharmony_ci        param->size = sizeof(RK_S32);
11593d0407baSopenharmony_ci        param->val = malloc(param->size);
11603d0407baSopenharmony_ci    }
11613d0407baSopenharmony_ci    int32_t ret = memcpy_s(param->val, param->size, &pBaseComponent->setup.drop.dropMode, sizeof(RK_S32));
11623d0407baSopenharmony_ci    if (ret != EOK) {
11633d0407baSopenharmony_ci        HDF_LOGE("%{public}s: copy data failed, error code: %{public}d", __func__, ret);
11643d0407baSopenharmony_ci        return HDF_FAILURE;
11653d0407baSopenharmony_ci    }
11663d0407baSopenharmony_ci    return HDF_SUCCESS;
11673d0407baSopenharmony_ci}
1168