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