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 );
image_transport_codecs::ImageTransportCodecs::loader
std::unique_ptr< pluginlib::ClassLoader< ImageTransportCodecPlugin > > loader
Pluginlib loader of codecs.
Definition: image_transport_codecs.h:467
c_api.h
imageTransportCodecsDecode
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.
image_transport_codecs::ImageTransportCodecs::decodeTyped
ImageTransportCodec::DecodeResult decodeTyped(const M &compressed, const std::string &topicOrCodec, const Config &config)
Decode the given compressed image into a raw image.
Definition: image_transport_codecs.h:445
boost::shared_ptr
xmlrpc_value_utils.hpp
image_transport_codecs::ImageTransportCodecs::encode
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.
Definition: image_transport_codecs.h:214
image_transport_codecs::ImageTransportCodec::DecodeResult
cras::expected< sensor_msgs::Image, std::string > DecodeResult
Result of image decoding. Either a sensor_msgs::Image holding the raw message, or error message.
Definition: image_transport_codec.h:95
cras::join
::std::string join(const T &strings, const ::std::string &delimiter)
cras::HasLogger
ros::Exception
imageTransportCodecsEncode
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 ///.
image_transport_codecs::ImageTransportCodecs::encodeTyped
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.
Definition: image_transport_codecs.h:423
image_transport_codecs::ImageTransportCodec::GetCompressedContentResult
cras::expected< cras::optional< CompressedImageContent >, std::string > GetCompressedContentResult
Result of getting the actual compressed image data.
Definition: image_transport_codec.h:98
log_utils.h
image_transport_codecs::ImageTransportCodecs::parseTransport
std::string parseTransport(const std::string &topicOrCodec) const
Parse the name of the codec from a topic.
image_transport_codecs::ImageTransportCodecs::decode
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.
image_transport_codec.h
Base for all image transport codecs.
image_transport_codecs::ImageTransportCodecs::encode
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.
image_transport_codecs::ImageTransportCodecs::encodeTyped
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.
Definition: image_transport_codecs.h:383
image_transport_codecs::ImageTransportCodecs::decode
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.
Definition: image_transport_codecs.h:235
getCompressedImageContents
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....
image_transport_codecs::ImageTransportCodecs::loadCodecs
void loadCodecs()
Load all codecs available via pluginlib. This function can be called multiple times without negative ...
class_loader.hpp
image_transport_codecs::ImageTransportCodecs::codecs
std::unordered_map< std::string, ImageTransportCodecPlugin::ConstPtr > codecs
Loaded codecs.
Definition: image_transport_codecs.h:468
image_transport_codecs::ImageTransportCodecs::getCompressedImageContent
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....
image_transport_codecs::ImageTransportCodecs
Plugin-based interface for compressing and decompressing images using codec plugins.
Definition: image_transport_codecs.h:48
image_transport_codecs::ImageTransportCodecs::~ImageTransportCodecs
virtual ~ImageTransportCodecs()
shape_shifter.h
image_transport_codec_plugin.h
Plugin interface to image transport codecs which allows automatic selection of a suitable codec by Im...
cras::LogHelperPtr
::cras::LogHelper::Ptr LogHelperPtr
image_transport_codecs
Definition: compressed_codec.h:29
cras::msgToShapeShifter
void msgToShapeShifter(const T &msg, ::topic_tools::ShapeShifter &shifter)
image_transport_codecs::ImageTransportCodecs::decodeTyped
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.
Definition: image_transport_codecs.h:403
image_transport_codecs::ImageTransportCodecs::encodeTyped
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.
Definition: image_transport_codecs.h:255
image_transport_codecs::ImageTransportCodecs::decodeTyped
ImageTransportCodec::DecodeResult decodeTyped(const M &compressed, const std::string &topicOrCodec, const dynamic_reconfigure::Config &config)
Decode the given compressed image into a raw image.
Definition: image_transport_codecs.h:284
node.h
image_transport_codecs::ImageTransportCodecs::addCodec
void addCodec(const ImageTransportCodecPlugin::ConstPtr &codec)
Manually add a codec instance. This is usually not needed as the codecs are autodetected using plugin...
image_transport_codecs::ImageTransportCodecs::encodeTyped
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.
Definition: image_transport_codecs.h:336
ros::NodeHandle::param
T param(const std::string &param_name, const T &default_val) const
cras::HasLogger::log
::cras::LogHelperPtr log
param
T param(const std::string &param_name, const T &default_val)
image_transport_codecs::ImageTransportCodecs::decodeTyped
ImageTransportCodec::DecodeResult decodeTyped(const M &compressed, const std::string &topicOrCodec, const XmlRpc::XmlRpcValue &config)
Decode the given compressed image into a raw image.
Definition: image_transport_codecs.h:359
image_transport_codecs::ImageTransportCodecs::encodeTyped
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.
Definition: image_transport_codecs.h:303
cras::format
inline ::std::string format(::std::string format, ::va_list args)
topic_tools::ShapeShifter
image_transport_codecs::ImageTransportCodecs::ImageTransportCodecs
ImageTransportCodecs(const cras::LogHelperPtr &log=std::make_shared< cras::NodeLogHelper >())
Create the codec interface and load all available codecs.
image_transport_codecs::ImageTransportCodec::EncodeResult
cras::expected< cras::ShapeShifter, std::string > EncodeResult
Result of image encoding. Either a shapeshifter holding the compressed message, or error message.
Definition: image_transport_codec.h:92
cras::convert
bool convert(const ::XmlRpc::XmlRpcValue &x, ::dynamic_reconfigure::Config &v, bool skipNonConvertible, ::std::list<::std::string > *errors)
cras::allocator_t
void *(* allocator_t)(size_t)
XmlRpc::XmlRpcValue
image_transport_codecs::ImageTransportCodecs::decodeTyped
ImageTransportCodec::DecodeResult decodeTyped(const M &compressed, const std::string &topicOrCodec)
Decode the given compressed image into a raw image using the default decompression parameters.
Definition: image_transport_codecs.h:319
ros::NodeHandle


image_transport_codecs
Author(s): Martin Pecka
autogenerated on Mon Jun 17 2024 02:49:15