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