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 #ifndef VIDEO_PROCESSING_LOADER_H
17 #define VIDEO_PROCESSING_LOADER_H
18 
19 #include <atomic>
20 #include <functional>
21 #include <mutex>
22 #include <string>
23 
24 #include "video_processing_capi_interface.h"
25 
26 class VideoProcessingNdkLoader {
27 public:
28     static VideoProcessingNdkLoader& Get();
29 
30     bool LoadLibrary();
31     void UnloadLibrary();
32     bool IsValid() const;
33 
34     // Interface
35     VideoProcessing_ErrorCode InitializeEnvironment();
36     VideoProcessing_ErrorCode DeinitializeEnvironment();
37     bool IsColorSpaceConversionSupported(const VideoProcessing_ColorSpaceInfo* sourceVideoInfo,
38         const VideoProcessing_ColorSpaceInfo* destinationVideoInfo);
39     bool IsMetadataGenerationSupported(const VideoProcessing_ColorSpaceInfo* sourceVideoInfo);
40     VideoProcessing_ErrorCode Create(OH_VideoProcessing** videoProcessor, int type);
41     VideoProcessing_ErrorCode Destroy(OH_VideoProcessing* videoProcessor);
42     VideoProcessing_ErrorCode RegisterCallback(OH_VideoProcessing* videoProcessor,
43         const VideoProcessing_Callback* callback, void* userData);
44     VideoProcessing_ErrorCode SetSurface(OH_VideoProcessing* videoProcessor, const OHNativeWindow* window);
45     VideoProcessing_ErrorCode GetSurface(OH_VideoProcessing* videoProcessor, OHNativeWindow** window);
46     VideoProcessing_ErrorCode SetParameter(OH_VideoProcessing* videoProcessor, const OH_AVFormat* parameter);
47     VideoProcessing_ErrorCode GetParameter(OH_VideoProcessing* videoProcessor, OH_AVFormat* parameter);
48     VideoProcessing_ErrorCode Start(OH_VideoProcessing* videoProcessor);
49     VideoProcessing_ErrorCode Stop(OH_VideoProcessing* videoProcessor);
50     VideoProcessing_ErrorCode RenderOutputBuffer(OH_VideoProcessing* videoProcessor, uint32_t index);
51 
52     // Callback
53     VideoProcessing_ErrorCode Create(VideoProcessing_Callback** callback);
54     VideoProcessing_ErrorCode Destroy(VideoProcessing_Callback* callback);
55     VideoProcessing_ErrorCode BindOnError(VideoProcessing_Callback* callback,
56         OH_VideoProcessingCallback_OnError onError);
57     VideoProcessing_ErrorCode BindOnState(VideoProcessing_Callback* callback,
58         OH_VideoProcessingCallback_OnState onState);
59     VideoProcessing_ErrorCode BindOnNewOutputBuffer(VideoProcessing_Callback* callback,
60         OH_VideoProcessingCallback_OnNewOutputBuffer onNewOutputBuffer);
61 
62 private:
63     using createNdkFunc = IVideoProcessingNdk* (*)();
64     using destroyNdkFunc = void (*)(IVideoProcessingNdk* obj);
65 
66     VideoProcessingNdkLoader() = default;
67     virtual ~VideoProcessingNdkLoader() = default;
68     VideoProcessingNdkLoader(const VideoProcessingNdkLoader&) = delete;
69     VideoProcessingNdkLoader& operator=(const VideoProcessingNdkLoader&) = delete;
70     VideoProcessingNdkLoader(VideoProcessingNdkLoader&&) = delete;
71     VideoProcessingNdkLoader& operator=(VideoProcessingNdkLoader&&) = delete;
72 
73     bool LoadLibraryLocked();
74     void UnloadLibraryLocked();
75     bool OpenLibraryLocked(const std::string& path);
76     bool LoadInterfaceLocked(IVideoProcessingNdk*& interface, destroyNdkFunc& destroyFunc,
77         const std::string& createFuncName, const std::string& destroyFuncName, const std::string& path);
78 
79     bool CallSupportNdk(std::function<bool(IVideoProcessingNdk*)>&& operation);
80     VideoProcessing_ErrorCode CallNdk(std::function<VideoProcessing_ErrorCode(IVideoProcessingNdk*)>&& operation);
81 
82     mutable std::mutex lock_{};
83     // Guarded by lock_ begin
84     std::atomic<bool> isValid_{};
85     uint32_t refCount_{0};
86     IVideoProcessingNdk* videoProcessing_{};
87     destroyNdkFunc destroyVideoProcessingFunc_{};
88     void* libHandle_{};
89     // Guarded by lock_ end
90 };
91 
92 #endif // VIDEO_PROCESSING_LOADER_H
93