1 /*
2  * Copyright (c) 2023-2023 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 "kits/native/include/camera/photo_output.h"
17 #include "impl/photo_output_impl.h"
18 #include "camera_log.h"
19 #include "hilog/log.h"
20 
21 #ifdef __cplusplus
22 extern "C" {
23 #endif
24 
25 /**
26  * @since 11
27  * @version 1.0
28  */
OH_PhotoOutput_RegisterCallback(Camera_PhotoOutput * photoOutput,PhotoOutput_Callbacks * callback)29 Camera_ErrorCode OH_PhotoOutput_RegisterCallback(Camera_PhotoOutput* photoOutput, PhotoOutput_Callbacks* callback)
30 {
31     CHECK_AND_RETURN_RET_LOG(photoOutput != nullptr, CAMERA_INVALID_ARGUMENT,
32         "Invaild argument, photoOutput is null!");
33     CHECK_AND_RETURN_RET_LOG(callback != nullptr, CAMERA_INVALID_ARGUMENT,
34         "Invaild argument, callback is null!");
35     CHECK_AND_RETURN_RET_LOG(callback->onFrameStart != nullptr ||
36         callback->onFrameEnd != nullptr ||
37         callback->onFrameShutter != nullptr ||
38         callback->onError != nullptr, CAMERA_INVALID_ARGUMENT,
39         "Invaild argument, invalid callback!");
40 
41     photoOutput->RegisterCallback(callback);
42     return CAMERA_OK;
43 }
44 
45 /**
46  * @since 11
47  * @version 1.0
48  */
OH_PhotoOutput_UnregisterCallback(Camera_PhotoOutput * photoOutput,PhotoOutput_Callbacks * callback)49 Camera_ErrorCode OH_PhotoOutput_UnregisterCallback(Camera_PhotoOutput* photoOutput, PhotoOutput_Callbacks* callback)
50 {
51     CHECK_AND_RETURN_RET_LOG(photoOutput != nullptr, CAMERA_INVALID_ARGUMENT,
52         "Invaild argument, photoOutput is null!");
53     CHECK_AND_RETURN_RET_LOG(callback != nullptr, CAMERA_INVALID_ARGUMENT,
54         "Invaild argument, callback is null!");
55     CHECK_AND_RETURN_RET_LOG(callback->onFrameStart != nullptr ||
56         callback->onFrameEnd != nullptr ||
57         callback->onFrameShutter != nullptr ||
58         callback->onError != nullptr, CAMERA_INVALID_ARGUMENT,
59         "Invaild argument, invalid callback!");
60 
61     photoOutput->UnregisterCallback(callback);
62     return CAMERA_OK;
63 }
64 
65 /**
66  * @since 12
67  * @version 1.0
68  */
OH_PhotoOutput_RegisterCaptureStartWithInfoCallback(Camera_PhotoOutput * photoOutput,OH_PhotoOutput_CaptureStartWithInfo callback)69 Camera_ErrorCode OH_PhotoOutput_RegisterCaptureStartWithInfoCallback(Camera_PhotoOutput* photoOutput,
70     OH_PhotoOutput_CaptureStartWithInfo callback)
71 {
72     CHECK_AND_RETURN_RET_LOG(photoOutput != nullptr, CAMERA_INVALID_ARGUMENT,
73         "Invaild argument, photoOutput is null!");
74     CHECK_AND_RETURN_RET_LOG(callback != nullptr, CAMERA_INVALID_ARGUMENT,
75         "Invaild argument, callback is null!");
76     photoOutput->RegisterCaptureStartWithInfoCallback(callback);
77     return CAMERA_OK;
78 }
79 
80 /**
81  * @since 12
82  * @version 1.0
83  */
OH_PhotoOutput_UnregisterCaptureStartWithInfoCallback(Camera_PhotoOutput * photoOutput,OH_PhotoOutput_CaptureStartWithInfo callback)84 Camera_ErrorCode OH_PhotoOutput_UnregisterCaptureStartWithInfoCallback(Camera_PhotoOutput* photoOutput,
85     OH_PhotoOutput_CaptureStartWithInfo callback)
86 {
87     CHECK_AND_RETURN_RET_LOG(photoOutput != nullptr, CAMERA_INVALID_ARGUMENT,
88         "Invaild argument, photoOutput is null!");
89     CHECK_AND_RETURN_RET_LOG(callback != nullptr, CAMERA_INVALID_ARGUMENT,
90         "Invaild argument, callback is null!");
91     photoOutput->UnregisterCaptureStartWithInfoCallback(callback);
92     return CAMERA_OK;
93 }
94 
95 /**
96  * @since 12
97  * @version 1.0
98  */
OH_PhotoOutput_RegisterCaptureEndCallback(Camera_PhotoOutput * photoOutput,OH_PhotoOutput_CaptureEnd callback)99 Camera_ErrorCode OH_PhotoOutput_RegisterCaptureEndCallback(Camera_PhotoOutput* photoOutput,
100     OH_PhotoOutput_CaptureEnd callback)
101 {
102     CHECK_AND_RETURN_RET_LOG(photoOutput != nullptr, CAMERA_INVALID_ARGUMENT,
103         "Invaild argument, photoOutput is null!");
104     CHECK_AND_RETURN_RET_LOG(callback != nullptr, CAMERA_INVALID_ARGUMENT,
105         "Invaild argument, callback is null!");
106     photoOutput->RegisterCaptureEndCallback(callback);
107     return CAMERA_OK;
108 }
109 
110 /**
111  * @since 12
112  * @version 1.0
113  */
OH_PhotoOutput_UnregisterCaptureEndCallback(Camera_PhotoOutput * photoOutput,OH_PhotoOutput_CaptureEnd callback)114 Camera_ErrorCode OH_PhotoOutput_UnregisterCaptureEndCallback(Camera_PhotoOutput* photoOutput,
115     OH_PhotoOutput_CaptureEnd callback)
116 {
117     CHECK_AND_RETURN_RET_LOG(photoOutput != nullptr, CAMERA_INVALID_ARGUMENT,
118         "Invaild argument, photoOutput is null!");
119     CHECK_AND_RETURN_RET_LOG(callback != nullptr, CAMERA_INVALID_ARGUMENT,
120         "Invaild argument, callback is null!");
121     photoOutput->UnregisterCaptureEndCallback(callback);
122     return CAMERA_OK;
123 }
124 
125 /**
126  * @since 12
127  * @version 1.0
128  */
OH_PhotoOutput_RegisterFrameShutterEndCallback(Camera_PhotoOutput * photoOutput,OH_PhotoOutput_OnFrameShutterEnd callback)129 Camera_ErrorCode OH_PhotoOutput_RegisterFrameShutterEndCallback(Camera_PhotoOutput* photoOutput,
130     OH_PhotoOutput_OnFrameShutterEnd callback)
131 {
132     CHECK_AND_RETURN_RET_LOG(photoOutput != nullptr, CAMERA_INVALID_ARGUMENT,
133         "Invaild argument, photoOutput is null!");
134     CHECK_AND_RETURN_RET_LOG(callback != nullptr, CAMERA_INVALID_ARGUMENT,
135         "Invaild argument, callback is null!");
136     photoOutput->RegisterFrameShutterEndCallback(callback);
137     return CAMERA_OK;
138 }
139 
140 /**
141  * @since 12
142  * @version 1.0
143  */
OH_PhotoOutput_UnregisterFrameShutterEndCallback(Camera_PhotoOutput * photoOutput,OH_PhotoOutput_OnFrameShutterEnd callback)144 Camera_ErrorCode OH_PhotoOutput_UnregisterFrameShutterEndCallback(Camera_PhotoOutput* photoOutput,
145     OH_PhotoOutput_OnFrameShutterEnd callback)
146 {
147     CHECK_AND_RETURN_RET_LOG(photoOutput != nullptr, CAMERA_INVALID_ARGUMENT,
148         "Invaild argument, photoOutput is null!");
149     CHECK_AND_RETURN_RET_LOG(callback != nullptr, CAMERA_INVALID_ARGUMENT,
150         "Invaild argument, callback is null!");
151     photoOutput->UnregisterFrameShutterEndCallback(callback);
152     return CAMERA_OK;
153 }
154 
155 /**
156  * @since 12
157  * @version 1.0
158  */
OH_PhotoOutput_RegisterCaptureReadyCallback(Camera_PhotoOutput * photoOutput,OH_PhotoOutput_CaptureReady callback)159 Camera_ErrorCode OH_PhotoOutput_RegisterCaptureReadyCallback(Camera_PhotoOutput* photoOutput,
160     OH_PhotoOutput_CaptureReady callback)
161 {
162     CHECK_AND_RETURN_RET_LOG(photoOutput != nullptr, CAMERA_INVALID_ARGUMENT,
163         "Invaild argument, photoOutput is null!");
164     CHECK_AND_RETURN_RET_LOG(callback != nullptr, CAMERA_INVALID_ARGUMENT,
165         "Invaild argument, callback is null!");
166     photoOutput->RegisterCaptureReadyCallback(callback);
167     return CAMERA_OK;
168 }
169 
170 /**
171  * @since 12
172  * @version 1.0
173  */
OH_PhotoOutput_UnregisterCaptureReadyCallback(Camera_PhotoOutput * photoOutput,OH_PhotoOutput_CaptureReady callback)174 Camera_ErrorCode OH_PhotoOutput_UnregisterCaptureReadyCallback(Camera_PhotoOutput* photoOutput,
175     OH_PhotoOutput_CaptureReady callback)
176 {
177     CHECK_AND_RETURN_RET_LOG(photoOutput != nullptr, CAMERA_INVALID_ARGUMENT,
178         "Invaild argument, photoOutput is null!");
179     CHECK_AND_RETURN_RET_LOG(callback != nullptr, CAMERA_INVALID_ARGUMENT,
180         "Invaild argument, callback is null!");
181     photoOutput->UnregisterCaptureReadyCallback(callback);
182     return CAMERA_OK;
183 }
184 
185 /**
186  * @since 12
187  * @version 1.0
188  */
OH_PhotoOutput_RegisterEstimatedCaptureDurationCallback(Camera_PhotoOutput * photoOutput,OH_PhotoOutput_EstimatedCaptureDuration callback)189 Camera_ErrorCode OH_PhotoOutput_RegisterEstimatedCaptureDurationCallback(Camera_PhotoOutput* photoOutput,
190     OH_PhotoOutput_EstimatedCaptureDuration callback)
191 {
192     CHECK_AND_RETURN_RET_LOG(photoOutput != nullptr, CAMERA_INVALID_ARGUMENT,
193         "Invaild argument, photoOutput is null!");
194     CHECK_AND_RETURN_RET_LOG(callback != nullptr, CAMERA_INVALID_ARGUMENT,
195         "Invaild argument, callback is null!");
196     photoOutput->RegisterEstimatedCaptureDurationCallback(callback);
197     return CAMERA_OK;
198 }
199 
200 /**
201  * @since 12
202  * @version 1.0
203  */
OH_PhotoOutput_UnregisterEstimatedCaptureDurationCallback(Camera_PhotoOutput * photoOutput,OH_PhotoOutput_EstimatedCaptureDuration callback)204 Camera_ErrorCode OH_PhotoOutput_UnregisterEstimatedCaptureDurationCallback(Camera_PhotoOutput* photoOutput,
205     OH_PhotoOutput_EstimatedCaptureDuration callback)
206 {
207     CHECK_AND_RETURN_RET_LOG(photoOutput != nullptr, CAMERA_INVALID_ARGUMENT,
208         "Invaild argument, photoOutput is null!");
209     CHECK_AND_RETURN_RET_LOG(callback != nullptr, CAMERA_INVALID_ARGUMENT,
210         "Invaild argument, callback is null!");
211     photoOutput->UnregisterEstimatedCaptureDurationCallback(callback);
212     return CAMERA_OK;
213 }
214 
215 /**
216  * @since 12
217  * @version 1.0
218  */
OH_PhotoOutput_RegisterPhotoAvailableCallback(Camera_PhotoOutput * photoOutput,OH_PhotoOutput_PhotoAvailable callback)219 Camera_ErrorCode OH_PhotoOutput_RegisterPhotoAvailableCallback(Camera_PhotoOutput* photoOutput,
220     OH_PhotoOutput_PhotoAvailable callback)
221 {
222     CHECK_AND_RETURN_RET_LOG(photoOutput != nullptr, CAMERA_INVALID_ARGUMENT,
223         "Invaild argument, photoOutput is null!");
224     CHECK_AND_RETURN_RET_LOG(callback != nullptr, CAMERA_INVALID_ARGUMENT,
225         "Invaild argument, callback is null!");
226 
227     return photoOutput->RegisterPhotoAvailableCallback(callback);
228 }
229 
230 /**
231  * @since 12
232  * @version 1.0
233  */
OH_PhotoOutput_UnregisterPhotoAvailableCallback(Camera_PhotoOutput * photoOutput,OH_PhotoOutput_PhotoAvailable callback)234 Camera_ErrorCode OH_PhotoOutput_UnregisterPhotoAvailableCallback(Camera_PhotoOutput* photoOutput,
235     OH_PhotoOutput_PhotoAvailable callback)
236 {
237     CHECK_AND_RETURN_RET_LOG(photoOutput != nullptr, CAMERA_INVALID_ARGUMENT,
238         "Invaild argument, photoOutput is null!");
239     CHECK_AND_RETURN_RET_LOG(callback != nullptr, CAMERA_INVALID_ARGUMENT,
240         "Invaild argument, callback is null!");
241 
242     return photoOutput->UnregisterPhotoAvailableCallback(callback);
243 }
244 
245 /**
246  * @since 12
247  * @version 1.0
248  */
OH_PhotoOutput_RegisterPhotoAssetAvailableCallback(Camera_PhotoOutput * photoOutput,OH_PhotoOutput_PhotoAssetAvailable callback)249 Camera_ErrorCode OH_PhotoOutput_RegisterPhotoAssetAvailableCallback(Camera_PhotoOutput* photoOutput,
250     OH_PhotoOutput_PhotoAssetAvailable callback)
251 {
252     CHECK_AND_RETURN_RET_LOG(photoOutput != nullptr, CAMERA_INVALID_ARGUMENT,
253         "Invaild argument, photoOutput is null!");
254     CHECK_AND_RETURN_RET_LOG(callback != nullptr, CAMERA_INVALID_ARGUMENT,
255         "Invaild argument, callback is null!");
256 
257     return photoOutput->RegisterPhotoAssetAvailableCallback(callback);
258 }
259 
260 /**
261  * @since 12
262  * @version 1.0
263  */
OH_PhotoOutput_UnregisterPhotoAssetAvailableCallback(Camera_PhotoOutput * photoOutput,OH_PhotoOutput_PhotoAssetAvailable callback)264 Camera_ErrorCode OH_PhotoOutput_UnregisterPhotoAssetAvailableCallback(Camera_PhotoOutput* photoOutput,
265     OH_PhotoOutput_PhotoAssetAvailable callback)
266 {
267     CHECK_AND_RETURN_RET_LOG(photoOutput != nullptr, CAMERA_INVALID_ARGUMENT,
268         "Invaild argument, photoOutput is null!");
269     CHECK_AND_RETURN_RET_LOG(callback != nullptr, CAMERA_INVALID_ARGUMENT,
270         "Invaild argument, callback is null!");
271 
272     return photoOutput->UnregisterPhotoAssetAvailableCallback(callback);
273 }
274 
275 /**
276  * @since 11
277  * @version 1.0
278  */
OH_PhotoOutput_Capture(Camera_PhotoOutput * photoOutput)279 Camera_ErrorCode OH_PhotoOutput_Capture(Camera_PhotoOutput* photoOutput)
280 {
281     CHECK_AND_RETURN_RET_LOG(photoOutput != nullptr, CAMERA_INVALID_ARGUMENT,
282         "Invaild argument, photoOutput is null!");
283 
284     return photoOutput->Capture();
285 }
286 
287 /**
288  * @since 11
289  * @version 1.0
290  */
OH_PhotoOutput_Capture_WithCaptureSetting(Camera_PhotoOutput * photoOutput,Camera_PhotoCaptureSetting setting)291 Camera_ErrorCode OH_PhotoOutput_Capture_WithCaptureSetting(Camera_PhotoOutput* photoOutput,
292     Camera_PhotoCaptureSetting setting)
293 {
294     CHECK_AND_RETURN_RET_LOG(photoOutput != nullptr, CAMERA_INVALID_ARGUMENT,
295         "Invaild argument, photoOutput is null!");
296 
297     return photoOutput->Capture_WithCaptureSetting(setting);
298 }
299 
300 /**
301  * @since 11
302  * @version 1.0
303  */
OH_PhotoOutput_Release(Camera_PhotoOutput * photoOutput)304 Camera_ErrorCode OH_PhotoOutput_Release(Camera_PhotoOutput* photoOutput)
305 {
306     CHECK_AND_RETURN_RET_LOG(photoOutput != nullptr, CAMERA_INVALID_ARGUMENT,
307         "Invaild argument, photoOutput is null!");
308 
309     Camera_ErrorCode retCode = photoOutput->Release();
310     if (photoOutput != nullptr) {
311         delete photoOutput;
312     }
313     return retCode;
314 }
315 
316 /**
317  * @since 11
318  * @version 1.0
319  */
OH_PhotoOutput_IsMirrorSupported(Camera_PhotoOutput * photoOutput,bool * isSupported)320 Camera_ErrorCode OH_PhotoOutput_IsMirrorSupported(Camera_PhotoOutput* photoOutput, bool* isSupported)
321 {
322     CHECK_AND_RETURN_RET_LOG(photoOutput != nullptr, CAMERA_INVALID_ARGUMENT,
323         "Invaild argument, photoOutput is null!");
324     CHECK_AND_RETURN_RET_LOG(isSupported != nullptr, CAMERA_INVALID_ARGUMENT,
325         "Invaild argument, isSupported is null!");
326 
327     return photoOutput->IsMirrorSupported(isSupported);
328 }
329 
330 /**
331  * @since 13
332  * @version 1.0
333  */
OH_PhotoOutput_EnableMirror(Camera_PhotoOutput * photoOutput,bool enableMirror)334 Camera_ErrorCode OH_PhotoOutput_EnableMirror(Camera_PhotoOutput* photoOutput, bool enableMirror)
335 {
336     CHECK_AND_RETURN_RET_LOG(photoOutput != nullptr, CAMERA_INVALID_ARGUMENT,
337         "Invaild argument, photoOutput is null!");
338 
339     return photoOutput->EnableMirror(enableMirror);
340 }
341 
342 /**
343  * @since 12
344  * @version 1.0
345  */
OH_PhotoOutput_GetActiveProfile(Camera_PhotoOutput * photoOutput,Camera_Profile ** profile)346 Camera_ErrorCode OH_PhotoOutput_GetActiveProfile(Camera_PhotoOutput* photoOutput, Camera_Profile** profile)
347 {
348     MEDIA_DEBUG_LOG("OH_PhotoOutput_GetActiveProfile is called.");
349     CHECK_AND_RETURN_RET_LOG(photoOutput != nullptr, CAMERA_INVALID_ARGUMENT,
350         "Invaild argument, photoOutput is null!");
351     CHECK_AND_RETURN_RET_LOG(profile != nullptr, CAMERA_INVALID_ARGUMENT,
352         "Invaild argument, profile is null!");
353 
354     return photoOutput->GetActiveProfile(profile);
355 }
356 
357 /**
358  * @since 12
359  * @version 1.0
360  */
OH_PhotoOutput_DeleteProfile(Camera_Profile * profile)361 Camera_ErrorCode OH_PhotoOutput_DeleteProfile(Camera_Profile* profile)
362 {
363     MEDIA_DEBUG_LOG("OH_PhotoOutput_DeleteProfile is called.");
364     CHECK_AND_RETURN_RET_LOG(profile != nullptr, CAMERA_INVALID_ARGUMENT,
365         "Invaild argument, profile is null!");
366 
367     delete profile;
368     profile = nullptr;
369     return CAMERA_OK;
370 }
371 
372 /**
373  * @since 12
374  * @version 1.0
375  */
OH_PhotoOutput_EnableMovingPhoto(Camera_PhotoOutput * photoOutput,bool enableMovingPhoto)376 Camera_ErrorCode OH_PhotoOutput_EnableMovingPhoto(Camera_PhotoOutput* photoOutput, bool enableMovingPhoto)
377 {
378     CHECK_AND_RETURN_RET_LOG(photoOutput != nullptr, CAMERA_INVALID_ARGUMENT,
379         "Invaild argument, photoOutput is null!");
380 
381     return photoOutput->EnableMovingPhoto(enableMovingPhoto);
382 }
383 
384 /**
385  * @since 12
386  * @version 1.0
387  */
OH_PhotoOutput_IsMovingPhotoSupported(Camera_PhotoOutput * photoOutput,bool * isSupported)388 Camera_ErrorCode OH_PhotoOutput_IsMovingPhotoSupported(Camera_PhotoOutput* photoOutput, bool* isSupported)
389 {
390     CHECK_AND_RETURN_RET_LOG(photoOutput != nullptr, CAMERA_INVALID_ARGUMENT,
391         "Invaild argument, photoOutput is null!");
392     CHECK_AND_RETURN_RET_LOG(isSupported != nullptr, CAMERA_INVALID_ARGUMENT,
393         "Invaild argument, isSupported is null!");
394 
395     return photoOutput->IsMovingPhotoSupported(isSupported);
396 }
397 
OH_PhotoOutput_GetPhotoRotation(Camera_PhotoOutput * photoOutput,int deviceDegree,Camera_ImageRotation * imageRotation)398 Camera_ErrorCode OH_PhotoOutput_GetPhotoRotation(Camera_PhotoOutput* photoOutput, int deviceDegree,
399     Camera_ImageRotation* imageRotation)
400 {
401     MEDIA_DEBUG_LOG("OH_PhotoOutput_GetPhotoRotation is called.");
402     CHECK_AND_RETURN_RET_LOG(photoOutput != nullptr, CAMERA_INVALID_ARGUMENT,
403         "Invaild argument, photoOutput is null!");
404     CHECK_AND_RETURN_RET_LOG(imageRotation != nullptr, CAMERA_INVALID_ARGUMENT,
405         "Invaild argument, cameraImageRotation is null!");
406     return photoOutput->GetPhotoRotation(deviceDegree, imageRotation);
407 }
408 #ifdef __cplusplus
409 }
410 #endif