1 /*
2 * Copyright (C) 2024 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 "image_fwk_ext_manager.h"
17
18 #include <dlfcn.h>
19 #include <string>
20 #include "image_log.h"
21 #include "image_func_timer.h"
22
23 #undef LOG_DOMAIN
24 #define LOG_DOMAIN LOG_TAG_DOMAIN_ID_IMAGE
25
26 #undef LOG_TAG
27 #define LOG_TAG "ImageFwkExtManager"
28
29 static const std::string IMAGE_FWK_EXT_NATIVE_SO = "libimage_codec_ext_native.so";
30
31 namespace OHOS {
32 namespace Media {
ImageFwkExtManager()33 ImageFwkExtManager::ImageFwkExtManager()
34 {
35 #if !defined(_WIN32) && !defined(_APPLE)
36 doHardWareEncodeFunc_ = nullptr;
37 doHardwareEncodePictureFunc_ = nullptr;
38 hevcSoftwareDecodeFunc_ = nullptr;
39 isImageFwkExtNativeSoOpened_ = false;
40 extNativeSoHandle_ = nullptr;
41 doHardwareEncodePictureFunc_ = nullptr;
42 #endif
43 }
44
~ImageFwkExtManager()45 ImageFwkExtManager::~ImageFwkExtManager()
46 {
47 #if !defined(_WIN32) && !defined(_APPLE)
48 if (!isImageFwkExtNativeSoOpened_ || extNativeSoHandle_ == nullptr) {
49 IMAGE_LOGD("image fwk ext native so is not open when dlclose");
50 return;
51 }
52 if (dlclose(extNativeSoHandle_)) {
53 IMAGE_LOGD("extNativeSoHandle dlclose failed: %{public}s", IMAGE_FWK_EXT_NATIVE_SO.c_str());
54 } else {
55 IMAGE_LOGD("extNativeSoHandle dlclose success: %{public}s", IMAGE_FWK_EXT_NATIVE_SO.c_str());
56 }
57 #endif
58 }
59
LoadImageFwkExtNativeSo()60 bool ImageFwkExtManager::LoadImageFwkExtNativeSo()
61 {
62 #if !defined(_WIN32) && !defined(_APPLE)
63 ImageFuncTimer imageFuncTimer(__func__);
64 if (!isImageFwkExtNativeSoOpened_) {
65 extNativeSoHandle_ = dlopen(IMAGE_FWK_EXT_NATIVE_SO.c_str(), RTLD_LAZY);
66 if (extNativeSoHandle_ == nullptr) {
67 IMAGE_LOGE("%{public}s dlopen falied", IMAGE_FWK_EXT_NATIVE_SO.c_str());
68 return false;
69 }
70 doHardWareEncodeFunc_ = reinterpret_cast<DoHardWareEncodeFunc>(dlsym(extNativeSoHandle_, "DoHardwareEncode"));
71 hevcSoftwareDecodeFunc_ =
72 reinterpret_cast<HevcSoftwareDecodeFunc>(dlsym(extNativeSoHandle_, "HevcSoftwareDecode"));
73 if (doHardWareEncodeFunc_ == nullptr || hevcSoftwareDecodeFunc_ == nullptr) {
74 IMAGE_LOGE("DoHardwareEncode dlsym falied");
75 dlclose(extNativeSoHandle_);
76 extNativeSoHandle_ = nullptr;
77 return false;
78 }
79 doHardwareEncodePictureFunc_ = reinterpret_cast<DoHardwareEncodePictureFunc>(dlsym(extNativeSoHandle_,
80 "DoHardwareEncodePicture"));
81 if (doHardwareEncodePictureFunc_ == nullptr) {
82 IMAGE_LOGE("DoHardwareEncodePicture dlsym falied");
83 dlclose(extNativeSoHandle_);
84 extNativeSoHandle_ = nullptr;
85 return false;
86 }
87 isImageFwkExtNativeSoOpened_ = true;
88 }
89 return true;
90 #else
91 return false;
92 #endif
93 }
94 } // namespace Media
95 } // namespace OHOS