39 typedef std::function<rs2_metadata_type(const rs2_metadata_type& param)>
attrib_modifyer;
59 template<
class S,
class Attribute,
typename Flag>
63 md_attribute_parser(Attribute S::* attribute_name, Flag flag,
unsigned long long offset, attrib_modifyer mod) :
64 _md_attribute(attribute_name), _md_flag(flag), _offset(offset), _modifyer(mod) {};
68 auto s =
reinterpret_cast<const S*
>(((
const uint8_t*)frm.additional_data.metadata_blob.data()) + _offset);
70 if (!is_attribute_valid(s))
74 if (_modifyer) attrib = _modifyer(attrib);
83 return is_attribute_valid(s);
95 if ((s->header.md_type_id != expected_type) || (s->header.md_size !=
sizeof(*s)))
97 std::string type = (md_type_desc.count(s->header.md_type_id) > 0) ?
98 md_type_desc.at(s->header.md_type_id) : (
to_string() <<
"0x" <<
static_cast<uint32_t
>(s->header.md_type_id));
99 LOG_DEBUG(
"Metadata mismatch - actual: " << type
100 <<
", expected: " << md_type_desc.at(expected_type) <<
"(0x" << std::hex << (uint32_t)expected_type << std::dec <<
")");
105 auto attribute_enabled = (0 !=(s->flags &
static_cast<uint32_t
>(_md_flag)));
106 if (!attribute_enabled)
107 LOG_DEBUG(
"Metadata attribute No: "<< (*s.*_md_attribute) <<
"is not active");
109 return attribute_enabled;
116 Attribute S::* _md_attribute;
118 unsigned long long _offset;
119 attrib_modifyer _modifyer;
124 template<
class S,
class Attribute,
typename Flag>
125 std::shared_ptr<md_attribute_parser_base>
make_attribute_parser(Attribute S::* attribute, Flag flag,
unsigned long long offset, attrib_modifyer mod =
nullptr)
132 template<
class St,
class Attribute>
137 _md_attribute(attribute_name), _modifyer(mod){};
144 auto attrib =
static_cast<rs2_metadata_type>((*
reinterpret_cast<const St*
>((
const uint8_t*)frm.additional_data.metadata_blob.data())).*_md_attribute);
145 if (_modifyer) attrib = _modifyer(attrib);
156 Attribute St::* _md_attribute;
157 attrib_modifyer _modifyer;
161 template<
class St,
class Attribute>
162 std::shared_ptr<md_attribute_parser_base>
make_uvc_header_parser(Attribute St::* attribute, attrib_modifyer mod =
nullptr)
169 template<
class St,
class Attribute>
174 _md_attribute(attribute_name) {};
188 Attribute St::* _md_attribute;
192 template<
class St,
class Attribute>
202 std::shared_ptr<md_attribute_parser_base> _sensor_ts_parser =
nullptr;
203 std::shared_ptr<md_attribute_parser_base> _frame_ts_parser =
nullptr;
207 std::shared_ptr<md_attribute_parser_base> frame_ts_parser) :
208 _sensor_ts_parser(sensor_ts_parser), _frame_ts_parser(frame_ts_parser) {};
216 return _frame_ts_parser->get(frm) - _sensor_ts_parser->get(frm);
221 return (_sensor_ts_parser->supports(frm) && _frame_ts_parser->supports(frm));
234 if (num_of_frames == 0)
236 LOG_INFO(
"frame_number - last_frame_number " << num_of_frames);
240 return diff > 0 ? std::max(1000.f / std::ceil(diff), (
double)1) : frm.
get_stream()->get_framerate();
249 :_exposure_modifyer(exposure_mod), _discrete(discrete), _fps_values{ 6, 15, 30, 60, 90 }
259 if (std::find(_fps_values.begin(), _fps_values.end(), 25) == _fps_values.end())
261 _fps_values.push_back(25);
262 std::sort(_fps_values.begin(), _fps_values.end());
269 auto exp_in_micro = _exposure_modifyer(exp);
270 if (exp_in_micro > 0)
272 auto fps = 1000000.f / exp_in_micro;
276 if (fps >= _fps_values.back())
278 fps =
static_cast<float>(_fps_values.back());
282 for (
auto i = 0; i < _fps_values.size() - 1; i++)
284 if (fps < _fps_values[i + 1])
286 fps =
static_cast<float>(_fps_values[i]);
292 return std::min((
int)fps, (
int)frm.get_stream()->get_framerate());
307 mutable std::vector<uint32_t> _fps_values;
308 attrib_modifyer _exposure_modifyer;
314 std::shared_ptr<md_attribute_parser_base> sensor_ts_parser)
321 template<
class S,
class Attribute>
326 _md_attribute(attribute_name), _offset(offset), _modifyer(mod){};
333 auto s =
reinterpret_cast<const S*
>((frm.additional_data.metadata_blob.data()) + _offset);
337 param = _modifyer(param);
351 Attribute S::* _md_attribute;
352 unsigned long long _offset;
353 attrib_modifyer _modifyer;
358 template<
class S,
class Attribute>
359 std::shared_ptr<md_attribute_parser_base>
make_sr300_attribute_parser(Attribute S::* attribute,
unsigned long long offset, attrib_modifyer mod =
nullptr)
std::shared_ptr< stream_profile_interface > get_stream() const override
Definition: archive.h:107
Definition: metadata-parser.h:23
std::shared_ptr< md_attribute_parser_base > make_rs400_sensor_ts_parser(std::shared_ptr< md_attribute_parser_base > frame_ts_parser, std::shared_ptr< md_attribute_parser_base > sensor_ts_parser)
A helper function to create a specialized parser for RS4xx sensor timestamp.
Definition: metadata-parser.h:313
Definition: rs_frame.h:33
Base class that establishes the interface for retrieving metadata attributes.
Definition: metadata-parser.h:28
md_rs400_sensor_timestamp(std::shared_ptr< md_attribute_parser_base > sensor_ts_parser, std::shared_ptr< md_attribute_parser_base > frame_ts_parser)
Definition: metadata-parser.h:206
The metadata parser class directly access the metadata attribute in the blob received from HW...
Definition: metadata-parser.h:60
uint32_t metadata_size
Definition: archive.h:27
Definition: metadata-parser.h:19
Optical timestamp for RS4xx devices is calculated internally.
Definition: metadata-parser.h:200
Definition: metadata-parser.h:20
Definition: metadata-parser.h:22
md_additional_parser(Attribute St::*attribute_name)
Definition: metadata-parser.h:173
Definition: metadata-parser.h:21
Definition: metadata-parser.h:24
bool supports(const frame &frm) const override
Definition: metadata-parser.h:181
Definition: metadata-parser.h:226
virtual bool supports(const frame &frm) const =0
frame_additional_data additional_data
Definition: archive.h:67
Definition: metadata.h:20
ds5_md_attribute_actual_fps(bool discrete=true, attrib_modifyer exposure_mod=[](const rs2_metadata_type ¶m) {return param;})
Definition: metadata-parser.h:248
Definition: metadata-parser.h:245
virtual ~md_attribute_parser_base()=default
#define LOG_DEBUG(...)
Definition: types.h:108
std::function< rs2_metadata_type(const rs2_metadata_type ¶m)> attrib_modifyer
Post-processing adjustment of the metadata attribute e.g change auto_exposure enum to boolean...
Definition: metadata-parser.h:39
provide attributes generated and stored internally by the library
Definition: metadata-parser.h:170
md_attribute_parser(Attribute S::*attribute_name, Flag flag, unsigned long long offset, attrib_modifyer mod)
Definition: metadata-parser.h:63
bool is_attribute_valid(const S *s) const
Definition: metadata-parser.h:88
md_type
md_mode - enumerates the types of metadata modes(structs) supported
Definition: metadata.h:29
bool supports(const frame &frm) const override
Definition: metadata-parser.h:219
std::shared_ptr< md_attribute_parser_base > make_uvc_header_parser(Attribute St::*attribute, attrib_modifyer mod=nullptr)
A utility function to create UVC metadata header parser.
Definition: metadata-parser.h:162
The SR300 metadata parser class.
Definition: metadata-parser.h:322
virtual ~md_rs400_sensor_timestamp()
Definition: metadata-parser.h:210
bool supports(const frame &frm) const override
Definition: metadata-parser.h:342
double get_fps(const frame &frm)
Definition: metadata-parser.h:229
rs2_time_t timestamp
Definition: archive.h:22
#define LOG_INFO(...)
Definition: types.h:109
Definition: rs_sensor.h:43
unsigned long long last_frame_number
Definition: archive.h:32
bool supports(const frame &frm) const override
Definition: metadata-parser.h:79
std::shared_ptr< md_attribute_parser_base > make_attribute_parser(Attribute S::*attribute, Flag flag, unsigned long long offset, attrib_modifyer mod=nullptr)
A helper function to create a specialized attribute parser. Return it as a pointer to a base-class...
Definition: metadata-parser.h:125
Definition: metadata-parser.h:41
long long rs2_metadata_type
Definition: rs_types.h:181
bool supports(const frame &frm) const override
Definition: metadata-parser.h:300
unsigned long long frame_number
Definition: archive.h:23
std::array< uint8_t, MAX_META_DATA_SIZE > metadata_blob
Definition: archive.h:29
std::shared_ptr< md_attribute_parser_base > make_additional_data_parser(Attribute St::*attribute)
A utility function to create additional_data parser.
Definition: metadata-parser.h:193
frame_metadata_internal
Metadata fields that are utilized internally by librealsense Provides extention to the r2_frame_metad...
Definition: metadata-parser.h:17
Definition: rs_sensor.h:67
std::shared_ptr< md_attribute_parser_base > make_sr300_attribute_parser(Attribute S::*attribute, unsigned long long offset, attrib_modifyer mod=nullptr)
A helper function to create a specialized attribute parser. Return it as a pointer to a base-class...
Definition: metadata-parser.h:359
rs2_time_t last_timestamp
Definition: archive.h:31
md_sr300_attribute_parser(Attribute S::*attribute_name, unsigned long long offset, attrib_modifyer mod)
Definition: metadata-parser.h:325
bool supports(const frame &frm) const override
Definition: metadata-parser.h:49