1 // Copyright 2018 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "device/vr/android/arcore/arcore_shim.h"
6 
7 #include <dlfcn.h>
8 
9 #include "base/android/android_hardware_buffer_compat.h"
10 #include "base/android/build_info.h"
11 #include "base/logging.h"
12 #include "device/vr/android/arcore/arcore_sdk.h"
13 
14 namespace {
15 
16 // Run DO macro for every function defined in the API.
17 #define FOR_EACH_API_FN(DO)                                        \
18   DO(ArAnchor_detach)                                              \
19   DO(ArAnchor_getPose)                                             \
20   DO(ArAnchor_getTrackingState)                                    \
21   DO(ArAnchor_release)                                             \
22   DO(ArAnchorList_acquireItem)                                     \
23   DO(ArAnchorList_create)                                          \
24   DO(ArAnchorList_destroy)                                         \
25   DO(ArAnchorList_getSize)                                         \
26   DO(ArAugmentedImage_getCenterPose)                               \
27   DO(ArAugmentedImage_getExtentX)                                  \
28   DO(ArAugmentedImage_getIndex)                                    \
29   DO(ArAugmentedImage_getTrackingMethod)                           \
30   DO(ArAugmentedImageDatabase_addImageWithPhysicalSize)            \
31   DO(ArAugmentedImageDatabase_create)                              \
32   DO(ArAugmentedImageDatabase_getNumImages)                        \
33   DO(ArCamera_getDisplayOrientedPose)                              \
34   DO(ArCamera_getProjectionMatrix)                                 \
35   DO(ArCamera_getTrackingState)                                    \
36   DO(ArCamera_getViewMatrix)                                       \
37   DO(ArCameraConfig_create)                                        \
38   DO(ArCameraConfig_destroy)                                       \
39   DO(ArCameraConfig_getDepthSensorUsage)                           \
40   DO(ArCameraConfig_getFacingDirection)                            \
41   DO(ArCameraConfig_getFpsRange)                                   \
42   DO(ArCameraConfig_getImageDimensions)                            \
43   DO(ArCameraConfig_getTextureDimensions)                          \
44   DO(ArCameraConfigFilter_create)                                  \
45   DO(ArCameraConfigFilter_destroy)                                 \
46   DO(ArCameraConfigFilter_setDepthSensorUsage)                     \
47   DO(ArCameraConfigFilter_setTargetFps)                            \
48   DO(ArCameraConfigList_create)                                    \
49   DO(ArCameraConfigList_destroy)                                   \
50   DO(ArCameraConfigList_getItem)                                   \
51   DO(ArCameraConfigList_getSize)                                   \
52   DO(ArConfig_create)                                              \
53   DO(ArConfig_destroy)                                             \
54   DO(ArConfig_getDepthMode)                                        \
55   DO(ArConfig_getLightEstimationMode)                              \
56   DO(ArConfig_setAugmentedImageDatabase)                           \
57   DO(ArConfig_setDepthMode)                                        \
58   DO(ArConfig_setFocusMode)                                        \
59   DO(ArConfig_setLightEstimationMode)                              \
60   DO(ArFrame_acquireCamera)                                        \
61   DO(ArFrame_acquireDepthImage)                                    \
62   DO(ArFrame_create)                                               \
63   DO(ArFrame_destroy)                                              \
64   DO(ArFrame_getLightEstimate)                                     \
65   DO(ArFrame_getTimestamp)                                         \
66   DO(ArFrame_getUpdatedAnchors)                                    \
67   DO(ArFrame_getUpdatedTrackables)                                 \
68   DO(ArFrame_hitTestRay)                                           \
69   DO(ArFrame_transformCoordinates2d)                               \
70   DO(ArHitResult_acquireTrackable)                                 \
71   DO(ArHitResult_create)                                           \
72   DO(ArHitResult_destroy)                                          \
73   DO(ArHitResult_getHitPose)                                       \
74   DO(ArHitResultList_create)                                       \
75   DO(ArHitResultList_destroy)                                      \
76   DO(ArHitResultList_getItem)                                      \
77   DO(ArHitResultList_getSize)                                      \
78   DO(ArImage_getFormat)                                            \
79   DO(ArImage_getHeight)                                            \
80   DO(ArImage_getNumberOfPlanes)                                    \
81   DO(ArImage_getPlaneData)                                         \
82   DO(ArImage_getPlanePixelStride)                                  \
83   DO(ArImage_getPlaneRowStride)                                    \
84   DO(ArImage_getTimestamp)                                         \
85   DO(ArImage_getWidth)                                             \
86   DO(ArImage_release)                                              \
87   DO(ArLightEstimate_acquireEnvironmentalHdrCubemap)               \
88   DO(ArLightEstimate_create)                                       \
89   DO(ArLightEstimate_destroy)                                      \
90   DO(ArLightEstimate_getEnvironmentalHdrAmbientSphericalHarmonics) \
91   DO(ArLightEstimate_getEnvironmentalHdrMainLightDirection)        \
92   DO(ArLightEstimate_getEnvironmentalHdrMainLightIntensity)        \
93   DO(ArLightEstimate_getState)                                     \
94   DO(ArLightEstimate_getTimestamp)                                 \
95   DO(ArPlane_acquireSubsumedBy)                                    \
96   DO(ArPlane_getCenterPose)                                        \
97   DO(ArPlane_getPolygon)                                           \
98   DO(ArPlane_getPolygonSize)                                       \
99   DO(ArPlane_getType)                                              \
100   DO(ArPlane_isPoseInPolygon)                                      \
101   DO(ArPose_create)                                                \
102   DO(ArPose_destroy)                                               \
103   DO(ArPose_getMatrix)                                             \
104   DO(ArPose_getPoseRaw)                                            \
105   DO(ArSession_acquireNewAnchor)                                   \
106   DO(ArSession_configure)                                          \
107   DO(ArSession_create)                                             \
108   DO(ArSession_destroy)                                            \
109   DO(ArSession_enableIncognitoMode_private)                        \
110   DO(ArSession_getAllAnchors)                                      \
111   DO(ArSession_getAllTrackables)                                   \
112   DO(ArSession_getSupportedCameraConfigsWithFilter)                \
113   DO(ArSession_pause)                                              \
114   DO(ArSession_resume)                                             \
115   DO(ArSession_setCameraConfig)                                    \
116   DO(ArSession_setCameraTextureName)                               \
117   DO(ArSession_setDisplayGeometry)                                 \
118   DO(ArSession_update)                                             \
119   DO(ArTrackable_acquireNewAnchor)                                 \
120   DO(ArTrackable_getTrackingState)                                 \
121   DO(ArTrackable_getType)                                          \
122   DO(ArTrackable_release)                                          \
123   DO(ArTrackableList_acquireItem)                                  \
124   DO(ArTrackableList_create)                                       \
125   DO(ArTrackableList_destroy)                                      \
126   DO(ArTrackableList_getSize)
127 
128 struct ArCoreApi {
129   // Generate a function pointer field for every ArCore API function.
130 #define GEN_FN_PTR(fn) decltype(&fn) impl_##fn = nullptr;
131   FOR_EACH_API_FN(GEN_FN_PTR)
132 #undef GEN_FN_PTR
133 };
134 
135 template <typename Fn>
LoadFunction(void * handle,const char * function_name,Fn * fn_out)136 void LoadFunction(void* handle, const char* function_name, Fn* fn_out) {
137   void* fn = dlsym(handle, function_name);
138   if (!fn) {
139     return;
140   }
141 
142   *fn_out = reinterpret_cast<Fn>(fn);
143 }
144 
LoadArCoreApi(void * handle,ArCoreApi * api)145 void LoadArCoreApi(void* handle, ArCoreApi* api) {
146   // Initialize each ArCoreApi function pointer field from the DLL
147 #define LOAD_FN_PTR(fn) LoadFunction(handle, #fn, &api->impl_##fn);
148   FOR_EACH_API_FN(LOAD_FN_PTR)
149 #undef LOAD_FN_PTR
150 }
151 
152 #undef FOR_EACH_API_FN
153 
154 void* g_sdk_handle = nullptr;
155 ArCoreApi* g_arcore_api = nullptr;
156 
157 }  // namespace
158 
159 namespace vr {
160 
LoadArCoreSdk(const std::string & libraryPath)161 bool LoadArCoreSdk(const std::string& libraryPath) {
162   if (g_arcore_api)
163     return true;
164 
165   auto* sdk_handle = dlopen(libraryPath.c_str(), RTLD_GLOBAL | RTLD_NOW);
166   if (!sdk_handle) {
167     char* error_string = dlerror();
168     LOG(ERROR) << "Could not open libarcore_sdk_c.so: " << error_string;
169     return false;
170   } else {
171     VLOG(2) << "Opened shim shared library.";
172   }
173 
174   // TODO(https://crbug.com/914999): check SDK version.
175   auto* arcore_api = new ArCoreApi();
176   LoadArCoreApi(sdk_handle, arcore_api);
177 
178   g_sdk_handle = sdk_handle;
179   g_arcore_api = arcore_api;
180   return true;
181 }
182 
IsArCoreSupported()183 bool IsArCoreSupported() {
184   return base::android::BuildInfo::GetInstance()->sdk_int() >=
185          base::android::SDK_VERSION_NOUGAT;
186 }
187 
188 }  // namespace vr
189 
ArAnchor_detach(ArSession * session,ArAnchor * anchor)190 void ArAnchor_detach(ArSession* session, ArAnchor* anchor) {
191   return g_arcore_api->impl_ArAnchor_detach(session, anchor);
192 }
193 
ArAnchor_getPose(const ArSession * session,const ArAnchor * anchor,ArPose * out_pose)194 void ArAnchor_getPose(const ArSession* session,
195                       const ArAnchor* anchor,
196                       ArPose* out_pose) {
197   return g_arcore_api->impl_ArAnchor_getPose(session, anchor, out_pose);
198 }
199 
ArAnchor_getTrackingState(const ArSession * session,const ArAnchor * anchor,ArTrackingState * out_tracking_state)200 void ArAnchor_getTrackingState(const ArSession* session,
201                                const ArAnchor* anchor,
202                                ArTrackingState* out_tracking_state) {
203   return g_arcore_api->impl_ArAnchor_getTrackingState(session, anchor,
204                                                       out_tracking_state);
205 }
206 
ArAnchor_release(ArAnchor * anchor)207 void ArAnchor_release(ArAnchor* anchor) {
208   g_arcore_api->impl_ArAnchor_release(anchor);
209 }
210 
ArAnchorList_acquireItem(const ArSession * session,const ArAnchorList * anchor_list,int32_t index,ArAnchor ** out_anchor)211 void ArAnchorList_acquireItem(const ArSession* session,
212                               const ArAnchorList* anchor_list,
213                               int32_t index,
214                               ArAnchor** out_anchor) {
215   return g_arcore_api->impl_ArAnchorList_acquireItem(session, anchor_list,
216                                                      index, out_anchor);
217 }
218 
ArAnchorList_create(const ArSession * session,ArAnchorList ** out_anchor_list)219 void ArAnchorList_create(const ArSession* session,
220                          ArAnchorList** out_anchor_list) {
221   return g_arcore_api->impl_ArAnchorList_create(session, out_anchor_list);
222 }
223 
ArAnchorList_destroy(ArAnchorList * anchor_list)224 void ArAnchorList_destroy(ArAnchorList* anchor_list) {
225   g_arcore_api->impl_ArAnchorList_destroy(anchor_list);
226 }
227 
ArAnchorList_getSize(const ArSession * session,const ArAnchorList * anchor_list,int32_t * out_size)228 void ArAnchorList_getSize(const ArSession* session,
229                           const ArAnchorList* anchor_list,
230                           int32_t* out_size) {
231   return g_arcore_api->impl_ArAnchorList_getSize(session, anchor_list,
232                                                  out_size);
233 }
234 
ArAugmentedImage_getCenterPose(const ArSession * session,const ArAugmentedImage * augmented_image,ArPose * out_pose)235 void ArAugmentedImage_getCenterPose(const ArSession* session,
236                                     const ArAugmentedImage* augmented_image,
237                                     ArPose* out_pose) {
238   g_arcore_api->impl_ArAugmentedImage_getCenterPose(session, augmented_image,
239                                                     out_pose);
240 }
241 
ArAugmentedImage_getExtentX(const ArSession * session,const ArAugmentedImage * augmented_image,float * out_extent_x)242 void ArAugmentedImage_getExtentX(const ArSession* session,
243                                  const ArAugmentedImage* augmented_image,
244                                  float* out_extent_x) {
245   g_arcore_api->impl_ArAugmentedImage_getExtentX(session, augmented_image,
246                                                  out_extent_x);
247 }
248 
ArAugmentedImage_getIndex(const ArSession * session,const ArAugmentedImage * augmented_image,int32_t * out_index)249 void ArAugmentedImage_getIndex(const ArSession* session,
250                                const ArAugmentedImage* augmented_image,
251                                int32_t* out_index) {
252   g_arcore_api->impl_ArAugmentedImage_getIndex(session, augmented_image,
253                                                out_index);
254 }
255 
ArAugmentedImage_getTrackingMethod(const ArSession * session,const ArAugmentedImage * image,ArAugmentedImageTrackingMethod * out_tracking_method)256 void ArAugmentedImage_getTrackingMethod(
257     const ArSession* session,
258     const ArAugmentedImage* image,
259     ArAugmentedImageTrackingMethod* out_tracking_method) {
260   return g_arcore_api->impl_ArAugmentedImage_getTrackingMethod(
261       session, image, out_tracking_method);
262 }
263 
ArAugmentedImageDatabase_addImageWithPhysicalSize(const ArSession * session,ArAugmentedImageDatabase * augmented_image_database,const char * image_name,const uint8_t * image_grayscale_pixels,int32_t image_width_in_pixels,int32_t image_height_in_pixels,int32_t image_stride_in_pixels,float image_width_in_meters,int32_t * out_index)264 ArStatus ArAugmentedImageDatabase_addImageWithPhysicalSize(
265     const ArSession* session,
266     ArAugmentedImageDatabase* augmented_image_database,
267     const char* image_name,
268     const uint8_t* image_grayscale_pixels,
269     int32_t image_width_in_pixels,
270     int32_t image_height_in_pixels,
271     int32_t image_stride_in_pixels,
272     float image_width_in_meters,
273     int32_t* out_index) {
274   return g_arcore_api->impl_ArAugmentedImageDatabase_addImageWithPhysicalSize(
275       session, augmented_image_database, image_name, image_grayscale_pixels,
276       image_width_in_pixels, image_height_in_pixels, image_stride_in_pixels,
277       image_width_in_meters, out_index);
278 }
279 
ArAugmentedImageDatabase_create(const ArSession * session,ArAugmentedImageDatabase ** out_augmented_image_database)280 void ArAugmentedImageDatabase_create(
281     const ArSession* session,
282     ArAugmentedImageDatabase** out_augmented_image_database) {
283   g_arcore_api->impl_ArAugmentedImageDatabase_create(
284       session, out_augmented_image_database);
285 }
286 
ArAugmentedImageDatabase_getNumImages(const ArSession * session,const ArAugmentedImageDatabase * augmented_image_database,int32_t * out_number_of_images)287 void ArAugmentedImageDatabase_getNumImages(
288     const ArSession* session,
289     const ArAugmentedImageDatabase* augmented_image_database,
290     int32_t* out_number_of_images) {
291   g_arcore_api->impl_ArAugmentedImageDatabase_getNumImages(
292       session, augmented_image_database, out_number_of_images);
293 }
294 
ArCamera_getDisplayOrientedPose(const ArSession * session,const ArCamera * camera,ArPose * out_pose)295 void ArCamera_getDisplayOrientedPose(const ArSession* session,
296                                      const ArCamera* camera,
297                                      ArPose* out_pose) {
298   return g_arcore_api->impl_ArCamera_getDisplayOrientedPose(session, camera,
299                                                             out_pose);
300 }
301 
ArCamera_getProjectionMatrix(const ArSession * session,const ArCamera * camera,float near,float far,float * dest_col_major_4x4)302 void ArCamera_getProjectionMatrix(const ArSession* session,
303                                   const ArCamera* camera,
304                                   float near,
305                                   float far,
306                                   float* dest_col_major_4x4) {
307   return g_arcore_api->impl_ArCamera_getProjectionMatrix(
308       session, camera, near, far, dest_col_major_4x4);
309 }
310 
ArCamera_getTrackingState(const ArSession * session,const ArCamera * camera,ArTrackingState * out_tracking_state)311 void ArCamera_getTrackingState(const ArSession* session,
312                                const ArCamera* camera,
313                                ArTrackingState* out_tracking_state) {
314   return g_arcore_api->impl_ArCamera_getTrackingState(session, camera,
315                                                       out_tracking_state);
316 }
317 
ArCamera_getViewMatrix(const ArSession * session,const ArCamera * camera,float * out_matrix)318 void ArCamera_getViewMatrix(const ArSession* session,
319                             const ArCamera* camera,
320                             float* out_matrix) {
321   return g_arcore_api->impl_ArCamera_getViewMatrix(session, camera, out_matrix);
322 }
323 
ArCameraConfig_create(const ArSession * session,ArCameraConfig ** out_camera_config)324 void ArCameraConfig_create(const ArSession* session,
325                            ArCameraConfig** out_camera_config) {
326   return g_arcore_api->impl_ArCameraConfig_create(session, out_camera_config);
327 }
328 
ArCameraConfig_destroy(ArCameraConfig * camera_config)329 void ArCameraConfig_destroy(ArCameraConfig* camera_config) {
330   return g_arcore_api->impl_ArCameraConfig_destroy(camera_config);
331 }
332 
ArCameraConfig_getDepthSensorUsage(const ArSession * session,const ArCameraConfig * camera_config,uint32_t * out_depth_sensor_usage)333 void ArCameraConfig_getDepthSensorUsage(const ArSession* session,
334                                         const ArCameraConfig* camera_config,
335                                         uint32_t* out_depth_sensor_usage) {
336   return g_arcore_api->impl_ArCameraConfig_getDepthSensorUsage(
337       session, camera_config, out_depth_sensor_usage);
338 }
339 
ArCameraConfig_getFacingDirection(const ArSession * session,const ArCameraConfig * camera_config,ArCameraConfigFacingDirection * out_facing)340 void ArCameraConfig_getFacingDirection(
341     const ArSession* session,
342     const ArCameraConfig* camera_config,
343     ArCameraConfigFacingDirection* out_facing) {
344   return g_arcore_api->impl_ArCameraConfig_getFacingDirection(
345       session, camera_config, out_facing);
346 }
347 
ArCameraConfig_getFpsRange(const ArSession * session,const ArCameraConfig * camera_config,int32_t * out_min_fps,int32_t * out_max_fps)348 void ArCameraConfig_getFpsRange(const ArSession* session,
349                                 const ArCameraConfig* camera_config,
350                                 int32_t* out_min_fps,
351                                 int32_t* out_max_fps) {
352   return g_arcore_api->impl_ArCameraConfig_getFpsRange(
353       session, camera_config, out_min_fps, out_max_fps);
354 }
355 
ArCameraConfig_getImageDimensions(const ArSession * session,const ArCameraConfig * camera_config,int32_t * out_width,int32_t * out_height)356 void ArCameraConfig_getImageDimensions(const ArSession* session,
357                                        const ArCameraConfig* camera_config,
358                                        int32_t* out_width,
359                                        int32_t* out_height) {
360   return g_arcore_api->impl_ArCameraConfig_getImageDimensions(
361       session, camera_config, out_width, out_height);
362 }
363 
ArCameraConfig_getTextureDimensions(const ArSession * session,const ArCameraConfig * camera_config,int32_t * out_width,int32_t * out_height)364 void ArCameraConfig_getTextureDimensions(const ArSession* session,
365                                          const ArCameraConfig* camera_config,
366                                          int32_t* out_width,
367                                          int32_t* out_height) {
368   return g_arcore_api->impl_ArCameraConfig_getTextureDimensions(
369       session, camera_config, out_width, out_height);
370 }
371 
ArCameraConfigFilter_create(const ArSession * session,ArCameraConfigFilter ** out_filter)372 void ArCameraConfigFilter_create(const ArSession* session,
373                                  ArCameraConfigFilter** out_filter) {
374   return g_arcore_api->impl_ArCameraConfigFilter_create(session, out_filter);
375 }
376 
ArCameraConfigFilter_destroy(ArCameraConfigFilter * filter)377 void ArCameraConfigFilter_destroy(ArCameraConfigFilter* filter) {
378   return g_arcore_api->impl_ArCameraConfigFilter_destroy(filter);
379 }
380 
ArCameraConfigFilter_setDepthSensorUsage(const ArSession * session,ArCameraConfigFilter * filter,uint32_t depth_sensor_usage_filters)381 void ArCameraConfigFilter_setDepthSensorUsage(
382     const ArSession* session,
383     ArCameraConfigFilter* filter,
384     uint32_t depth_sensor_usage_filters) {
385   return g_arcore_api->impl_ArCameraConfigFilter_setDepthSensorUsage(
386       session, filter, depth_sensor_usage_filters);
387 }
388 
ArCameraConfigFilter_setTargetFps(const ArSession * session,ArCameraConfigFilter * filter,const uint32_t fps_filters)389 void ArCameraConfigFilter_setTargetFps(const ArSession* session,
390                                        ArCameraConfigFilter* filter,
391                                        const uint32_t fps_filters) {
392   return g_arcore_api->impl_ArCameraConfigFilter_setTargetFps(session, filter,
393                                                               fps_filters);
394 }
395 
ArCameraConfigList_create(const ArSession * session,ArCameraConfigList ** out_list)396 void ArCameraConfigList_create(const ArSession* session,
397                                ArCameraConfigList** out_list) {
398   return g_arcore_api->impl_ArCameraConfigList_create(session, out_list);
399 }
400 
ArCameraConfigList_destroy(ArCameraConfigList * list)401 void ArCameraConfigList_destroy(ArCameraConfigList* list) {
402   return g_arcore_api->impl_ArCameraConfigList_destroy(list);
403 }
404 
ArCameraConfigList_getItem(const ArSession * session,const ArCameraConfigList * list,int32_t index,ArCameraConfig * out_camera_config)405 void ArCameraConfigList_getItem(const ArSession* session,
406                                 const ArCameraConfigList* list,
407                                 int32_t index,
408                                 ArCameraConfig* out_camera_config) {
409   return g_arcore_api->impl_ArCameraConfigList_getItem(session, list, index,
410                                                        out_camera_config);
411 }
412 
ArCameraConfigList_getSize(const ArSession * session,const ArCameraConfigList * list,int32_t * out_size)413 void ArCameraConfigList_getSize(const ArSession* session,
414                                 const ArCameraConfigList* list,
415                                 int32_t* out_size) {
416   return g_arcore_api->impl_ArCameraConfigList_getSize(session, list, out_size);
417 }
418 
ArConfig_create(const ArSession * session,ArConfig ** out_config)419 void ArConfig_create(const ArSession* session, ArConfig** out_config) {
420   return g_arcore_api->impl_ArConfig_create(session, out_config);
421 }
422 
ArConfig_destroy(ArConfig * config)423 void ArConfig_destroy(ArConfig* config) {
424   return g_arcore_api->impl_ArConfig_destroy(config);
425 }
426 
ArConfig_getDepthMode(const ArSession * session,const ArConfig * config,ArDepthMode * out_depth_mode)427 void ArConfig_getDepthMode(const ArSession* session,
428                            const ArConfig* config,
429                            ArDepthMode* out_depth_mode) {
430   return g_arcore_api->impl_ArConfig_getDepthMode(session, config,
431                                                   out_depth_mode);
432 }
433 
ArConfig_getLightEstimationMode(const ArSession * session,const ArConfig * config,ArLightEstimationMode * light_estimation_mode)434 void ArConfig_getLightEstimationMode(
435     const ArSession* session,
436     const ArConfig* config,
437     ArLightEstimationMode* light_estimation_mode) {
438   return g_arcore_api->impl_ArConfig_getLightEstimationMode(
439       session, config, light_estimation_mode);
440 }
441 
ArConfig_setAugmentedImageDatabase(const ArSession * session,ArConfig * config,const ArAugmentedImageDatabase * augmented_image_database)442 void ArConfig_setAugmentedImageDatabase(
443     const ArSession* session,
444     ArConfig* config,
445     const ArAugmentedImageDatabase* augmented_image_database) {
446   g_arcore_api->impl_ArConfig_setAugmentedImageDatabase(
447       session, config, augmented_image_database);
448 }
449 
ArConfig_setDepthMode(const ArSession * session,ArConfig * config,ArDepthMode mode)450 void ArConfig_setDepthMode(const ArSession* session,
451                            ArConfig* config,
452                            ArDepthMode mode) {
453   return g_arcore_api->impl_ArConfig_setDepthMode(session, config, mode);
454 }
455 
ArConfig_setFocusMode(const ArSession * session,ArConfig * config,ArFocusMode focus_mode)456 void ArConfig_setFocusMode(const ArSession* session,
457                            ArConfig* config,
458                            ArFocusMode focus_mode) {
459   g_arcore_api->impl_ArConfig_setFocusMode(session, config, focus_mode);
460 }
461 
ArConfig_setLightEstimationMode(const ArSession * session,ArConfig * config,ArLightEstimationMode light_estimation_mode)462 void ArConfig_setLightEstimationMode(
463     const ArSession* session,
464     ArConfig* config,
465     ArLightEstimationMode light_estimation_mode) {
466   return g_arcore_api->impl_ArConfig_setLightEstimationMode(
467       session, config, light_estimation_mode);
468 }
469 
ArFrame_acquireCamera(const ArSession * session,const ArFrame * frame,ArCamera ** out_camera)470 void ArFrame_acquireCamera(const ArSession* session,
471                            const ArFrame* frame,
472                            ArCamera** out_camera) {
473   return g_arcore_api->impl_ArFrame_acquireCamera(session, frame, out_camera);
474 }
475 
ArFrame_acquireDepthImage(const ArSession * session,const ArFrame * frame,ArImage ** out_depth_image)476 ArStatus ArFrame_acquireDepthImage(const ArSession* session,
477                                    const ArFrame* frame,
478                                    ArImage** out_depth_image) {
479   return g_arcore_api->impl_ArFrame_acquireDepthImage(session, frame,
480                                                       out_depth_image);
481 }
482 
ArFrame_create(const ArSession * session,ArFrame ** out_frame)483 void ArFrame_create(const ArSession* session, ArFrame** out_frame) {
484   return g_arcore_api->impl_ArFrame_create(session, out_frame);
485 }
486 
ArFrame_destroy(ArFrame * frame)487 void ArFrame_destroy(ArFrame* frame) {
488   return g_arcore_api->impl_ArFrame_destroy(frame);
489 }
490 
ArFrame_getLightEstimate(const ArSession * session,const ArFrame * frame,ArLightEstimate * out_light_estimate)491 void ArFrame_getLightEstimate(const ArSession* session,
492                               const ArFrame* frame,
493                               ArLightEstimate* out_light_estimate) {
494   return g_arcore_api->impl_ArFrame_getLightEstimate(session, frame,
495                                                      out_light_estimate);
496 }
497 
ArFrame_getTimestamp(const ArSession * session,const ArFrame * frame,int64_t * out_timestamp_ns)498 void ArFrame_getTimestamp(const ArSession* session,
499                           const ArFrame* frame,
500                           int64_t* out_timestamp_ns) {
501   return g_arcore_api->impl_ArFrame_getTimestamp(session, frame,
502                                                  out_timestamp_ns);
503 }
504 
ArFrame_getUpdatedAnchors(const ArSession * session,const ArFrame * frame,ArAnchorList * out_anchor_list)505 void ArFrame_getUpdatedAnchors(const ArSession* session,
506                                const ArFrame* frame,
507                                ArAnchorList* out_anchor_list) {
508   return g_arcore_api->impl_ArFrame_getUpdatedAnchors(session, frame,
509                                                       out_anchor_list);
510 }
511 
ArFrame_getUpdatedTrackables(const ArSession * session,const ArFrame * frame,ArTrackableType filter_type,ArTrackableList * out_trackable_list)512 void ArFrame_getUpdatedTrackables(const ArSession* session,
513                                   const ArFrame* frame,
514                                   ArTrackableType filter_type,
515                                   ArTrackableList* out_trackable_list) {
516   return g_arcore_api->impl_ArFrame_getUpdatedTrackables(
517       session, frame, filter_type, out_trackable_list);
518 }
519 
ArFrame_hitTestRay(const ArSession * session,const ArFrame * frame,const float * ray_origin_3,const float * ray_direction_3,ArHitResultList * out_hit_results)520 void ArFrame_hitTestRay(const ArSession* session,
521                         const ArFrame* frame,
522                         const float* ray_origin_3,
523                         const float* ray_direction_3,
524                         ArHitResultList* out_hit_results) {
525   return g_arcore_api->impl_ArFrame_hitTestRay(
526       session, frame, ray_origin_3, ray_direction_3, out_hit_results);
527 }
528 
ArFrame_transformCoordinates2d(const ArSession * session,const ArFrame * frame,ArCoordinates2dType input_coordinates,int32_t number_of_vertices,const float * vertices_2d,ArCoordinates2dType output_coordinates,float * out_vertices_2d)529 void ArFrame_transformCoordinates2d(const ArSession* session,
530                                     const ArFrame* frame,
531                                     ArCoordinates2dType input_coordinates,
532                                     int32_t number_of_vertices,
533                                     const float* vertices_2d,
534                                     ArCoordinates2dType output_coordinates,
535                                     float* out_vertices_2d) {
536   return g_arcore_api->impl_ArFrame_transformCoordinates2d(
537       session, frame, input_coordinates, number_of_vertices, vertices_2d,
538       output_coordinates, out_vertices_2d);
539 }
540 
ArHitResult_create(const ArSession * session,ArHitResult ** out_hit_result)541 void ArHitResult_create(const ArSession* session,
542                         ArHitResult** out_hit_result) {
543   return g_arcore_api->impl_ArHitResult_create(session, out_hit_result);
544 }
545 
ArHitResult_destroy(ArHitResult * hit_result)546 void ArHitResult_destroy(ArHitResult* hit_result) {
547   return g_arcore_api->impl_ArHitResult_destroy(hit_result);
548 }
549 
ArHitResult_getHitPose(const ArSession * session,const ArHitResult * hit_result,ArPose * out_pose)550 void ArHitResult_getHitPose(const ArSession* session,
551                             const ArHitResult* hit_result,
552                             ArPose* out_pose) {
553   return g_arcore_api->impl_ArHitResult_getHitPose(session, hit_result,
554                                                    out_pose);
555 }
556 
ArHitResult_acquireTrackable(const ArSession * session,const ArHitResult * hit_result,ArTrackable ** out_trackable)557 void ArHitResult_acquireTrackable(const ArSession* session,
558                                   const ArHitResult* hit_result,
559                                   ArTrackable** out_trackable) {
560   return g_arcore_api->impl_ArHitResult_acquireTrackable(session, hit_result,
561                                                          out_trackable);
562 }
563 
ArHitResultList_create(const ArSession * session,ArHitResultList ** out_hit_result_list)564 void ArHitResultList_create(const ArSession* session,
565                             ArHitResultList** out_hit_result_list) {
566   return g_arcore_api->impl_ArHitResultList_create(session,
567                                                    out_hit_result_list);
568 }
569 
ArHitResultList_destroy(ArHitResultList * hit_result_list)570 void ArHitResultList_destroy(ArHitResultList* hit_result_list) {
571   return g_arcore_api->impl_ArHitResultList_destroy(hit_result_list);
572 }
573 
ArHitResultList_getItem(const ArSession * session,const ArHitResultList * hit_result_list,int index,ArHitResult * out_hit_result)574 void ArHitResultList_getItem(const ArSession* session,
575                              const ArHitResultList* hit_result_list,
576                              int index,
577                              ArHitResult* out_hit_result) {
578   return g_arcore_api->impl_ArHitResultList_getItem(session, hit_result_list,
579                                                     index, out_hit_result);
580 }
581 
ArHitResultList_getSize(const ArSession * session,const ArHitResultList * hit_result_list,int * out_size)582 void ArHitResultList_getSize(const ArSession* session,
583                              const ArHitResultList* hit_result_list,
584                              int* out_size) {
585   return g_arcore_api->impl_ArHitResultList_getSize(session, hit_result_list,
586                                                     out_size);
587 }
588 
ArImage_getFormat(const ArSession * session,const ArImage * image,ArImageFormat * out_format)589 void ArImage_getFormat(const ArSession* session,
590                        const ArImage* image,
591                        ArImageFormat* out_format) {
592   return g_arcore_api->impl_ArImage_getFormat(session, image, out_format);
593 }
594 
ArImage_getHeight(const ArSession * session,const ArImage * image,int32_t * out_height)595 void ArImage_getHeight(const ArSession* session,
596                        const ArImage* image,
597                        int32_t* out_height) {
598   return g_arcore_api->impl_ArImage_getHeight(session, image, out_height);
599 }
600 
ArImage_getNumberOfPlanes(const ArSession * session,const ArImage * image,int32_t * out_num_planes)601 void ArImage_getNumberOfPlanes(const ArSession* session,
602                                const ArImage* image,
603                                int32_t* out_num_planes) {
604   return g_arcore_api->impl_ArImage_getNumberOfPlanes(session, image,
605                                                       out_num_planes);
606 }
607 
ArImage_getPlaneData(const ArSession * session,const ArImage * image,int32_t plane_index,const uint8_t ** out_data,int32_t * out_data_length)608 void ArImage_getPlaneData(const ArSession* session,
609                           const ArImage* image,
610                           int32_t plane_index,
611                           const uint8_t** out_data,
612                           int32_t* out_data_length) {
613   return g_arcore_api->impl_ArImage_getPlaneData(session, image, plane_index,
614                                                  out_data, out_data_length);
615 }
616 
ArImage_getPlanePixelStride(const ArSession * session,const ArImage * image,int32_t plane_index,int32_t * out_pixel_stride)617 void ArImage_getPlanePixelStride(const ArSession* session,
618                                  const ArImage* image,
619                                  int32_t plane_index,
620                                  int32_t* out_pixel_stride) {
621   return g_arcore_api->impl_ArImage_getPlanePixelStride(
622       session, image, plane_index, out_pixel_stride);
623 }
624 
ArImage_getPlaneRowStride(const ArSession * session,const ArImage * image,int32_t plane_index,int32_t * out_row_stride)625 void ArImage_getPlaneRowStride(const ArSession* session,
626                                const ArImage* image,
627                                int32_t plane_index,
628                                int32_t* out_row_stride) {
629   return g_arcore_api->impl_ArImage_getPlaneRowStride(
630       session, image, plane_index, out_row_stride);
631 }
632 
ArImage_getTimestamp(const ArSession * session,const ArImage * image,int64_t * out_timestamp_ns)633 void ArImage_getTimestamp(const ArSession* session,
634                           const ArImage* image,
635                           int64_t* out_timestamp_ns) {
636   return g_arcore_api->impl_ArImage_getTimestamp(session, image,
637                                                  out_timestamp_ns);
638 }
639 
ArImage_getWidth(const ArSession * session,const ArImage * image,int32_t * out_width)640 void ArImage_getWidth(const ArSession* session,
641                       const ArImage* image,
642                       int32_t* out_width) {
643   return g_arcore_api->impl_ArImage_getWidth(session, image, out_width);
644 }
645 
ArImage_release(ArImage * image)646 void ArImage_release(ArImage* image) {
647   return g_arcore_api->impl_ArImage_release(image);
648 }
649 
ArLightEstimate_acquireEnvironmentalHdrCubemap(const ArSession * session,const ArLightEstimate * light_estimate,ArImageCubemap out_textures_6)650 void ArLightEstimate_acquireEnvironmentalHdrCubemap(
651     const ArSession* session,
652     const ArLightEstimate* light_estimate,
653     ArImageCubemap out_textures_6) {
654   return g_arcore_api->impl_ArLightEstimate_acquireEnvironmentalHdrCubemap(
655       session, light_estimate, out_textures_6);
656 }
657 
ArLightEstimate_create(const ArSession * session,ArLightEstimate ** out_light_estimate)658 void ArLightEstimate_create(const ArSession* session,
659                             ArLightEstimate** out_light_estimate) {
660   return g_arcore_api->impl_ArLightEstimate_create(session, out_light_estimate);
661 }
662 
ArLightEstimate_destroy(ArLightEstimate * light_estimate)663 void ArLightEstimate_destroy(ArLightEstimate* light_estimate) {
664   return g_arcore_api->impl_ArLightEstimate_destroy(light_estimate);
665 }
666 
ArLightEstimate_getEnvironmentalHdrAmbientSphericalHarmonics(const ArSession * session,const ArLightEstimate * light_estimate,float * out_coefficients_27)667 void ArLightEstimate_getEnvironmentalHdrAmbientSphericalHarmonics(
668     const ArSession* session,
669     const ArLightEstimate* light_estimate,
670     float* out_coefficients_27) {
671   return g_arcore_api
672       ->impl_ArLightEstimate_getEnvironmentalHdrAmbientSphericalHarmonics(
673           session, light_estimate, out_coefficients_27);
674 }
675 
ArLightEstimate_getEnvironmentalHdrMainLightDirection(const ArSession * session,const ArLightEstimate * light_estimate,float * out_direction_3)676 void ArLightEstimate_getEnvironmentalHdrMainLightDirection(
677     const ArSession* session,
678     const ArLightEstimate* light_estimate,
679     float* out_direction_3) {
680   return g_arcore_api
681       ->impl_ArLightEstimate_getEnvironmentalHdrMainLightDirection(
682           session, light_estimate, out_direction_3);
683 }
684 
ArLightEstimate_getEnvironmentalHdrMainLightIntensity(const ArSession * session,const ArLightEstimate * light_estimate,float * out_intensity_3)685 void ArLightEstimate_getEnvironmentalHdrMainLightIntensity(
686     const ArSession* session,
687     const ArLightEstimate* light_estimate,
688     float* out_intensity_3) {
689   return g_arcore_api
690       ->impl_ArLightEstimate_getEnvironmentalHdrMainLightIntensity(
691           session, light_estimate, out_intensity_3);
692 }
693 
ArLightEstimate_getState(const ArSession * session,const ArLightEstimate * light_estimate,ArLightEstimateState * out_light_estimate_state)694 void ArLightEstimate_getState(const ArSession* session,
695                               const ArLightEstimate* light_estimate,
696                               ArLightEstimateState* out_light_estimate_state) {
697   return g_arcore_api->impl_ArLightEstimate_getState(session, light_estimate,
698                                                      out_light_estimate_state);
699 }
700 
ArLightEstimate_getTimestamp(const ArSession * session,const ArLightEstimate * light_estimate,int64_t * out_timestamp_ns)701 void ArLightEstimate_getTimestamp(const ArSession* session,
702                                   const ArLightEstimate* light_estimate,
703                                   int64_t* out_timestamp_ns) {
704   return g_arcore_api->impl_ArLightEstimate_getTimestamp(
705       session, light_estimate, out_timestamp_ns);
706 }
707 
ArPlane_acquireSubsumedBy(const ArSession * session,const ArPlane * plane,ArPlane ** out_subsumed_by)708 void ArPlane_acquireSubsumedBy(const ArSession* session,
709                                const ArPlane* plane,
710                                ArPlane** out_subsumed_by) {
711   return g_arcore_api->impl_ArPlane_acquireSubsumedBy(session, plane,
712                                                       out_subsumed_by);
713 }
714 
ArPlane_getCenterPose(const ArSession * session,const ArPlane * plane,ArPose * out_pose)715 void ArPlane_getCenterPose(const ArSession* session,
716                            const ArPlane* plane,
717                            ArPose* out_pose) {
718   return g_arcore_api->impl_ArPlane_getCenterPose(session, plane, out_pose);
719 }
720 
ArPlane_getPolygon(const ArSession * session,const ArPlane * plane,float * out_polygon_xz)721 void ArPlane_getPolygon(const ArSession* session,
722                         const ArPlane* plane,
723                         float* out_polygon_xz) {
724   return g_arcore_api->impl_ArPlane_getPolygon(session, plane, out_polygon_xz);
725 }
726 
ArPlane_getPolygonSize(const ArSession * session,const ArPlane * plane,int32_t * out_polygon_size)727 void ArPlane_getPolygonSize(const ArSession* session,
728                             const ArPlane* plane,
729                             int32_t* out_polygon_size) {
730   return g_arcore_api->impl_ArPlane_getPolygonSize(session, plane,
731                                                    out_polygon_size);
732 }
733 
ArPlane_getType(const ArSession * session,const ArPlane * plane,ArPlaneType * out_plane_type)734 void ArPlane_getType(const ArSession* session,
735                      const ArPlane* plane,
736                      ArPlaneType* out_plane_type) {
737   return g_arcore_api->impl_ArPlane_getType(session, plane, out_plane_type);
738 }
739 
ArPlane_isPoseInPolygon(const ArSession * session,const ArPlane * plane,const ArPose * pose,int32_t * out_pose_in_polygon)740 void ArPlane_isPoseInPolygon(const ArSession* session,
741                              const ArPlane* plane,
742                              const ArPose* pose,
743                              int32_t* out_pose_in_polygon) {
744   return g_arcore_api->impl_ArPlane_isPoseInPolygon(session, plane, pose,
745                                                     out_pose_in_polygon);
746 }
747 
ArPose_create(const ArSession * session,const float * pose_raw,ArPose ** out_pose)748 void ArPose_create(const ArSession* session,
749                    const float* pose_raw,
750                    ArPose** out_pose) {
751   return g_arcore_api->impl_ArPose_create(session, pose_raw, out_pose);
752 }
753 
ArPose_destroy(ArPose * pose)754 void ArPose_destroy(ArPose* pose) {
755   return g_arcore_api->impl_ArPose_destroy(pose);
756 }
757 
ArPose_getMatrix(const ArSession * session,const ArPose * pose,float * out_matrix)758 void ArPose_getMatrix(const ArSession* session,
759                       const ArPose* pose,
760                       float* out_matrix) {
761   return g_arcore_api->impl_ArPose_getMatrix(session, pose, out_matrix);
762 }
763 
ArPose_getPoseRaw(const ArSession * session,const ArPose * pose,float * out_pose_raw)764 void ArPose_getPoseRaw(const ArSession* session,
765                        const ArPose* pose,
766                        float* out_pose_raw) {
767   return g_arcore_api->impl_ArPose_getPoseRaw(session, pose, out_pose_raw);
768 }
769 
ArSession_acquireNewAnchor(ArSession * session,const ArPose * pose,ArAnchor ** out_anchor)770 ArStatus ArSession_acquireNewAnchor(ArSession* session,
771                                     const ArPose* pose,
772                                     ArAnchor** out_anchor) {
773   return g_arcore_api->impl_ArSession_acquireNewAnchor(session, pose,
774                                                        out_anchor);
775 }
776 
ArSession_configure(ArSession * session,const ArConfig * config)777 ArStatus ArSession_configure(ArSession* session, const ArConfig* config) {
778   return g_arcore_api->impl_ArSession_configure(session, config);
779 }
780 
ArSession_create(void * env,void * application_context,ArSession ** out_session_pointer)781 ArStatus ArSession_create(void* env,
782                           void* application_context,
783                           ArSession** out_session_pointer) {
784   return g_arcore_api->impl_ArSession_create(env, application_context,
785                                              out_session_pointer);
786 }
787 
ArSession_destroy(ArSession * session)788 void ArSession_destroy(ArSession* session) {
789   return g_arcore_api->impl_ArSession_destroy(session);
790 }
791 
ArSession_enableIncognitoMode_private(ArSession * session)792 void ArSession_enableIncognitoMode_private(ArSession* session) {
793   return g_arcore_api->impl_ArSession_enableIncognitoMode_private(session);
794 }
795 
ArSession_getAllAnchors(const ArSession * session,ArAnchorList * out_anchor_list)796 void ArSession_getAllAnchors(const ArSession* session,
797                              ArAnchorList* out_anchor_list) {
798   return g_arcore_api->impl_ArSession_getAllAnchors(session, out_anchor_list);
799 }
800 
ArSession_getAllTrackables(const ArSession * session,ArTrackableType filter_type,ArTrackableList * out_trackable_list)801 void ArSession_getAllTrackables(const ArSession* session,
802                                 ArTrackableType filter_type,
803                                 ArTrackableList* out_trackable_list) {
804   return g_arcore_api->impl_ArSession_getAllTrackables(session, filter_type,
805                                                        out_trackable_list);
806 }
807 
ArSession_getSupportedCameraConfigsWithFilter(const ArSession * session,const ArCameraConfigFilter * filter,ArCameraConfigList * list)808 void ArSession_getSupportedCameraConfigsWithFilter(
809     const ArSession* session,
810     const ArCameraConfigFilter* filter,
811     ArCameraConfigList* list) {
812   return g_arcore_api->impl_ArSession_getSupportedCameraConfigsWithFilter(
813       session, filter, list);
814 }
815 
ArSession_pause(ArSession * session)816 ArStatus ArSession_pause(ArSession* session) {
817   return g_arcore_api->impl_ArSession_pause(session);
818 }
819 
ArSession_resume(ArSession * session)820 ArStatus ArSession_resume(ArSession* session) {
821   return g_arcore_api->impl_ArSession_resume(session);
822 }
823 
ArSession_setCameraConfig(const ArSession * session,const ArCameraConfig * camera_config)824 ArStatus ArSession_setCameraConfig(const ArSession* session,
825                                    const ArCameraConfig* camera_config) {
826   return g_arcore_api->impl_ArSession_setCameraConfig(session, camera_config);
827 }
828 
ArSession_setCameraTextureName(ArSession * session,uint32_t texture_id)829 void ArSession_setCameraTextureName(ArSession* session, uint32_t texture_id) {
830   return g_arcore_api->impl_ArSession_setCameraTextureName(session, texture_id);
831 }
832 
ArSession_setDisplayGeometry(ArSession * session,int32_t rotation,int32_t width,int32_t height)833 void ArSession_setDisplayGeometry(ArSession* session,
834                                   int32_t rotation,
835                                   int32_t width,
836                                   int32_t height) {
837   return g_arcore_api->impl_ArSession_setDisplayGeometry(session, rotation,
838                                                          width, height);
839 }
840 
ArSession_update(ArSession * session,ArFrame * out_frame)841 ArStatus ArSession_update(ArSession* session, ArFrame* out_frame) {
842   return g_arcore_api->impl_ArSession_update(session, out_frame);
843 }
844 
ArTrackable_acquireNewAnchor(ArSession * session,ArTrackable * trackable,ArPose * pose,ArAnchor ** out_anchor)845 ArStatus ArTrackable_acquireNewAnchor(ArSession* session,
846                                       ArTrackable* trackable,
847                                       ArPose* pose,
848                                       ArAnchor** out_anchor) {
849   return g_arcore_api->impl_ArTrackable_acquireNewAnchor(session, trackable,
850                                                          pose, out_anchor);
851 }
852 
ArTrackable_getTrackingState(const ArSession * session,const ArTrackable * trackable,ArTrackingState * out_tracking_state)853 void ArTrackable_getTrackingState(const ArSession* session,
854                                   const ArTrackable* trackable,
855                                   ArTrackingState* out_tracking_state) {
856   return g_arcore_api->impl_ArTrackable_getTrackingState(session, trackable,
857                                                          out_tracking_state);
858 }
859 
ArTrackable_getType(const ArSession * session,const ArTrackable * trackable,ArTrackableType * out_trackable_type)860 void ArTrackable_getType(const ArSession* session,
861                          const ArTrackable* trackable,
862                          ArTrackableType* out_trackable_type) {
863   return g_arcore_api->impl_ArTrackable_getType(session, trackable,
864                                                 out_trackable_type);
865 }
866 
ArTrackable_release(ArTrackable * trackable)867 void ArTrackable_release(ArTrackable* trackable) {
868   return g_arcore_api->impl_ArTrackable_release(trackable);
869 }
870 
ArTrackableList_acquireItem(const ArSession * session,const ArTrackableList * trackable_list,int32_t index,ArTrackable ** out_trackable)871 void ArTrackableList_acquireItem(const ArSession* session,
872                                  const ArTrackableList* trackable_list,
873                                  int32_t index,
874                                  ArTrackable** out_trackable) {
875   return g_arcore_api->impl_ArTrackableList_acquireItem(session, trackable_list,
876                                                         index, out_trackable);
877 }
878 
ArTrackableList_create(const ArSession * session,ArTrackableList ** out_trackable_list)879 void ArTrackableList_create(const ArSession* session,
880                             ArTrackableList** out_trackable_list) {
881   return g_arcore_api->impl_ArTrackableList_create(session, out_trackable_list);
882 }
883 
ArTrackableList_destroy(ArTrackableList * trackable_list)884 void ArTrackableList_destroy(ArTrackableList* trackable_list) {
885   return g_arcore_api->impl_ArTrackableList_destroy(trackable_list);
886 }
887 
ArTrackableList_getSize(const ArSession * session,const ArTrackableList * trackable_list,int32_t * out_size)888 void ArTrackableList_getSize(const ArSession* session,
889                              const ArTrackableList* trackable_list,
890                              int32_t* out_size) {
891   return g_arcore_api->impl_ArTrackableList_getSize(session, trackable_list,
892                                                     out_size);
893 }
894