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