• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "video_processing.h"
17 
18 #include <atomic>
19 #include <functional>
20 
21 #include "vpe_log.h"
22 #include "video_processing_capi_capability.h"
23 #include "video_environment_native.h"
24 #include "video_processing_callback_impl.h"
25 #include "video_processing_impl.h"
26 
27 using namespace OHOS::Media::VideoProcessingEngine;
28 
29 // CAPI define
30 // Video processing feature types:
31 const int32_t VIDEO_PROCESSING_TYPE_COLOR_SPACE_CONVERSION = 0x1;
32 const int32_t VIDEO_PROCESSING_TYPE_METADATA_GENERATION = 0x2;
33 const int32_t VIDEO_PROCESSING_TYPE_DETAIL_ENHANCER = 0x4;
34 // Video processing parameter keys:
35 // Detail enhancement:
36 const char* VIDEO_DETAIL_ENHANCER_PARAMETER_KEY_QUALITY_LEVEL = "QualityLevel";
37 
38 namespace {
39 // Call video processing interface
CallVideoProcessing(OH_VideoProcessing * videoProcessor,std::function<VideoProcessing_ErrorCode (std::shared_ptr<IVideoProcessingNative> &)> && operation)40 VideoProcessing_ErrorCode CallVideoProcessing(OH_VideoProcessing* videoProcessor,
41     std::function<VideoProcessing_ErrorCode(std::shared_ptr<IVideoProcessingNative>&)>&& operation)
42 {
43     CHECK_AND_RETURN_RET_LOG(videoProcessor != nullptr, VIDEO_PROCESSING_ERROR_INVALID_INSTANCE,
44         "videoProcessor is null!");
45     auto videoProcessing = videoProcessor->GetVideoProcessing();
46     CHECK_AND_RETURN_RET_LOG(videoProcessing != nullptr, VIDEO_PROCESSING_ERROR_INVALID_INSTANCE,
47         "videoProcessor is invalid!");
48     return operation(videoProcessing);
49 }
50 
51 // Call video processing callback interface
CallVideoProcessingCallback(VideoProcessing_Callback * callback,std::function<VideoProcessing_ErrorCode (std::shared_ptr<VideoProcessingCallbackNative> &)> && operation)52 VideoProcessing_ErrorCode CallVideoProcessingCallback(VideoProcessing_Callback* callback,
53     std::function<VideoProcessing_ErrorCode(std::shared_ptr<VideoProcessingCallbackNative>&)>&& operation)
54 {
55     CHECK_AND_RETURN_RET_LOG(callback != nullptr, VIDEO_PROCESSING_ERROR_INVALID_PARAMETER, "callback is null!");
56     auto innerCallback = callback->GetInnerCallback();
57     CHECK_AND_RETURN_RET_LOG(innerCallback != nullptr, VIDEO_PROCESSING_ERROR_INVALID_PARAMETER,
58         "callback is invalid!");
59     return operation(innerCallback);
60 }
61 }
62 
OH_VideoProcessing_InitializeEnvironment(void)63 VideoProcessing_ErrorCode OH_VideoProcessing_InitializeEnvironment(void)
64 {
65     CHECK_AND_RETURN_RET_LOG(VideoProcessingCapiCapability::OpenGLInit() == VIDEO_PROCESSING_SUCCESS,
66         VIDEO_PROCESSING_ERROR_INITIALIZE_FAILED, "OpenGLInit failed!");
67     return VideoEnvironmentNative::Get().Initialize();
68 }
69 
OH_VideoProcessing_DeinitializeEnvironment(void)70 VideoProcessing_ErrorCode OH_VideoProcessing_DeinitializeEnvironment(void)
71 {
72     return VideoEnvironmentNative::Get().Deinitialize();
73 }
74 
OH_VideoProcessing_IsColorSpaceConversionSupported(const VideoProcessing_ColorSpaceInfo * sourceVideoInfo,const VideoProcessing_ColorSpaceInfo * destinationVideoInfo)75 bool OH_VideoProcessing_IsColorSpaceConversionSupported(const VideoProcessing_ColorSpaceInfo* sourceVideoInfo,
76     const VideoProcessing_ColorSpaceInfo* destinationVideoInfo)
77 {
78     return VideoProcessingCapiCapability::IsColorSpaceConversionSupported(sourceVideoInfo, destinationVideoInfo);
79 }
80 
OH_VideoProcessing_IsMetadataGenerationSupported(const VideoProcessing_ColorSpaceInfo * sourceVideoInfo)81 bool OH_VideoProcessing_IsMetadataGenerationSupported(const VideoProcessing_ColorSpaceInfo* sourceVideoInfo)
82 {
83     return VideoProcessingCapiCapability::IsMetadataGenerationSupported(sourceVideoInfo);
84 }
85 
OH_VideoProcessing_Create(OH_VideoProcessing ** videoProcessor,int type)86 VideoProcessing_ErrorCode OH_VideoProcessing_Create(OH_VideoProcessing** videoProcessor, int type)
87 {
88     return OH_VideoProcessing::Create(videoProcessor, type, VideoProcessingCapiCapability::GetOpenGLContext());
89 }
90 
OH_VideoProcessing_Destroy(OH_VideoProcessing * videoProcessor)91 VideoProcessing_ErrorCode OH_VideoProcessing_Destroy(OH_VideoProcessing* videoProcessor)
92 {
93     return OH_VideoProcessing::Destroy(videoProcessor);
94 }
95 
OH_VideoProcessing_RegisterCallback(OH_VideoProcessing * videoProcessor,const VideoProcessing_Callback * callback,void * userData)96 VideoProcessing_ErrorCode OH_VideoProcessing_RegisterCallback(OH_VideoProcessing* videoProcessor,
97     const VideoProcessing_Callback* callback, void* userData)
98 {
99     return CallVideoProcessing(videoProcessor, [&callback, &userData](std::shared_ptr<IVideoProcessingNative>& obj) {
100         return obj->RegisterCallback(callback, userData);
101     });
102 }
103 
OH_VideoProcessing_SetSurface(OH_VideoProcessing * videoProcessor,const OHNativeWindow * window)104 VideoProcessing_ErrorCode OH_VideoProcessing_SetSurface(OH_VideoProcessing* videoProcessor,
105     const OHNativeWindow* window)
106 {
107     return CallVideoProcessing(videoProcessor, [&window](std::shared_ptr<IVideoProcessingNative>& obj) {
108         return obj->SetSurface(window);
109     });
110 }
111 
OH_VideoProcessing_GetSurface(OH_VideoProcessing * videoProcessor,OHNativeWindow ** window)112 VideoProcessing_ErrorCode OH_VideoProcessing_GetSurface(OH_VideoProcessing* videoProcessor, OHNativeWindow** window)
113 {
114     return CallVideoProcessing(videoProcessor, [&window](std::shared_ptr<IVideoProcessingNative>& obj) {
115         return obj->GetSurface(window);
116     });
117 }
118 
OH_VideoProcessing_SetParameter(OH_VideoProcessing * videoProcessor,const OH_AVFormat * parameter)119 VideoProcessing_ErrorCode OH_VideoProcessing_SetParameter(OH_VideoProcessing* videoProcessor,
120     const OH_AVFormat* parameter)
121 {
122     return CallVideoProcessing(videoProcessor, [&parameter](std::shared_ptr<IVideoProcessingNative>& obj) {
123         return obj->SetParameter(parameter);
124     });
125 }
126 
OH_VideoProcessing_GetParameter(OH_VideoProcessing * videoProcessor,OH_AVFormat * parameter)127 VideoProcessing_ErrorCode OH_VideoProcessing_GetParameter(OH_VideoProcessing* videoProcessor, OH_AVFormat* parameter)
128 {
129     return CallVideoProcessing(videoProcessor, [&parameter](std::shared_ptr<IVideoProcessingNative>& obj) {
130         return obj->GetParameter(parameter);
131     });
132 }
133 
OH_VideoProcessing_Start(OH_VideoProcessing * videoProcessor)134 VideoProcessing_ErrorCode OH_VideoProcessing_Start(OH_VideoProcessing* videoProcessor)
135 {
136     return CallVideoProcessing(videoProcessor, [](std::shared_ptr<IVideoProcessingNative>& obj) {
137         return obj->Start();
138     });
139 }
140 
OH_VideoProcessing_Stop(OH_VideoProcessing * videoProcessor)141 VideoProcessing_ErrorCode OH_VideoProcessing_Stop(OH_VideoProcessing* videoProcessor)
142 {
143     return CallVideoProcessing(videoProcessor, [](std::shared_ptr<IVideoProcessingNative>& obj) {
144         return obj->Stop();
145     });
146 }
147 
OH_VideoProcessing_RenderOutputBuffer(OH_VideoProcessing * videoProcessor,uint32_t index)148 VideoProcessing_ErrorCode OH_VideoProcessing_RenderOutputBuffer(OH_VideoProcessing* videoProcessor, uint32_t index)
149 {
150     return CallVideoProcessing(videoProcessor, [&index](std::shared_ptr<IVideoProcessingNative>& obj) {
151         return obj->RenderOutputBuffer(index);
152     });
153 }
154 
OH_VideoProcessingCallback_Create(VideoProcessing_Callback ** callback)155 VideoProcessing_ErrorCode OH_VideoProcessingCallback_Create(VideoProcessing_Callback** callback)
156 {
157     return VideoProcessing_Callback::Create(callback);
158 }
159 
OH_VideoProcessingCallback_Destroy(VideoProcessing_Callback * callback)160 VideoProcessing_ErrorCode OH_VideoProcessingCallback_Destroy(VideoProcessing_Callback* callback)
161 {
162     return VideoProcessing_Callback::Destroy(callback);
163 }
164 
OH_VideoProcessingCallback_BindOnError(VideoProcessing_Callback * callback,OH_VideoProcessingCallback_OnError onError)165 VideoProcessing_ErrorCode OH_VideoProcessingCallback_BindOnError(VideoProcessing_Callback* callback,
166     OH_VideoProcessingCallback_OnError onError)
167 {
168     return CallVideoProcessingCallback(callback, [&onError](std::shared_ptr<VideoProcessingCallbackNative>& obj) {
169         return obj->BindOnError(onError);
170     });
171 }
172 
OH_VideoProcessingCallback_BindOnState(VideoProcessing_Callback * callback,OH_VideoProcessingCallback_OnState onState)173 VideoProcessing_ErrorCode OH_VideoProcessingCallback_BindOnState(VideoProcessing_Callback* callback,
174     OH_VideoProcessingCallback_OnState onState)
175 {
176     return CallVideoProcessingCallback(callback, [&onState](std::shared_ptr<VideoProcessingCallbackNative>& obj) {
177         return obj->BindOnState(onState);
178     });
179 }
180 
OH_VideoProcessingCallback_BindOnNewOutputBuffer(VideoProcessing_Callback * callback,OH_VideoProcessingCallback_OnNewOutputBuffer onNewOutputBuffer)181 VideoProcessing_ErrorCode OH_VideoProcessingCallback_BindOnNewOutputBuffer(VideoProcessing_Callback* callback,
182     OH_VideoProcessingCallback_OnNewOutputBuffer onNewOutputBuffer)
183 {
184     return CallVideoProcessingCallback(callback,
185         [&onNewOutputBuffer](std::shared_ptr<VideoProcessingCallbackNative>& obj) {
186             return obj->BindOnNewOutputBuffer(onNewOutputBuffer);
187         });
188 }
189