1 /*
2 * Copyright (C) 2023 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 // TODO(http://b/73019835) needed by NdkCameraCaptureSession.h
18 #include <camera/NdkCaptureRequest.h>
19
20 #include <camera/NdkCameraCaptureSession.h>
21 #include <camera/NdkCameraError.h>
22 #include <camera/NdkCameraManager.h>
23
24 #include "berberis/base/logging.h"
25 #include "berberis/guest_abi/function_wrappers.h"
26 #include "berberis/proxy_loader/proxy_library_builder.h"
27
28 #include "android_camera_checks.h"
29
30 namespace berberis {
31
32 namespace {
33
ToHostACameraManager_AvailabilityCallbacks(const ACameraManager_AvailabilityCallbacks * guest_callback,ACameraManager_AvailabilityCallbacks * host_callback)34 ACameraManager_AvailabilityCallbacks* ToHostACameraManager_AvailabilityCallbacks(
35 const ACameraManager_AvailabilityCallbacks* guest_callback,
36 ACameraManager_AvailabilityCallbacks* host_callback) {
37 if (guest_callback == nullptr) {
38 return nullptr;
39 }
40 *host_callback = {
41 guest_callback->context,
42 // typedef void (*ACameraManager_AvailabilityCallback)(void* context, const char* cameraId);
43 WrapGuestFunction(GuestType(guest_callback->onCameraAvailable), "onCameraAvailable-callback"),
44 WrapGuestFunction(GuestType(guest_callback->onCameraUnavailable),
45 "onCameraUnavailable-callback")};
46
47 return host_callback;
48 }
49
ToHostACameraManager_ExtendedAvailabilityCallbacks(const ACameraManager_ExtendedAvailabilityCallbacks * guest_callback,ACameraManager_ExtendedAvailabilityCallbacks * host_callback)50 ACameraManager_ExtendedAvailabilityCallbacks* ToHostACameraManager_ExtendedAvailabilityCallbacks(
51 const ACameraManager_ExtendedAvailabilityCallbacks* guest_callback,
52 ACameraManager_ExtendedAvailabilityCallbacks* host_callback) {
53 if (guest_callback == nullptr) {
54 return nullptr;
55 }
56
57 auto* base_callbacks = ToHostACameraManager_AvailabilityCallbacks(
58 &(guest_callback->availabilityCallbacks), &(host_callback->availabilityCallbacks));
59 CHECK_EQ(base_callbacks, &(host_callback->availabilityCallbacks));
60
61 // typedef void (*ACameraManager_AccessPrioritiesChangedCallback)(void* context);
62 host_callback->onCameraAccessPrioritiesChanged =
63 WrapGuestFunction(GuestType(guest_callback->onCameraAccessPrioritiesChanged),
64 "onCameraAccessPrioritiesChanged-callback");
65
66 memset(&(host_callback->reserved), 0, sizeof(host_callback->reserved));
67
68 return host_callback;
69 }
70
ToHostACameraCaptureSession_captureCallbacks(const ACameraCaptureSession_captureCallbacks * guest_callbacks,ACameraCaptureSession_captureCallbacks * host_callbacks)71 ACameraCaptureSession_captureCallbacks* ToHostACameraCaptureSession_captureCallbacks(
72 const ACameraCaptureSession_captureCallbacks* guest_callbacks,
73 ACameraCaptureSession_captureCallbacks* host_callbacks) {
74 if (guest_callbacks == nullptr) {
75 return nullptr;
76 }
77
78 *host_callbacks = {
79 guest_callbacks->context,
80 // typedef void (*ACameraCaptureSession_captureCallback_start)(void* context,
81 // ACameraCaptureSession* session,
82 // const ACaptureRequest* request,
83 // int64_t timestamp);
84 WrapGuestFunction(GuestType(guest_callbacks->onCaptureStarted), "onCaptureStarted-callback"),
85 // typedef void (*ACameraCaptureSession_captureCallback_result)(void* context,
86 // ACameraCaptureSession*
87 // session, ACaptureRequest*
88 // request, const
89 // ACameraMetadata* result);
90 WrapGuestFunction(GuestType(guest_callbacks->onCaptureProgressed),
91 "onCaptureProgressed-callback"),
92 WrapGuestFunction(GuestType(guest_callbacks->onCaptureCompleted),
93 "onCaptureCompleted-callback"),
94 // typedef void (*ACameraCaptureSession_captureCallback_failed)(void* context,
95 // ACameraCaptureSession*
96 // session, ACaptureRequest*
97 // request,
98 // ACameraCaptureFailure*
99 // failure);
100 WrapGuestFunction(GuestType(guest_callbacks->onCaptureFailed), "onCaptureFailed-callback"),
101 // typedef void (*ACameraCaptureSession_captureCallback_sequenceEnd)(
102 // void* context, ACameraCaptureSession* session, int sequenceId, int64_t frameNumber);
103 WrapGuestFunction(GuestType(guest_callbacks->onCaptureSequenceCompleted),
104 "onCaptureSequenceCompleted-callback"),
105 // typedef void (*ACameraCaptureSession_captureCallback_sequenceAbort)(
106 // void* context, ACameraCaptureSession* session, int sequenceId);
107 WrapGuestFunction(GuestType(guest_callbacks->onCaptureSequenceAborted),
108 "onCaptureSequenceAborted-callback"),
109 // typedef void (*ACameraCaptureSession_captureCallback_bufferLost)(
110 // void* context,
111 // ACameraCaptureSession* session,
112 // ACaptureRequest* request,
113 // ANativeWindow* window,
114 // int64_t frameNumber);
115 WrapGuestFunction(GuestType(guest_callbacks->onCaptureBufferLost),
116 "onCaptureBufferLost-callback"),
117
118 };
119
120 return host_callbacks;
121 }
122
ToHostACameraCaptureSession_captureCallbacksV2(const ACameraCaptureSession_captureCallbacksV2 * guest_callbacks,ACameraCaptureSession_captureCallbacksV2 * host_callbacks)123 ACameraCaptureSession_captureCallbacksV2* ToHostACameraCaptureSession_captureCallbacksV2(
124 const ACameraCaptureSession_captureCallbacksV2* guest_callbacks,
125 ACameraCaptureSession_captureCallbacksV2* host_callbacks) {
126 if (guest_callbacks == nullptr) {
127 return nullptr;
128 }
129
130 *host_callbacks = {
131 guest_callbacks->context,
132 WrapGuestFunction(GuestType(guest_callbacks->onCaptureStarted), "onCaptureStarted-callback"),
133 WrapGuestFunction(GuestType(guest_callbacks->onCaptureProgressed),
134 "onCaptureProgressed-callback"),
135 WrapGuestFunction(GuestType(guest_callbacks->onCaptureCompleted),
136 "onCaptureCompleted-callback"),
137 WrapGuestFunction(GuestType(guest_callbacks->onCaptureFailed), "onCaptureFailed-callback"),
138 WrapGuestFunction(GuestType(guest_callbacks->onCaptureSequenceCompleted),
139 "onCaptureSequenceCompleted-callback"),
140 WrapGuestFunction(GuestType(guest_callbacks->onCaptureSequenceAborted),
141 "onCaptureSequenceAborted-callback"),
142 WrapGuestFunction(GuestType(guest_callbacks->onCaptureBufferLost),
143 "onCaptureBufferLost-callback"),
144
145 };
146
147 return host_callbacks;
148 }
149
150 ACameraCaptureSession_logicalCamera_captureCallbacks*
ToHostACameraCaptureSession_logicalCamera_captureCallbacks(const ACameraCaptureSession_logicalCamera_captureCallbacks * guest_callbacks,ACameraCaptureSession_logicalCamera_captureCallbacks * host_callbacks)151 ToHostACameraCaptureSession_logicalCamera_captureCallbacks(
152 const ACameraCaptureSession_logicalCamera_captureCallbacks* guest_callbacks,
153 ACameraCaptureSession_logicalCamera_captureCallbacks* host_callbacks) {
154 if (guest_callbacks == nullptr) {
155 return nullptr;
156 }
157
158 *host_callbacks = {
159 guest_callbacks->context,
160 WrapGuestFunction(GuestType(guest_callbacks->onCaptureStarted), "onCaptureStarted-callback"),
161 WrapGuestFunction(GuestType(guest_callbacks->onCaptureProgressed),
162 "onCaptureProgressed-callback"),
163 WrapGuestFunction(GuestType(guest_callbacks->onLogicalCameraCaptureCompleted),
164 "onLogicalCameraCaptureCompleted-callback"),
165 WrapGuestFunction(GuestType(guest_callbacks->onLogicalCameraCaptureFailed),
166 "onLogicalCameraCaptureFailed-callback"),
167 WrapGuestFunction(GuestType(guest_callbacks->onCaptureSequenceCompleted),
168 "onCaptureSequenceCompleted-callback"),
169 WrapGuestFunction(GuestType(guest_callbacks->onCaptureSequenceAborted),
170 "onCaptureSequenceAborted-callback"),
171 WrapGuestFunction(GuestType(guest_callbacks->onCaptureBufferLost),
172 "onCaptureBufferLost-callback"),
173 };
174
175 return host_callbacks;
176 }
177
178 ACameraCaptureSession_logicalCamera_captureCallbacksV2*
ToHostACameraCaptureSession_logicalCamera_captureCallbacksV2(const ACameraCaptureSession_logicalCamera_captureCallbacksV2 * guest_callbacks,ACameraCaptureSession_logicalCamera_captureCallbacksV2 * host_callbacks)179 ToHostACameraCaptureSession_logicalCamera_captureCallbacksV2(
180 const ACameraCaptureSession_logicalCamera_captureCallbacksV2* guest_callbacks,
181 ACameraCaptureSession_logicalCamera_captureCallbacksV2* host_callbacks) {
182 if (guest_callbacks == nullptr) {
183 return nullptr;
184 }
185
186 *host_callbacks = {
187 guest_callbacks->context,
188 WrapGuestFunction(GuestType(guest_callbacks->onCaptureStarted), "onCaptureStarted-callback"),
189 WrapGuestFunction(GuestType(guest_callbacks->onCaptureProgressed),
190 "onCaptureProgressed-callback"),
191 WrapGuestFunction(GuestType(guest_callbacks->onLogicalCameraCaptureCompleted),
192 "onLogicalCameraCaptureCompleted-callback"),
193 WrapGuestFunction(GuestType(guest_callbacks->onLogicalCameraCaptureFailed),
194 "onLogicalCameraCaptureFailed-callback"),
195 WrapGuestFunction(GuestType(guest_callbacks->onCaptureSequenceCompleted),
196 "onCaptureSequenceCompleted-callback"),
197 WrapGuestFunction(GuestType(guest_callbacks->onCaptureSequenceAborted),
198 "onCaptureSequenceAborted-callback"),
199 WrapGuestFunction(GuestType(guest_callbacks->onCaptureBufferLost),
200 "onCaptureBufferLost-callback"),
201 };
202
203 return host_callbacks;
204 }
205
ToHostACameraCaptureSession_stateCallbacks(const ACameraCaptureSession_stateCallbacks * guest_callbacks,ACameraCaptureSession_stateCallbacks * host_callbacks)206 ACameraCaptureSession_stateCallbacks* ToHostACameraCaptureSession_stateCallbacks(
207 const ACameraCaptureSession_stateCallbacks* guest_callbacks,
208 ACameraCaptureSession_stateCallbacks* host_callbacks) {
209 if (guest_callbacks == nullptr) {
210 return nullptr;
211 }
212
213 *host_callbacks = {
214 guest_callbacks->context,
215 // typedef void (*ACameraCaptureSession_stateCallback)(void* context,
216 // ACameraCaptureSession* session);
217 WrapGuestFunction(GuestType(guest_callbacks->onClosed), "onClosed-callback"),
218 WrapGuestFunction(GuestType(guest_callbacks->onReady), "onReady-callback"),
219 WrapGuestFunction(GuestType(guest_callbacks->onActive), "onActive-callback"),
220 };
221
222 return host_callbacks;
223 }
224
ToHostACameraDevice_StateCallbacks(const ACameraDevice_StateCallbacks * guest_callbacks,ACameraDevice_StateCallbacks * host_callbacks)225 ACameraDevice_StateCallbacks* ToHostACameraDevice_StateCallbacks(
226 const ACameraDevice_StateCallbacks* guest_callbacks,
227 ACameraDevice_StateCallbacks* host_callbacks) {
228 if (guest_callbacks == nullptr) {
229 return nullptr;
230 }
231
232 *host_callbacks = {
233 guest_callbacks->context,
234 // typedef void (*ACameraDevice_StateCallback)(void* context, ACameraDevice* device);
235 WrapGuestFunction(GuestType(guest_callbacks->onDisconnected), "onDisconnected-callback"),
236 // typedef void (*ACameraDevice_ErrorStateCallback)(void* context,
237 // ACameraDevice* device,
238 // int error);
239 WrapGuestFunction(GuestType(guest_callbacks->onError), "onError-callback"),
240
241 };
242
243 return host_callbacks;
244 }
245
DoThunk_ACameraCaptureSession_capture(ACameraCaptureSession * session,ACameraCaptureSession_captureCallbacks * callbacks,int numRequests,ACaptureRequest ** requests,int * captureSequenceId)246 camera_status_t DoThunk_ACameraCaptureSession_capture(
247 ACameraCaptureSession* session,
248 ACameraCaptureSession_captureCallbacks* callbacks,
249 int numRequests,
250 ACaptureRequest** requests,
251 int* captureSequenceId) {
252 ACameraCaptureSession_captureCallbacks host_callbacks_holder;
253 auto host_callbacks =
254 ToHostACameraCaptureSession_captureCallbacks(callbacks, &host_callbacks_holder);
255 return ACameraCaptureSession_capture(
256 session, host_callbacks, numRequests, requests, captureSequenceId);
257 }
258
DoThunk_ACameraCaptureSession_captureV2(ACameraCaptureSession * session,ACameraCaptureSession_captureCallbacksV2 * callbacks,int numRequests,ACaptureRequest ** requests,int * captureSequenceId)259 camera_status_t DoThunk_ACameraCaptureSession_captureV2(
260 ACameraCaptureSession* session,
261 ACameraCaptureSession_captureCallbacksV2* callbacks,
262 int numRequests,
263 ACaptureRequest** requests,
264 int* captureSequenceId) {
265 ACameraCaptureSession_captureCallbacksV2 host_callbacks_holder;
266 auto host_callbacks =
267 ToHostACameraCaptureSession_captureCallbacksV2(callbacks, &host_callbacks_holder);
268 return ACameraCaptureSession_captureV2(
269 session, host_callbacks, numRequests, requests, captureSequenceId);
270 }
271
DoThunk_ACameraCaptureSession_setRepeatingRequest(ACameraCaptureSession * session,ACameraCaptureSession_captureCallbacks * callbacks,int numRequests,ACaptureRequest ** requests,int * captureSequenceId)272 camera_status_t DoThunk_ACameraCaptureSession_setRepeatingRequest(
273 ACameraCaptureSession* session,
274 ACameraCaptureSession_captureCallbacks* callbacks,
275 int numRequests,
276 ACaptureRequest** requests,
277 int* captureSequenceId) {
278 ACameraCaptureSession_captureCallbacks host_callbacks_holder;
279 auto host_callbacks =
280 ToHostACameraCaptureSession_captureCallbacks(callbacks, &host_callbacks_holder);
281 return ACameraCaptureSession_setRepeatingRequest(
282 session, host_callbacks, numRequests, requests, captureSequenceId);
283 }
284
DoThunk_ACameraCaptureSession_setRepeatingRequestV2(ACameraCaptureSession * session,ACameraCaptureSession_captureCallbacksV2 * callbacks,int numRequests,ACaptureRequest ** requests,int * captureSequenceId)285 camera_status_t DoThunk_ACameraCaptureSession_setRepeatingRequestV2(
286 ACameraCaptureSession* session,
287 ACameraCaptureSession_captureCallbacksV2* callbacks,
288 int numRequests,
289 ACaptureRequest** requests,
290 int* captureSequenceId) {
291 ACameraCaptureSession_captureCallbacksV2 host_callbacks_holder;
292 auto host_callbacks =
293 ToHostACameraCaptureSession_captureCallbacksV2(callbacks, &host_callbacks_holder);
294 return ACameraCaptureSession_setRepeatingRequestV2(
295 session, host_callbacks, numRequests, requests, captureSequenceId);
296 }
297
DoThunk_ACameraCaptureSession_logicalCamera_capture(ACameraCaptureSession * session,ACameraCaptureSession_logicalCamera_captureCallbacks * callbacks,int numRequests,ACaptureRequest ** requests,int * captureSequenceId)298 camera_status_t DoThunk_ACameraCaptureSession_logicalCamera_capture(
299 ACameraCaptureSession* session,
300 ACameraCaptureSession_logicalCamera_captureCallbacks* callbacks,
301 int numRequests,
302 ACaptureRequest** requests,
303 int* captureSequenceId) {
304 ACameraCaptureSession_logicalCamera_captureCallbacks host_callbacks_holder;
305 auto host_callbacks =
306 ToHostACameraCaptureSession_logicalCamera_captureCallbacks(callbacks, &host_callbacks_holder);
307 return ACameraCaptureSession_logicalCamera_capture(
308 session, host_callbacks, numRequests, requests, captureSequenceId);
309 }
310
DoThunk_ACameraCaptureSession_logicalCamera_captureV2(ACameraCaptureSession * session,ACameraCaptureSession_logicalCamera_captureCallbacksV2 * callbacks,int numRequests,ACaptureRequest ** requests,int * captureSequenceId)311 camera_status_t DoThunk_ACameraCaptureSession_logicalCamera_captureV2(
312 ACameraCaptureSession* session,
313 ACameraCaptureSession_logicalCamera_captureCallbacksV2* callbacks,
314 int numRequests,
315 ACaptureRequest** requests,
316 int* captureSequenceId) {
317 ACameraCaptureSession_logicalCamera_captureCallbacksV2 host_callbacks_holder;
318 auto host_callbacks = ToHostACameraCaptureSession_logicalCamera_captureCallbacksV2(
319 callbacks, &host_callbacks_holder);
320 return ACameraCaptureSession_logicalCamera_captureV2(
321 session, host_callbacks, numRequests, requests, captureSequenceId);
322 }
323
DoThunk_ACameraCaptureSession_logicalCamera_setRepeatingRequest(ACameraCaptureSession * session,ACameraCaptureSession_logicalCamera_captureCallbacks * callbacks,int numRequests,ACaptureRequest ** requests,int * captureSequenceId)324 camera_status_t DoThunk_ACameraCaptureSession_logicalCamera_setRepeatingRequest(
325 ACameraCaptureSession* session,
326 ACameraCaptureSession_logicalCamera_captureCallbacks* callbacks,
327 int numRequests,
328 ACaptureRequest** requests,
329 int* captureSequenceId) {
330 ACameraCaptureSession_logicalCamera_captureCallbacks host_callbacks_holder;
331 auto host_callbacks =
332 ToHostACameraCaptureSession_logicalCamera_captureCallbacks(callbacks, &host_callbacks_holder);
333 return ACameraCaptureSession_logicalCamera_setRepeatingRequest(
334 session, host_callbacks, numRequests, requests, captureSequenceId);
335 }
336
DoThunk_ACameraCaptureSession_logicalCamera_setRepeatingRequestV2(ACameraCaptureSession * session,ACameraCaptureSession_logicalCamera_captureCallbacksV2 * callbacks,int numRequests,ACaptureRequest ** requests,int * captureSequenceId)337 camera_status_t DoThunk_ACameraCaptureSession_logicalCamera_setRepeatingRequestV2(
338 ACameraCaptureSession* session,
339 ACameraCaptureSession_logicalCamera_captureCallbacksV2* callbacks,
340 int numRequests,
341 ACaptureRequest** requests,
342 int* captureSequenceId) {
343 ACameraCaptureSession_logicalCamera_captureCallbacksV2 host_callbacks_holder;
344 auto host_callbacks = ToHostACameraCaptureSession_logicalCamera_captureCallbacksV2(
345 callbacks, &host_callbacks_holder);
346 return ACameraCaptureSession_logicalCamera_setRepeatingRequestV2(
347 session, host_callbacks, numRequests, requests, captureSequenceId);
348 }
349
DoThunk_ACameraDevice_createCaptureSession(ACameraDevice * device,const ACaptureSessionOutputContainer * outputs,const ACameraCaptureSession_stateCallbacks * callbacks,ACameraCaptureSession ** session)350 camera_status_t DoThunk_ACameraDevice_createCaptureSession(
351 ACameraDevice* device,
352 const ACaptureSessionOutputContainer* outputs,
353 const ACameraCaptureSession_stateCallbacks* callbacks,
354 ACameraCaptureSession** session) {
355 ACameraCaptureSession_stateCallbacks host_callbacks_holder;
356 auto host_callbacks =
357 ToHostACameraCaptureSession_stateCallbacks(callbacks, &host_callbacks_holder);
358 return ACameraDevice_createCaptureSession(device, outputs, host_callbacks, session);
359 }
360
DoThunk_ACameraDevice_createCaptureSessionWithSessionParameters(ACameraDevice * device,const ACaptureSessionOutputContainer * outputs,const ACaptureRequest * sessionParameters,const ACameraCaptureSession_stateCallbacks * callbacks,ACameraCaptureSession ** session)361 camera_status_t DoThunk_ACameraDevice_createCaptureSessionWithSessionParameters(
362 ACameraDevice* device,
363 const ACaptureSessionOutputContainer* outputs,
364 const ACaptureRequest* sessionParameters,
365 const ACameraCaptureSession_stateCallbacks* callbacks,
366 ACameraCaptureSession** session) {
367 ACameraCaptureSession_stateCallbacks host_callbacks_holder;
368 auto host_callbacks =
369 ToHostACameraCaptureSession_stateCallbacks(callbacks, &host_callbacks_holder);
370 return ACameraDevice_createCaptureSessionWithSessionParameters(
371 device, outputs, sessionParameters, host_callbacks, session);
372 }
373
DoThunk_ACameraManager_openCamera(ACameraManager * manager,const char * cameraId,ACameraDevice_StateCallbacks * callbacks,ACameraDevice ** device)374 camera_status_t DoThunk_ACameraManager_openCamera(ACameraManager* manager,
375 const char* cameraId,
376 ACameraDevice_StateCallbacks* callbacks,
377 ACameraDevice** device) {
378 ACameraDevice_StateCallbacks host_callbacks_holder;
379 auto host_callbacks = ToHostACameraDevice_StateCallbacks(callbacks, &host_callbacks_holder);
380 return ACameraManager_openCamera(manager, cameraId, host_callbacks, device);
381 }
382
DoThunk_ACameraManager_registerAvailabilityCallback(ACameraManager * opaque_manager,const ACameraManager_AvailabilityCallbacks * guest_callback)383 camera_status_t DoThunk_ACameraManager_registerAvailabilityCallback(
384 ACameraManager* opaque_manager,
385 const ACameraManager_AvailabilityCallbacks* guest_callback) {
386 ACameraManager_AvailabilityCallbacks host_callback_holder;
387 const auto host_callback =
388 ToHostACameraManager_AvailabilityCallbacks(guest_callback, &host_callback_holder);
389 return ACameraManager_registerAvailabilityCallback(opaque_manager, host_callback);
390 }
391
DoThunk_ACameraManager_unregisterAvailabilityCallback(ACameraManager * opaque_manager,const ACameraManager_AvailabilityCallbacks * guest_callback)392 camera_status_t DoThunk_ACameraManager_unregisterAvailabilityCallback(
393 ACameraManager* opaque_manager,
394 const ACameraManager_AvailabilityCallbacks* guest_callback) {
395 // Note, if guest callbacks are the same as registered, we will find them
396 // in wrapper cache. If not, we'll wrap what we have and let host
397 // unregisterator decide how to interpret this invalid input (it currently
398 // ignores unregistered callbacks).
399 ACameraManager_AvailabilityCallbacks host_callback_holder;
400 const auto host_callback =
401 ToHostACameraManager_AvailabilityCallbacks(guest_callback, &host_callback_holder);
402 return ACameraManager_unregisterAvailabilityCallback(opaque_manager, host_callback);
403 }
404
DoThunk_ACameraManager_registerExtendedAvailabilityCallback(ACameraManager * opaque_manager,const ACameraManager_ExtendedAvailabilityCallbacks * guest_callback)405 camera_status_t DoThunk_ACameraManager_registerExtendedAvailabilityCallback(
406 ACameraManager* opaque_manager,
407 const ACameraManager_ExtendedAvailabilityCallbacks* guest_callback) {
408 ACameraManager_ExtendedAvailabilityCallbacks host_callback_holder;
409 const auto host_callback =
410 ToHostACameraManager_ExtendedAvailabilityCallbacks(guest_callback, &host_callback_holder);
411 return ACameraManager_registerExtendedAvailabilityCallback(opaque_manager, host_callback);
412 }
413
DoThunk_ACameraManager_unregisterExtendedAvailabilityCallback(ACameraManager * opaque_manager,const ACameraManager_ExtendedAvailabilityCallbacks * guest_callback)414 camera_status_t DoThunk_ACameraManager_unregisterExtendedAvailabilityCallback(
415 ACameraManager* opaque_manager,
416 const ACameraManager_ExtendedAvailabilityCallbacks* guest_callback) {
417 // See comment inside DoThunk_ACameraManager_unregisterAvailabilityCallback.
418 ACameraManager_ExtendedAvailabilityCallbacks host_callback_holder;
419 const auto host_callback =
420 ToHostACameraManager_ExtendedAvailabilityCallbacks(guest_callback, &host_callback_holder);
421 return ACameraManager_unregisterExtendedAvailabilityCallback(opaque_manager, host_callback);
422 }
423
424 #if defined(NATIVE_BRIDGE_GUEST_ARCH_ARM) && defined(__i386__)
425
426 #include "trampolines_arm_to_x86-inl.h" // generated file NOLINT [build/include]
427
428 #elif defined(NATIVE_BRIDGE_GUEST_ARCH_ARM64) && defined(__x86_64__)
429
430 #include "trampolines_arm64_to_x86_64-inl.h" // generated file NOLINT [build/include]
431
432 #elif defined(NATIVE_BRIDGE_GUEST_ARCH_RISCV64) && defined(__x86_64__)
433
434 #include "trampolines_riscv64_to_x86_64-inl.h" // generated file NOLINT [build/include]
435
436 #else
437
438 #error "Unknown guest/host arch combination"
439
440 #endif
441
442 DEFINE_INIT_PROXY_LIBRARY("libcamera2ndk.so")
443
444 } // namespace
445
446 } // namespace berberis
447