1 #ifndef ANDROID_DVR_TRACKING_H_
2 #define ANDROID_DVR_TRACKING_H_
3 
4 #include <stdint.h>
5 #include <sys/cdefs.h>
6 
7 #include <dvr/dvr_tracking_types.h>
8 
9 __BEGIN_DECLS
10 
11 typedef struct DvrReadBuffer DvrReadBuffer;
12 typedef struct DvrTrackingCamera DvrTrackingCamera;
13 typedef struct DvrTrackingFeatureExtractor DvrTrackingFeatureExtractor;
14 typedef struct DvrTrackingSensors DvrTrackingSensors;
15 typedef struct DvrWriteBufferQueue DvrWriteBufferQueue;
16 
17 // The callback for DvrTrackingFeatureExtractor that will deliver the feature
18 // events. This callback is passed to dvrTrackingFeatureExtractorStart.
19 typedef void (*DvrTrackingFeatureCallback)(void* context,
20                                            const DvrTrackingFeatures* event);
21 
22 // The callback for DvrTrackingSensors session that will deliver the events.
23 // This callback is passed to dvrTrackingSensorsStart.
24 typedef void (*DvrTrackingSensorEventCallback)(void* context,
25                                                DvrTrackingSensorEvent* event);
26 
27 // Creates a DvrTrackingCamera session.
28 //
29 // On creation, the session is not in operating mode. Client code must call
30 // dvrTrackingCameraStart to bootstrap the underlying camera stack.
31 //
32 // There is no plan to expose camera configuration through this API. All camera
33 // parameters are determined by the system optimized for better tracking
34 // results. See b/78662281 for detailed deprecation plan of this API and the
35 // Stage 2 of VR tracking data source refactoring.
36 //
37 // @param out_camera The pointer of a DvrTrackingCamera will be filled here if
38 //     the method call succeeds.
39 // @return Zero on success, or negative error code.
40 int dvrTrackingCameraCreate(DvrTrackingCamera** out_camera);
41 
42 // Destroys a DvrTrackingCamera handle.
43 //
44 // @param camera The DvrTrackingCamera of interest.
45 void dvrTrackingCameraDestroy(DvrTrackingCamera* camera);
46 
47 // Starts the DvrTrackingCamera.
48 //
49 // On successful return, all DvrReadBufferQueue's associated with the given
50 // write_queue will start to receive buffers from the camera stack. Note that
51 // clients of this API should not assume the buffer dimension, format, and/or
52 // usage of the outcoming buffers, as they are governed by the underlying camera
53 // logic. Also note that it's the client's responsibility to consume buffers
54 // from DvrReadBufferQueue on time and return them back to the producer;
55 // otherwise the camera stack might be blocked.
56 //
57 // @param camera The DvrTrackingCamera of interest.
58 // @param write_queue A DvrWriteBufferQueue that the camera stack can use to
59 //     populate the buffer into. The queue must be empty and the camera stack
60 //     will request buffer allocation with proper buffer dimension, format, and
61 //     usage. Note that the write queue must be created with user_metadata_size
62 //     set to sizeof(DvrTrackingBufferMetadata). On success, the write_queue
63 //     handle will become invalid and the ownership of the queue handle will be
64 //     transferred into the camera; otherwise, the write_queue handle will keep
65 //     untouched and the caller still has the ownership.
66 // @return Zero on success, or negative error code.
67 int dvrTrackingCameraStart(DvrTrackingCamera* camera,
68                            DvrWriteBufferQueue* write_queue);
69 
70 // Stops the DvrTrackingCamera.
71 //
72 // On successful return, the DvrWriteBufferQueue set during
73 // dvrTrackingCameraStart will stop getting new buffers from the camera stack.
74 //
75 // @param camera The DvrTrackingCamera of interest.
76 // @return Zero on success, or negative error code.
77 int dvrTrackingCameraStop(DvrTrackingCamera* camera);
78 
79 // Creates a DvrTrackingSensors session.
80 //
81 // This will initialize but not start device sensors (gyro / accel). Upon
82 // successfull creation, the clients can call dvrTrackingSensorsStart to start
83 // receiving sensor events.
84 //
85 // @param out_sensors The pointer of a DvrTrackingSensors will be filled here if
86 //     the method call succeeds.
87 // @param mode The sensor mode.
88 //        mode="ndk": Use the Android NDK.
89 //        mode="direct": Use direct mode sensors (lower latency).
90 // @return Zero on success, or negative error code.
91 int dvrTrackingSensorsCreate(DvrTrackingSensors** out_sensors,
92                              const char* mode);
93 
94 // Destroys a DvrTrackingSensors session.
95 //
96 // @param sensors The DvrTrackingSensors struct to destroy.
97 void dvrTrackingSensorsDestroy(DvrTrackingSensors* sensors);
98 
99 // Starts the tracking sensor session.
100 //
101 // This will start the device sensors and start pumping the feature and sensor
102 // events as they arrive.
103 //
104 // @param client A tracking client created by dvrTrackingSensorsCreate.
105 // @param context A client supplied pointer that will be passed to the callback.
106 // @param callback A callback that will receive the sensor events on an
107 // arbitrary thread.
108 // @return Zero on success, or negative error code.
109 int dvrTrackingSensorsStart(DvrTrackingSensors* sensors,
110                             DvrTrackingSensorEventCallback callback,
111                             void* context);
112 
113 // Stops a DvrTrackingSensors session.
114 //
115 // This will stop the device sensors. dvrTrackingSensorsStart can be called to
116 // restart them again.
117 //
118 // @param client A tracking client created by dvrTrackingClientCreate.
119 // @return Zero on success, or negative error code.
120 int dvrTrackingSensorsStop(DvrTrackingSensors* sensors);
121 
122 // Creates a tracking feature extractor.
123 //
124 // This will initialize but not start the feature extraction session. Upon
125 // successful creation, the client can call dvrTrackingFeatureExtractorStart to
126 // start receiving features.
127 //
128 // @param out_extractor The pointer of a DvrTrackingFeatureExtractor will be
129 //     filled here if the method call succeeds.
130 int dvrTrackingFeatureExtractorCreate(
131     DvrTrackingFeatureExtractor** out_extractor);
132 
133 // Destroys a tracking feature extractor.
134 //
135 // @param extractor The DvrTrackingFeatureExtractor to destroy.
136 void dvrTrackingFeatureExtractorDestroy(DvrTrackingFeatureExtractor* extractor);
137 
138 // Starts the tracking feature extractor.
139 //
140 // This will start the extractor and start pumping the output feature events to
141 // the registered callback. Note that this method will create one or more
142 // threads to handle feature processing.
143 //
144 // @param extractor The DvrTrackingFeatureExtractor to destroy.
145 int dvrTrackingFeatureExtractorStart(DvrTrackingFeatureExtractor* extractor,
146                                      DvrTrackingFeatureCallback callback,
147                                      void* context);
148 
149 // Stops the tracking feature extractor.
150 //
151 // This will stop the extractor session and clean up all internal resourcse
152 // related to this extractor. On succssful return, all internal therad started
153 // by dvrTrackingFeatureExtractorStart should be stopped.
154 //
155 // @param extractor The DvrTrackingFeatureExtractor to destroy.
156 int dvrTrackingFeatureExtractorStop(DvrTrackingFeatureExtractor* extractor);
157 
158 // Processes one buffer to extract features from.
159 //
160 // The buffer will be sent over to DSP for feature extraction. Once the process
161 // is done, the processing thread will invoke DvrTrackingFeatureCallback with
162 // newly extracted features. Note that not all buffers will be processed, as the
163 // underlying DSP can only process buffers at a certain framerate. If a buffer
164 // needs to be skipped, out_skipped filed will be set to true. Also note that
165 // for successfully processed stereo buffer, two callbacks (one for each eye)
166 // will be fired.
167 //
168 // @param extractor The DvrTrackingFeatureExtractor to destroy.
169 // @param buffer The buffer to extract features from. Note that the buffer must
170 //     be in acquired state for the buffer to be processed. Also note that the
171 //     buffer will be released back to its producer on successful return of the
172 //     method.
173 // @param metadata The metadata associated with the buffer. Should be populated
174 //     by DvrTrackingCamera session as user defined metadata.
175 // @param out_skipped On successful return, the field will be set to true iff
176 //     the buffer was skipped; and false iff the buffer was processed. This
177 //     field is optional and nullptr can be passed here to ignore the field.
178 // @return Zero on success, or negative error code.
179 int dvrTrackingFeatureExtractorProcessBuffer(
180     DvrTrackingFeatureExtractor* extractor, DvrReadBuffer* buffer,
181     const DvrTrackingBufferMetadata* metadata, bool* out_skipped);
182 
183 __END_DECLS
184 
185 #endif  // ANDROID_DVR_TRACKING_H_
186