1e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#ifndef ANDROID_DVR_POSE_CLIENT_H_ 2e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#define ANDROID_DVR_POSE_CLIENT_H_ 3e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 4e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#ifdef __ARM_NEON 5e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <arm_neon.h> 6e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#else 7e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#ifndef __FLOAT32X4T_86 8e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#define __FLOAT32X4T_86 9e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkotypedef float float32x4_t __attribute__ ((__vector_size__ (16))); 10e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkotypedef struct float32x4x4_t { float32x4_t val[4]; }; 11e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#endif 12e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#endif 13e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 14e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <stdbool.h> 15e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <stdint.h> 16e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 17e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#ifdef __cplusplus 18e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoextern "C" { 19e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#endif 20e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 21e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkotypedef struct DvrPose DvrPose; 22e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 23e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Represents the current state provided by the pose service, containing a 24e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// rotation and translation. 25e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkotypedef struct __attribute__((packed, aligned(8))) DvrPoseState { 26e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // A quaternion representing the rotation of the HMD in Start Space. 27e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko struct __attribute__((packed)) { 28e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko float x, y, z, w; 29e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } head_from_start_rotation; 30e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // The position of the HMD in Start Space. 31e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko struct __attribute__((packed)) { 32e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko float x, y, z; 33e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } head_from_start_translation; 34e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Time in nanoseconds for the current pose. 35e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko uint64_t timestamp_ns; 36e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // The rotational velocity of the HMD. 37e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko struct __attribute__((packed)) { 38e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko float x, y, z; 39e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } sensor_from_start_rotation_velocity; 40e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} DvrPoseState; 41e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 42e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoenum { 43e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko DVR_POSE_FLAG_VALID = (1UL << 0), // This pose is valid. 44e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko DVR_POSE_FLAG_HEAD = (1UL << 1), // This pose is the head. 45e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko DVR_POSE_FLAG_CONTROLLER = (1UL << 2), // This pose is a controller. 46e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}; 47e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 48e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Represents an estimated pose, accessed asynchronously through a shared ring 49e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// buffer. No assumptions should be made about the data in padding space. 50e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// The size of this struct is 128 bytes. 51e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkotypedef struct __attribute__((packed, aligned(16))) DvrPoseAsync { 52e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Left eye head-from-start orientation quaternion x,y,z,w. 53e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko float32x4_t orientation; 54e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Left eye head-from-start translation x,y,z,pad in meters. 55e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko float32x4_t translation; 56e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Right eye head-from-start orientation quaternion x,y,z,w. 57e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko float32x4_t right_orientation; 58e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Right eye head-from-start translation x,y,z,pad in meters. 59e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko float32x4_t right_translation; 60e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Start-space angular velocity x,y,z,pad in radians per second. 61e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko float32x4_t angular_velocity; 62e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Start-space positional velocity x,y,z,pad in meters per second. 63e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko float32x4_t velocity; 64e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Timestamp of when this pose is predicted for, typically halfway through 65e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // scanout. 66e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int64_t timestamp_ns; 67e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Bitmask of DVR_POSE_FLAG_* constants that apply to this pose. 68e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // 69e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // If DVR_POSE_FLAG_VALID is not set, the pose is indeterminate. 70e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko uint64_t flags; 71e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Reserved padding to 128 bytes. 72e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko uint8_t pad[16]; 73e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} DvrPoseAsync; 74e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 75e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Returned by the async pose ring buffer access API. 76e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkotypedef struct DvrPoseRingBufferInfo { 77e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Read-only pointer to the pose ring buffer. The current pose is in this 78e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // buffer at element buffer[current_frame & (buffer_size - 1)]. The next 79e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // frame's forecasted pose is at element 80e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // ((current_frame + 1) & (buffer_size - 1)). And so on. The poses are 81e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // predicted for when 50% of the corresponding frame's pixel data is visible 82e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // to the user. 83e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // The last value returned by dvrPresent is the count for the next frame, 84e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // which is the earliest that the application could display something if they 85e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // were to render promptly. (TODO(jbates) move this comment to dvrPresent). 86e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko volatile const DvrPoseAsync* buffer; 87e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Minimum number of accurate forecasted poses including the current frame's 88e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // pose. This is the number of poses that are udpated by the pose service. 89e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // If the application reads past this count, they will get a stale prediction 90e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // from a previous frame. Guaranteed to be at least 2. 91e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko uint32_t min_future_count; 92e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Number of elements in buffer. At least 8 and greater than min_future_count. 93e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Guaranteed to be a power of two. The total size of the buffer in bytes is: 94e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // total_count * sizeof(DvrPoseAsync) 95e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko uint32_t total_count; 96e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} DvrPoseRingBufferInfo; 97e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 98e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkotypedef enum DvrPoseMode { 99e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko DVR_POSE_MODE_6DOF = 0, 100e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko DVR_POSE_MODE_3DOF, 101e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko DVR_POSE_MODE_MOCK_FROZEN, 102e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko DVR_POSE_MODE_MOCK_HEAD_TURN_SLOW, 103e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko DVR_POSE_MODE_MOCK_HEAD_TURN_FAST, 104e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko DVR_POSE_MODE_MOCK_ROTATE_SLOW, 105e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko DVR_POSE_MODE_MOCK_ROTATE_MEDIUM, 106e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko DVR_POSE_MODE_MOCK_ROTATE_FAST, 107e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko DVR_POSE_MODE_MOCK_CIRCLE_STRAFE, 108e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 109e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Always last. 110e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko DVR_POSE_MODE_COUNT, 111e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} DvrPoseMode; 112e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 113e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkotypedef enum DvrControllerId { 114e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko DVR_CONTROLLER_0 = 0, 115e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko DVR_CONTROLLER_1 = 1, 116e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} DvrControllerId; 117e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 118e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Creates a new pose client. 119e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// 120e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @return Pointer to the created pose client, nullptr on failure. 121e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoDvrPose* dvrPoseCreate(); 122e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 123e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Destroys a pose client. 124e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// 125e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @param client Pointer to the pose client to be destroyed. 126e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkovoid dvrPoseDestroy(DvrPose* client); 127e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 128e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Gets the pose for the given vsync count. 129e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// 130e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @param client Pointer to the pose client. 131e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @param vsync_count Vsync that this pose should be forward-predicted to. 132e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Typically this is the count returned by dvrGetNextVsyncCount. 133e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @param out_pose Struct to store pose state. 134e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @return Zero on success, negative error code on failure. 135e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint dvrPoseGet(DvrPose* client, uint32_t vsync_count, DvrPoseAsync* out_pose); 136e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 137e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Gets the current vsync count. 138e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkouint32_t dvrPoseGetVsyncCount(DvrPose* client); 139e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 140e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Gets the pose for the given controller at the given vsync count. 141e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// 142e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @param client Pointer to the pose client. 143e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @param controller_id The controller id. 144e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @param vsync_count Vsync that this pose should be forward-predicted to. 145e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Typically this is the count returned by dvrGetNextVsyncCount. 146e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @param out_pose Struct to store pose state. 147e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @return Zero on success, negative error code on failure. 148e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint dvrPoseGetController(DvrPose* client, int32_t controller_id, 149e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko uint32_t vsync_count, DvrPoseAsync* out_pose); 150e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 151e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Enables/disables logging for the controller fusion. 152e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// 153e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @param client Pointer to the pose client. 154e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @param enable True starts logging, False stops. 155e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @return Zero on success, negative error code on failure. 156e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint dvrPoseLogController(DvrPose* client, bool enable); 157e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 158e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// DEPRECATED 159e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Polls current pose state. 160e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// 161e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @param client Pointer to the pose client. 162e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @param state Struct to store polled state. 163e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @return Zero on success, negative error code on failure. 164e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint dvrPosePoll(DvrPose* client, DvrPoseState* state); 165e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 166e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Freezes the pose to the provided state. 167e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// 168e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Future poll operations will return this state until a different state is 169e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// frozen or dvrPoseSetMode() is called with a different mode. The timestamp is 170e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// not frozen. 171e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// 172e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @param client Pointer to the pose client. 173e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @param frozen_state State pose to be frozen to. 174e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @return Zero on success, negative error code on failure. 175e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint dvrPoseFreeze(DvrPose* client, const DvrPoseState* frozen_state); 176e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 177e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Sets the pose service mode. 178e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// 179e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @param mode The requested pose mode. 180e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @return Zero on success, negative error code on failure. 181e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint dvrPoseSetMode(DvrPose* client, DvrPoseMode mode); 182e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 183e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Gets the pose service mode. 184e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// 185e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @param mode Return value for the current pose mode. 186e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @return Zero on success, negative error code on failure. 187e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint dvrPoseGetMode(DvrPose* client, DvrPoseMode* mode); 188e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 189e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Get access to the shared memory pose ring buffer. 190e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// A future pose at vsync <current> + <offset> is accessed at index: 191e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// index = (<current> + <offset>) % out_buffer_size 192e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Where <current> was the last value returned by dvrPresent and 193e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// <offset> is less than or equal to |out_min_future_count|. 194e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// |out_buffer| will be set to a pointer to the buffer. 195e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// |out_fd| will be set to the gralloc buffer file descriptor, which is 196e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// required for binding this buffer for GPU use. 197e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Returns 0 on success. 198e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint dvrPoseGetRingBuffer(DvrPose* client, DvrPoseRingBufferInfo* out_info); 199e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 200e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 201e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#ifdef __cplusplus 202e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} // extern "C" 203e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#endif 204e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 205e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#endif // ANDROID_DVR_POSE_CLIENT_H_ 206