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