1 /*
2 * Copyright (c) 2022 HiHope Open Source Organization .
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "hdi_mpp_mpi.h"
17 #include <dlfcn.h>
18 #include <securec.h>
19 #include <hdf_base.h>
20 #include <hdf_log.h>
21
22 #define HDF_LOG_TAG codec_hdi_mpp_mpi
23
24 void *mLibHandle = NULL;
25
26 #if defined(__arm64__) || defined(__aarch64__)
27 char *mLibName = "/vendor/lib64/librockchip_mpp.z.so";
28 #else
29 char *mLibName = "/vendor/lib/librockchip_mpp.z.so";
30 #endif
31
GetPacketApi(RKMppApi * pMppApi)32 RKMppApi *GetPacketApi(RKMppApi *pMppApi)
33 {
34 pMppApi->HdiMppPacketNew = (hdiMppPacketNew)dlsym(mLibHandle, "mpp_packet_new");
35 pMppApi->HdiMppPacketInit = (hdiMppPacketInit)dlsym(mLibHandle, "mpp_packet_init");
36 pMppApi->HdiMppPacketInitWithBuffer =
37 (hdiMppPacketInitWithBuffer)dlsym(mLibHandle, "mpp_packet_init_with_buffer");
38 pMppApi->HdiMppPacketCopyInit = (hdiMppPacketCopyInit)dlsym(mLibHandle, "mpp_packet_copy_init");
39 pMppApi->HdiMppPacketDeinit = (hdiMppPacketDeinit)dlsym(mLibHandle, "mpp_packet_deinit");
40 pMppApi->HdiMppPacketGetEos = (hdiMppPacketGetEos)dlsym(mLibHandle, "mpp_packet_get_eos");
41 pMppApi->HdiMppPacketSetEos = (hdiMppPacketSetEos)dlsym(mLibHandle, "mpp_packet_set_eos");
42 pMppApi->HdiMppPacketGetPts = (hdiMppPacketGetPts)dlsym(mLibHandle, "mpp_packet_get_pts");
43 pMppApi->HdiMppPacketSetPts = (hdiMppPacketSetPts)dlsym(mLibHandle, "mpp_packet_set_pts");
44 pMppApi->HdiMppPacketSetData = (hdiMppPacketSetData)dlsym(mLibHandle, "mpp_packet_set_data");
45 pMppApi->HdiMppPacketSetSize = (hdiMppPacketSetSize)dlsym(mLibHandle, "mpp_packet_set_size");
46 pMppApi->HdiMppPacketGetPos = (hdiMppPacketGetPos)dlsym(mLibHandle, "mpp_packet_get_pos");
47 pMppApi->HdiMppPacketSetPos = (hdiMppPacketSetPos)dlsym(mLibHandle, "mpp_packet_set_pos");
48 pMppApi->HdiMppPacketSetLength = (hdiMppPacketSetLength)dlsym(mLibHandle, "mpp_packet_set_length");
49 pMppApi->HdiMppPacketGetLength = (hdiMppPacketGetLength)dlsym(mLibHandle, "mpp_packet_get_length");
50 pMppApi->HdiMppPacketIsPartition = (hdiMppPacketIsPartition)dlsym(mLibHandle, "mpp_packet_is_partition");
51 pMppApi->HdiMppPacketIsEoi = (hdiMppPacketIsEoi)dlsym(mLibHandle, "mpp_packet_is_eoi");
52 pMppApi->HdiMppMetaSetPacket = (hdiMppMetaSetPacket)dlsym(mLibHandle, "mpp_meta_set_packet");
53 return pMppApi;
54 }
55
GetFrameApi(RKMppApi * pMppApi)56 RKMppApi *GetFrameApi(RKMppApi *pMppApi)
57 {
58 pMppApi->HdiMppFrameInit = (hdiMppFrameInit)dlsym(mLibHandle, "mpp_frame_init");
59 pMppApi->HdiMppFrameDeinit = (hdiMppFrameDeinit)dlsym(mLibHandle, "mpp_frame_deinit");
60 pMppApi->HdiMppFrameGetNext = (hdiMppFrameGetNext)dlsym(mLibHandle, "mpp_frame_get_next");
61 pMppApi->HdiMppFrameGetInfoChange = (hdiMppFrameGetInfoChange)dlsym(mLibHandle, "mpp_frame_get_info_change");
62 pMppApi->HdiMppFrameGetWidth = (hdiMppFrameGetWidth)dlsym(mLibHandle, "mpp_frame_get_width");
63 pMppApi->HdiMppFrameGetHeight = (hdiMppFrameGetHeight)dlsym(mLibHandle, "mpp_frame_get_height");
64 pMppApi->HdiMppFrameGetHorStride = (hdiMppFrameGetHorStride)dlsym(mLibHandle, "mpp_frame_get_hor_stride");
65 pMppApi->HdiMppFrameGetVerStride = (hdiMppFrameGetVerStride)dlsym(mLibHandle, "mpp_frame_get_ver_stride");
66 pMppApi->HdiMppFrameGetBufferSize = (hdiMppFrameGetBufferSize)dlsym(mLibHandle, "mpp_frame_get_buf_size");
67 pMppApi->HdiMppFrameGetFormat = (hdiMppFrameGetFormat)dlsym(mLibHandle, "mpp_frame_get_fmt");
68 pMppApi->HdiMppFrameGetErrinfo = (hdiMppFrameGetErrinfo)dlsym(mLibHandle, "mpp_frame_get_errinfo");
69 pMppApi->HdiMppFrameGetDiscard = (hdiMppFrameGetDiscard)dlsym(mLibHandle, "mpp_frame_get_discard");
70 pMppApi->HdiMppFrameGetBuffer = (hdiMppFrameGetBuffer)dlsym(mLibHandle, "mpp_frame_get_buffer");
71 pMppApi->HdiMppFrameSetBuffer = (hdiMppFrameSetBuffer)dlsym(mLibHandle, "mpp_frame_set_buffer");
72 pMppApi->HdiMppFrameGetEos = (hdiMppFrameGetEos)dlsym(mLibHandle, "mpp_frame_get_eos");
73 pMppApi->HdiMppFrameSetEos = (hdiMppFrameSetEos)dlsym(mLibHandle, "mpp_frame_set_eos");
74 pMppApi->HdiMppFrameSetFormat = (hdiMppFrameSetFormat)dlsym(mLibHandle, "mpp_frame_set_fmt");
75 pMppApi->HdiMppFrameSetWidth = (hdiMppFrameSetWidth)dlsym(mLibHandle, "mpp_frame_set_width");
76 pMppApi->HdiMppFrameSetHeight = (hdiMppFrameSetHeight)dlsym(mLibHandle, "mpp_frame_set_height");
77 pMppApi->HdiMppFrameSetHorStride = (hdiMppFrameSetHorStride)dlsym(mLibHandle, "mpp_frame_set_hor_stride");
78 pMppApi->HdiMppFrameSetVerStride = (hdiMppFrameSetVerStride)dlsym(mLibHandle, "mpp_frame_set_ver_stride");
79 pMppApi->HdiMppFrameGetMeta = (hdiMppFrameGetMeta)dlsym(mLibHandle, "mpp_frame_get_meta");
80 return pMppApi;
81 }
82
GetConfigApi(RKMppApi * pMppApi)83 RKMppApi *GetConfigApi(RKMppApi *pMppApi)
84 {
85 pMppApi->HdiMppDecCfgInit = (hdiMppDecCfgInit)dlsym(mLibHandle, "mpp_dec_cfg_init");
86 pMppApi->HdiMppDecCfgDeinit = (hdiMppDecCfgDeinit)dlsym(mLibHandle, "mpp_dec_cfg_deinit");
87 pMppApi->HdiMppDecCfgSetU32 = (hdiMppDecCfgSetU32)dlsym(mLibHandle, "mpp_dec_cfg_set_u32");
88
89 pMppApi->HdiMppEncCfgInit = (hdiMppEncCfgInit)dlsym(mLibHandle, "mpp_enc_cfg_init");
90 pMppApi->HdiMppEncCfgDeinit = (hdiMppEncCfgDeinit)dlsym(mLibHandle, "mpp_enc_cfg_deinit");
91 pMppApi->HdiMppEncCfgSetS32 = (hdiMppEncCfgSetS32)dlsym(mLibHandle, "mpp_enc_cfg_set_s32");
92 pMppApi->HdiMppEncCfgSetU32 = (hdiMppEncCfgSetS32)dlsym(mLibHandle, "mpp_enc_cfg_set_u32");
93 pMppApi->HdiMppEncRefCfgInit = (hdiMppEncRefCfgInit)dlsym(mLibHandle, "mpp_enc_ref_cfg_init");
94 pMppApi->HdiMppEncRefCfgDeinit = (hdiMppEncRefCfgDeinit)dlsym(mLibHandle, "mpp_enc_ref_cfg_deinit");
95 pMppApi->HdiMppEncGenRefCfg = (hdiMppEncGenRefCfg)dlsym(mLibHandle, "mpi_enc_gen_ref_cfg");
96 pMppApi->HdiMppEncGenSmartGopRefCfg =
97 (hdiMppEncGenSmartGopRefCfg)dlsym(mLibHandle, "mpi_enc_gen_smart_gop_ref_cfg");
98 return pMppApi;
99 }
100
GetBufferGroupApi(RKMppApi * pMppApi)101 RKMppApi *GetBufferGroupApi(RKMppApi *pMppApi)
102 {
103 pMppApi->HdiMppBufferGroupGet = (hdiMppBufferGroupGet)dlsym(mLibHandle, "mpp_buffer_group_get");
104 pMppApi->HdiMppBufferGroupPut = (hdiMppBufferGroupPut)dlsym(mLibHandle, "mpp_buffer_group_put");
105 pMppApi->HdiMppBufferGroupClear = (hdiMppBufferGroupClear)dlsym(mLibHandle, "mpp_buffer_group_clear");
106 pMppApi->HdiMppBufferGroupLimitConfig =
107 (hdiMppBufferGroupLimitConfig)dlsym(mLibHandle, "mpp_buffer_group_limit_config");
108 pMppApi->HdiMppBufferGetFdWithCaller =
109 (hdiMppBufferGetFdWithCaller)dlsym(mLibHandle, "mpp_buffer_get_fd_with_caller");
110 pMppApi->HdiMppBufferGetWithTag = (hdiMppBufferGetWithTag)dlsym(mLibHandle, "mpp_buffer_get_with_tag");
111 pMppApi->HdiMppBufferGetPtrWithCaller =
112 (hdiMppBufferGetPtrWithCaller)dlsym(mLibHandle, "mpp_buffer_get_ptr_with_caller");
113 pMppApi->HdiMppBufferGroupUsage = (hdiMppBufferGroupUsage)dlsym(mLibHandle, "mpp_buffer_group_usage");
114 pMppApi->HdiMppBufferPutWithCaller =
115 (hdiMppBufferPutWithCaller)dlsym(mLibHandle, "mpp_buffer_put_with_caller");
116 return pMppApi;
117 }
118
GetMppApi(RKMppApi ** mppApi)119 int32_t GetMppApi(RKMppApi **mppApi)
120 {
121 *mppApi = (RKMppApi *)malloc(sizeof(RKMppApi));
122 if (*mppApi == NULL) {
123 HDF_LOGE("%{public}s: malloc failed!", __func__);
124 return HDF_ERR_INVALID_PARAM;
125 }
126
127 RKMppApi *pMppApi = *mppApi;
128 memset_s(pMppApi, sizeof(RKMppApi), 0, sizeof(RKMppApi));
129
130 mLibHandle = dlopen(mLibName, RTLD_NOW);
131 if (mLibHandle == NULL) {
132 HDF_LOGE("%{public}s: lib %{public}s dlopen failed, error code[%{public}s]", __func__, mLibName, dlerror());
133 free(*mppApi);
134 *mppApi = NULL;
135 return HDF_FAILURE;
136 }
137
138 pMppApi->HdiMppCreate = (hdiMppCreate)dlsym(mLibHandle, "mpp_create");
139 pMppApi->HdiMppInit = (hdiMppInit)dlsym(mLibHandle, "mpp_init");
140 pMppApi->HdiMppStart = (hdiMppStart)dlsym(mLibHandle, "mpp_start");
141 pMppApi->HdiMppStop = (hdiMppStop)dlsym(mLibHandle, "mpp_stop");
142 pMppApi->HdiMppDestroy = (hdiMppDestroy)dlsym(mLibHandle, "mpp_destroy");
143 pMppApi->HdiMppCheckSupportFormat = (hdiMppCheckSupportFormat)dlsym(mLibHandle, "mpp_check_support_format");
144 pMppApi->HdiMppShowSupportFormat = (hdiMppShowSupportFormat)dlsym(mLibHandle, "mpp_show_support_format");
145 pMppApi->HdiMppShowColorFormat = (hdiMppShowColorFormat)dlsym(mLibHandle, "mpp_show_color_format");
146 GetPacketApi(pMppApi);
147 GetFrameApi(pMppApi);
148 GetConfigApi(pMppApi);
149 GetBufferGroupApi(pMppApi);
150 pMppApi->HdiMppTaskMetaGetPacket = (hdiMppTaskMetaGetPacket)dlsym(mLibHandle, "mpp_task_meta_get_packet");
151 pMppApi->HdiMppEnvGetU32 = (hdiMppEnvGetU32)dlsym(mLibHandle, "mpp_env_get_u32");
152 return HDF_SUCCESS;
153 }
154
ReleaseMppApi(RKMppApi * mppApi)155 void ReleaseMppApi(RKMppApi *mppApi)
156 {
157 if (mppApi != NULL) {
158 memset_s(mppApi, sizeof(RKMppApi), 0, sizeof(RKMppApi));
159 free(mppApi);
160 }
161 }
162