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, [¶meter](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, [¶meter](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