Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions include/ffmpeg_encoder_decoder/utils.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,21 @@ std::vector<std::string> split_by_char(const std::string & str_list, const char
* \return true if ROS encoding is single channel and color format is like NV12/yuv420p
*/
bool encode_single_channel_as_color(const std::string & encoding, enum AVPixelFormat fmt);

/**
* \brief splits a string with a list of decoders
* \param decoder_list comma-separated list of decoders
* \return vector of separated strings
*/
std::vector<std::string> split_decoders(const std::string & decoder_list);

/**
* \brief splits a string with an encoding ("codec;fmt;fmt;fmt")
* \param encoding string with encoding information
* \return vector of separated strings
*/
std::vector<std::string> split_encoding(const std::string & encoding);

} // namespace utils
} // namespace ffmpeg_encoder_decoder
#endif // FFMPEG_ENCODER_DECODER__UTILS_HPP_
7 changes: 1 addition & 6 deletions src/decoder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,15 +66,10 @@ void Decoder::setOutputMessageEncoding(const std::string & output_encoding)
outputMsgEncoding_ = output_encoding;
}

static std::vector<std::string> splitEncoding(const std::string & encoding)
{
return (utils::split_by_char(encoding, ';'));
}

void Decoder::setEncoding(const std::string & encoding)
{
packetEncoding_ = encoding;
const auto split = splitEncoding(encoding);
const auto split = ffmpeg_encoder_decoder::utils::split_encoding(encoding);
if (outputMsgEncoding_.empty()) {
// assume orig was bgr8
outputMsgEncoding_ = split.size() == 4 ? split[3] : "bgr8";
Expand Down
25 changes: 22 additions & 3 deletions src/utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,8 @@ enum AVPixelFormat ros_to_av_pix_format(const std::string & ros_pix_fmt)
const auto it = ros_to_av_pix_map.find(ros_pix_fmt);
if (it == ros_to_av_pix_map.end()) {
RCLCPP_ERROR_STREAM(
rclcpp::get_logger("encoder"), "no AV pixel format known for ros format " << ros_pix_fmt);
rclcpp::get_logger("encoder/decoder"),
"no AV pixel format known for ros format " << ros_pix_fmt);
throw(std::runtime_error("no matching pixel format found for: " + ros_pix_fmt));
}
return (it->second);
Expand Down Expand Up @@ -265,6 +266,16 @@ std::vector<std::string> split_by_char(const std::string & str_list, const char
return (split);
}

std::vector<std::string> split_decoders(const std::string & decoder_list)
{
return (split_by_char(decoder_list, ','));
}

std::vector<std::string> split_encoding(const std::string & encoding)
{
return (split_by_char(encoding, ';'));
}

// This function finds the encoding that is the target of a given encoder.

static AVCodecID find_id_for_encoder_or_encoding(const std::string & encoder)
Expand Down Expand Up @@ -312,13 +323,21 @@ std::string find_decoders(const std::string & codec)
std::string filter_decoders(const std::string & codec, const std::string & decoders)
{
std::string filtered;
const auto valid_decoders = split_by_char(find_decoders(codec), ',');
for (const auto & dec : split_by_char(decoders, ',')) {
const auto valid_decoders = split_decoders(find_decoders(codec));
for (const auto & dec : split_decoders(decoders)) {
bool found = false;
for (const auto & valid : valid_decoders) {
if (dec == valid) {
filtered += (filtered.empty() ? "" : ",") + dec;
found = true;
break;
}
}
if (!found) {
RCLCPP_WARN_STREAM(
rclcpp::get_logger("encoder/decoder"),
"ignoring invalid decoder " << dec << " for codec " << codec);
}
}
return (filtered);
}
Expand Down