// Copyright 2019 The MediaPipe Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "mediapipe/framework/packet.h" #include "absl/strings/str_cat.h" #include "mediapipe/framework/port.h" #include "mediapipe/framework/port/canonical_errors.h" #include "mediapipe/framework/port/integral_types.h" #include "mediapipe/framework/port/ret_check.h" #include "mediapipe/framework/port/status.h" #include "mediapipe/framework/port/status_builder.h" #include "mediapipe/framework/tool/type_util.h" namespace mediapipe { namespace packet_internal { HolderBase::~HolderBase() {} Packet Create(HolderBase* holder) { Packet result; result.holder_.reset(holder); return result; } Packet Create(HolderBase* holder, Timestamp timestamp) { Packet result; result.holder_.reset(holder); result.timestamp_ = timestamp; return result; } Packet Create(std::shared_ptr holder, Timestamp timestamp) { Packet result; result.holder_ = std::move(holder); result.timestamp_ = timestamp; return result; } const HolderBase* GetHolder(const Packet& packet) { return packet.holder_.get(); } absl::StatusOr PacketFromDynamicProto(const std::string& type_name, const std::string& serialized) { ASSIGN_OR_RETURN( auto message_holder, packet_internal::MessageHolderRegistry::CreateByName(type_name)); auto* message = const_cast(message_holder->GetProtoMessageLite()); RET_CHECK_NE(message, nullptr); RET_CHECK(message->ParseFromString(serialized)); return packet_internal::Create(message_holder.release()); } } // namespace packet_internal Packet Packet::At(class Timestamp timestamp) const& { Packet result(*this); result.timestamp_ = timestamp; return result; } Packet Packet::At(class Timestamp timestamp) && { timestamp_ = timestamp; // Note: Below object is of type Packet&& which doesn't match return type // of Packet, so a new Packet will be created by move constructor here. // Moving everything to a new Packet is done intentionally to preserve the // immutability of Timestamps. return std::move(*this); } std::string Packet::RegisteredTypeName() const { if (IsEmpty()) { return ""; } return holder_->RegisteredTypeName(); } std::string Packet::DebugTypeName() const { if (IsEmpty()) { return "{empty}"; } return holder_->DebugTypeName(); } std::string Packet::DebugString() const { std::string result = absl::StrCat("mediapipe::Packet with timestamp: ", timestamp_.DebugString()); if (IsEmpty()) { absl::StrAppend(&result, " and no data"); } else { absl::StrAppend(&result, " and type: ", holder_->DebugTypeName()); } return result; } absl::Status Packet::ValidateAsType(const tool::TypeInfo& type_info) const { if (ABSL_PREDICT_FALSE(IsEmpty())) { return absl::InternalError( absl::StrCat("Expected a Packet of type: ", MediaPipeTypeStringOrDemangled(type_info), ", but received an empty Packet.")); } bool holder_is_right_type = holder_->GetTypeId() == type_info.hash_code(); if (ABSL_PREDICT_FALSE(!holder_is_right_type)) { return absl::InvalidArgumentError(absl::StrCat( "The Packet stores \"", holder_->DebugTypeName(), "\", but \"", MediaPipeTypeStringOrDemangled(type_info), "\" was requested.")); } return absl::OkStatus(); } absl::Status Packet::ValidateAsProtoMessageLite() const { if (ABSL_PREDICT_FALSE(IsEmpty())) { return absl::InternalError("Packet is empty."); } if (ABSL_PREDICT_FALSE(holder_->GetProtoMessageLite() == nullptr)) { return absl::InvalidArgumentError( absl::StrCat("The Packet stores \"", holder_->DebugTypeName(), "\"", "which is not convertible to proto_ns::MessageLite.")); } else { return absl::OkStatus(); } } const proto_ns::MessageLite& Packet::GetProtoMessageLite() const { CHECK(holder_ != nullptr) << "The packet is empty."; const proto_ns::MessageLite* proto = holder_->GetProtoMessageLite(); CHECK(proto != nullptr) << "The Packet stores '" << holder_->DebugTypeName() << "', it cannot be converted to MessageLite type."; return *proto; } StatusOr> Packet::GetVectorOfProtoMessageLitePtrs() const { if (holder_ == nullptr) { return absl::InternalError("Packet is empty."); } return holder_->GetVectorOfProtoMessageLite(); } MEDIAPIPE_REGISTER_TYPE(::mediapipe::Packet, "::mediapipe::Packet", nullptr, nullptr); MEDIAPIPE_REGISTER_TYPE(::std::vector<::mediapipe::Packet>, "::std::vector<::mediapipe::Packet>", nullptr, nullptr); MEDIAPIPE_REGISTER_TYPE(::mediapipe::Timestamp, "::mediapipe::Timestamp", nullptr, nullptr); #define PACKET_PAIR_TYPE ::std::pair<::mediapipe::Packet, ::mediapipe::Packet> MEDIAPIPE_REGISTER_TYPE(PACKET_PAIR_TYPE, "::std::pair<::mediapipe::Packet,::mediapipe::Packet>", nullptr, nullptr); #undef PACKET_PAIR_TYPE #define PACKET_MAP_TYPE ::std::map MEDIAPIPE_REGISTER_TYPE(PACKET_MAP_TYPE, "::std::map", nullptr, nullptr); #undef PACKET_MAP_TYPE } // namespace mediapipe