image_transport_codecs.h
Go to the documentation of this file.
1 #pragma once
2 
3 // SPDX-License-Identifier: BSD-3-Clause
4 // SPDX-FileCopyrightText: Czech Technical University in Prague
5 
12 #include <list>
13 #include <memory>
14 #include <string>
15 #include <unordered_map>
16 
17 #include <dynamic_reconfigure/Config.h>
19 #include <topic_tools/shape_shifter.h>
20 
21 #include <cras_cpp_common/c_api.h>
28 
29 namespace image_transport_codecs
30 {
31 
49 {
50 public:
55  explicit ImageTransportCodecs(const cras::LogHelperPtr& log = std::make_shared<cras::NodeLogHelper>());
56 
57  virtual ~ImageTransportCodecs();
58 
64 
75  virtual ImageTransportCodec::EncodeResult encode(const sensor_msgs::Image& raw,
76  const std::string& topicOrCodec, const dynamic_reconfigure::Config& config);
77 
89  const std::string& topicOrCodec, const dynamic_reconfigure::Config& config);
90 
106  const topic_tools::ShapeShifter& compressed, const std::string& topicOrCodec, const std::string& matchFormat) const;
107 
121  const topic_tools::ShapeShifter& compressed, const std::string& topicOrCodec) const;
122 
132  ImageTransportCodec::EncodeResult encode(const sensor_msgs::Image& raw, const std::string& topicOrCodec);
133 
144  const std::string& topicOrCodec);
145 
156  ImageTransportCodec::EncodeResult encode(const sensor_msgs::Image& raw,
157  const std::string& topicOrCodec, const XmlRpc::XmlRpcValue& config);
158 
170  const std::string& topicOrCodec, const XmlRpc::XmlRpcValue& config);
171 
183  ImageTransportCodec::EncodeResult encode(const sensor_msgs::Image& raw,
184  const std::string& topicOrCodec, const ros::NodeHandle& nh, const std::string& param);
185 
199  const std::string& topicOrCodec, const ros::NodeHandle& nh, const std::string& param);
200 
213  template<typename Config>
214  ImageTransportCodec::EncodeResult encode(const sensor_msgs::Image& raw,
215  const std::string& topicOrCodec, const Config& config)
216  {
217  dynamic_reconfigure::Config configMsg;
218  config.__toMessage__(configMsg);
219  return this->encode(raw, topicOrCodec, configMsg);
220  }
221 
234  template<typename Config>
236  const std::string& topicOrCodec, const Config& config)
237  {
238  dynamic_reconfigure::Config configMsg;
239  config.__toMessage__(configMsg);
240  return this->decode(compressed, topicOrCodec, configMsg);
241  }
242 
254  template<typename M>
255  inline cras::expected<M, std::string> encodeTyped(const sensor_msgs::Image& raw, const std::string& topicOrCodec,
256  const dynamic_reconfigure::Config& config)
257  {
258  const auto shifter = this->encode(raw, topicOrCodec, config);
259  if (!shifter)
260  return cras::make_unexpected(shifter.error());
261 
262  try
263  {
264  return *shifter->instantiate<M>();
265  }
266  catch (const ros::Exception& e)
267  {
268  return cras::make_unexpected(cras::format("Invalid shapeshifter returned from encoder: %s.", e.what()));
269  }
270  }
271 
283  template<typename M>
284  inline ImageTransportCodec::DecodeResult decodeTyped(const M& compressed, const std::string& topicOrCodec,
285  const dynamic_reconfigure::Config& config)
286  {
288  cras::msgToShapeShifter(compressed, shifter);
289  return this->decode(shifter, topicOrCodec, config);
290  }
291 
302  template<typename M>
303  inline cras::expected<M, std::string> encodeTyped(const sensor_msgs::Image& raw, const std::string& topicOrCodec)
304  {
305  return this->encodeTyped<M>(raw, topicOrCodec, dynamic_reconfigure::Config());
306  }
307 
318  template<typename M>
319  inline ImageTransportCodec::DecodeResult decodeTyped(const M& compressed, const std::string& topicOrCodec)
320  {
321  return this->decodeTyped(compressed, topicOrCodec, dynamic_reconfigure::Config());
322  }
323 
335  template<typename M>
336  inline cras::expected<M, std::string> encodeTyped(const sensor_msgs::Image& raw, const std::string& topicOrCodec,
337  const XmlRpc::XmlRpcValue& config)
338  {
339  dynamic_reconfigure::Config configMsg;
340  std::list<std::string> errors;
341  if (!cras::convert(config, configMsg, true, &errors))
342  return cras::make_unexpected("Invalid encoder config: " + cras::join(errors, " "));
343 
344  return this->encodeTyped<M>(raw, topicOrCodec, configMsg);
345  }
346 
358  template<typename M>
359  inline ImageTransportCodec::DecodeResult decodeTyped(const M& compressed, const std::string& topicOrCodec,
360  const XmlRpc::XmlRpcValue& config)
361  {
362  dynamic_reconfigure::Config configMsg;
363  std::list<std::string> errors;
364  if (!cras::convert(config, configMsg, true, &errors))
365  return cras::make_unexpected("Invalid decoder config: " + cras::join(errors, " "));
366 
367  return this->decodeTyped(compressed, topicOrCodec, configMsg);
368  }
369 
382  template<typename M>
383  inline cras::expected<M, std::string> encodeTyped(const sensor_msgs::Image& raw, const std::string& topicOrCodec,
384  const ros::NodeHandle& nh, const std::string& param)
385  {
386  return this->encodeTyped<M>(raw, topicOrCodec, nh.param(param, XmlRpc::XmlRpcValue()));
387  }
388 
402  template<typename M>
403  inline ImageTransportCodec::DecodeResult decodeTyped(const M& compressed, const std::string& topicOrCodec,
404  const ros::NodeHandle& nh, const std::string& param)
405  {
406  return this->encodeTyped(compressed, topicOrCodec, nh.param(param, XmlRpc::XmlRpcValue()));
407  }
408 
422  template<typename M, typename Config>
423  inline cras::expected<M, std::string> encodeTyped(const sensor_msgs::Image& raw, const std::string& topicOrCodec,
424  const Config& config)
425  {
426  dynamic_reconfigure::Config configMsg;
427  config.__toMessage__(configMsg);
428  return this->encodeTyped<M>(raw, topicOrCodec, configMsg);
429  }
430 
444  template<typename M, typename Config>
445  inline ImageTransportCodec::DecodeResult decodeTyped(const M& compressed, const std::string& topicOrCodec,
446  const Config& config)
447  {
448  dynamic_reconfigure::Config configMsg;
449  config.__toMessage__(configMsg);
450  return this->decodeTyped(compressed, topicOrCodec, configMsg);
451  }
452 
453 protected:
458  void loadCodecs();
459 
465  std::string parseTransport(const std::string& topicOrCodec) const;
466 
467  std::unique_ptr<pluginlib::ClassLoader<ImageTransportCodecPlugin>> loader;
468  std::unordered_map<std::string, ImageTransportCodecPlugin::ConstPtr> codecs;
469 };
470 
471 }
472 
476 
507 extern "C" bool imageTransportCodecsEncode(
508  const char* topicOrCodec,
509  sensor_msgs::Image::_height_type rawHeight,
510  sensor_msgs::Image::_width_type rawWidth,
511  const char* rawEncoding,
512  sensor_msgs::Image::_is_bigendian_type rawIsBigEndian,
513  sensor_msgs::Image::_step_type rawStep,
514  size_t rawDataLength,
515  const uint8_t rawData[],
516  cras::allocator_t compressedTypeAllocator,
517  cras::allocator_t md5SumAllocator,
518  cras::allocator_t compressedDataAllocator,
519  size_t serializedConfigLength,
520  const uint8_t serializedConfig[],
521  cras::allocator_t errorStringAllocator,
522  cras::allocator_t logMessagesAllocator
523 );
524 
555 extern "C" bool imageTransportCodecsDecode(
556  const char* topicOrCodec,
557  const char* compressedType,
558  const char* compressedMd5sum,
559  size_t compressedDataLength,
560  const uint8_t compressedData[],
561  sensor_msgs::Image::_height_type& rawHeight,
562  sensor_msgs::Image::_width_type& rawWidth,
563  cras::allocator_t rawEncodingAllocator,
564  sensor_msgs::Image::_is_bigendian_type& rawIsBigEndian,
565  sensor_msgs::Image::_step_type& rawStep,
566  cras::allocator_t rawDataAllocator,
567  size_t serializedConfigLength,
568  const uint8_t serializedConfig[],
569  cras::allocator_t errorStringAllocator,
570  cras::allocator_t logMessagesAllocator
571 );
572 
602 extern "C" bool getCompressedImageContents(
603  const char* topicOrCodec,
604  const char* compressedType,
605  const char* compressedMd5sum,
606  size_t compressedDataLength,
607  const uint8_t compressedData[],
608  const char* matchFormat,
609  bool& hasData,
610  cras::allocator_t formatAllocator,
611  cras::allocator_t dataAllocator,
612  cras::allocator_t errorStringAllocator,
613  cras::allocator_t logMessagesAllocator
614 );
Plugin-based interface for compressing and decompressing images using codec plugins.
bool param(const std::string &param_name, T &param_val, const T &default_val)
cras::expected< cras::ShapeShifter, std::string > EncodeResult
Result of image encoding. Either a shapeshifter holding the compressed message, or error message...
ImageTransportCodec::DecodeResult decodeTyped(const M &compressed, const std::string &topicOrCodec, const dynamic_reconfigure::Config &config)
Decode the given compressed image into a raw image.
void loadCodecs()
Load all codecs available via pluginlib. This function can be called multiple times without negative ...
cras::expected< M, std::string > encodeTyped(const sensor_msgs::Image &raw, const std::string &topicOrCodec)
Encode the given raw image into a compressed image using the default compression parameters.
ImageTransportCodec::DecodeResult decodeTyped(const M &compressed, const std::string &topicOrCodec)
Decode the given compressed image into a raw image using the default decompression parameters...
bool imageTransportCodecsDecode(const char *topicOrCodec, const char *compressedType, const char *compressedMd5sum, size_t compressedDataLength, const uint8_t compressedData[], sensor_msgs::Image::_height_type &rawHeight, sensor_msgs::Image::_width_type &rawWidth, cras::allocator_t rawEncodingAllocator, sensor_msgs::Image::_is_bigendian_type &rawIsBigEndian, sensor_msgs::Image::_step_type &rawStep, cras::allocator_t rawDataAllocator, size_t serializedConfigLength, const uint8_t serializedConfig[], cras::allocator_t errorStringAllocator, cras::allocator_t logMessagesAllocator)
Decode the given compressed image using compressed codec with the given config.
std::unique_ptr< pluginlib::ClassLoader< ImageTransportCodecPlugin > > loader
Pluginlib loader of codecs.
Plugin interface to image transport codecs which allows automatic selection of a suitable codec by Im...
virtual ImageTransportCodec::DecodeResult decode(const topic_tools::ShapeShifter &compressed, const std::string &topicOrCodec, const dynamic_reconfigure::Config &config)
Decode the given compressed image shapeshifter into a raw image.
void addCodec(const ImageTransportCodecPlugin::ConstPtr &codec)
Manually add a codec instance. This is usually not needed as the codecs are autodetected using plugin...
std::unordered_map< std::string, ImageTransportCodecPlugin::ConstPtr > codecs
Loaded codecs.
::cras::LogHelperPtr log
cras::expected< M, std::string > encodeTyped(const sensor_msgs::Image &raw, const std::string &topicOrCodec, const dynamic_reconfigure::Config &config)
Encode the given raw image into a compressed image.
cras::expected< sensor_msgs::Image, std::string > DecodeResult
Result of image decoding. Either a sensor_msgs::Image holding the raw message, or error message...
ImageTransportCodecs(const cras::LogHelperPtr &log=std::make_shared< cras::NodeLogHelper >())
Create the codec interface and load all available codecs.
bool param(const std::string &param_name, T &param_val, const T &default_val) const
void msgToShapeShifter(const T &msg, ::topic_tools::ShapeShifter &shifter)
ImageTransportCodec::EncodeResult encode(const sensor_msgs::Image &raw, const std::string &topicOrCodec, const Config &config)
Encode the given raw image into a compressed image shapeshifter.
cras::expected< cras::optional< CompressedImageContent >, std::string > GetCompressedContentResult
Result of getting the actual compressed image data.
Base for all image transport codecs.
bool imageTransportCodecsEncode(const char *topicOrCodec, sensor_msgs::Image::_height_type rawHeight, sensor_msgs::Image::_width_type rawWidth, const char *rawEncoding, sensor_msgs::Image::_is_bigendian_type rawIsBigEndian, sensor_msgs::Image::_step_type rawStep, size_t rawDataLength, const uint8_t rawData[], cras::allocator_t compressedTypeAllocator, cras::allocator_t md5SumAllocator, cras::allocator_t compressedDataAllocator, size_t serializedConfigLength, const uint8_t serializedConfig[], cras::allocator_t errorStringAllocator, cras::allocator_t logMessagesAllocator)
C API ///.
ImageTransportCodec::DecodeResult decodeTyped(const M &compressed, const std::string &topicOrCodec, const Config &config)
Decode the given compressed image into a raw image.
virtual ImageTransportCodec::GetCompressedContentResult getCompressedImageContent(const topic_tools::ShapeShifter &compressed, const std::string &topicOrCodec, const std::string &matchFormat) const
Return the part of the encoded message that represents the actual image data (i.e. the part that can be passed to external decoders or saved to a file). If the codec messages have no such meaning, empty result is returned.
bool convert(const ::XmlRpc::XmlRpcValue &x, ::XmlRpc::XmlRpcValue &v, bool=false, ::std::list<::std::string > *errors=nullptr)
inline ::std::string format(const char *format, ::va_list args)
bool getCompressedImageContents(const char *topicOrCodec, const char *compressedType, const char *compressedMd5sum, size_t compressedDataLength, const uint8_t compressedData[], const char *matchFormat, bool &hasData, cras::allocator_t formatAllocator, cras::allocator_t dataAllocator, cras::allocator_t errorStringAllocator, cras::allocator_t logMessagesAllocator)
Return the part of the encoded message that represents the actual image data (i.e. the part that can be passed to external decoders or saved to a file). If the codec messages have no such meaning, empty result is returned.
virtual ImageTransportCodec::EncodeResult encode(const sensor_msgs::Image &raw, const std::string &topicOrCodec, const dynamic_reconfigure::Config &config)
Encode the given raw image into a compressed image shapeshifter.
void *(* allocator_t)(size_t)
cras::expected< M, std::string > encodeTyped(const sensor_msgs::Image &raw, const std::string &topicOrCodec, const Config &config)
Encode the given raw image into a compressed image.
ImageTransportCodec::DecodeResult decodeTyped(const M &compressed, const std::string &topicOrCodec, const ros::NodeHandle &nh, const std::string &param)
Decode the given compressed image into a raw image.
ImageTransportCodec::DecodeResult decodeTyped(const M &compressed, const std::string &topicOrCodec, const XmlRpc::XmlRpcValue &config)
Decode the given compressed image into a raw image.
::std::string join(const T &strings, const ::std::string &delimiter)
std::string parseTransport(const std::string &topicOrCodec) const
Parse the name of the codec from a topic.
cras::expected< M, std::string > encodeTyped(const sensor_msgs::Image &raw, const std::string &topicOrCodec, const XmlRpc::XmlRpcValue &config)
Encode the given raw image into a compressed image.
ImageTransportCodec::DecodeResult decode(const topic_tools::ShapeShifter &compressed, const std::string &topicOrCodec, const Config &config)
Decode the given compressed image shapeshifter into a raw image.
::cras::LogHelper::Ptr LogHelperPtr
cras::expected< M, std::string > encodeTyped(const sensor_msgs::Image &raw, const std::string &topicOrCodec, const ros::NodeHandle &nh, const std::string &param)
Encode the given raw image into a compressed image.


image_transport_codecs
Author(s): Martin Pecka
autogenerated on Sat Jun 17 2023 02:33:19