#include "mediapipe/framework/tool/container_util.h" #include "mediapipe/framework/tool/switch_container.pb.h" namespace mediapipe { namespace tool { std::string ChannelTag(const std::string& tag, int channel) { return absl::StrCat("C", channel, "__", tag); } // Parses a tag name starting with a channel prefix, like "C2__". bool ParseChannelTag(const std::string& channel_name, std::string* name, std::string* num) { int pos = channel_name.find('C'); int sep = channel_name.find("__"); if (pos != 0 || sep == std::string::npos) { return false; } *num = channel_name.substr(pos + 1, sep - (pos + 1)); *name = channel_name.substr(sep + 2); return true; } std::set ChannelTags(const std::shared_ptr& map) { std::set result; for (const std::string& tag : map->GetTags()) { std::string name, num; if (ParseChannelTag(tag, &name, &num)) { result.insert(name); } } return result; } int ChannelCount(const std::shared_ptr& map) { int count = 0; for (const std::string& tag : map->GetTags()) { std::string name, num; int channel = -1; if (ParseChannelTag(tag, &name, &num)) { if (absl::SimpleAtoi(num, &channel)) { count = std::max(count, channel + 1); } } } return count; } void Relay(const InputStreamShard& input, OutputStreamShard* output) { if (input.IsEmpty()) { Timestamp input_bound = input.Value().Timestamp().NextAllowedInStream(); if (output->NextTimestampBound() < input_bound) { output->SetNextTimestampBound(input_bound); } } else { output->AddPacket(input.Value()); } } int GetChannelIndex(const CalculatorContext& cc, int previous_index) { int result = previous_index; Packet select_packet; Packet enable_packet; if (cc.InputTimestamp() == Timestamp::Unstarted()) { auto& options = cc.Options(); if (options.has_enable()) { result = options.enable() ? 1 : 0; } if (options.has_select()) { result = options.select(); } if (cc.InputSidePackets().HasTag("ENABLE")) { enable_packet = cc.InputSidePackets().Tag("ENABLE"); } if (cc.InputSidePackets().HasTag("SELECT")) { select_packet = cc.InputSidePackets().Tag("SELECT"); } } else { if (cc.Inputs().HasTag("ENABLE")) { enable_packet = cc.Inputs().Tag("ENABLE").Value(); } if (cc.Inputs().HasTag("SELECT")) { select_packet = cc.Inputs().Tag("SELECT").Value(); } } if (!enable_packet.IsEmpty()) { result = enable_packet.Get() ? 1 : 0; } if (!select_packet.IsEmpty()) { result = select_packet.Get(); } return result; } } // namespace tool } // namespace mediapipe