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