13d0407baSopenharmony_ci/*
23d0407baSopenharmony_ci * Copyright (c) 2022 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_mpi.h"
173d0407baSopenharmony_ci#include <dlfcn.h>
183d0407baSopenharmony_ci#include <hdf_base.h>
193d0407baSopenharmony_ci#include <hdf_log.h>
203d0407baSopenharmony_ci#include <securec.h>
213d0407baSopenharmony_ci
223d0407baSopenharmony_ci#define HDF_LOG_TAG codec_hdi_mpp_mpi
233d0407baSopenharmony_ci
243d0407baSopenharmony_civoid *mLibHandle = NULL;
253d0407baSopenharmony_ci
263d0407baSopenharmony_cichar *mLibName = "librockchip_mpp.z.so";
273d0407baSopenharmony_ciRKMppApi *GetPacketApi(RKMppApi *pMppApi)
283d0407baSopenharmony_ci{
293d0407baSopenharmony_ci    pMppApi->HdiMppPacketNew = (hdiMppPacketNew)dlsym(mLibHandle, "mpp_packet_new");
303d0407baSopenharmony_ci    pMppApi->HdiMppPacketInit = (hdiMppPacketInit)dlsym(mLibHandle, "mpp_packet_init");
313d0407baSopenharmony_ci    pMppApi->HdiMppPacketInitWithBuffer = (hdiMppPacketInitWithBuffer)dlsym(mLibHandle, "mpp_packet_init_with_buffer");
323d0407baSopenharmony_ci    pMppApi->HdiMppPacketCopyInit = (hdiMppPacketCopyInit)dlsym(mLibHandle, "mpp_packet_copy_init");
333d0407baSopenharmony_ci    pMppApi->HdiMppPacketDeinit = (hdiMppPacketDeinit)dlsym(mLibHandle, "mpp_packet_deinit");
343d0407baSopenharmony_ci    pMppApi->HdiMppPacketGetEos = (hdiMppPacketGetEos)dlsym(mLibHandle, "mpp_packet_get_eos");
353d0407baSopenharmony_ci    pMppApi->HdiMppPacketSetEos = (hdiMppPacketSetEos)dlsym(mLibHandle, "mpp_packet_set_eos");
363d0407baSopenharmony_ci    pMppApi->HdiMppPacketGetPts = (hdiMppPacketGetPts)dlsym(mLibHandle, "mpp_packet_get_pts");
373d0407baSopenharmony_ci    pMppApi->HdiMppPacketSetPts = (hdiMppPacketSetPts)dlsym(mLibHandle, "mpp_packet_set_pts");
383d0407baSopenharmony_ci    pMppApi->HdiMppPacketSetData = (hdiMppPacketSetData)dlsym(mLibHandle, "mpp_packet_set_data");
393d0407baSopenharmony_ci    pMppApi->HdiMppPacketSetSize = (hdiMppPacketSetSize)dlsym(mLibHandle, "mpp_packet_set_size");
403d0407baSopenharmony_ci    pMppApi->HdiMppPacketGetPos = (hdiMppPacketGetPos)dlsym(mLibHandle, "mpp_packet_get_pos");
413d0407baSopenharmony_ci    pMppApi->HdiMppPacketSetPos = (hdiMppPacketSetPos)dlsym(mLibHandle, "mpp_packet_set_pos");
423d0407baSopenharmony_ci    pMppApi->HdiMppPacketSetLength = (hdiMppPacketSetLength)dlsym(mLibHandle, "mpp_packet_set_length");
433d0407baSopenharmony_ci    pMppApi->HdiMppPacketGetLength = (hdiMppPacketGetLength)dlsym(mLibHandle, "mpp_packet_get_length");
443d0407baSopenharmony_ci    pMppApi->HdiMppPacketIsPartition = (hdiMppPacketIsPartition)dlsym(mLibHandle, "mpp_packet_is_partition");
453d0407baSopenharmony_ci    pMppApi->HdiMppPacketIsEoi = (hdiMppPacketIsEoi)dlsym(mLibHandle, "mpp_packet_is_eoi");
463d0407baSopenharmony_ci    pMppApi->HdiMppMetaSetPacket = (hdiMppMetaSetPacket)dlsym(mLibHandle, "mpp_meta_set_packet");
473d0407baSopenharmony_ci    return pMppApi;
483d0407baSopenharmony_ci}
493d0407baSopenharmony_ci
503d0407baSopenharmony_ciRKMppApi *GetFrameApi(RKMppApi *pMppApi)
513d0407baSopenharmony_ci{
523d0407baSopenharmony_ci    pMppApi->HdiMppFrameInit = (hdiMppFrameInit)dlsym(mLibHandle, "mpp_frame_init");
533d0407baSopenharmony_ci    pMppApi->HdiMppFrameDeinit = (hdiMppFrameDeinit)dlsym(mLibHandle, "mpp_frame_deinit");
543d0407baSopenharmony_ci    pMppApi->HdiMppFrameGetNext = (hdiMppFrameGetNext)dlsym(mLibHandle, "mpp_frame_get_next");
553d0407baSopenharmony_ci    pMppApi->HdiMppFrameGetInfoChange = (hdiMppFrameGetInfoChange)dlsym(mLibHandle, "mpp_frame_get_info_change");
563d0407baSopenharmony_ci    pMppApi->HdiMppFrameGetWidth = (hdiMppFrameGetWidth)dlsym(mLibHandle, "mpp_frame_get_width");
573d0407baSopenharmony_ci    pMppApi->HdiMppFrameGetHeight = (hdiMppFrameGetHeight)dlsym(mLibHandle, "mpp_frame_get_height");
583d0407baSopenharmony_ci    pMppApi->HdiMppFrameGetHorStride = (hdiMppFrameGetHorStride)dlsym(mLibHandle, "mpp_frame_get_hor_stride");
593d0407baSopenharmony_ci    pMppApi->HdiMppFrameGetVerStride = (hdiMppFrameGetVerStride)dlsym(mLibHandle, "mpp_frame_get_ver_stride");
603d0407baSopenharmony_ci    pMppApi->HdiMppFrameGetBufferSize = (hdiMppFrameGetBufferSize)dlsym(mLibHandle, "mpp_frame_get_buf_size");
613d0407baSopenharmony_ci    pMppApi->HdiMppFrameGetFormat = (hdiMppFrameGetFormat)dlsym(mLibHandle, "mpp_frame_get_fmt");
623d0407baSopenharmony_ci    pMppApi->HdiMppFrameGetErrinfo = (hdiMppFrameGetErrinfo)dlsym(mLibHandle, "mpp_frame_get_errinfo");
633d0407baSopenharmony_ci    pMppApi->HdiMppFrameGetDiscard = (hdiMppFrameGetDiscard)dlsym(mLibHandle, "mpp_frame_get_discard");
643d0407baSopenharmony_ci    pMppApi->HdiMppFrameGetBuffer = (hdiMppFrameGetBuffer)dlsym(mLibHandle, "mpp_frame_get_buffer");
653d0407baSopenharmony_ci    pMppApi->HdiMppFrameSetBuffer = (hdiMppFrameSetBuffer)dlsym(mLibHandle, "mpp_frame_set_buffer");
663d0407baSopenharmony_ci    pMppApi->HdiMppFrameGetEos = (hdiMppFrameGetEos)dlsym(mLibHandle, "mpp_frame_get_eos");
673d0407baSopenharmony_ci    pMppApi->HdiMppFrameSetEos = (hdiMppFrameSetEos)dlsym(mLibHandle, "mpp_frame_set_eos");
683d0407baSopenharmony_ci    pMppApi->HdiMppFrameSetFormat = (hdiMppFrameSetFormat)dlsym(mLibHandle, "mpp_frame_set_fmt");
693d0407baSopenharmony_ci    pMppApi->HdiMppFrameSetWidth = (hdiMppFrameSetWidth)dlsym(mLibHandle, "mpp_frame_set_width");
703d0407baSopenharmony_ci    pMppApi->HdiMppFrameSetHeight = (hdiMppFrameSetHeight)dlsym(mLibHandle, "mpp_frame_set_height");
713d0407baSopenharmony_ci    pMppApi->HdiMppFrameSetHorStride = (hdiMppFrameSetHorStride)dlsym(mLibHandle, "mpp_frame_set_hor_stride");
723d0407baSopenharmony_ci    pMppApi->HdiMppFrameSetVerStride = (hdiMppFrameSetVerStride)dlsym(mLibHandle, "mpp_frame_set_ver_stride");
733d0407baSopenharmony_ci    pMppApi->HdiMppFrameGetMeta = (hdiMppFrameGetMeta)dlsym(mLibHandle, "mpp_frame_get_meta");
743d0407baSopenharmony_ci    return pMppApi;
753d0407baSopenharmony_ci}
763d0407baSopenharmony_ci
773d0407baSopenharmony_ciRKMppApi *GetConfigApi(RKMppApi *pMppApi)
783d0407baSopenharmony_ci{
793d0407baSopenharmony_ci    pMppApi->HdiMppDecCfgInit = (hdiMppDecCfgInit)dlsym(mLibHandle, "mpp_dec_cfg_init");
803d0407baSopenharmony_ci    pMppApi->HdiMppDecCfgDeinit = (hdiMppDecCfgDeinit)dlsym(mLibHandle, "mpp_dec_cfg_deinit");
813d0407baSopenharmony_ci    pMppApi->HdiMppDecCfgSetU32 = (hdiMppDecCfgSetU32)dlsym(mLibHandle, "mpp_dec_cfg_set_u32");
823d0407baSopenharmony_ci
833d0407baSopenharmony_ci    pMppApi->HdiMppEncCfgInit = (hdiMppEncCfgInit)dlsym(mLibHandle, "mpp_enc_cfg_init");
843d0407baSopenharmony_ci    pMppApi->HdiMppEncCfgDeinit = (hdiMppEncCfgDeinit)dlsym(mLibHandle, "mpp_enc_cfg_deinit");
853d0407baSopenharmony_ci    pMppApi->HdiMppEncCfgSetS32 = (hdiMppEncCfgSetS32)dlsym(mLibHandle, "mpp_enc_cfg_set_s32");
863d0407baSopenharmony_ci    pMppApi->HdiMppEncCfgSetU32 = (hdiMppEncCfgSetU32)dlsym(mLibHandle, "mpp_enc_cfg_set_u32");
873d0407baSopenharmony_ci    pMppApi->HdiMppEncRefCfgInit = (hdiMppEncRefCfgInit)dlsym(mLibHandle, "mpp_enc_ref_cfg_init");
883d0407baSopenharmony_ci    pMppApi->HdiMppEncRefCfgDeinit = (hdiMppEncRefCfgDeinit)dlsym(mLibHandle, "mpp_enc_ref_cfg_deinit");
893d0407baSopenharmony_ci    pMppApi->HdiMppEncGenRefCfg = (hdiMppEncGenRefCfg)dlsym(mLibHandle, "mpi_enc_gen_ref_cfg");
903d0407baSopenharmony_ci    pMppApi->HdiMppEncGenSmartGopRefCfg =
913d0407baSopenharmony_ci        (hdiMppEncGenSmartGopRefCfg)dlsym(mLibHandle, "mpi_enc_gen_smart_gop_ref_cfg");
923d0407baSopenharmony_ci    return pMppApi;
933d0407baSopenharmony_ci}
943d0407baSopenharmony_ci
953d0407baSopenharmony_ciRKMppApi *GetBufferGroupApi(RKMppApi *pMppApi)
963d0407baSopenharmony_ci{
973d0407baSopenharmony_ci    pMppApi->HdiMppBufferGroupGet = (hdiMppBufferGroupGet)dlsym(mLibHandle, "mpp_buffer_group_get");
983d0407baSopenharmony_ci    pMppApi->HdiMppBufferGroupPut = (hdiMppBufferGroupPut)dlsym(mLibHandle, "mpp_buffer_group_put");
993d0407baSopenharmony_ci    pMppApi->HdiMppBufferGroupClear = (hdiMppBufferGroupClear)dlsym(mLibHandle, "mpp_buffer_group_clear");
1003d0407baSopenharmony_ci    pMppApi->HdiMppBufferGroupLimitConfig =
1013d0407baSopenharmony_ci        (hdiMppBufferGroupLimitConfig)dlsym(mLibHandle, "mpp_buffer_group_limit_config");
1023d0407baSopenharmony_ci    pMppApi->HdiMppBufferGetFdWithCaller =
1033d0407baSopenharmony_ci        (hdiMppBufferGetFdWithCaller)dlsym(mLibHandle, "mpp_buffer_get_fd_with_caller");
1043d0407baSopenharmony_ci    pMppApi->HdiMppBufferGetWithTag = (hdiMppBufferGetWithTag)dlsym(mLibHandle, "mpp_buffer_get_with_tag");
1053d0407baSopenharmony_ci    pMppApi->HdiMppBufferImportWithTag = (hdiMppBufferImportWithTag)dlsym(mLibHandle, "mpp_buffer_import_with_tag");
1063d0407baSopenharmony_ci    pMppApi->HdiMppBufferWriteWithCaller =
1073d0407baSopenharmony_ci        (hdiMppBufferWriteWithCaller)dlsym(mLibHandle, "mpp_buffer_write_with_caller");
1083d0407baSopenharmony_ci    pMppApi->HdiMppBufferGetPtrWithCaller =
1093d0407baSopenharmony_ci        (hdiMppBufferGetPtrWithCaller)dlsym(mLibHandle, "mpp_buffer_get_ptr_with_caller");
1103d0407baSopenharmony_ci    pMppApi->HdiMppBufferGetSizeWithCaller =
1113d0407baSopenharmony_ci        (hdiMppBufferGetSizeWithCaller)dlsym(mLibHandle, "mpp_buffer_get_size_with_caller");
1123d0407baSopenharmony_ci    pMppApi->HdiMppBufferGroupUsage = (hdiMppBufferGroupUsage)dlsym(mLibHandle, "mpp_buffer_group_usage");
1133d0407baSopenharmony_ci    pMppApi->HdiMppBufferPutWithCaller = (hdiMppBufferPutWithCaller)dlsym(mLibHandle, "mpp_buffer_put_with_caller");
1143d0407baSopenharmony_ci    return pMppApi;
1153d0407baSopenharmony_ci}
1163d0407baSopenharmony_ci
1173d0407baSopenharmony_ciint32_t GetMppApi(RKMppApi **mppApi)
1183d0407baSopenharmony_ci{
1193d0407baSopenharmony_ci    *mppApi = (RKMppApi *)malloc(sizeof(RKMppApi));
1203d0407baSopenharmony_ci    if (*mppApi == NULL) {
1213d0407baSopenharmony_ci        HDF_LOGE("%{public}s: malloc failed!", __func__);
1223d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
1233d0407baSopenharmony_ci    }
1243d0407baSopenharmony_ci
1253d0407baSopenharmony_ci    RKMppApi *pMppApi = *mppApi;
1263d0407baSopenharmony_ci    memset_s(pMppApi, sizeof(RKMppApi), 0, sizeof(RKMppApi));
1273d0407baSopenharmony_ci
1283d0407baSopenharmony_ci    mLibHandle = dlopen(mLibName, RTLD_NOW);
1293d0407baSopenharmony_ci    if (mLibHandle == NULL) {
1303d0407baSopenharmony_ci        HDF_LOGE("%{public}s: lib %{public}s dlopen failed, error code[%{public}s]", __func__, mLibName, dlerror());
1313d0407baSopenharmony_ci        free(*mppApi);
1323d0407baSopenharmony_ci        *mppApi = NULL;
1333d0407baSopenharmony_ci        return HDF_FAILURE;
1343d0407baSopenharmony_ci    }
1353d0407baSopenharmony_ci
1363d0407baSopenharmony_ci    pMppApi->HdiMppCreate = (hdiMppCreate)dlsym(mLibHandle, "mpp_create");
1373d0407baSopenharmony_ci    pMppApi->HdiMppInit = (hdiMppInit)dlsym(mLibHandle, "mpp_init");
1383d0407baSopenharmony_ci    pMppApi->HdiMppStart = (hdiMppStart)dlsym(mLibHandle, "mpp_start");
1393d0407baSopenharmony_ci    pMppApi->HdiMppStop = (hdiMppStop)dlsym(mLibHandle, "mpp_stop");
1403d0407baSopenharmony_ci    pMppApi->HdiMppDestroy = (hdiMppDestroy)dlsym(mLibHandle, "mpp_destroy");
1413d0407baSopenharmony_ci    pMppApi->HdiMppCheckSupportFormat = (hdiMppCheckSupportFormat)dlsym(mLibHandle, "mpp_check_support_format");
1423d0407baSopenharmony_ci    pMppApi->HdiMppShowSupportFormat = (hdiMppShowSupportFormat)dlsym(mLibHandle, "mpp_show_support_format");
1433d0407baSopenharmony_ci    pMppApi->HdiMppShowColorFormat = (hdiMppShowColorFormat)dlsym(mLibHandle, "mpp_show_color_format");
1443d0407baSopenharmony_ci    GetPacketApi(pMppApi);
1453d0407baSopenharmony_ci    GetFrameApi(pMppApi);
1463d0407baSopenharmony_ci    GetConfigApi(pMppApi);
1473d0407baSopenharmony_ci    GetBufferGroupApi(pMppApi);
1483d0407baSopenharmony_ci    pMppApi->HdiMppTaskMetaGetPacket = (hdiMppTaskMetaGetPacket)dlsym(mLibHandle, "mpp_task_meta_get_packet");
1493d0407baSopenharmony_ci    pMppApi->HdiMppTaskMetaSetPacket = (hdiMppTaskMetaSetPacket)dlsym(mLibHandle, "mpp_task_meta_set_packet");
1503d0407baSopenharmony_ci    pMppApi->HdiMppTaskMetaGetFrame = (hdiMppTaskMetaGetFrame)dlsym(mLibHandle, "mpp_task_meta_get_frame");
1513d0407baSopenharmony_ci    pMppApi->HdiMppTaskMetaSetFrame = (hdiMppTaskMetaSetFrame)dlsym(mLibHandle, "mpp_task_meta_set_frame");
1523d0407baSopenharmony_ci    pMppApi->HdiMppEnvGetU32 = (hdiMppEnvGetU32)dlsym(mLibHandle, "mpp_env_get_u32");
1533d0407baSopenharmony_ci    return HDF_SUCCESS;
1543d0407baSopenharmony_ci}
1553d0407baSopenharmony_ci
1563d0407baSopenharmony_civoid ReleaseMppApi(RKMppApi *mppApi)
1573d0407baSopenharmony_ci{
1583d0407baSopenharmony_ci    if (mppApi != NULL) {
1593d0407baSopenharmony_ci        memset_s(mppApi, sizeof(RKMppApi), 0, sizeof(RKMppApi));
1603d0407baSopenharmony_ci        free(mppApi);
1613d0407baSopenharmony_ci    }
1623d0407baSopenharmony_ci}
163