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 <hdf_base.h>
19 #include <hdf_log.h>
20 #include <securec.h>
21 
22 #define HDF_LOG_TAG codec_hdi_mpp_mpi
23 
24 void *mLibHandle = NULL;
25 
26 char *mLibName = "librockchip_mpp.z.so";
GetPacketApi(RKMppApi *pMppApi)27 RKMppApi *GetPacketApi(RKMppApi *pMppApi)
28 {
29     pMppApi->HdiMppPacketNew = (hdiMppPacketNew)dlsym(mLibHandle, "mpp_packet_new");
30     pMppApi->HdiMppPacketInit = (hdiMppPacketInit)dlsym(mLibHandle, "mpp_packet_init");
31     pMppApi->HdiMppPacketInitWithBuffer = (hdiMppPacketInitWithBuffer)dlsym(mLibHandle, "mpp_packet_init_with_buffer");
32     pMppApi->HdiMppPacketCopyInit = (hdiMppPacketCopyInit)dlsym(mLibHandle, "mpp_packet_copy_init");
33     pMppApi->HdiMppPacketDeinit = (hdiMppPacketDeinit)dlsym(mLibHandle, "mpp_packet_deinit");
34     pMppApi->HdiMppPacketGetEos = (hdiMppPacketGetEos)dlsym(mLibHandle, "mpp_packet_get_eos");
35     pMppApi->HdiMppPacketSetEos = (hdiMppPacketSetEos)dlsym(mLibHandle, "mpp_packet_set_eos");
36     pMppApi->HdiMppPacketGetPts = (hdiMppPacketGetPts)dlsym(mLibHandle, "mpp_packet_get_pts");
37     pMppApi->HdiMppPacketSetPts = (hdiMppPacketSetPts)dlsym(mLibHandle, "mpp_packet_set_pts");
38     pMppApi->HdiMppPacketSetData = (hdiMppPacketSetData)dlsym(mLibHandle, "mpp_packet_set_data");
39     pMppApi->HdiMppPacketSetSize = (hdiMppPacketSetSize)dlsym(mLibHandle, "mpp_packet_set_size");
40     pMppApi->HdiMppPacketGetPos = (hdiMppPacketGetPos)dlsym(mLibHandle, "mpp_packet_get_pos");
41     pMppApi->HdiMppPacketSetPos = (hdiMppPacketSetPos)dlsym(mLibHandle, "mpp_packet_set_pos");
42     pMppApi->HdiMppPacketSetLength = (hdiMppPacketSetLength)dlsym(mLibHandle, "mpp_packet_set_length");
43     pMppApi->HdiMppPacketGetLength = (hdiMppPacketGetLength)dlsym(mLibHandle, "mpp_packet_get_length");
44     pMppApi->HdiMppPacketIsPartition = (hdiMppPacketIsPartition)dlsym(mLibHandle, "mpp_packet_is_partition");
45     pMppApi->HdiMppPacketIsEoi = (hdiMppPacketIsEoi)dlsym(mLibHandle, "mpp_packet_is_eoi");
46     pMppApi->HdiMppMetaSetPacket = (hdiMppMetaSetPacket)dlsym(mLibHandle, "mpp_meta_set_packet");
47     return pMppApi;
48 }
49 
GetFrameApi(RKMppApi *pMppApi)50 RKMppApi *GetFrameApi(RKMppApi *pMppApi)
51 {
52     pMppApi->HdiMppFrameInit = (hdiMppFrameInit)dlsym(mLibHandle, "mpp_frame_init");
53     pMppApi->HdiMppFrameDeinit = (hdiMppFrameDeinit)dlsym(mLibHandle, "mpp_frame_deinit");
54     pMppApi->HdiMppFrameGetNext = (hdiMppFrameGetNext)dlsym(mLibHandle, "mpp_frame_get_next");
55     pMppApi->HdiMppFrameGetInfoChange = (hdiMppFrameGetInfoChange)dlsym(mLibHandle, "mpp_frame_get_info_change");
56     pMppApi->HdiMppFrameGetWidth = (hdiMppFrameGetWidth)dlsym(mLibHandle, "mpp_frame_get_width");
57     pMppApi->HdiMppFrameGetHeight = (hdiMppFrameGetHeight)dlsym(mLibHandle, "mpp_frame_get_height");
58     pMppApi->HdiMppFrameGetHorStride = (hdiMppFrameGetHorStride)dlsym(mLibHandle, "mpp_frame_get_hor_stride");
59     pMppApi->HdiMppFrameGetVerStride = (hdiMppFrameGetVerStride)dlsym(mLibHandle, "mpp_frame_get_ver_stride");
60     pMppApi->HdiMppFrameGetBufferSize = (hdiMppFrameGetBufferSize)dlsym(mLibHandle, "mpp_frame_get_buf_size");
61     pMppApi->HdiMppFrameGetFormat = (hdiMppFrameGetFormat)dlsym(mLibHandle, "mpp_frame_get_fmt");
62     pMppApi->HdiMppFrameGetErrinfo = (hdiMppFrameGetErrinfo)dlsym(mLibHandle, "mpp_frame_get_errinfo");
63     pMppApi->HdiMppFrameGetDiscard = (hdiMppFrameGetDiscard)dlsym(mLibHandle, "mpp_frame_get_discard");
64     pMppApi->HdiMppFrameGetBuffer = (hdiMppFrameGetBuffer)dlsym(mLibHandle, "mpp_frame_get_buffer");
65     pMppApi->HdiMppFrameSetBuffer = (hdiMppFrameSetBuffer)dlsym(mLibHandle, "mpp_frame_set_buffer");
66     pMppApi->HdiMppFrameGetEos = (hdiMppFrameGetEos)dlsym(mLibHandle, "mpp_frame_get_eos");
67     pMppApi->HdiMppFrameSetEos = (hdiMppFrameSetEos)dlsym(mLibHandle, "mpp_frame_set_eos");
68     pMppApi->HdiMppFrameSetFormat = (hdiMppFrameSetFormat)dlsym(mLibHandle, "mpp_frame_set_fmt");
69     pMppApi->HdiMppFrameSetWidth = (hdiMppFrameSetWidth)dlsym(mLibHandle, "mpp_frame_set_width");
70     pMppApi->HdiMppFrameSetHeight = (hdiMppFrameSetHeight)dlsym(mLibHandle, "mpp_frame_set_height");
71     pMppApi->HdiMppFrameSetHorStride = (hdiMppFrameSetHorStride)dlsym(mLibHandle, "mpp_frame_set_hor_stride");
72     pMppApi->HdiMppFrameSetVerStride = (hdiMppFrameSetVerStride)dlsym(mLibHandle, "mpp_frame_set_ver_stride");
73     pMppApi->HdiMppFrameGetMeta = (hdiMppFrameGetMeta)dlsym(mLibHandle, "mpp_frame_get_meta");
74     return pMppApi;
75 }
76 
GetConfigApi(RKMppApi *pMppApi)77 RKMppApi *GetConfigApi(RKMppApi *pMppApi)
78 {
79     pMppApi->HdiMppDecCfgInit = (hdiMppDecCfgInit)dlsym(mLibHandle, "mpp_dec_cfg_init");
80     pMppApi->HdiMppDecCfgDeinit = (hdiMppDecCfgDeinit)dlsym(mLibHandle, "mpp_dec_cfg_deinit");
81     pMppApi->HdiMppDecCfgSetU32 = (hdiMppDecCfgSetU32)dlsym(mLibHandle, "mpp_dec_cfg_set_u32");
82 
83     pMppApi->HdiMppEncCfgInit = (hdiMppEncCfgInit)dlsym(mLibHandle, "mpp_enc_cfg_init");
84     pMppApi->HdiMppEncCfgDeinit = (hdiMppEncCfgDeinit)dlsym(mLibHandle, "mpp_enc_cfg_deinit");
85     pMppApi->HdiMppEncCfgSetS32 = (hdiMppEncCfgSetS32)dlsym(mLibHandle, "mpp_enc_cfg_set_s32");
86     pMppApi->HdiMppEncCfgSetU32 = (hdiMppEncCfgSetU32)dlsym(mLibHandle, "mpp_enc_cfg_set_u32");
87     pMppApi->HdiMppEncRefCfgInit = (hdiMppEncRefCfgInit)dlsym(mLibHandle, "mpp_enc_ref_cfg_init");
88     pMppApi->HdiMppEncRefCfgDeinit = (hdiMppEncRefCfgDeinit)dlsym(mLibHandle, "mpp_enc_ref_cfg_deinit");
89     pMppApi->HdiMppEncGenRefCfg = (hdiMppEncGenRefCfg)dlsym(mLibHandle, "mpi_enc_gen_ref_cfg");
90     pMppApi->HdiMppEncGenSmartGopRefCfg =
91         (hdiMppEncGenSmartGopRefCfg)dlsym(mLibHandle, "mpi_enc_gen_smart_gop_ref_cfg");
92     return pMppApi;
93 }
94 
GetBufferGroupApi(RKMppApi *pMppApi)95 RKMppApi *GetBufferGroupApi(RKMppApi *pMppApi)
96 {
97     pMppApi->HdiMppBufferGroupGet = (hdiMppBufferGroupGet)dlsym(mLibHandle, "mpp_buffer_group_get");
98     pMppApi->HdiMppBufferGroupPut = (hdiMppBufferGroupPut)dlsym(mLibHandle, "mpp_buffer_group_put");
99     pMppApi->HdiMppBufferGroupClear = (hdiMppBufferGroupClear)dlsym(mLibHandle, "mpp_buffer_group_clear");
100     pMppApi->HdiMppBufferGroupLimitConfig =
101         (hdiMppBufferGroupLimitConfig)dlsym(mLibHandle, "mpp_buffer_group_limit_config");
102     pMppApi->HdiMppBufferGetFdWithCaller =
103         (hdiMppBufferGetFdWithCaller)dlsym(mLibHandle, "mpp_buffer_get_fd_with_caller");
104     pMppApi->HdiMppBufferGetWithTag = (hdiMppBufferGetWithTag)dlsym(mLibHandle, "mpp_buffer_get_with_tag");
105     pMppApi->HdiMppBufferImportWithTag = (hdiMppBufferImportWithTag)dlsym(mLibHandle, "mpp_buffer_import_with_tag");
106     pMppApi->HdiMppBufferWriteWithCaller =
107         (hdiMppBufferWriteWithCaller)dlsym(mLibHandle, "mpp_buffer_write_with_caller");
108     pMppApi->HdiMppBufferGetPtrWithCaller =
109         (hdiMppBufferGetPtrWithCaller)dlsym(mLibHandle, "mpp_buffer_get_ptr_with_caller");
110     pMppApi->HdiMppBufferGetSizeWithCaller =
111         (hdiMppBufferGetSizeWithCaller)dlsym(mLibHandle, "mpp_buffer_get_size_with_caller");
112     pMppApi->HdiMppBufferGroupUsage = (hdiMppBufferGroupUsage)dlsym(mLibHandle, "mpp_buffer_group_usage");
113     pMppApi->HdiMppBufferPutWithCaller = (hdiMppBufferPutWithCaller)dlsym(mLibHandle, "mpp_buffer_put_with_caller");
114     return pMppApi;
115 }
116 
GetMppApi(RKMppApi **mppApi)117 int32_t GetMppApi(RKMppApi **mppApi)
118 {
119     *mppApi = (RKMppApi *)malloc(sizeof(RKMppApi));
120     if (*mppApi == NULL) {
121         HDF_LOGE("%{public}s: malloc failed!", __func__);
122         return HDF_ERR_INVALID_PARAM;
123     }
124 
125     RKMppApi *pMppApi = *mppApi;
126     memset_s(pMppApi, sizeof(RKMppApi), 0, sizeof(RKMppApi));
127 
128     mLibHandle = dlopen(mLibName, RTLD_NOW);
129     if (mLibHandle == NULL) {
130         HDF_LOGE("%{public}s: lib %{public}s dlopen failed, error code[%{public}s]", __func__, mLibName, dlerror());
131         free(*mppApi);
132         *mppApi = NULL;
133         return HDF_FAILURE;
134     }
135 
136     pMppApi->HdiMppCreate = (hdiMppCreate)dlsym(mLibHandle, "mpp_create");
137     pMppApi->HdiMppInit = (hdiMppInit)dlsym(mLibHandle, "mpp_init");
138     pMppApi->HdiMppStart = (hdiMppStart)dlsym(mLibHandle, "mpp_start");
139     pMppApi->HdiMppStop = (hdiMppStop)dlsym(mLibHandle, "mpp_stop");
140     pMppApi->HdiMppDestroy = (hdiMppDestroy)dlsym(mLibHandle, "mpp_destroy");
141     pMppApi->HdiMppCheckSupportFormat = (hdiMppCheckSupportFormat)dlsym(mLibHandle, "mpp_check_support_format");
142     pMppApi->HdiMppShowSupportFormat = (hdiMppShowSupportFormat)dlsym(mLibHandle, "mpp_show_support_format");
143     pMppApi->HdiMppShowColorFormat = (hdiMppShowColorFormat)dlsym(mLibHandle, "mpp_show_color_format");
144     GetPacketApi(pMppApi);
145     GetFrameApi(pMppApi);
146     GetConfigApi(pMppApi);
147     GetBufferGroupApi(pMppApi);
148     pMppApi->HdiMppTaskMetaGetPacket = (hdiMppTaskMetaGetPacket)dlsym(mLibHandle, "mpp_task_meta_get_packet");
149     pMppApi->HdiMppTaskMetaSetPacket = (hdiMppTaskMetaSetPacket)dlsym(mLibHandle, "mpp_task_meta_set_packet");
150     pMppApi->HdiMppTaskMetaGetFrame = (hdiMppTaskMetaGetFrame)dlsym(mLibHandle, "mpp_task_meta_get_frame");
151     pMppApi->HdiMppTaskMetaSetFrame = (hdiMppTaskMetaSetFrame)dlsym(mLibHandle, "mpp_task_meta_set_frame");
152     pMppApi->HdiMppEnvGetU32 = (hdiMppEnvGetU32)dlsym(mLibHandle, "mpp_env_get_u32");
153     return HDF_SUCCESS;
154 }
155 
ReleaseMppApi(RKMppApi *mppApi)156 void ReleaseMppApi(RKMppApi *mppApi)
157 {
158     if (mppApi != NULL) {
159         memset_s(mppApi, sizeof(RKMppApi), 0, sizeof(RKMppApi));
160         free(mppApi);
161     }
162 }
163