1 /*
2 * Copyright (c) 2023-2025 Huawei Device Co., Ltd.
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 "histreamer_query_tool.h"
17
18 #include <dlfcn.h>
19 #include <malloc.h>
20
21 #include "distributed_hardware_log.h"
22
23 namespace OHOS {
24 namespace DistributedHardware {
25 IMPLEMENT_SINGLE_INSTANCE(HiStreamerQueryTool);
26 using QueryAudioEncoderFunc = int32_t (*)(char*);
27 using QueryAudioDecoderFunc = int32_t (*)(char*);
28 using QueryVideoEncoderFunc = int32_t (*)(char*);
29 using QueryVideoDecoderFunc = int32_t (*)(char*);
30
31 QueryAudioEncoderFunc queryAudioEncoderFunc = nullptr;
32 QueryAudioDecoderFunc queryAudioDecoderFunc = nullptr;
33 QueryVideoEncoderFunc queryVideoEncoderFunc = nullptr;
34 QueryVideoDecoderFunc queryVideoDecoderFunc = nullptr;
35
36 constexpr const char *QUERY_AUDIO_ENCODER_FUNC_NAME = "QueryAudioEncoderAbilityStr";
37 constexpr const char *QUERY_AUDIO_DECODER_FUNC_NAME = "QueryAudioDecoderAbilityStr";
38 constexpr const char *QUERY_VIDEO_ENCODER_FUNC_NAME = "QueryVideoEncoderAbilityStr";
39 constexpr const char *QUERY_VIDEO_DECODER_FUNC_NAME = "QueryVideoDecoderAbilityStr";
40 constexpr const char *LOAD_SO = "libhistreamer_ability_querier.z.so";
41
42 constexpr uint32_t MAX_MESSAGES_LEN = 1 * 1024 * 1024;
43
Init()44 void HiStreamerQueryTool::Init()
45 {
46 if (isInit) {
47 return;
48 }
49 DHLOGI("Start Init HiStreamer Query SO");
50 void *pHandler = dlopen(LOAD_SO, RTLD_LAZY | RTLD_NODELETE);
51 if (pHandler == nullptr) {
52 DHLOGE("libhistreamer_ability_querier.z.so handler load failed, failed reason : %{public}s", dlerror());
53 return;
54 }
55
56 queryAudioEncoderFunc = (QueryAudioEncoderFunc)dlsym(pHandler, QUERY_AUDIO_ENCODER_FUNC_NAME);
57 if (queryAudioEncoderFunc == nullptr) {
58 DHLOGE("get QueryAudioEncoderAbilityStr is nullptr, failed reason : %{public}s", dlerror());
59 dlclose(pHandler);
60 pHandler = nullptr;
61 return;
62 }
63
64 queryAudioDecoderFunc = (QueryAudioDecoderFunc)dlsym(pHandler, QUERY_AUDIO_DECODER_FUNC_NAME);
65 if (queryAudioDecoderFunc == nullptr) {
66 DHLOGE("get QueryAudioDecoderAbilityStr is null, failed reason : %{public}s", dlerror());
67 dlclose(pHandler);
68 pHandler = nullptr;
69 return;
70 }
71
72 queryVideoEncoderFunc = (QueryVideoEncoderFunc)dlsym(pHandler, QUERY_VIDEO_ENCODER_FUNC_NAME);
73 if (queryVideoEncoderFunc == nullptr) {
74 DHLOGE("get QueryVideoEncoderAbilityStr is null, failed reason : %{public}s", dlerror());
75 dlclose(pHandler);
76 pHandler = nullptr;
77 return;
78 }
79
80 queryVideoDecoderFunc = (QueryVideoDecoderFunc)dlsym(pHandler, QUERY_VIDEO_DECODER_FUNC_NAME);
81 if (queryVideoDecoderFunc == nullptr) {
82 DHLOGE("get QueryVideoDecoderAbilityStr is null, failed reason : %{public}s", dlerror());
83 dlclose(pHandler);
84 pHandler = nullptr;
85 return;
86 }
87
88 DHLOGI("Init Query HiStreamer Tool Success");
89 isInit = true;
90 }
91
QueryHiStreamerPluginInfo(HISTREAM_PLUGIN_TYPE type)92 std::string HiStreamerQueryTool::QueryHiStreamerPluginInfo(HISTREAM_PLUGIN_TYPE type)
93 {
94 Init();
95 if (!isInit || queryAudioEncoderFunc == nullptr || queryAudioDecoderFunc == nullptr ||
96 queryVideoEncoderFunc == nullptr || queryVideoDecoderFunc == nullptr) {
97 DHLOGE("Query HiStreamer Tool Init failed");
98 return "";
99 }
100
101 int32_t len = 0;
102 char* res = reinterpret_cast<char *>(malloc(MAX_MESSAGES_LEN));
103 if (res == nullptr) {
104 DHLOGE("Malloc memory failed");
105 return "";
106 }
107 switch (type) {
108 case HISTREAM_PLUGIN_TYPE::AUDIO_ENCODER: {
109 len = queryAudioEncoderFunc(res);
110 break;
111 }
112 case HISTREAM_PLUGIN_TYPE::AUDIO_DECODER: {
113 len = queryAudioDecoderFunc(res);
114 break;
115 }
116 case HISTREAM_PLUGIN_TYPE::VIDEO_ENCODER: {
117 len = queryVideoEncoderFunc(res);
118 break;
119 }
120 case HISTREAM_PLUGIN_TYPE::VIDEO_DECODER: {
121 len = queryVideoDecoderFunc(res);
122 break;
123 }
124 default:
125 break;
126 }
127
128 std::string result(res, len);
129 free(res);
130 res = nullptr;
131 return result;
132 }
133 }
134 }