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/struct_check.h"
25 
26 #if defined(__arm__) || defined(NATIVE_BRIDGE_GUEST_ARCH_ARM)
27 
28 // This is layout we expect from the ACameraManager_AvailabilityCallbacks
29 // TODO: Note that we do not really have a way to test that guest structure layout is
30 // the same (see http://b/78329188 for details)
31 CHECK_STRUCT_LAYOUT(ACameraManager_AvailabilityCallbacks, 96, 32);
32 CHECK_FIELD_LAYOUT(ACameraManager_AvailabilityCallbacks, context, 0, 32);
33 CHECK_FIELD_LAYOUT(ACameraManager_AvailabilityCallbacks, onCameraAvailable, 32, 32);
34 CHECK_FIELD_LAYOUT(ACameraManager_AvailabilityCallbacks, onCameraUnavailable, 64, 32);
35 
36 CHECK_STRUCT_LAYOUT(ACameraManager_ExtendedAvailabilityCallbacks, 320, 32);
37 CHECK_FIELD_LAYOUT(ACameraManager_ExtendedAvailabilityCallbacks, availabilityCallbacks, 0, 96);
38 CHECK_FIELD_LAYOUT(ACameraManager_ExtendedAvailabilityCallbacks,
39                    onCameraAccessPrioritiesChanged,
40                    96,
41                    32);
42 CHECK_FIELD_LAYOUT(ACameraManager_ExtendedAvailabilityCallbacks,
43                    onPhysicalCameraAvailable,
44                    128,
45                    32);
46 CHECK_FIELD_LAYOUT(ACameraManager_ExtendedAvailabilityCallbacks,
47                    onPhysicalCameraUnavailable,
48                    160,
49                    32);
50 CHECK_FIELD_LAYOUT(ACameraManager_ExtendedAvailabilityCallbacks, reserved, 192, 4 * 32);
51 
52 CHECK_STRUCT_LAYOUT(ACameraCaptureSession_captureCallbacks, 256, 32);
53 CHECK_FIELD_LAYOUT(ACameraCaptureSession_captureCallbacks, context, 0, 32);
54 CHECK_FIELD_LAYOUT(ACameraCaptureSession_captureCallbacks, onCaptureStarted, 32, 32);
55 CHECK_FIELD_LAYOUT(ACameraCaptureSession_captureCallbacks, onCaptureProgressed, 64, 32);
56 CHECK_FIELD_LAYOUT(ACameraCaptureSession_captureCallbacks, onCaptureCompleted, 96, 32);
57 CHECK_FIELD_LAYOUT(ACameraCaptureSession_captureCallbacks, onCaptureFailed, 128, 32);
58 CHECK_FIELD_LAYOUT(ACameraCaptureSession_captureCallbacks, onCaptureSequenceCompleted, 160, 32);
59 CHECK_FIELD_LAYOUT(ACameraCaptureSession_captureCallbacks, onCaptureSequenceAborted, 192, 32);
60 CHECK_FIELD_LAYOUT(ACameraCaptureSession_captureCallbacks, onCaptureBufferLost, 224, 32);
61 
62 CHECK_STRUCT_LAYOUT(ACameraCaptureSession_stateCallbacks, 128, 32);
63 CHECK_FIELD_LAYOUT(ACameraCaptureSession_stateCallbacks, context, 0, 32);
64 CHECK_FIELD_LAYOUT(ACameraCaptureSession_stateCallbacks, onClosed, 32, 32);
65 CHECK_FIELD_LAYOUT(ACameraCaptureSession_stateCallbacks, onReady, 64, 32);
66 CHECK_FIELD_LAYOUT(ACameraCaptureSession_stateCallbacks, onActive, 96, 32);
67 
68 CHECK_STRUCT_LAYOUT(ACameraDevice_StateCallbacks, 96, 32);
69 CHECK_FIELD_LAYOUT(ACameraDevice_StateCallbacks, context, 0, 32);
70 CHECK_FIELD_LAYOUT(ACameraDevice_StateCallbacks, onDisconnected, 32, 32);
71 CHECK_FIELD_LAYOUT(ACameraDevice_StateCallbacks, onError, 64, 32);
72 
73 #elif defined(__aarch64__) || defined(NATIVE_BRIDGE_GUEST_ARCH_ARM64) || defined(NATIVE_BRIDGE_GUEST_ARCH_RISCV64)
74 
75 // This is layout we expect from the ACameraManager_AvailabilityCallbacks
76 // TODO: Note that we do not really have a way to test that guest structure layout is
77 // the same (see http://b/78329188 for details)
78 CHECK_STRUCT_LAYOUT(ACameraManager_AvailabilityCallbacks, 192, 64);
79 CHECK_FIELD_LAYOUT(ACameraManager_AvailabilityCallbacks, context, 0, 64);
80 CHECK_FIELD_LAYOUT(ACameraManager_AvailabilityCallbacks, onCameraAvailable, 64, 64);
81 CHECK_FIELD_LAYOUT(ACameraManager_AvailabilityCallbacks, onCameraUnavailable, 128, 64);
82 
83 CHECK_STRUCT_LAYOUT(ACameraManager_ExtendedAvailabilityCallbacks, 640, 64);
84 CHECK_FIELD_LAYOUT(ACameraManager_ExtendedAvailabilityCallbacks, availabilityCallbacks, 0, 192);
85 CHECK_FIELD_LAYOUT(ACameraManager_ExtendedAvailabilityCallbacks,
86                    onCameraAccessPrioritiesChanged,
87                    192,
88                    64);
89 CHECK_FIELD_LAYOUT(ACameraManager_ExtendedAvailabilityCallbacks,
90                    onPhysicalCameraAvailable,
91                    256,
92                    64);
93 CHECK_FIELD_LAYOUT(ACameraManager_ExtendedAvailabilityCallbacks,
94                    onPhysicalCameraUnavailable,
95                    320,
96                    64);
97 CHECK_FIELD_LAYOUT(ACameraManager_ExtendedAvailabilityCallbacks, reserved, 384, 4 * 64);
98 
99 CHECK_STRUCT_LAYOUT(ACameraCaptureSession_captureCallbacks, 512, 64);
100 CHECK_FIELD_LAYOUT(ACameraCaptureSession_captureCallbacks, context, 0, 64);
101 CHECK_FIELD_LAYOUT(ACameraCaptureSession_captureCallbacks, onCaptureStarted, 64, 64);
102 CHECK_FIELD_LAYOUT(ACameraCaptureSession_captureCallbacks, onCaptureProgressed, 128, 64);
103 CHECK_FIELD_LAYOUT(ACameraCaptureSession_captureCallbacks, onCaptureCompleted, 192, 64);
104 CHECK_FIELD_LAYOUT(ACameraCaptureSession_captureCallbacks, onCaptureFailed, 256, 64);
105 CHECK_FIELD_LAYOUT(ACameraCaptureSession_captureCallbacks, onCaptureSequenceCompleted, 320, 64);
106 CHECK_FIELD_LAYOUT(ACameraCaptureSession_captureCallbacks, onCaptureSequenceAborted, 384, 64);
107 CHECK_FIELD_LAYOUT(ACameraCaptureSession_captureCallbacks, onCaptureBufferLost, 448, 64);
108 
109 CHECK_STRUCT_LAYOUT(ACameraCaptureSession_stateCallbacks, 256, 64);
110 CHECK_FIELD_LAYOUT(ACameraCaptureSession_stateCallbacks, context, 0, 64);
111 CHECK_FIELD_LAYOUT(ACameraCaptureSession_stateCallbacks, onClosed, 64, 64);
112 CHECK_FIELD_LAYOUT(ACameraCaptureSession_stateCallbacks, onReady, 128, 64);
113 CHECK_FIELD_LAYOUT(ACameraCaptureSession_stateCallbacks, onActive, 192, 64);
114 
115 CHECK_STRUCT_LAYOUT(ACameraDevice_StateCallbacks, 192, 64);
116 CHECK_FIELD_LAYOUT(ACameraDevice_StateCallbacks, context, 0, 64);
117 CHECK_FIELD_LAYOUT(ACameraDevice_StateCallbacks, onDisconnected, 64, 64);
118 CHECK_FIELD_LAYOUT(ACameraDevice_StateCallbacks, onError, 128, 64);
119 
120 #else
121 
122 #error "Unknown guest/host arch combination"
123 
124 #endif
125 
126 CHECK_STRUCT_LAYOUT(camera_status_t, 32, 32);
127