Intel® RealSense™ Cross Platform API
Intel Realsense Cross-platform API
context.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 "types.h"
7 #include "backend.h"
8 #include "mock/recorder.h"
9 #include "core/streaming.h"
10 #if WITH_TRACKING
11  #include "tm2/tm-context.h"
12 #endif
13 
14 #include <vector>
16 
17 namespace librealsense
18 {
19  class context;
20  class device_info;
21 }
22 
24 {
25  std::shared_ptr<librealsense::context> ctx;
26  std::shared_ptr<librealsense::device_info> info;
27 };
28 
30 {
31  std::shared_ptr<librealsense::context> ctx;
32  std::vector<rs2_device_info> list;
33 };
34 
36 {
38  std::shared_ptr<librealsense::stream_profile_interface> clone;
39 };
40 
41 namespace librealsense
42 {
43  class device;
44  class context;
45 
47  {
48  public:
49  virtual std::shared_ptr<device_interface> create_device(bool register_device_notifications = false) const
50  {
51  return create(_ctx, register_device_notifications);
52  }
53 
54  virtual ~device_info() = default;
55 
56  virtual platform::backend_device_group get_device_data()const = 0;
57 
58  virtual bool operator==(const device_info& other) const
59  {
60  return other.get_device_data() == get_device_data();
61  }
62 
63  protected:
64  explicit device_info(std::shared_ptr<context> backend)
65  : _ctx(move(backend))
66  {}
67 
68  virtual std::shared_ptr<device_interface> create(std::shared_ptr<context> ctx,
69  bool register_device_notifications) const = 0;
70 
71  std::shared_ptr<context> _ctx;
72  };
73 
74  enum class backend_type
75  {
76  standard,
77  record,
78  playback
79  };
80 
81 
83  {
84  std::shared_ptr<playback_device> _dev;
85  public:
86  explicit playback_device_info(std::shared_ptr<playback_device> dev)
87  : device_info(nullptr), _dev(dev)
88  {
89 
90  }
91 
92  std::shared_ptr<device_interface> create_device(bool) const override
93  {
94  return _dev;
95  }
97  {
98  return platform::backend_device_group({ platform::playback_device_info{ _dev->get_file_name() } });
99  }
100 
101  std::shared_ptr<device_interface> create(std::shared_ptr<context>, bool) const override
102  {
103  return _dev;
104  }
105  };
106 
107  typedef std::vector<std::shared_ptr<device_info>> devices_info;
108 
109  class context : public std::enable_shared_from_this<context>
110  {
111  public:
112  explicit context(backend_type type,
113  const char* filename = nullptr,
114  const char* section = nullptr,
116 
117  void stop(){_device_watcher->stop();}
118  ~context();
119  std::vector<std::shared_ptr<device_info>> query_devices() const;
120  const platform::backend& get_backend() const { return *_backend; }
121 
122  uint64_t register_internal_device_callback(devices_changed_callback_ptr callback);
123  void set_devices_changed_callback(devices_changed_callback_ptr callback);
124  void unregister_internal_device_callback(uint64_t cb_id);
125 
126  std::vector<std::shared_ptr<device_info>> create_devices(platform::backend_device_group devices, const std::map<std::string, std::shared_ptr<device_info>>& playback_devices) const;
127 
128 
129 
130  std::shared_ptr<device_interface> add_device(const std::string& file);
131  void remove_device(const std::string& file);
132 
133  private:
134  void on_device_changed(platform::backend_device_group old,
136  const std::map<std::string, std::shared_ptr<device_info>>& old_playback_devices,
137  const std::map<std::string, std::shared_ptr<device_info>>& new_playback_devices);
138  void raise_devices_changed(const std::vector<rs2_device_info>& removed, const std::vector<rs2_device_info>& added);
139  int find_stream_profile(const stream_interface& p);
140  std::shared_ptr<lazy<rs2_extrinsics>> fetch_edge(int from, int to);
141 
142  std::shared_ptr<platform::backend> _backend;
143 #if WITH_TRACKING
144  std::shared_ptr<tm2_context> _tm2_context;
145 #endif
146  std::shared_ptr<platform::device_watcher> _device_watcher;
147  std::map<std::string, std::shared_ptr<device_info>> _playback_devices;
148  std::map<uint64_t, devices_changed_callback_ptr> _devices_changed_callbacks;
149 
150 
151  devices_changed_callback_ptr _devices_changed_callback;
152  std::map<int, std::weak_ptr<const stream_interface>> _streams;
153  std::map<int, std::map<int, std::weak_ptr<lazy<rs2_extrinsics>>>> _extrinsics;
154  std::mutex _streams_mutex, _devices_changed_callbacks_mtx;
155  };
156 
158  {
159  public:
160  readonly_device_info(std::shared_ptr<device_interface> dev) : device_info(dev->get_context()), _dev(dev) {}
161  std::shared_ptr<device_interface> create(std::shared_ptr<context> ctx, bool register_device_notifications) const override
162  {
163  return _dev;
164  }
165 
167  {
168  return _dev->get_device_data();
169  }
170  private:
171  std::shared_ptr<device_interface> _dev;
172  };
173 
174  // Helper functions for device list manipulation:
175  std::vector<platform::uvc_device_info> filter_by_product(const std::vector<platform::uvc_device_info>& devices, const std::set<uint16_t>& pid_list);
176  std::vector<std::pair<std::vector<platform::uvc_device_info>, std::vector<platform::hid_device_info>>> group_devices_and_hids_by_unique_id(
177  const std::vector<std::vector<platform::uvc_device_info>>& devices,
178  const std::vector<platform::hid_device_info>& hids);
179  std::vector<std::vector<platform::uvc_device_info>> group_devices_by_unique_id(const std::vector<platform::uvc_device_info>& devices);
180  void trim_device_list(std::vector<platform::uvc_device_info>& devices, const std::vector<platform::uvc_device_info>& chosen);
181  bool mi_present(const std::vector<platform::uvc_device_info>& devices, uint32_t mi);
182  platform::uvc_device_info get_mi(const std::vector<platform::uvc_device_info>& devices, uint32_t mi);
183  std::vector<platform::uvc_device_info> filter_by_mi(const std::vector<platform::uvc_device_info>& devices, uint32_t mi);
184 
185  std::vector<platform::usb_device_info> filter_by_product(const std::vector<platform::usb_device_info>& devices, const std::set<uint16_t>& pid_list);
186  void trim_device_list(std::vector<platform::usb_device_info>& devices, const std::vector<platform::usb_device_info>& chosen);
187 }
Definition: context.h:82
std::shared_ptr< librealsense::context > ctx
Definition: context.h:31
std::shared_ptr< librealsense::context > ctx
Definition: context.h:25
Definition: backend.h:650
playback_device_info(std::shared_ptr< playback_device > dev)
Definition: context.h:86
Definition: context.h:23
virtual platform::backend_device_group get_device_data() const =0
std::shared_ptr< librealsense::device_info > info
Definition: context.h:26
platform::backend_device_group get_device_data() const override
Definition: context.h:166
std::vector< std::shared_ptr< device_info > > devices_info
Definition: context.h:107
rs2_recording_mode
Definition: rs_internal.h:25
std::vector< std::pair< std::vector< platform::uvc_device_info >, std::vector< platform::hid_device_info > > > group_devices_and_hids_by_unique_id(const std::vector< std::vector< platform::uvc_device_info >> &devices, const std::vector< platform::hid_device_info > &hids)
Definition: context.h:109
virtual std::shared_ptr< device_interface > create_device(bool register_device_notifications=false) const
Definition: context.h:49
std::vector< rs2_device_info > list
Definition: context.h:32
std::vector< platform::uvc_device_info > filter_by_product(const std::vector< platform::uvc_device_info > &devices, const std::set< uint16_t > &pid_list)
std::vector< std::vector< platform::uvc_device_info > > group_devices_by_unique_id(const std::vector< platform::uvc_device_info > &devices)
std::shared_ptr< device_interface > create(std::shared_ptr< context >, bool) const override
Definition: context.h:101
virtual bool operator==(const device_info &other) const
Definition: context.h:58
Definition: algo.h:16
Definition: streaming.h:31
std::shared_ptr< context > _ctx
Definition: context.h:71
std::shared_ptr< librealsense::stream_profile_interface > clone
Definition: context.h:38
readonly_device_info(std::shared_ptr< device_interface > dev)
Definition: context.h:160
platform::backend_device_group get_device_data() const override
Definition: context.h:96
Definition: context.h:29
Definition: streaming.h:46
Definition: context.h:46
platform::uvc_device_info get_mi(const std::vector< platform::uvc_device_info > &devices, uint32_t mi)
Definition: rs_internal.h:30
backend_type
Definition: context.h:74
std::shared_ptr< device_interface > create(std::shared_ptr< context > ctx, bool register_device_notifications) const override
Definition: context.h:161
Definition: context.h:35
void stop()
Definition: context.h:117
void trim_device_list(std::vector< platform::uvc_device_info > &devices, const std::vector< platform::uvc_device_info > &chosen)
librealsense::stream_profile_interface * profile
Definition: context.h:37
std::shared_ptr< device_interface > create_device(bool) const override
Definition: context.h:92
std::vector< platform::uvc_device_info > filter_by_mi(const std::vector< platform::uvc_device_info > &devices, uint32_t mi)
Definition: context.h:157
const platform::backend & get_backend() const
Definition: context.h:120
std::shared_ptr< rs2_devices_changed_callback > devices_changed_callback_ptr
Definition: types.h:875
device_info(std::shared_ptr< context > backend)
Definition: context.h:64
Definition: device.h:43
bool mi_present(const std::vector< platform::uvc_device_info > &devices, uint32_t mi)