recorder.h
Go to the documentation of this file.
1 // License: Apache 2.0. See LICENSE file in root directory.
2 // Copyright(c) 2015 Intel Corporation. All Rights Reserved.
3 
4 #pragma once
5 
6 #include "../../include/librealsense2/h/rs_internal.h"
7 #include "backend.h"
8 #include "context.h"
9 #include "command_transfer.h"
10 #include <vector>
11 #include <mutex>
12 #include <chrono>
13 #include <atomic>
14 #include <map>
15 
16 namespace librealsense
17 {
18  namespace platform
19  {
20  enum class call_type
21  {
22  none,
31  uvc_lock,
32  uvc_unlock,
33  uvc_get_pu,
34  uvc_set_pu,
38  uvc_set_xu,
39  uvc_get_xu,
42  uvc_play,
45  uvc_close,
46  uvc_frame,
50  hid_open,
51  hid_close,
54  hid_frame,
61  };
62 
64  {
65  public:
66  int dist(uint32_t x, uint32_t y) const;
67 
68  std::vector<uint8_t> decode(const std::vector<uint8_t>& input) const;
69 
70  std::vector<uint8_t> encode(uint8_t* data, size_t size) const;
71 
72  int min_dist = 110;
73  int max_length = 32;
74  };
75 
76  struct call
77  {
79  double timestamp = 0;
80  int entity_id = 0;
82 
83  int param1 = 0;
84  int param2 = 0;
85  int param3 = 0;
86  int param4 = 0;
87  int param5 = 0;
88  int param6 = 0;
89 
90  bool had_error = false;
91 
92  int param7 = 0;
93  int param8 = 0;
94  int param9 = 0;
95  int param10 = 0;
96  int param11 = 0;
97  int param12 = 0;
98 
99 
100  };
101 
102  struct lookup_key
103  {
106  };
108 
109  class recording
110  {
111  public:
112  recording(std::shared_ptr<time_service> ts = nullptr, std::shared_ptr<playback_device_watcher> watcher = nullptr);
113 
114  double get_time();
115  void save(const char* filename, const char* section, bool append = false) const;
116  static std::shared_ptr<recording> load(const char* filename, const char* section, std::shared_ptr<playback_device_watcher> watcher = nullptr, std::string min_api_version = "");
117 
118  int save_blob(const void* ptr, size_t size);
119 
120  template<class T>
121  std::pair<int, int> insert_list(std::vector<T> list, std::vector<T>& target)
122  {
123  std::pair<int, int> range;
124 
125  range.first = static_cast<int>(target.size());
126  for (auto&& i : list) target.push_back(i);
127  range.second = static_cast<int>(target.size());
128 
129  return range;
130  }
131 
132  template<class T>
133  void save_list(std::vector<T> list, std::vector<T>& target, call_type type, int entity_id)
134  {
135  std::lock_guard<std::recursive_mutex> lock(_mutex);
136  call c;
137  c.type = type;
138  c.entity_id = entity_id;
139  auto range = insert_list(list, target);
140  c.param1 = range.first;
141  c.param2 = range.second;
142 
143  c.timestamp = get_current_time();
144  calls.push_back(c);
145  }
146 
148  {
149  std::lock_guard<std::recursive_mutex> lock(_mutex);
150  call c;
151  c.type = key.type;
152  c.entity_id = key.entity_id;
153  c.timestamp = get_current_time();
154  calls.push_back(c);
155  return calls[calls.size() - 1];
156  }
157 
158  template<class T>
159  std::vector<T> load_list(const std::vector<T>& source, const call& c)
160  {
161  std::vector<T> results;
162  std::lock_guard<std::recursive_mutex> lock(_mutex);
163  for (auto i = c.param1; i < c.param2; i++)
164  {
165  results.push_back(source[i]);
166  }
167  return results;
168  }
169 
170  template<class T>
171  std::vector<T> load_list(const std::vector<T>& source, const int range_start, const int range_end)
172  {
173  std::vector<T> results;
174  std::lock_guard<std::recursive_mutex> lock(_mutex);
175  for (auto i = range_start; i < range_end; i++)
176  {
177  results.push_back(source[i]);
178  }
179  return results;
180  }
182  {
183  std::lock_guard<std::recursive_mutex> lock(_mutex);
184  call c;
185  c.type = k.type;
186  c.entity_id = k.entity_id;
187 
188  auto range = insert_list(old.uvc_devices, uvc_device_infos);
189  c.param1 = range.first;
190  c.param2 = range.second;
191 
192  range = insert_list(old.usb_devices, usb_device_infos);
193  c.param3 = range.first;
194  c.param4 = range.second;
195 
196  range = insert_list(old.hid_devices, hid_device_infos);
197  c.param5 = range.first;
198  c.param6 = range.second;
199 
200  range = insert_list(curr.uvc_devices, uvc_device_infos);
201  c.param7 = range.first;
202  c.param8 = range.second;
203 
204  range = insert_list(curr.usb_devices, usb_device_infos);
205  c.param9 = range.first;
206  c.param10 = range.second;
207 
208  range = insert_list(curr.hid_devices, hid_device_infos);
209  c.param11 = range.first;
210  c.param12 = range.second;
211 
212  c.timestamp = get_current_time();
213  calls.push_back(c);
214  }
215 
216  void save_device_info_list(std::vector<uvc_device_info> list, lookup_key k)
217  {
218  save_list(list, uvc_device_infos, k.type, k.entity_id);
219  }
220 
221  void save_device_info_list(std::vector<hid_device_info> list, lookup_key k)
222  {
223  save_list(list, hid_device_infos, k.type, k.entity_id);
224  }
225 
226  void save_device_info_list(std::vector<usb_device_info> list, lookup_key k)
227  {
228  save_list(list, usb_device_infos, k.type, k.entity_id);
229  }
230 
231  void save_stream_profiles(std::vector<stream_profile> list, lookup_key key)
232  {
233  save_list(list, stream_profiles, key.type, key.entity_id);
234  }
235 
236  void save_hid_sensors(std::vector<hid_sensor> list, lookup_key key)
237  {
238  save_list(list, hid_sensors, key.type, key.entity_id);
239  }
240 
241  void save_hid_sensors2_inputs(std::vector<hid_sensor_input> list, lookup_key key)
242  {
243  save_list(list, hid_sensor_inputs, key.type, key.entity_id);
244  }
245 
246 
247  std::vector<stream_profile> load_stream_profiles(int id, call_type type)
248  {
249  auto&& c = find_call(type, id);
250  return load_list(stream_profiles, c);
251  }
252 
254  {
255  auto&& c = find_call(k.type, k.entity_id);
256 
257  old.uvc_devices = load_list(uvc_device_infos, c.param1, c.param2);
258  old.usb_devices = load_list(usb_device_infos, c.param3, c.param4);
259  old.hid_devices = load_list(hid_device_infos, c.param5, c.param6);
260 
261  curr.uvc_devices = load_list(uvc_device_infos, c.param7, c.param8);
262  curr.usb_devices = load_list(usb_device_infos, c.param9, c.param10);
263  curr.hid_devices = load_list(hid_device_infos, c.param11, c.param12);
264 
265  }
266 
267  std::vector<usb_device_info> load_usb_device_info_list()
268  {
269  auto&& c = find_call(call_type::query_usb_devices, 0);
270  return load_list(usb_device_infos, c);
271  }
272 
273  std::vector<uvc_device_info> load_uvc_device_info_list()
274  {
275  auto&& c = find_call(call_type::query_uvc_devices, 0);
276  return load_list(uvc_device_infos, c);
277  }
278 
279  std::vector<hid_device_info> load_hid_device_info_list()
280  {
281  auto&& c = find_call(call_type::query_hid_devices, 0);
282  return load_list(hid_device_infos, c);
283  }
284 
285  std::vector<hid_sensor> load_hid_sensors2_list(int entity_id)
286  {
287  auto&& c = find_call(call_type::hid_get_sensors, entity_id);
288  return load_list(hid_sensors, c);
289  }
290 
291  std::vector<uint8_t> load_blob(int id) const
292  {
293  return blobs[id];
294  }
295 
296  call& find_call(call_type t, int entity_id, std::function<bool(const call& c)> history_match_validation = [](const call& c) {return true; });
297  call* cycle_calls(call_type call_type, int id);
298  call* pick_next_call(int id = 0);
299  size_t size() const { return calls.size(); }
300 
301  private:
302  std::vector<call> calls;
303  std::vector<std::vector<uint8_t>> blobs;
304  std::vector<uvc_device_info> uvc_device_infos;
305  std::vector<usb_device_info> usb_device_infos;
306  std::vector<stream_profile> stream_profiles;
307  std::vector<hid_device_info> hid_device_infos;
308  std::vector<hid_sensor> hid_sensors;
309  std::vector<hid_sensor_input> hid_sensor_inputs;
310  std::shared_ptr<playback_device_watcher> _watcher;
311 
312  std::recursive_mutex _mutex;
313  std::shared_ptr<time_service> _ts;
314 
315  std::map<size_t, size_t> _cursors;
316  std::map<size_t, size_t> _cycles;
317 
318  double get_current_time();
319 
320  void invoke_device_changed_event();
321 
322  double _curr_time = 0;
323  };
324 
325  class record_backend;
326 
328  {
329  public:
330  void probe_and_commit(stream_profile profile, frame_callback callback, int buffers) override;
331  void stream_on(std::function<void(const notification& n)> error_handler = [](const notification& n) {}) override;
332  void start_callbacks() override;
333  void stop_callbacks() override;
334  void close(stream_profile profile) override;
335  void set_power_state(power_state state) override;
336  power_state get_power_state() const override;
337  void init_xu(const extension_unit& xu) override;
338  bool set_xu(const extension_unit& xu, uint8_t ctrl, const uint8_t* data, int len) override;
339  bool get_xu(const extension_unit& xu, uint8_t ctrl, uint8_t* data, int len) const override;
340  control_range get_xu_range(const extension_unit& xu, uint8_t ctrl, int len) const override;
341  bool get_pu(rs2_option opt, int32_t& value) const override;
342  bool set_pu(rs2_option opt, int32_t value) override;
343  control_range get_pu_range(rs2_option opt) const override;
344  std::vector<stream_profile> get_profiles() const override;
345  void lock() const override;
346  void unlock() const override;
347  std::string get_device_location() const override;
348  usb_spec get_usb_specification() const override;
349 
351  std::shared_ptr<uvc_device> source,
352  std::shared_ptr<compression_algorithm> compression,
353  int id, const record_backend* owner)
354  : _source(source), _entity_id(id),
355  _compression(compression), _owner(owner) {}
356 
357  private:
358  std::shared_ptr<uvc_device> _source;
360  std::shared_ptr<compression_algorithm> _compression;
362  };
363 
365  {
366  public:
367  void register_profiles(const std::vector<hid_profile>& hid_profiles) override;
368  void open(const std::vector<hid_profile>& hid_profiles) override;
369  void close() override;
370  void stop_capture() override;
371  void start_capture(hid_callback callback) override;
372  std::vector<hid_sensor> get_sensors() override;
373  std::vector<uint8_t> get_custom_report_data(const std::string& custom_sensor_name,
374  const std::string& report_name,
375  custom_sensor_report_field report_field) override;
376 
377  record_hid_device(std::shared_ptr<hid_device> source,
378  int id, const record_backend* owner)
379  : _source(source), _entity_id(id), _owner(owner) {}
380 
381  private:
382  std::shared_ptr<hid_device> _source;
385  };
386 
388  {
389  public:
390  std::vector<uint8_t> send_receive(const std::vector<uint8_t>& data, int timeout_ms, bool require_response) override;
391 
392  record_usb_device(std::shared_ptr<command_transfer> source,
393  int id, const record_backend* owner)
394  : _source(source), _entity_id(id), _owner(owner) {}
395 
396  private:
397  std::shared_ptr<command_transfer> _source;
400  };
401 
402 
404  {
405  public:
406  record_device_watcher(const record_backend* owner, std::shared_ptr<device_watcher> source_watcher, int id) :
407  _source_watcher(source_watcher), _owner(owner), _entity_id(id) {}
408 
410  {
411  stop();
412  }
413 
414  void start(device_changed_callback callback) override;
415 
416  void stop() override;
417 
418  private:
420  std::shared_ptr<device_watcher> _source_watcher;
422  };
423 
424  class record_backend : public backend
425  {
426  public:
427  std::shared_ptr<hid_device> create_hid_device(hid_device_info info) const override;
428  std::vector<hid_device_info> query_hid_devices() const override;
429  std::shared_ptr<uvc_device> create_uvc_device(uvc_device_info info) const override;
430  std::vector<uvc_device_info> query_uvc_devices() const override;
431  std::shared_ptr<command_transfer> create_usb_device(usb_device_info info) const override;
432  std::vector<usb_device_info> query_usb_devices() const override;
433  std::shared_ptr<time_service> create_time_service() const override;
434  std::shared_ptr<device_watcher> create_device_watcher() const override;
435 
436  record_backend(std::shared_ptr<backend> source,
437  const char* filename,
438  const char* section,
440  ~record_backend();
441 
442  rs2_recording_mode get_mode() const { return _mode; }
443 
444  template<class T>
445  auto try_record(T t, int entity_id, call_type type) const
446  -> decltype(t((recording*)nullptr, *((lookup_key*)nullptr)))
447  {
448  lookup_key k{ entity_id, type };
449  _entity_count = 0;
450  try
451  {
452  return t(_rec.get(), k);
453  }
454  catch (const std::exception& ex)
455  {
456  auto&& c = _rec->add_call(k);
457  c.had_error = true;
458  c.inline_string = ex.what();
459 
460  throw;
461  }
462  catch (...)
463  {
464  auto&& c = _rec->add_call(k);
465  c.had_error = true;
466  c.inline_string = "Unknown exception has occurred!";
467 
468  throw;
469  }
470  }
471 
472  private:
473  void write_to_file() const;
474 
475  std::shared_ptr<backend> _source;
476 
477  std::shared_ptr<recording> _rec;
478  mutable std::atomic<int> _entity_count;
481  std::shared_ptr<compression_algorithm> _compression;
483  };
484 
485  typedef std::vector<std::pair<stream_profile, frame_callback>> configurations;
486 
488  {
489 
490  public:
491  playback_device_watcher(int id);
493  void start(device_changed_callback callback) override;
494  void stop() override;
495 
496  void raise_callback(backend_device_group old, backend_device_group curr);
497 
498  private:
500  std::atomic<bool> _alive;
501  std::thread _callback_thread;
504  std::recursive_mutex _mutex;
505  };
506 
508  {
509  public:
510  void probe_and_commit(stream_profile profile, frame_callback callback, int buffers) override;
511  void stream_on(std::function<void(const notification& n)> error_handler = [](const notification& n) {}) override;
512  void start_callbacks() override;
513  void stop_callbacks() override;
514  void close(stream_profile profile) override;
515  void set_power_state(power_state state) override;
516  power_state get_power_state() const override;
517  void init_xu(const extension_unit& xu) override;
518  bool set_xu(const extension_unit& xu, uint8_t ctrl, const uint8_t* data, int len) override;
519  bool get_xu(const extension_unit& xu, uint8_t ctrl, uint8_t* data, int len) const override;
520  control_range get_xu_range(const extension_unit& xu, uint8_t ctrl, int len) const override;
521  bool get_pu(rs2_option opt, int32_t& value) const override;
522  bool set_pu(rs2_option opt, int32_t value) override;
523  control_range get_pu_range(rs2_option opt) const override;
524  std::vector<stream_profile> get_profiles() const override;
525  void lock() const override;
526  void unlock() const override;
527  std::string get_device_location() const override;
528  usb_spec get_usb_specification() const override;
529 
530  explicit playback_uvc_device(std::shared_ptr<recording> rec, int id);
531 
532  void callback_thread();
534 
535  private:
536  stream_profile get_profile(call* frame) const;
537 
538  std::shared_ptr<recording> _rec;
540  std::atomic<bool> _alive;
541  std::thread _callback_thread;
542  configurations _callbacks;
543  configurations _commitments;
544  std::mutex _callback_mutex;
546  };
547 
548 
550  {
551  public:
552  std::vector<uint8_t> send_receive(const std::vector<uint8_t>& data, int timeout_ms, bool require_response) override;
553 
554  explicit playback_usb_device(std::shared_ptr<recording> rec,
555  int id) : _rec(rec), _entity_id(id)
556  {}
557 
558  private:
559  std::shared_ptr<recording> _rec;
561  };
562 
564  {
565  public:
566  void register_profiles(const std::vector<hid_profile>& hid_profiles) override;
567  void open(const std::vector<hid_profile>& hid_profiles) override;
568  void close() override;
569  void stop_capture() override;
570  void start_capture(hid_callback callback) override;
571  std::vector<hid_sensor> get_sensors() override;
572  std::vector<uint8_t> get_custom_report_data(const std::string& custom_sensor_name,
573  const std::string& report_name,
574  custom_sensor_report_field report_field) override;
575  void callback_thread();
577 
578  explicit playback_hid_device(std::shared_ptr<recording> rec, int id);
579 
580  private:
581  std::shared_ptr<recording> _rec;
582  std::mutex _callback_mutex;
585  std::thread _callback_thread;
586  std::atomic<bool> _alive;
587  };
588 
589  class playback_backend : public backend
590  {
591  public:
592  std::shared_ptr<hid_device> create_hid_device(hid_device_info info) const override;
593  std::vector<hid_device_info> query_hid_devices() const override;
594  std::shared_ptr<uvc_device> create_uvc_device(uvc_device_info info) const override;
595  std::vector<uvc_device_info> query_uvc_devices() const override;
596  std::shared_ptr<command_transfer> create_usb_device(usb_device_info info) const override;
597  std::vector<usb_device_info> query_usb_devices() const override;
598  std::shared_ptr<time_service> create_time_service() const override;
599  std::shared_ptr<device_watcher> create_device_watcher() const override;
600 
601  explicit playback_backend(const char* filename, const char* section, std::string min_api_version);
602  private:
603 
604  std::shared_ptr<playback_device_watcher> _device_watcher;
605  std::shared_ptr<recording> _rec;
606  };
607 
609  {
610  public:
612  _rec(rec) {}
613 
614  virtual rs2_time_t get_time() const override
615  {
616  return _rec.get_time();
617  }
618  private:
620  };
621  }
622 }
static const textual_icon lock
Definition: model-views.h:218
std::shared_ptr< device_watcher > _source_watcher
Definition: recorder.h:420
GLint y
static const textual_icon unlock
Definition: model-views.h:237
rs2_option
Defines general configuration controls. These can generally be mapped to camera UVC controls...
Definition: rs_option.h:22
void write_to_file(void const *data, size_t cb, std::string const &dir, char const *filename)
playback_usb_device(std::shared_ptr< recording > rec, int id)
Definition: recorder.h:554
std::shared_ptr< uvc_device > _source
Definition: recorder.h:358
std::shared_ptr< compression_algorithm > _compression
Definition: recorder.h:481
std::vector< hid_sensor_input > hid_sensor_inputs
Definition: recorder.h:309
std::shared_ptr< compression_algorithm > _compression
Definition: recorder.h:360
rs2_recording_mode
Definition: rs_internal.h:32
std::map< size_t, size_t > _cursors
Definition: recorder.h:315
GLfloat value
std::vector< call > calls
Definition: recorder.h:302
std::shared_ptr< command_transfer > _source
Definition: recorder.h:397
std::shared_ptr< recording > _rec
Definition: recorder.h:581
void save_device_info_list(std::vector< hid_device_info > list, lookup_key k)
Definition: recorder.h:221
std::shared_ptr< recording > _rec
Definition: recorder.h:477
GLsizei const GLchar *const * string
std::shared_ptr< recording > _rec
Definition: recorder.h:559
GLdouble n
Definition: glext.h:1966
unsigned char uint8_t
Definition: stdint.h:78
static const textual_icon stop
Definition: model-views.h:225
std::vector< hid_device_info > load_hid_device_info_list()
Definition: recorder.h:279
auto try_record(T t, int entity_id, call_type type) const -> decltype(t((recording *) nullptr,*((lookup_key *) nullptr)))
Definition: recorder.h:445
std::shared_ptr< time_service > _ts
Definition: recorder.h:313
GLenum GLuint id
std::shared_ptr< playback_device_watcher > _watcher
Definition: recorder.h:310
std::recursive_mutex _mutex
Definition: recorder.h:312
GLdouble t
GLenum GLsizei len
Definition: glext.h:3285
GLuint64 key
Definition: glext.h:8966
def info(name, value, persistent=False)
Definition: test.py:301
std::vector< T > load_list(const std::vector< T > &source, const call &c)
Definition: recorder.h:159
GLenum mode
call & add_call(lookup_key key)
Definition: recorder.h:147
static float min_dist
Definition: rs-kinfu.cpp:17
std::vector< hid_device_info > hid_devices
Definition: backend.h:527
GLsizeiptr size
const GLubyte * c
Definition: glext.h:12690
std::shared_ptr< recording > _rec
Definition: recorder.h:605
std::vector< hid_sensor > hid_sensors
Definition: recorder.h:308
std::vector< hid_sensor > load_hid_sensors2_list(int entity_id)
Definition: recorder.h:285
GLdouble x
std::function< void(backend_device_group old, backend_device_group curr)> device_changed_callback
Definition: backend.h:574
virtual rs2_time_t get_time() const override
Definition: recorder.h:614
unsigned int uint32_t
Definition: stdint.h:80
record_usb_device(std::shared_ptr< command_transfer > source, int id, const record_backend *owner)
Definition: recorder.h:392
std::vector< stream_profile > load_stream_profiles(int id, call_type type)
Definition: recorder.h:247
void load_device_changed_data(backend_device_group &old, backend_device_group &curr, lookup_key k)
Definition: recorder.h:253
GLenum target
Definition: glext.h:1565
def callback(frame)
Definition: t265_stereo.py:91
void save_list(std::vector< T > list, std::vector< T > &target, call_type type, int entity_id)
Definition: recorder.h:133
GLuint start
record_hid_device(std::shared_ptr< hid_device > source, int id, const record_backend *owner)
Definition: recorder.h:377
const GLuint * buffers
std::map< size_t, size_t > _cycles
Definition: recorder.h:316
std::vector< std::pair< stream_profile, frame_callback > > configurations
Definition: recorder.h:485
record_device_watcher(const record_backend *owner, std::shared_ptr< device_watcher > source_watcher, int id)
Definition: recorder.h:406
std::vector< std::shared_ptr< stream_profile_interface >> stream_profiles
Definition: streaming.h:165
std::function< void(stream_profile, frame_object, std::function< void()>)> frame_callback
Definition: backend.h:177
void save_hid_sensors2_inputs(std::vector< hid_sensor_input > list, lookup_key key)
Definition: recorder.h:241
std::vector< usb_device_info > load_usb_device_info_list()
Definition: recorder.h:267
std::shared_ptr< playback_device_watcher > _device_watcher
Definition: recorder.h:604
std::pair< int, int > insert_list(std::vector< T > list, std::vector< T > &target)
Definition: recorder.h:121
record_uvc_device(std::shared_ptr< uvc_device > source, std::shared_ptr< compression_algorithm > compression, int id, const record_backend *owner)
Definition: recorder.h:350
std::vector< uint8_t > load_blob(int id) const
Definition: recorder.h:291
GLenum GLenum GLenum input
Definition: glext.h:10805
GLenum type
std::vector< usb_device_info > usb_devices
Definition: backend.h:526
void save_device_changed_data(backend_device_group old, backend_device_group curr, lookup_key k)
Definition: recorder.h:181
std::vector< std::vector< uint8_t > > blobs
Definition: recorder.h:303
std::vector< T > load_list(const std::vector< T > &source, const int range_start, const int range_end)
Definition: recorder.h:171
GLsizei GLsizei GLchar * source
std::vector< hid_device_info > hid_device_infos
Definition: recorder.h:307
std::vector< uvc_device_info > uvc_device_infos
Definition: recorder.h:304
GLsizei range
void save_device_info_list(std::vector< uvc_device_info > list, lookup_key k)
Definition: recorder.h:216
int i
rs2_recording_mode get_mode() const
Definition: recorder.h:442
signed int int32_t
Definition: stdint.h:77
std::function< void(const sensor_data &)> hid_callback
Definition: backend.h:327
std::vector< uvc_device_info > uvc_devices
Definition: backend.h:525
std::shared_ptr< recording > _rec
Definition: recorder.h:538
double rs2_time_t
Definition: rs_types.h:300
void save_stream_profiles(std::vector< stream_profile > list, lookup_key key)
Definition: recorder.h:231
std::shared_ptr< hid_device > _source
Definition: recorder.h:382
void save_hid_sensors(std::vector< hid_sensor > list, lookup_key key)
Definition: recorder.h:236
double get_time()
Definition: rs_internal.hpp:62
std::vector< usb_device_info > usb_device_infos
Definition: recorder.h:305
Definition: parser.hpp:150
BOOST_DEDUCED_TYPENAME range_iterator< C >::type range_end(C &c)
Definition: end.hpp:41
std::vector< stream_profile > stream_profiles
Definition: recorder.h:306
std::vector< uvc_device_info > load_uvc_device_info_list()
Definition: recorder.h:273
void save_device_info_list(std::vector< usb_device_info > list, lookup_key k)
Definition: recorder.h:226
std::shared_ptr< backend > _source
Definition: recorder.h:475


librealsense2
Author(s): Sergey Dorodnicov , Doron Hirshberg , Mark Horn , Reagan Lopez , Itay Carpis
autogenerated on Mon May 3 2021 02:47:39