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