// 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. #ifndef MEDIAPIPE_FRAMEWORK_PACKET_GENERATOR_H_ #define MEDIAPIPE_FRAMEWORK_PACKET_GENERATOR_H_ #include <memory> #include <string> #include <type_traits> #include "absl/base/attributes.h" #include "absl/base/macros.h" #include "mediapipe/framework/deps/registration.h" #include "mediapipe/framework/packet_generator.pb.h" #include "mediapipe/framework/packet_set.h" #include "mediapipe/framework/packet_type.h" #include "mediapipe/framework/port.h" #include "mediapipe/framework/port/status.h" namespace mediapipe { // Pure virtual base class for packet generators. These classes take any // number of input side packet packets and produce some number of external // output packets. Those packets then become input side packets to other // PacketGenerator's or to Calculators within the calculator graph. // // ***NOTE*** It is vital that the public interfaces for all classes // included in packets be thread safe if the packet is meant // to be used concurrently (e.g., with the PacketManager). class PacketGenerator { … }; // Details for the registration of a PacketGenerator follow. A user of // PacketGenerator does not need to know about the following code. namespace internal { // Gives access to the static functions within subclasses of PacketGenerator. // This adds functionality akin to virtual static functions. class StaticAccessToGenerator { … }; using StaticAccessToGeneratorRegistry = GlobalFactoryRegistry<std::unique_ptr<StaticAccessToGenerator>>; // Functions for checking that the PacketGenerator has the proper // functions defined. template <class T> constexpr bool PacketGeneratorHasFillExpectations( decltype(&T::FillExpectations) /*unused*/) { … } template <class T> constexpr bool PacketGeneratorHasFillExpectations(...) { … } template <class T> constexpr bool PacketGeneratorHasGenerate(decltype(&T::Generate) /*unused*/) { … } template <class T> constexpr bool PacketGeneratorHasGenerate(...) { … } // Provides access to the static functions within a specific subclass // of PacketGenerator. See thee same mechanism in calculator.h for a // more detailed explanation. template <typename PacketGeneratorSubclass> class StaticAccessToGeneratorTyped : public StaticAccessToGenerator { … }; } // namespace internal // Macro for registering PacketGenerators. It actually just registers // the StaticAccessToGeneratorTyped class. #define REGISTER_PACKET_GENERATOR(name) … } // namespace mediapipe #endif // MEDIAPIPE_FRAMEWORK_PACKET_GENERATOR_H_