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}