1da853ecaSopenharmony_ci/* 2da853ecaSopenharmony_ci * Copyright (C) 2023 Huawei Device Co., Ltd. 3da853ecaSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4da853ecaSopenharmony_ci * you may not use this file except in compliance with the License. 5da853ecaSopenharmony_ci * You may obtain a copy of the License at 6da853ecaSopenharmony_ci * 7da853ecaSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8da853ecaSopenharmony_ci * 9da853ecaSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10da853ecaSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11da853ecaSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12da853ecaSopenharmony_ci * See the License for the specific language governing permissions and 13da853ecaSopenharmony_ci * limitations under the License. 14da853ecaSopenharmony_ci */ 15da853ecaSopenharmony_ci#include "fcodec_loader.h" 16da853ecaSopenharmony_ci#include <dlfcn.h> 17da853ecaSopenharmony_ci#include "avcodec_errors.h" 18da853ecaSopenharmony_ci#include "avcodec_log.h" 19da853ecaSopenharmony_ci#include "fcodec.h" 20da853ecaSopenharmony_ci 21da853ecaSopenharmony_cinamespace OHOS { 22da853ecaSopenharmony_cinamespace MediaAVCodec { 23da853ecaSopenharmony_cinamespace { 24da853ecaSopenharmony_ciusing FCodec = Codec::FCodec; 25da853ecaSopenharmony_ciconstexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, LOG_DOMAIN_FRAMEWORK, "FCodecLoader"}; 26da853ecaSopenharmony_ciconst char *FCODEC_LIB_PATH = "libfcodec.z.so"; 27da853ecaSopenharmony_ciconst char *FCODEC_CREATE_FUNC_NAME = "CreateFCodecByName"; 28da853ecaSopenharmony_ciconst char *FCODEC_GETCAPS_FUNC_NAME = "GetFCodecCapabilityList"; 29da853ecaSopenharmony_ci 30da853ecaSopenharmony_ci} // namespace 31da853ecaSopenharmony_cistd::shared_ptr<CodecBase> FCodecLoader::CreateByName(const std::string &name) 32da853ecaSopenharmony_ci{ 33da853ecaSopenharmony_ci FCodecLoader &loader = GetInstance(); 34da853ecaSopenharmony_ci 35da853ecaSopenharmony_ci CodecBase *noDeleterPtr = nullptr; 36da853ecaSopenharmony_ci { 37da853ecaSopenharmony_ci std::lock_guard<std::mutex> lock(loader.mutex_); 38da853ecaSopenharmony_ci CHECK_AND_RETURN_RET_LOG(loader.Init() == AVCS_ERR_OK, nullptr, "Create codec by name failed: init error"); 39da853ecaSopenharmony_ci noDeleterPtr = loader.Create(name).get(); 40da853ecaSopenharmony_ci CHECK_AND_RETURN_RET_LOG(noDeleterPtr != nullptr, nullptr, "Create fcodec by name failed: no memory"); 41da853ecaSopenharmony_ci ++(loader.fcodecCount_); 42da853ecaSopenharmony_ci } 43da853ecaSopenharmony_ci auto deleter = [&loader](CodecBase *ptr) { 44da853ecaSopenharmony_ci std::lock_guard<std::mutex> lock(loader.mutex_); 45da853ecaSopenharmony_ci FCodec *codec = reinterpret_cast<FCodec*>(ptr); 46da853ecaSopenharmony_ci codec->DecStrongRef(codec); 47da853ecaSopenharmony_ci --(loader.fcodecCount_); 48da853ecaSopenharmony_ci loader.CloseLibrary(); 49da853ecaSopenharmony_ci }; 50da853ecaSopenharmony_ci return std::shared_ptr<CodecBase>(noDeleterPtr, deleter); 51da853ecaSopenharmony_ci} 52da853ecaSopenharmony_ci 53da853ecaSopenharmony_ciint32_t FCodecLoader::GetCapabilityList(std::vector<CapabilityData> &caps) 54da853ecaSopenharmony_ci{ 55da853ecaSopenharmony_ci FCodecLoader &loader = GetInstance(); 56da853ecaSopenharmony_ci 57da853ecaSopenharmony_ci std::lock_guard<std::mutex> lock(loader.mutex_); 58da853ecaSopenharmony_ci CHECK_AND_RETURN_RET_LOG(loader.Init() == AVCS_ERR_OK, AVCS_ERR_UNKNOWN, "Get capability failed: init error"); 59da853ecaSopenharmony_ci int32_t ret = loader.GetCaps(caps); 60da853ecaSopenharmony_ci loader.CloseLibrary(); 61da853ecaSopenharmony_ci return ret; 62da853ecaSopenharmony_ci} 63da853ecaSopenharmony_ci 64da853ecaSopenharmony_ciFCodecLoader::FCodecLoader() : VideoCodecLoader(FCODEC_LIB_PATH, FCODEC_CREATE_FUNC_NAME, FCODEC_GETCAPS_FUNC_NAME) {} 65da853ecaSopenharmony_ci 66da853ecaSopenharmony_civoid FCodecLoader::CloseLibrary() 67da853ecaSopenharmony_ci{ 68da853ecaSopenharmony_ci if (fcodecCount_) { 69da853ecaSopenharmony_ci return; 70da853ecaSopenharmony_ci } 71da853ecaSopenharmony_ci Close(); 72da853ecaSopenharmony_ci} 73da853ecaSopenharmony_ci 74da853ecaSopenharmony_ciFCodecLoader &FCodecLoader::GetInstance() 75da853ecaSopenharmony_ci{ 76da853ecaSopenharmony_ci static FCodecLoader loader; 77da853ecaSopenharmony_ci return loader; 78da853ecaSopenharmony_ci} 79da853ecaSopenharmony_ci} // namespace MediaAVCodec 80da853ecaSopenharmony_ci} // namespace OHOS