wrappers/matlab/types.h
Go to the documentation of this file.
1 #pragma once
2 #include "librealsense2/rs.hpp"
3 #include <memory>
4 #include <array>
5 
6 // C API
8 {
9  const char* fnames[] = { "rotation", "translation" };
10  mxArray* cell = mxCreateStructMatrix(1, 1, 2, fnames);
11  mxSetField(cell, 0, "rotation", MatlabParamParser::wrap_array(val.rotation, 9));
12  mxSetField(cell, 0, "translation", MatlabParamParser::wrap_array(val.translation, 3));
13  return cell;
14 }
16 {
17  const char* fnames[] = { "width", "height", "ppx", "ppy", "fx", "fy", "model", "coeffs" };
18  mxArray* cell = mxCreateStructMatrix(1, 1, 8, fnames);
19  mxSetField(cell, 0, "width", MatlabParamParser::wrap(std::move(val.width)));
20  mxSetField(cell, 0, "height", MatlabParamParser::wrap(std::move(val.height)));
21  mxSetField(cell, 0, "ppx", MatlabParamParser::wrap(std::move(val.ppx)));
22  mxSetField(cell, 0, "ppy", MatlabParamParser::wrap(std::move(val.ppy)));
23  mxSetField(cell, 0, "fx", MatlabParamParser::wrap(std::move(val.fx)));
24  mxSetField(cell, 0, "fy", MatlabParamParser::wrap(std::move(val.fy)));
25  mxSetField(cell, 0, "model", MatlabParamParser::wrap(std::move(val.model)));
26  mxSetField(cell, 0, "coeffs", MatlabParamParser::wrap_array(val.coeffs, 5));
27  return cell;
28 }
30 {
31  const char* fnames[] = { "data", "noise_variances", "bias_variances"};
32  mxArray* cell = mxCreateStructMatrix(1, 1, 3, fnames);
33  mxSetField(cell, 0, "noise_variances", MatlabParamParser::wrap_array(val.noise_variances, 3));
34  mxSetField(cell, 0, "bias_variances", MatlabParamParser::wrap_array(val.bias_variances, 3));
35 
36  // have to do data field manually for now because of multidimensional array. hope to extend make_array to cover this case
38  mxArray* data_cell = mxCreateNumericMatrix(3, 4, data_wrapper_t::value::value, mxREAL);
39  auto data_ptr = static_cast<double*>(mxGetData(data_cell));
40  for (int y = 0; y < 3; ++y) for (int x = 0; x < 4; ++x) data_ptr[y + 3*x] = val.data[y][x];
41  mxSetField(cell, 0, "data", data_cell);
42  return cell;
43 }
45 {
46  using wrapper_t = mx_wrapper<float>;
47  auto cells = mxCreateNumericMatrix(1, 3, wrapper_t::value::value, mxREAL);
48  auto ptr = static_cast<typename wrapper_t::type*>(mxGetData(cells));
49  ptr[0] = wrapper_t::type(val.x);
50  ptr[1] = wrapper_t::type(val.y);
51  ptr[2] = wrapper_t::type(val.z);
52  return cells;
53 }
55 {
57  auto cells = mxCreateNumericMatrix(1, 4, wrapper_t::value::value, mxREAL);
58  auto ptr = static_cast<typename wrapper_t::type*>(mxGetData(cells));
59  ptr[0] = wrapper_t::type(val.x);
60  ptr[1] = wrapper_t::type(val.y);
61  ptr[2] = wrapper_t::type(val.z);
62  ptr[3] = wrapper_t::type(val.w);
63  return cells;
64 }
66 {
67  const char* fnames[] = { "translation", "velocity", "acceleration", "rotation", "angular_velocity", "angular_acceleration", "tracker_confidence", "mapper_confidence" };
68  mxArray* cell = mxCreateStructMatrix(1, 1, 8, fnames);
69  mxSetField(cell, 0, "translation", MatlabParamParser::wrap(std::move(val.translation)));
70  mxSetField(cell, 0, "velocity", MatlabParamParser::wrap(std::move(val.velocity)));
71  mxSetField(cell, 0, "acceleration", MatlabParamParser::wrap(std::move(val.acceleration)));
72  mxSetField(cell, 0, "rotation", MatlabParamParser::wrap(std::move(val.rotation)));
73  mxSetField(cell, 0, "angular_velocity", MatlabParamParser::wrap(std::move(val.angular_velocity)));
74  mxSetField(cell, 0, "angular_acceleration", MatlabParamParser::wrap(std::move(val.angular_acceleration)));
75  mxSetField(cell, 0, "tracker_confidence", MatlabParamParser::wrap(std::move(val.tracker_confidence)));
76  mxSetField(cell, 0, "mapper_confidence", MatlabParamParser::wrap(std::move(val.mapper_confidence)));
77  return cell;
78 }
79 
80 // rs_types.hpp
82 {
83  const char* fnames[] = { "min", "max", "step", "def" };
84  mxArray* cell = mxCreateStructMatrix(1, 1, 4, fnames);
85  mxSetField(cell, 0, "min", MatlabParamParser::wrap(std::move(val.min)));
86  mxSetField(cell, 0, "max", MatlabParamParser::wrap(std::move(val.max)));
87  mxSetField(cell, 0, "step", MatlabParamParser::wrap(std::move(val.step)));
88  mxSetField(cell, 0, "def", MatlabParamParser::wrap(std::move(val.def)));
89  return cell;
90 }
91 template<> struct MatlabParamParser::mx_wrapper_fns<rs2::region_of_interest>
92 {
93  static rs2::region_of_interest parse(const mxArray* cell)
94  {
96  ret.min_x = MatlabParamParser::parse<int>(mxGetField(cell, 0, "min_x"));
97  ret.min_y = MatlabParamParser::parse<int>(mxGetField(cell, 0, "min_y"));
98  ret.max_x = MatlabParamParser::parse<int>(mxGetField(cell, 0, "max_x"));
99  ret.max_y = MatlabParamParser::parse<int>(mxGetField(cell, 0, "max_y"));
100  return ret;
101  }
102  static mxArray* wrap(rs2::region_of_interest&& val)
103  {
104  const char* fnames[] = { "min_x", "min_y", "max_x", "max_y" };
105  mxArray* cell = mxCreateStructMatrix(1, 1, 4, fnames);
106  mxSetField(cell, 0, "min_x", MatlabParamParser::wrap(std::move(val.min_x)));
107  mxSetField(cell, 0, "min_y", MatlabParamParser::wrap(std::move(val.min_y)));
108  mxSetField(cell, 0, "max_x", MatlabParamParser::wrap(std::move(val.max_x)));
109  mxSetField(cell, 0, "max_y", MatlabParamParser::wrap(std::move(val.max_y)));
110  return cell;
111  }
112 };
113 
114 // rs_context.hpp
115 
116 // rs_record_playback.hpp
117 
118 // rs_device.hpp
120 {
121  // Device list is sent as a native array of (ptr, id) pairs to preserve lazy instantiation of devices
122  size_t len = var.size();
123 
124  mxArray* vec = mxCreateCellMatrix(1, len);
125  for (uint32_t i = 0; i < len; ++i)
126  {
127  using dl_wrap_t = mx_wrapper<rs2::device_list>;
128  using idx_wrap_t = mx_wrapper<decltype(i)>;
129  auto cells = mxCreateCellMatrix(1, 2);
130  auto dl_cell = mxCreateNumericMatrix(1, 1, dl_wrap_t::value::value, mxREAL);
131  mexLock(); // lock once for each created pointer
132  *static_cast<dl_wrap_t::type*>(mxGetData(dl_cell)) = reinterpret_cast<dl_wrap_t::type>(new type_traits<rs2::device_list>::rs2_internal_t(var));
133  auto idx_cell = mxCreateNumericMatrix(1, 1, idx_wrap_t::value::value, mxREAL);
134  *static_cast<idx_wrap_t::type*>(mxGetData(idx_cell)) = static_cast<idx_wrap_t::type>(i);
135  mxSetCell(cells, 0, dl_cell);
136  mxSetCell(cells, 1, idx_cell);
137  mxSetCell(vec, i, cells);
138  }
139 
140  return vec;
141 }
142 
143 // rs_sensor.hpp
144 
145 // rs_frame.hpp
146 // TODO: Is there really not a cleaner way to deal with cloned stream_profiles?
147 template<typename T> struct MatlabParamParser::mx_wrapper_fns<T, typename std::enable_if<std::is_base_of<rs2::stream_profile, T>::value>::type>
148 {
149  static T parse(const mxArray* cell)
150  {
151  using internal_t = typename type_traits<T>::rs2_internal_t;
152  // since stream_profiles embed the raw pointer directly, we need to add on the extra level of indirection expected by from_internal.
153  auto internal_p = mx_wrapper_fns<internal_t>::parse(cell);
154  return traits_trampoline::from_internal<T>(&internal_p);
155  }
156  static mxArray* wrap(T&& val)
157  {
158  auto cells = mxCreateCellMatrix(1, 2);
159  auto handle_cell = mxCreateNumericMatrix(1, 1, mxUINT64_CLASS, mxREAL);
160  auto handle_ptr = static_cast<uint64_t*>(mxGetData(handle_cell));
161  *handle_ptr = reinterpret_cast<uint64_t>(typename type_traits<T>::rs2_internal_t(val));
162 
163  auto own_cell = mxCreateNumericMatrix(1, 1, mxUINT64_CLASS, mxREAL);
164  auto own_ptr = static_cast<uint64_t*>(mxGetData(own_cell));
165  // if its cloned, give the wrapper ownership of the stream_profile
166  if (val.is_cloned())
167  {
168  mexLock();
169  *own_ptr = reinterpret_cast<uint64_t>(new std::shared_ptr<rs2_stream_profile>(val));
170  }
171  else *own_ptr = reinterpret_cast<uint64_t>(nullptr);
172 
173  mxSetCell(cells, 0, handle_cell);
174  mxSetCell(cells, 1, own_cell);
175  return cells;
176  }
177  static void destroy(const mxArray* cell)
178  {
179  // we parse a std::shard_ptr<rs2_stream_profile>* because that is how the ownership
180  // pointer is stored, which is the one we need to destroy (assuming it exists)
182  if (!ptr) return; // only destroy if wrapper owns the profile
183  delete ptr;
184  mexUnlock();
185  }
186 };
187 
188 // rs2::frame does its own internal refcounting, so this interfaces with it properly
189 template<typename T> struct MatlabParamParser::mx_wrapper_fns<T, typename std::enable_if<std::is_base_of<rs2::frame, T>::value>::type>
190 {
191  static mxArray* wrap(T&& var)
192  {
193  using wrapper_t = mx_wrapper<T>;
194  mxArray *cell = mxCreateNumericMatrix(1, 1, wrapper_t::value::value, mxREAL);
195  auto *outp = static_cast<uint64_t*>(mxGetData(cell));
196  auto inptr = typename type_traits<T>::rs2_internal_t(var);
197  rs2_frame_add_ref(inptr, nullptr);
198  mexLock(); // Wrapper holds a reference to the internal type, which won't get destroyed until the wrapper lets go
199  *outp = reinterpret_cast<uint64_t>(inptr);
200  return cell;
201  }
202  static T parse(const mxArray* cell)
203  {
205  rs2_frame_add_ref(inptr, nullptr);
206  // Can the jump through rs2::frame happen automatically? e.g. is rs2::points(rs2_frame* inptr) equivalent to rs2::points(rs2::frame(rs2_frame* inptr))?
207  // If not, might have to use trampolining like stream_profile
208  return T(inptr);
209  }
210  static void destroy(const mxArray* cell)
211  {
213  rs2_release_frame(inptr);
214  mexUnlock(); // Wrapper holds a reference to the internal type, which won't get destroyed until the wrapper lets go
215  }
216 };
217 template <> mxArray* MatlabParamParser::wrap_array<rs2::vertex>(const rs2::vertex* var, size_t length)
218 {
219  using wrapper_t = mx_wrapper<float>;
220  auto cells = mxCreateNumericMatrix(length, 3, wrapper_t::value::value, mxREAL);
221  auto ptr = static_cast<typename wrapper_t::type*>(mxGetData(cells));
222  for (int x = 0; x < length; ++x) {
223  ptr[0 * length + x] = wrapper_t::type(var[x].x);
224  ptr[1 * length + x] = wrapper_t::type(var[x].y);
225  ptr[2 * length + x] = wrapper_t::type(var[x].z);
226  }
227  return cells;
228 }
229 template <> mxArray* MatlabParamParser::wrap_array<rs2::texture_coordinate>(const rs2::texture_coordinate* var, size_t length)
230 {
231  using wrapper_t = mx_wrapper<float>;
232  auto cells = mxCreateNumericMatrix(length, 2, wrapper_t::value::value, mxREAL);
233  auto ptr = static_cast<typename wrapper_t::type*>(mxGetData(cells));
234  for (int x = 0; x < length; ++x) {
235  ptr[0 * length + x] = wrapper_t::type(var[x].u);
236  ptr[1 * length + x] = wrapper_t::type(var[x].v);
237  }
238  return cells;
239 }
240 
241 // rs_processing.hpp
242 //template<> rs2::process_interface* MatlabParamParser::mx_wrapper_fns<rs2::process_interface*>::parse(const mxArray* cell)
243 //{
244 // using traits_t = type_traits<rs2::process_interface>;
245 // auto ptr = static_cast<traits_t::rs2_internal_t*>(mxGetData(cell));
246 // if (ptr->type == traits_t::carrier_enum::value) return reinterpret_cast<traits_t::carrier_t*>(ptr->ptr)->get();
247 // mexErrMsgTxt("Error parsing argument, object is not a process_interface");
248 //}
249 
250 // rs_pipeline.hpp
GLint y
GLfloat value
static mxArray * wrap(rs2::region_of_interest &&val)
Definition: cah-model.h:10
GLdouble GLdouble z
static mxArray * wrap(T &&var)
GLenum GLsizei len
Definition: glext.h:3285
GLuint GLfloat * val
Quaternion used to represent rotation.
Definition: rs_types.h:135
GLdouble x
unsigned int uint32_t
Definition: stdint.h:80
unsigned __int64 uint64_t
Definition: stdint.h:90
static rs2::region_of_interest parse(const mxArray *cell)
Cross-stream extrinsics: encodes the topology describing how the different devices are oriented...
Definition: rs_sensor.h:96
3D vector in Euclidean coordinate space
Definition: rs_types.h:129
GLenum type
void rs2_frame_add_ref(rs2_frame *frame, rs2_error **error)
Definition: rs.cpp:1015
typename::boost::move_detail::remove_reference< T >::type && move(T &&t) BOOST_NOEXCEPT
Video stream intrinsics.
Definition: rs_types.h:58
Motion device intrinsics: scale, bias, and variances.
Definition: rs_types.h:103
int i
GLenum GLuint GLenum GLsizei length
void rs2_release_frame(rs2_frame *frame)
Definition: rs.cpp:993
static mxArray * wrap(T &&var)
GLdouble v
static T parse(const mxArray *cell)
static std::enable_if<!is_basic_type< T >::value &&!traits_trampoline::use_cells< T >::value, mxArray * >::type wrap_array(const T *var, size_t length)


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