1794c9f46Sopenharmony_ci/*
2794c9f46Sopenharmony_ci * Copyright (c) 2023-2024 Huawei Device Co., Ltd.
3794c9f46Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4794c9f46Sopenharmony_ci * you may not use this file except in compliance with the License.
5794c9f46Sopenharmony_ci * You may obtain a copy of the License at
6794c9f46Sopenharmony_ci *
7794c9f46Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8794c9f46Sopenharmony_ci *
9794c9f46Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10794c9f46Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11794c9f46Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12794c9f46Sopenharmony_ci * See the License for the specific language governing permissions and
13794c9f46Sopenharmony_ci * limitations under the License.
14794c9f46Sopenharmony_ci */
15794c9f46Sopenharmony_ci
16794c9f46Sopenharmony_ci#include "histreamer_query_tool.h"
17794c9f46Sopenharmony_ci
18794c9f46Sopenharmony_ci#include <dlfcn.h>
19794c9f46Sopenharmony_ci#include <malloc.h>
20794c9f46Sopenharmony_ci
21794c9f46Sopenharmony_ci#include "distributed_hardware_log.h"
22794c9f46Sopenharmony_ci
23794c9f46Sopenharmony_cinamespace OHOS {
24794c9f46Sopenharmony_cinamespace DistributedHardware {
25794c9f46Sopenharmony_ciIMPLEMENT_SINGLE_INSTANCE(HiStreamerQueryTool);
26794c9f46Sopenharmony_ciusing QueryAudioEncoderFunc = int32_t (*)(char*);
27794c9f46Sopenharmony_ciusing QueryAudioDecoderFunc = int32_t (*)(char*);
28794c9f46Sopenharmony_ciusing QueryVideoEncoderFunc = int32_t (*)(char*);
29794c9f46Sopenharmony_ciusing QueryVideoDecoderFunc = int32_t (*)(char*);
30794c9f46Sopenharmony_ci
31794c9f46Sopenharmony_ciQueryAudioEncoderFunc queryAudioEncoderFunc = nullptr;
32794c9f46Sopenharmony_ciQueryAudioDecoderFunc queryAudioDecoderFunc = nullptr;
33794c9f46Sopenharmony_ciQueryVideoEncoderFunc queryVideoEncoderFunc = nullptr;
34794c9f46Sopenharmony_ciQueryVideoDecoderFunc queryVideoDecoderFunc = nullptr;
35794c9f46Sopenharmony_ci
36794c9f46Sopenharmony_ciconst std::string QueryAudioEncoderFuncName = "QueryAudioEncoderAbilityStr";
37794c9f46Sopenharmony_ciconst std::string QueryAudioDecoderFuncName = "QueryAudioDecoderAbilityStr";
38794c9f46Sopenharmony_ciconst std::string QueryVideoEncoderFuncName = "QueryVideoEncoderAbilityStr";
39794c9f46Sopenharmony_ciconst std::string QueryVideoDecoderFuncName = "QueryVideoDecoderAbilityStr";
40794c9f46Sopenharmony_ci
41794c9f46Sopenharmony_ciconst uint32_t MAX_MESSAGES_LEN = 1 * 1024 * 1024;
42794c9f46Sopenharmony_ci
43794c9f46Sopenharmony_ciconst std::string LOAD_SO = "libhistreamer_ability_querier.z.so";
44794c9f46Sopenharmony_ci
45794c9f46Sopenharmony_civoid HiStreamerQueryTool::Init()
46794c9f46Sopenharmony_ci{
47794c9f46Sopenharmony_ci    if (isInit) {
48794c9f46Sopenharmony_ci        return;
49794c9f46Sopenharmony_ci    }
50794c9f46Sopenharmony_ci    DHLOGI("Start Init HiStreamer Query SO");
51794c9f46Sopenharmony_ci    void *pHandler = dlopen(LOAD_SO.c_str(), RTLD_LAZY | RTLD_NODELETE);
52794c9f46Sopenharmony_ci    if (pHandler == nullptr) {
53794c9f46Sopenharmony_ci        DHLOGE("libhistreamer_ability_querier.z.so handler load failed, failed reason : %{public}s", dlerror());
54794c9f46Sopenharmony_ci        return;
55794c9f46Sopenharmony_ci    }
56794c9f46Sopenharmony_ci
57794c9f46Sopenharmony_ci    queryAudioEncoderFunc = (QueryAudioEncoderFunc)dlsym(pHandler,
58794c9f46Sopenharmony_ci        QueryAudioEncoderFuncName.c_str());
59794c9f46Sopenharmony_ci    if (queryAudioEncoderFunc == nullptr) {
60794c9f46Sopenharmony_ci        DHLOGE("get QueryAudioEncoderAbilityStr is null, failed reason : %{public}s", dlerror());
61794c9f46Sopenharmony_ci        dlclose(pHandler);
62794c9f46Sopenharmony_ci        pHandler = nullptr;
63794c9f46Sopenharmony_ci        return;
64794c9f46Sopenharmony_ci    }
65794c9f46Sopenharmony_ci
66794c9f46Sopenharmony_ci    queryAudioDecoderFunc = (QueryAudioDecoderFunc)dlsym(pHandler,
67794c9f46Sopenharmony_ci        QueryAudioDecoderFuncName.c_str());
68794c9f46Sopenharmony_ci    if (queryAudioDecoderFunc == nullptr) {
69794c9f46Sopenharmony_ci        DHLOGE("get QueryAudioDecoderAbilityStr is null, failed reason : %{public}s", dlerror());
70794c9f46Sopenharmony_ci        dlclose(pHandler);
71794c9f46Sopenharmony_ci        pHandler = nullptr;
72794c9f46Sopenharmony_ci        return;
73794c9f46Sopenharmony_ci    }
74794c9f46Sopenharmony_ci
75794c9f46Sopenharmony_ci    queryVideoEncoderFunc = (QueryVideoEncoderFunc)dlsym(pHandler,
76794c9f46Sopenharmony_ci        QueryVideoEncoderFuncName.c_str());
77794c9f46Sopenharmony_ci    if (queryVideoEncoderFunc == nullptr) {
78794c9f46Sopenharmony_ci        DHLOGE("get QueryVideoEncoderAbilityStr is null, failed reason : %{public}s", dlerror());
79794c9f46Sopenharmony_ci        dlclose(pHandler);
80794c9f46Sopenharmony_ci        pHandler = nullptr;
81794c9f46Sopenharmony_ci        return;
82794c9f46Sopenharmony_ci    }
83794c9f46Sopenharmony_ci
84794c9f46Sopenharmony_ci    queryVideoDecoderFunc = (QueryVideoDecoderFunc)dlsym(pHandler,
85794c9f46Sopenharmony_ci        QueryVideoDecoderFuncName.c_str());
86794c9f46Sopenharmony_ci    if (queryVideoDecoderFunc == nullptr) {
87794c9f46Sopenharmony_ci        DHLOGE("get QueryVideoDecoderAbilityStr is null, failed reason : %{public}s", dlerror());
88794c9f46Sopenharmony_ci        dlclose(pHandler);
89794c9f46Sopenharmony_ci        pHandler = nullptr;
90794c9f46Sopenharmony_ci        return;
91794c9f46Sopenharmony_ci    }
92794c9f46Sopenharmony_ci
93794c9f46Sopenharmony_ci    DHLOGI("Init Query HiStreamer Tool Success");
94794c9f46Sopenharmony_ci    isInit = true;
95794c9f46Sopenharmony_ci}
96794c9f46Sopenharmony_ci
97794c9f46Sopenharmony_cistd::string HiStreamerQueryTool::QueryHiStreamerPluginInfo(HISTREAM_PLUGIN_TYPE type)
98794c9f46Sopenharmony_ci{
99794c9f46Sopenharmony_ci    Init();
100794c9f46Sopenharmony_ci    if (!isInit || queryAudioEncoderFunc == nullptr || queryAudioDecoderFunc == nullptr ||
101794c9f46Sopenharmony_ci        queryVideoEncoderFunc == nullptr || queryVideoDecoderFunc == nullptr) {
102794c9f46Sopenharmony_ci        DHLOGE("Query HiStreamer Tool Init failed");
103794c9f46Sopenharmony_ci        return "";
104794c9f46Sopenharmony_ci    }
105794c9f46Sopenharmony_ci
106794c9f46Sopenharmony_ci    int32_t len = 0;
107794c9f46Sopenharmony_ci    char* res = reinterpret_cast<char *>(malloc(MAX_MESSAGES_LEN));
108794c9f46Sopenharmony_ci    if (res == nullptr) {
109794c9f46Sopenharmony_ci        DHLOGE("Malloc memory failed");
110794c9f46Sopenharmony_ci        return "";
111794c9f46Sopenharmony_ci    }
112794c9f46Sopenharmony_ci    switch (type) {
113794c9f46Sopenharmony_ci        case HISTREAM_PLUGIN_TYPE::AUDIO_ENCODER: {
114794c9f46Sopenharmony_ci            len = queryAudioEncoderFunc(res);
115794c9f46Sopenharmony_ci            break;
116794c9f46Sopenharmony_ci        }
117794c9f46Sopenharmony_ci        case HISTREAM_PLUGIN_TYPE::AUDIO_DECODER: {
118794c9f46Sopenharmony_ci            len = queryAudioDecoderFunc(res);
119794c9f46Sopenharmony_ci            break;
120794c9f46Sopenharmony_ci        }
121794c9f46Sopenharmony_ci        case HISTREAM_PLUGIN_TYPE::VIDEO_ENCODER: {
122794c9f46Sopenharmony_ci            len = queryVideoEncoderFunc(res);
123794c9f46Sopenharmony_ci            break;
124794c9f46Sopenharmony_ci        }
125794c9f46Sopenharmony_ci        case HISTREAM_PLUGIN_TYPE::VIDEO_DECODER: {
126794c9f46Sopenharmony_ci            len = queryVideoDecoderFunc(res);
127794c9f46Sopenharmony_ci            break;
128794c9f46Sopenharmony_ci        }
129794c9f46Sopenharmony_ci        default:
130794c9f46Sopenharmony_ci            break;
131794c9f46Sopenharmony_ci    }
132794c9f46Sopenharmony_ci
133794c9f46Sopenharmony_ci    std::string result(res, len);
134794c9f46Sopenharmony_ci    free(res);
135794c9f46Sopenharmony_ci    res = nullptr;
136794c9f46Sopenharmony_ci    return result;
137794c9f46Sopenharmony_ci}
138794c9f46Sopenharmony_ci}
139794c9f46Sopenharmony_ci}