1 #ifndef ANDROID_DVR_API_H_
2 #define ANDROID_DVR_API_H_
3 
4 #include <stdbool.h>
5 #include <stddef.h>
6 #include <stdint.h>
7 #include <unistd.h>
8 #include <cstdio>
9 
10 #include <dvr/dvr_display_types.h>
11 #include <dvr/dvr_hardware_composer_types.h>
12 #include <dvr/dvr_pose.h>
13 #include <dvr/dvr_tracking_types.h>
14 
15 #ifdef __cplusplus
16 extern "C" {
17 #endif
18 
19 #ifdef __GNUC__
20 #define ALIGNED_DVR_STRUCT(x) __attribute__((packed, aligned(x)))
21 #else
22 #define ALIGNED_DVR_STRUCT(x)
23 #endif
24 
25 typedef struct ANativeWindow ANativeWindow;
26 
27 typedef struct DvrPoseAsync DvrPoseAsync;
28 
29 typedef uint64_t DvrSurfaceUpdateFlags;
30 typedef struct DvrDisplayManager DvrDisplayManager;
31 typedef struct DvrSurfaceState DvrSurfaceState;
32 typedef struct DvrPoseClient DvrPoseClient;
33 typedef struct DvrPoseDataCaptureRequest DvrPoseDataCaptureRequest;
34 typedef struct DvrVSyncClient DvrVSyncClient;
35 typedef struct DvrVirtualTouchpad DvrVirtualTouchpad;
36 
37 typedef struct DvrBuffer DvrBuffer;
38 typedef struct DvrWriteBuffer DvrWriteBuffer;
39 typedef struct DvrReadBuffer DvrReadBuffer;
40 typedef struct AHardwareBuffer AHardwareBuffer;
41 
42 typedef struct DvrReadBufferQueue DvrReadBufferQueue;
43 typedef struct DvrWriteBufferQueue DvrWriteBufferQueue;
44 typedef struct DvrNativeBufferMetadata DvrNativeBufferMetadata;
45 
46 typedef struct DvrSurface DvrSurface;
47 typedef uint64_t DvrSurfaceAttributeType;
48 typedef int32_t DvrSurfaceAttributeKey;
49 typedef int32_t DvrGlobalBufferKey;
50 
51 typedef struct DvrSurfaceAttributeValue DvrSurfaceAttributeValue;
52 typedef struct DvrSurfaceAttribute DvrSurfaceAttribute;
53 
54 typedef struct DvrReadBuffer DvrReadBuffer;
55 typedef struct DvrTrackingCamera DvrTrackingCamera;
56 typedef struct DvrTrackingFeatureExtractor DvrTrackingFeatureExtractor;
57 typedef struct DvrTrackingSensors DvrTrackingSensors;
58 typedef struct DvrWriteBufferQueue DvrWriteBufferQueue;
59 
60 // Note: To avoid breaking others during active development, only modify this
61 // struct by appending elements to the end.
62 // If you do feel we should to re-arrange or remove elements, please make a
63 // note of it, and wait until we're about to finalize for an API release to do
64 // so.
65 typedef struct DvrNativeDisplayMetrics {
66   uint32_t display_width;
67   uint32_t display_height;
68   uint32_t display_x_dpi;
69   uint32_t display_y_dpi;
70   uint32_t vsync_period_ns;
71 } DvrNativeDisplayMetrics;
72 
73 // native_handle contains the fds for the underlying ION allocations inside
74 // the gralloc buffer. This is needed temporarily while GPU vendors work on
75 // better support for AHardwareBuffer via glBindSharedBuffer APIs. See
76 // b/37207909. For now we can declare the native_handle struct where it is
77 // used for GPU late latching. See cutils/native_handle.h for the struct layout.
78 struct native_handle;
79 
80 // Device metrics data type enums.
81 enum {
82   // Request the device lens metrics protobuf. This matches cardboard protos.
83   DVR_CONFIGURATION_DATA_LENS_METRICS = 0,
84   // Request the device metrics protobuf.
85   DVR_CONFIGURATION_DATA_DEVICE_METRICS = 1,
86   // Request the per device configuration data file.
87   DVR_CONFIGURATION_DATA_DEVICE_CONFIG = 2,
88 };
89 
90 // dvr_display_manager.h
91 typedef int (*DvrDisplayManagerCreatePtr)(DvrDisplayManager** client_out);
92 typedef void (*DvrDisplayManagerDestroyPtr)(DvrDisplayManager* client);
93 typedef int (*DvrDisplayManagerGetEventFdPtr)(DvrDisplayManager* client);
94 typedef int (*DvrDisplayManagerTranslateEpollEventMaskPtr)(
95     DvrDisplayManager* client, int in_events, int* out_events);
96 typedef int (*DvrDisplayManagerGetSurfaceStatePtr)(
97     DvrDisplayManager* client, DvrSurfaceState* surface_state);
98 typedef int (*DvrDisplayManagerGetReadBufferQueuePtr)(
99     DvrDisplayManager* client, int surface_id, int queue_id,
100     DvrReadBufferQueue** queue_out);
101 typedef int (*DvrConfigurationDataGetPtr)(int config_type, uint8_t** data,
102                                           size_t* data_size);
103 typedef void (*DvrConfigurationDataDestroyPtr)(uint8_t* data);
104 typedef int (*DvrSurfaceStateCreatePtr)(DvrSurfaceState** surface_state);
105 typedef void (*DvrSurfaceStateDestroyPtr)(DvrSurfaceState* surface_state);
106 typedef int (*DvrSurfaceStateGetSurfaceCountPtr)(DvrSurfaceState* surface_state,
107                                                  size_t* count_out);
108 typedef int (*DvrSurfaceStateGetUpdateFlagsPtr)(
109     DvrSurfaceState* surface_state, size_t surface_index,
110     DvrSurfaceUpdateFlags* flags_out);
111 typedef int (*DvrSurfaceStateGetSurfaceIdPtr)(DvrSurfaceState* surface_state,
112                                               size_t surface_index,
113                                               int* surface_id_out);
114 typedef int (*DvrSurfaceStateGetProcessIdPtr)(DvrSurfaceState* surface_state,
115                                               size_t surface_index,
116                                               int* process_id_out);
117 typedef int (*DvrSurfaceStateGetQueueCountPtr)(DvrSurfaceState* surface_state,
118                                                size_t surface_index,
119                                                size_t* count_out);
120 typedef ssize_t (*DvrSurfaceStateGetQueueIdsPtr)(DvrSurfaceState* surface_state,
121                                                  size_t surface_index,
122                                                  int* queue_ids,
123                                                  size_t max_count);
124 typedef int (*DvrSurfaceStateGetZOrderPtr)(DvrSurfaceState* surface_state,
125                                            size_t surface_index,
126                                            int* z_order_out);
127 typedef int (*DvrSurfaceStateGetVisiblePtr)(DvrSurfaceState* surface_state,
128                                             size_t surface_index,
129                                             bool* visible_out);
130 typedef int (*DvrSurfaceStateGetAttributeCountPtr)(
131     DvrSurfaceState* surface_state, size_t surface_index, size_t* count_out);
132 typedef ssize_t (*DvrSurfaceStateGetAttributesPtr)(
133     DvrSurfaceState* surface_state, size_t surface_index,
134     DvrSurfaceAttribute* attributes, size_t max_attribute_count);
135 
136 // dvr_buffer.h
137 typedef void (*DvrWriteBufferCreateEmptyPtr)(DvrWriteBuffer** write_buffer_out);
138 typedef void (*DvrWriteBufferDestroyPtr)(DvrWriteBuffer* write_buffer);
139 typedef int (*DvrWriteBufferIsValidPtr)(DvrWriteBuffer* write_buffer);
140 typedef int (*DvrWriteBufferClearPtr)(DvrWriteBuffer* write_buffer);
141 typedef int (*DvrWriteBufferGetIdPtr)(DvrWriteBuffer* write_buffer);
142 typedef int (*DvrWriteBufferGetAHardwareBufferPtr)(
143     DvrWriteBuffer* write_buffer, AHardwareBuffer** hardware_buffer);
144 typedef int (*DvrWriteBufferPostPtr)(DvrWriteBuffer* write_buffer,
145                                      int ready_fence_fd, const void* meta,
146                                      size_t meta_size_bytes);
147 typedef int (*DvrWriteBufferGainPtr)(DvrWriteBuffer* write_buffer,
148                                      int* release_fence_fd);
149 typedef int (*DvrWriteBufferGainAsyncPtr)(DvrWriteBuffer* write_buffer);
150 typedef const struct native_handle* (*DvrWriteBufferGetNativeHandlePtr)(
151     DvrWriteBuffer* write_buffer);
152 
153 typedef void (*DvrReadBufferCreateEmptyPtr)(DvrReadBuffer** read_buffer_out);
154 typedef void (*DvrReadBufferDestroyPtr)(DvrReadBuffer* read_buffer);
155 typedef int (*DvrReadBufferIsValidPtr)(DvrReadBuffer* read_buffer);
156 typedef int (*DvrReadBufferClearPtr)(DvrReadBuffer* read_buffer);
157 typedef int (*DvrReadBufferGetIdPtr)(DvrReadBuffer* read_buffer);
158 typedef int (*DvrReadBufferGetAHardwareBufferPtr)(
159     DvrReadBuffer* read_buffer, AHardwareBuffer** hardware_buffer);
160 typedef int (*DvrReadBufferAcquirePtr)(DvrReadBuffer* read_buffer,
161                                        int* ready_fence_fd, void* meta,
162                                        size_t meta_size_bytes);
163 typedef int (*DvrReadBufferReleasePtr)(DvrReadBuffer* read_buffer,
164                                        int release_fence_fd);
165 typedef int (*DvrReadBufferReleaseAsyncPtr)(DvrReadBuffer* read_buffer);
166 typedef const struct native_handle* (*DvrReadBufferGetNativeHandlePtr)(
167     DvrReadBuffer* read_buffer);
168 
169 typedef void (*DvrBufferDestroyPtr)(DvrBuffer* buffer);
170 typedef int (*DvrBufferGetAHardwareBufferPtr)(
171     DvrBuffer* buffer, AHardwareBuffer** hardware_buffer);
172 typedef int (*DvrBufferGlobalLayoutVersionGetPtr)();
173 typedef const struct native_handle* (*DvrBufferGetNativeHandlePtr)(
174     DvrBuffer* buffer);
175 
176 // dvr_buffer_queue.h
177 typedef int (*DvrWriteBufferQueueCreatePtr)(uint32_t width, uint32_t height,
178                                             uint32_t format,
179                                             uint32_t layer_count,
180                                             uint64_t usage, size_t capacity,
181                                             size_t metadata_size,
182                                             DvrWriteBufferQueue** queue_out);
183 typedef void (*DvrWriteBufferQueueDestroyPtr)(DvrWriteBufferQueue* write_queue);
184 typedef ssize_t (*DvrWriteBufferQueueGetCapacityPtr)(
185     DvrWriteBufferQueue* write_queue);
186 typedef int (*DvrWriteBufferQueueGetIdPtr)(DvrWriteBufferQueue* write_queue);
187 typedef int (*DvrWriteBufferQueueGetExternalSurfacePtr)(
188     DvrWriteBufferQueue* write_queue, ANativeWindow** out_window);
189 typedef int (*DvrWriteBufferQueueGetANativeWindowPtr)(
190     DvrWriteBufferQueue* write_queue, ANativeWindow** out_window);
191 typedef int (*DvrWriteBufferQueueCreateReadQueuePtr)(
192     DvrWriteBufferQueue* write_queue, DvrReadBufferQueue** out_read_queue);
193 typedef int (*DvrWriteBufferQueueDequeuePtr)(DvrWriteBufferQueue* write_queue,
194                                              int timeout,
195                                              DvrWriteBuffer* out_buffer,
196                                              int* out_fence_fd);
197 typedef int (*DvrWriteBufferQueueGainBufferPtr)(
198     DvrWriteBufferQueue* write_queue, int timeout,
199     DvrWriteBuffer** out_write_buffer, DvrNativeBufferMetadata* out_meta,
200     int* out_fence_fd);
201 typedef int (*DvrWriteBufferQueuePostBufferPtr)(
202     DvrWriteBufferQueue* write_queue, DvrWriteBuffer* write_buffer,
203     const DvrNativeBufferMetadata* meta, int ready_fence_fd);
204 typedef int (*DvrWriteBufferQueueResizeBufferPtr)(
205     DvrWriteBufferQueue* write_queue, uint32_t width, uint32_t height);
206 typedef void (*DvrReadBufferQueueDestroyPtr)(DvrReadBufferQueue* read_queue);
207 typedef ssize_t (*DvrReadBufferQueueGetCapacityPtr)(
208     DvrReadBufferQueue* read_queue);
209 typedef int (*DvrReadBufferQueueGetIdPtr)(DvrReadBufferQueue* read_queue);
210 typedef int (*DvrReadBufferQueueGetEventFdPtr)(DvrReadBufferQueue* read_queue);
211 typedef int (*DvrReadBufferQueueCreateReadQueuePtr)(
212     DvrReadBufferQueue* read_queue, DvrReadBufferQueue** out_read_queue);
213 typedef int (*DvrReadBufferQueueDequeuePtr)(DvrReadBufferQueue* read_queue,
214                                             int timeout,
215                                             DvrReadBuffer* out_buffer,
216                                             int* out_fence_fd, void* out_meta,
217                                             size_t meta_size_bytes);
218 typedef int (*DvrReadBufferQueueAcquireBufferPtr)(
219     DvrReadBufferQueue* read_queue, int timeout,
220     DvrReadBuffer** out_read_buffer, DvrNativeBufferMetadata* out_meta,
221     int* out_fence_fd);
222 typedef int (*DvrReadBufferQueueReleaseBufferPtr)(
223     DvrReadBufferQueue* read_queue, DvrReadBuffer* read_buffer,
224     const DvrNativeBufferMetadata* meta, int release_fence_fd);
225 typedef void (*DvrReadBufferQueueBufferAvailableCallback)(void* context);
226 typedef int (*DvrReadBufferQueueSetBufferAvailableCallbackPtr)(
227     DvrReadBufferQueue* read_queue,
228     DvrReadBufferQueueBufferAvailableCallback callback, void* context);
229 typedef void (*DvrReadBufferQueueBufferRemovedCallback)(DvrReadBuffer* buffer,
230                                                         void* context);
231 typedef int (*DvrReadBufferQueueSetBufferRemovedCallbackPtr)(
232     DvrReadBufferQueue* read_queue,
233     DvrReadBufferQueueBufferRemovedCallback callback, void* context);
234 typedef int (*DvrReadBufferQueueHandleEventsPtr)(
235     DvrReadBufferQueue* read_queue);
236 
237 // dvr_surface.h
238 typedef int (*DvrSetupGlobalBufferPtr)(DvrGlobalBufferKey key, size_t size,
239                                        uint64_t usage, DvrBuffer** buffer_out);
240 typedef int (*DvrDeleteGlobalBufferPtr)(DvrGlobalBufferKey key);
241 typedef int (*DvrGetGlobalBufferPtr)(DvrGlobalBufferKey key,
242                                      DvrBuffer** out_buffer);
243 typedef int (*DvrSurfaceCreatePtr)(const DvrSurfaceAttribute* attributes,
244                                    size_t attribute_count,
245                                    DvrSurface** surface_out);
246 typedef void (*DvrSurfaceDestroyPtr)(DvrSurface* surface);
247 typedef int (*DvrSurfaceGetIdPtr)(DvrSurface* surface);
248 typedef int (*DvrSurfaceSetAttributesPtr)(DvrSurface* surface,
249                                           const DvrSurfaceAttribute* attributes,
250                                           size_t attribute_count);
251 typedef int (*DvrSurfaceCreateWriteBufferQueuePtr)(
252     DvrSurface* surface, uint32_t width, uint32_t height, uint32_t format,
253     uint32_t layer_count, uint64_t usage, size_t capacity, size_t metadata_size,
254     DvrWriteBufferQueue** queue_out);
255 typedef int (*DvrGetNativeDisplayMetricsPtr)(size_t sizeof_metrics,
256                                              DvrNativeDisplayMetrics* metrics);
257 
258 // dvr_vsync.h
259 typedef int (*DvrVSyncClientCreatePtr)(DvrVSyncClient** client_out);
260 typedef void (*DvrVSyncClientDestroyPtr)(DvrVSyncClient* client);
261 typedef int (*DvrVSyncClientGetSchedInfoPtr)(DvrVSyncClient* client,
262                                              int64_t* vsync_period_ns,
263                                              int64_t* next_timestamp_ns,
264                                              uint32_t* next_vsync_count);
265 
266 // libs/vr/libvrsensor/include/dvr/pose_client.h
267 typedef DvrPoseClient* (*DvrPoseClientCreatePtr)();
268 typedef void (*DvrPoseClientDestroyPtr)(DvrPoseClient* client);
269 typedef int (*DvrPoseClientGetPtr)(DvrPoseClient* client, uint32_t vsync_count,
270                                    DvrPoseAsync* out_pose);
271 typedef uint32_t (*DvrPoseClientGetVsyncCountPtr)(DvrPoseClient* client);
272 typedef int (*DvrPoseClientGetControllerPtr)(DvrPoseClient* client,
273                                              int32_t controller_id,
274                                              uint32_t vsync_count,
275                                              DvrPoseAsync* out_pose);
276 typedef int (*DvrPoseClientSensorsEnablePtr)(DvrPoseClient* client,
277                                              bool enabled);
278 typedef int (*DvrPoseClientDataCapturePtr)(DvrPoseClient* client,
279     const DvrPoseDataCaptureRequest* request);
280 typedef int (*DvrPoseClientDataReaderDestroyPtr)(DvrPoseClient* client,
281                                                  uint64_t data_type);
282 
283 // dvr_pose.h
284 typedef int (*DvrPoseClientGetDataReaderPtr)(DvrPoseClient* client,
285                                              uint64_t data_type,
286                                              DvrReadBufferQueue** read_queue);
287 
288 // services/vr/virtual_touchpad/include/dvr/virtual_touchpad_client.h
289 
290 // Touchpad IDs for *Touch*() and *ButtonState*() calls.
291 enum {
292   DVR_VIRTUAL_TOUCHPAD_PRIMARY = 0,
293   DVR_VIRTUAL_TOUCHPAD_VIRTUAL = 1,
294 };
295 typedef DvrVirtualTouchpad* (*DvrVirtualTouchpadCreatePtr)();
296 typedef void (*DvrVirtualTouchpadDestroyPtr)(DvrVirtualTouchpad* client);
297 typedef int (*DvrVirtualTouchpadAttachPtr)(DvrVirtualTouchpad* client);
298 typedef int (*DvrVirtualTouchpadDetachPtr)(DvrVirtualTouchpad* client);
299 typedef int (*DvrVirtualTouchpadTouchPtr)(DvrVirtualTouchpad* client,
300                                           int touchpad, float x, float y,
301                                           float pressure);
302 typedef int (*DvrVirtualTouchpadButtonStatePtr)(DvrVirtualTouchpad* client,
303                                                 int touchpad, int buttons);
304 typedef int (*DvrVirtualTouchpadScrollPtr)(DvrVirtualTouchpad* client,
305                                            int touchpad, float x, float y);
306 
307 // dvr_hardware_composer_client.h
308 typedef struct DvrHwcClient DvrHwcClient;
309 typedef struct DvrHwcFrame DvrHwcFrame;
310 typedef int (*DvrHwcOnFrameCallback)(void* client_state, DvrHwcFrame* frame);
311 typedef DvrHwcClient* (*DvrHwcClientCreatePtr)(DvrHwcOnFrameCallback callback,
312                                                void* client_state);
313 typedef void (*DvrHwcClientDestroyPtr)(DvrHwcClient* client);
314 typedef void (*DvrHwcFrameDestroyPtr)(DvrHwcFrame* frame);
315 typedef DvrHwcDisplay (*DvrHwcFrameGetDisplayIdPtr)(DvrHwcFrame* frame);
316 typedef int32_t (*DvrHwcFrameGetDisplayWidthPtr)(DvrHwcFrame* frame);
317 typedef int32_t (*DvrHwcFrameGetDisplayHeightPtr)(DvrHwcFrame* frame);
318 typedef bool (*DvrHwcFrameGetDisplayRemovedPtr)(DvrHwcFrame* frame);
319 typedef size_t (*DvrHwcFrameGetLayerCountPtr)(DvrHwcFrame* frame);
320 typedef DvrHwcLayer (*DvrHwcFrameGetLayerIdPtr)(DvrHwcFrame* frame,
321                                                 size_t layer_index);
322 typedef uint32_t (*DvrHwcFrameGetActiveConfigPtr)(DvrHwcFrame* frame);
323 typedef uint32_t (*DvrHwcFrameGetColorModePtr)(DvrHwcFrame* frame);
324 typedef void (*DvrHwcFrameGetColorTransformPtr)(DvrHwcFrame* frame,
325                                                 float* out_matrix,
326                                                 int32_t* out_hint);
327 typedef uint32_t (*DvrHwcFrameGetPowerModePtr)(DvrHwcFrame* frame);
328 typedef uint32_t (*DvrHwcFrameGetVsyncEnabledPtr)(DvrHwcFrame* frame);
329 typedef AHardwareBuffer* (*DvrHwcFrameGetLayerBufferPtr)(DvrHwcFrame* frame,
330                                                          size_t layer_index);
331 typedef int (*DvrHwcFrameGetLayerFencePtr)(DvrHwcFrame* frame,
332                                            size_t layer_index);
333 typedef DvrHwcRecti (*DvrHwcFrameGetLayerDisplayFramePtr)(DvrHwcFrame* frame,
334                                                           size_t layer_index);
335 typedef DvrHwcRectf (*DvrHwcFrameGetLayerCropPtr)(DvrHwcFrame* frame,
336                                                   size_t layer_index);
337 typedef DvrHwcBlendMode (*DvrHwcFrameGetLayerBlendModePtr)(DvrHwcFrame* frame,
338                                                            size_t layer_index);
339 typedef float (*DvrHwcFrameGetLayerAlphaPtr)(DvrHwcFrame* frame,
340                                              size_t layer_index);
341 typedef uint32_t (*DvrHwcFrameGetLayerTypePtr)(DvrHwcFrame* frame,
342                                                size_t layer_index);
343 typedef uint32_t (*DvrHwcFrameGetLayerApplicationIdPtr)(DvrHwcFrame* frame,
344                                                         size_t layer_index);
345 typedef uint32_t (*DvrHwcFrameGetLayerZOrderPtr)(DvrHwcFrame* frame,
346                                                  size_t layer_index);
347 
348 typedef void (*DvrHwcFrameGetLayerCursorPtr)(DvrHwcFrame* frame,
349                                              size_t layer_index, int32_t* out_x,
350                                              int32_t* out_y);
351 
352 typedef uint32_t (*DvrHwcFrameGetLayerTransformPtr)(DvrHwcFrame* frame,
353                                                     size_t layer_index);
354 
355 typedef uint32_t (*DvrHwcFrameGetLayerDataspacePtr)(DvrHwcFrame* frame,
356                                                     size_t layer_index);
357 
358 typedef uint32_t (*DvrHwcFrameGetLayerColorPtr)(DvrHwcFrame* frame,
359                                                 size_t layer_index);
360 
361 typedef uint32_t (*DvrHwcFrameGetLayerNumVisibleRegionsPtr)(DvrHwcFrame* frame,
362                                                             size_t layer_index);
363 typedef DvrHwcRecti (*DvrHwcFrameGetLayerVisibleRegionPtr)(DvrHwcFrame* frame,
364                                                            size_t layer_index,
365                                                            size_t index);
366 
367 typedef uint32_t (*DvrHwcFrameGetLayerNumDamagedRegionsPtr)(DvrHwcFrame* frame,
368                                                             size_t layer_index);
369 typedef DvrHwcRecti (*DvrHwcFrameGetLayerDamagedRegionPtr)(DvrHwcFrame* frame,
370                                                            size_t layer_index,
371                                                            size_t index);
372 
373 // dvr_performance.h
374 typedef int (*DvrPerformanceSetSchedulerPolicyPtr)(
375     pid_t task_id, const char* scheduler_policy);
376 
377 // dvr_tracking.h
378 typedef int (*DvrTrackingCameraCreatePtr)(DvrTrackingCamera** out_camera);
379 typedef void (*DvrTrackingCameraDestroyPtr)(DvrTrackingCamera* camera);
380 typedef int (*DvrTrackingCameraStartPtr)(DvrTrackingCamera* camera,
381                                          DvrWriteBufferQueue* write_queue);
382 typedef int (*DvrTrackingCameraStopPtr)(DvrTrackingCamera* camera);
383 
384 typedef int (*DvrTrackingFeatureExtractorCreatePtr)(
385     DvrTrackingFeatureExtractor** out_extractor);
386 typedef void (*DvrTrackingFeatureExtractorDestroyPtr)(
387     DvrTrackingFeatureExtractor* extractor);
388 typedef void (*DvrTrackingFeatureCallback)(void* context,
389                                            const DvrTrackingFeatures* event);
390 typedef int (*DvrTrackingFeatureExtractorStartPtr)(
391     DvrTrackingFeatureExtractor* extractor,
392     DvrTrackingFeatureCallback callback, void* context);
393 typedef int (*DvrTrackingFeatureExtractorStopPtr)(
394     DvrTrackingFeatureExtractor* extractor);
395 typedef int (*DvrTrackingFeatureExtractorProcessBufferPtr)(
396     DvrTrackingFeatureExtractor* extractor, DvrReadBuffer* buffer,
397     const DvrTrackingBufferMetadata* metadata, bool* out_skipped);
398 
399 typedef void (*DvrTrackingSensorEventCallback)(void* context,
400                                                DvrTrackingSensorEvent* event);
401 typedef int (*DvrTrackingSensorsCreatePtr)(DvrTrackingSensors** out_sensors,
402                                            const char* mode);
403 typedef void (*DvrTrackingSensorsDestroyPtr)(DvrTrackingSensors* sensors);
404 typedef int (*DvrTrackingSensorsStartPtr)(
405     DvrTrackingSensors* sensors, DvrTrackingSensorEventCallback callback,
406     void* context);
407 typedef int (*DvrTrackingSensorsStopPtr)(DvrTrackingSensors* sensors);
408 
409 // The buffer metadata that an Android Surface (a.k.a. ANativeWindow)
410 // will populate. A DvrWriteBufferQueue must be created with this metadata iff
411 // ANativeWindow access is needed. Please do not remove, modify, or reorder
412 // existing data members. If new fields need to be added, please take extra care
413 // to make sure that new data field is padded properly the size of the struct
414 // stays same.
415 // TODO(b/118893702): move the definition to libnativewindow or libui
416 struct ALIGNED_DVR_STRUCT(8) DvrNativeBufferMetadata {
417 #ifdef __cplusplus
DvrNativeBufferMetadataDvrNativeBufferMetadata418   DvrNativeBufferMetadata()
419       : timestamp(0),
420         is_auto_timestamp(0),
421         dataspace(0),
422         crop_left(0),
423         crop_top(0),
424         crop_right(0),
425         crop_bottom(0),
426         scaling_mode(0),
427         transform(0),
428         index(0),
429         user_metadata_size(0),
430         user_metadata_ptr(0),
431         release_fence_mask(0),
432         reserved{0} {}
433 #endif
434   // Timestamp of the frame.
435   int64_t timestamp;
436 
437   // Whether the buffer is using auto timestamp.
438   int32_t is_auto_timestamp;
439 
440   // Must be one of the HAL_DATASPACE_XXX value defined in system/graphics.h
441   int32_t dataspace;
442 
443   // Crop extracted from an ACrop or android::Crop object.
444   int32_t crop_left;
445   int32_t crop_top;
446   int32_t crop_right;
447   int32_t crop_bottom;
448 
449   // Must be one of the NATIVE_WINDOW_SCALING_MODE_XXX value defined in
450   // system/window.h.
451   int32_t scaling_mode;
452 
453   // Must be one of the ANATIVEWINDOW_TRANSFORM_XXX value defined in
454   // android/native_window.h
455   int32_t transform;
456 
457   // The index of the frame.
458   int64_t index;
459 
460   // Size of additional metadata requested by user.
461   uint64_t user_metadata_size;
462 
463   // Raw memory address of the additional user defined metadata. Only valid when
464   // user_metadata_size is non-zero.
465   uint64_t user_metadata_ptr;
466 
467   // Only applicable for metadata retrieved from GainAsync. This indicates which
468   // consumer has pending fence that producer should epoll on.
469   uint32_t release_fence_mask;
470 
471   // Reserved bytes for so that the struct is forward compatible and padding to
472   // 104 bytes so the size is a multiple of 8.
473   int32_t reserved[9];
474 };
475 
476 #ifdef __cplusplus
477 // Warning: DvrNativeBufferMetadata is part of the DVR API and changing its size
478 // will cause compatiblity issues between different DVR API releases.
479 static_assert(sizeof(DvrNativeBufferMetadata) == 104,
480               "Unexpected size for DvrNativeBufferMetadata");
481 #endif
482 
483 struct DvrApi_v1 {
484 // Defines an API entry for V1 (no version suffix).
485 #define DVR_V1_API_ENTRY(name) Dvr##name##Ptr name
486 #define DVR_V1_API_ENTRY_DEPRECATED(name) Dvr##name##Ptr name
487 
488 #include "dvr_api_entries.h"
489 
490 // Undefine macro definitions to play nice with Google3 style rules.
491 #undef DVR_V1_API_ENTRY
492 #undef DVR_V1_API_ENTRY_DEPRECATED
493 };
494 
495 int dvrGetApi(void* api, size_t struct_size, int version);
496 
497 #ifdef __cplusplus
498 }  // extern "C"
499 #endif
500 
501 #endif  // ANDROID_DVR_API_H_
502