• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }