Project import generated by Copybara.
GitOrigin-RevId: d8caa66de45839696f5bd0786ad3bfbcb9cff632
This commit is contained in:
@@ -4,9 +4,9 @@
|
||||
#include "mediapipe/framework/port/integral_types.h"
|
||||
#include "mediapipe/framework/type_map.h"
|
||||
|
||||
#define MEDIAPIPE_REGISTER_GENERIC_TYPE(type) \
|
||||
MEDIAPIPE_REGISTER_TYPE( \
|
||||
::mediapipe::type_map_internal::ReflectType<void(type*)>::Type, #type, \
|
||||
#define MEDIAPIPE_REGISTER_GENERIC_TYPE(type) \
|
||||
MEDIAPIPE_REGISTER_TYPE( \
|
||||
mediapipe::type_map_internal::ReflectType<void(type*)>::Type, #type, \
|
||||
nullptr, nullptr)
|
||||
|
||||
// Note: we cannot define a type which type hash id is already in the map.
|
||||
|
||||
@@ -81,7 +81,7 @@ class CalculatorBase {
|
||||
// this function is static the registration macro provides access to
|
||||
// each subclass' GetContract function.
|
||||
//
|
||||
// static ::mediapipe::Status GetContract(CalculatorContract* cc);
|
||||
// static mediapipe::Status GetContract(CalculatorContract* cc);
|
||||
//
|
||||
// GetContract fills in the calculator's contract with the framework, such
|
||||
// as its expectations of what packets it will receive. When this function
|
||||
@@ -115,23 +115,23 @@ class CalculatorBase {
|
||||
// Open is called before any Process() calls, on a freshly constructed
|
||||
// calculator. Subclasses may override this method to perform necessary
|
||||
// setup, and possibly output Packets and/or set output streams' headers.
|
||||
// Must return ::mediapipe::OkStatus() to indicate success. On failure any
|
||||
// Must return mediapipe::OkStatus() to indicate success. On failure any
|
||||
// other status code can be returned. If failure is returned then the
|
||||
// framework will call neither Process() nor Close() on the calculator (so any
|
||||
// necessary cleanup should be done before returning failure or in the
|
||||
// destructor).
|
||||
virtual ::mediapipe::Status Open(CalculatorContext* cc) {
|
||||
return ::mediapipe::OkStatus();
|
||||
virtual mediapipe::Status Open(CalculatorContext* cc) {
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
// Processes the incoming inputs. May call the methods on cc to access
|
||||
// inputs and produce outputs.
|
||||
//
|
||||
// Process() called on a non-source node must return
|
||||
// ::mediapipe::OkStatus() to indicate that all went well, or any other
|
||||
// mediapipe::OkStatus() to indicate that all went well, or any other
|
||||
// status code to signal an error.
|
||||
// For example:
|
||||
// ::mediapipe::UnknownError("Failure Message");
|
||||
// mediapipe::UnknownError("Failure Message");
|
||||
// Notice the convenience functions in util/task/canonical_errors.h .
|
||||
// If a non-source Calculator returns tool::StatusStop(), then this
|
||||
// signals the graph is being cancelled early. In this case, all
|
||||
@@ -139,22 +139,22 @@ class CalculatorBase {
|
||||
// remaining Packets will propagate through the graph).
|
||||
//
|
||||
// A source node will continue to have Process() called on it as long
|
||||
// as it returns ::mediapipe::OkStatus(). To indicate that there is
|
||||
// as it returns mediapipe::OkStatus(). To indicate that there is
|
||||
// no more data to be generated return tool::StatusStop(). Any other
|
||||
// status indicates an error has occurred.
|
||||
virtual ::mediapipe::Status Process(CalculatorContext* cc) = 0;
|
||||
virtual mediapipe::Status Process(CalculatorContext* cc) = 0;
|
||||
|
||||
// Is called if Open() was called and succeeded. Is called either
|
||||
// immediately after processing is complete or after a graph run has ended
|
||||
// (if an error occurred in the graph). Must return ::mediapipe::OkStatus()
|
||||
// (if an error occurred in the graph). Must return mediapipe::OkStatus()
|
||||
// to indicate success. On failure any other status code can be returned.
|
||||
// Packets may be output during a call to Close(). However, output packets
|
||||
// are silently discarded if Close() is called after a graph run has ended.
|
||||
//
|
||||
// NOTE: If Close() needs to perform an action only when processing is
|
||||
// complete, Close() must check if cc->GraphStatus() is OK.
|
||||
virtual ::mediapipe::Status Close(CalculatorContext* cc) {
|
||||
return ::mediapipe::OkStatus();
|
||||
virtual mediapipe::Status Close(CalculatorContext* cc) {
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
// Returns a value according to which the framework selects
|
||||
@@ -178,7 +178,7 @@ namespace internal {
|
||||
class StaticAccessToCalculatorBase {
|
||||
public:
|
||||
virtual ~StaticAccessToCalculatorBase() {}
|
||||
virtual ::mediapipe::Status GetContract(CalculatorContract* cc) = 0;
|
||||
virtual mediapipe::Status GetContract(CalculatorContract* cc) = 0;
|
||||
};
|
||||
|
||||
using StaticAccessToCalculatorBaseRegistry =
|
||||
@@ -187,7 +187,7 @@ using StaticAccessToCalculatorBaseRegistry =
|
||||
// Functions for checking that the calculator has the required GetContract.
|
||||
template <class T>
|
||||
constexpr bool CalculatorHasGetContract(decltype(&T::GetContract) /*unused*/) {
|
||||
typedef ::mediapipe::Status (*GetContractType)(CalculatorContract * cc);
|
||||
typedef mediapipe::Status (*GetContractType)(CalculatorContract * cc);
|
||||
return std::is_same<decltype(&T::GetContract), GetContractType>::value;
|
||||
}
|
||||
template <class T>
|
||||
@@ -200,17 +200,17 @@ constexpr bool CalculatorHasGetContract(...) {
|
||||
template <typename CalculatorBaseSubclass>
|
||||
class StaticAccessToCalculatorBaseTyped : public StaticAccessToCalculatorBase {
|
||||
public:
|
||||
static_assert(std::is_base_of<::mediapipe::CalculatorBase,
|
||||
CalculatorBaseSubclass>::value,
|
||||
"Classes registered with REGISTER_CALCULATOR must be "
|
||||
"subclasses of ::mediapipe::CalculatorBase.");
|
||||
static_assert(
|
||||
std::is_base_of<mediapipe::CalculatorBase, CalculatorBaseSubclass>::value,
|
||||
"Classes registered with REGISTER_CALCULATOR must be "
|
||||
"subclasses of mediapipe::CalculatorBase.");
|
||||
static_assert(CalculatorHasGetContract<CalculatorBaseSubclass>(nullptr),
|
||||
"GetContract() must be defined with the correct signature in "
|
||||
"every calculator.");
|
||||
|
||||
// Provides access to the static function GetContract within a specific
|
||||
// subclass of CalculatorBase.
|
||||
::mediapipe::Status GetContract(CalculatorContract* cc) final {
|
||||
mediapipe::Status GetContract(CalculatorContract* cc) final {
|
||||
// CalculatorBaseSubclass must implement this function, since it is not
|
||||
// implemented in the parent class.
|
||||
return CalculatorBaseSubclass::GetContract(cc);
|
||||
|
||||
@@ -41,7 +41,7 @@ namespace test_ns {
|
||||
// streams and input side packets.
|
||||
class DeadEndCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
for (int i = 0; i < cc->Inputs().NumEntries(); ++i) {
|
||||
cc->Inputs().Index(i).SetAny();
|
||||
}
|
||||
@@ -51,16 +51,16 @@ class DeadEndCalculator : public CalculatorBase {
|
||||
for (int i = 0; i < cc->InputSidePackets().NumEntries(); ++i) {
|
||||
cc->InputSidePackets().Index(i).SetAny();
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Open(CalculatorContext* cc) override {
|
||||
return ::mediapipe::OkStatus();
|
||||
mediapipe::Status Open(CalculatorContext* cc) override {
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Process(CalculatorContext* cc) override {
|
||||
mediapipe::Status Process(CalculatorContext* cc) override {
|
||||
if (cc->Inputs().NumEntries() > 0) {
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
} else {
|
||||
// This is a source calculator, but we don't produce any outputs.
|
||||
return tool::StatusStop();
|
||||
@@ -73,14 +73,14 @@ namespace whitelisted_ns {
|
||||
|
||||
class DeadCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
return ::mediapipe::OkStatus();
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
::mediapipe::Status Open(CalculatorContext* cc) override {
|
||||
return ::mediapipe::OkStatus();
|
||||
mediapipe::Status Open(CalculatorContext* cc) override {
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
::mediapipe::Status Process(CalculatorContext* cc) override {
|
||||
return ::mediapipe::OkStatus();
|
||||
mediapipe::Status Process(CalculatorContext* cc) override {
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -89,14 +89,14 @@ class DeadCalculator : public CalculatorBase {
|
||||
|
||||
class EndCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
return ::mediapipe::OkStatus();
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
::mediapipe::Status Open(CalculatorContext* cc) override {
|
||||
return ::mediapipe::OkStatus();
|
||||
mediapipe::Status Open(CalculatorContext* cc) override {
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
::mediapipe::Status Process(CalculatorContext* cc) override {
|
||||
return ::mediapipe::OkStatus();
|
||||
mediapipe::Status Process(CalculatorContext* cc) override {
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
};
|
||||
REGISTER_CALCULATOR(::mediapipe::EndCalculator);
|
||||
@@ -181,13 +181,13 @@ TEST(CalculatorTest, CreateByName) {
|
||||
"mediapipe", "DeadEndCalculator")
|
||||
.status()
|
||||
.code(),
|
||||
::mediapipe::StatusCode::kNotFound);
|
||||
mediapipe::StatusCode::kNotFound);
|
||||
|
||||
EXPECT_EQ(CalculatorBaseRegistry::CreateByName( //
|
||||
"DeadEndCalculator")
|
||||
.status()
|
||||
.code(),
|
||||
::mediapipe::StatusCode::kNotFound);
|
||||
mediapipe::StatusCode::kNotFound);
|
||||
}
|
||||
|
||||
// Tests registration of a calculator within a whitelisted namespace.
|
||||
@@ -202,7 +202,7 @@ TEST(CalculatorTest, CreateByNameWhitelisted) {
|
||||
// Register a whitelisted calculator.
|
||||
CalculatorBaseRegistry::Register(
|
||||
"::mediapipe::test_ns::whitelisted_ns::DeadCalculator",
|
||||
absl::make_unique< ::mediapipe::test_ns::whitelisted_ns::DeadCalculator>);
|
||||
absl::make_unique<mediapipe::test_ns::whitelisted_ns::DeadCalculator>);
|
||||
|
||||
// A whitelisted calculator can be found in its own namespace.
|
||||
MP_EXPECT_OK(CalculatorBaseRegistry::CreateByNameInNamespace( //
|
||||
|
||||
@@ -103,7 +103,7 @@ class CalculatorContext {
|
||||
// Returns the status of the graph run.
|
||||
//
|
||||
// NOTE: This method should only be called during CalculatorBase::Close().
|
||||
::mediapipe::Status GraphStatus() const { return graph_status_; }
|
||||
mediapipe::Status GraphStatus() const { return graph_status_; }
|
||||
|
||||
ProfilingContext* GetProfilingContext() const {
|
||||
return calculator_state_->GetSharedProfilingContext().get();
|
||||
@@ -148,7 +148,7 @@ class CalculatorContext {
|
||||
input_timestamps_.pop();
|
||||
}
|
||||
|
||||
void SetGraphStatus(const ::mediapipe::Status& status) {
|
||||
void SetGraphStatus(const mediapipe::Status& status) {
|
||||
graph_status_ = status;
|
||||
}
|
||||
|
||||
@@ -167,7 +167,7 @@ class CalculatorContext {
|
||||
std::queue<Timestamp> input_timestamps_;
|
||||
|
||||
// The status of the graph run. Only used when Close() is called.
|
||||
::mediapipe::Status graph_status_;
|
||||
mediapipe::Status graph_status_;
|
||||
|
||||
// Accesses CalculatorContext for setting input timestamp.
|
||||
friend class CalculatorContextManager;
|
||||
|
||||
@@ -34,8 +34,8 @@ void CalculatorContextManager::Initialize(
|
||||
calculator_run_in_parallel_ = calculator_run_in_parallel;
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorContextManager::PrepareForRun(
|
||||
std::function<::mediapipe::Status(CalculatorContext*)>
|
||||
mediapipe::Status CalculatorContextManager::PrepareForRun(
|
||||
std::function<mediapipe::Status(CalculatorContext*)>
|
||||
setup_shards_callback) {
|
||||
setup_shards_callback_ = std::move(setup_shards_callback);
|
||||
default_context_ = absl::make_unique<CalculatorContext>(
|
||||
@@ -71,7 +71,7 @@ CalculatorContext* CalculatorContextManager::PrepareCalculatorContext(
|
||||
return GetDefaultCalculatorContext();
|
||||
}
|
||||
absl::MutexLock lock(&contexts_mutex_);
|
||||
CHECK(!::mediapipe::ContainsKey(active_contexts_, input_timestamp))
|
||||
CHECK(!mediapipe::ContainsKey(active_contexts_, input_timestamp))
|
||||
<< "Multiple invocations with the same timestamps are not allowed with "
|
||||
"parallel execution, input_timestamp = "
|
||||
<< input_timestamp;
|
||||
|
||||
@@ -45,8 +45,8 @@ class CalculatorContextManager {
|
||||
// Sets the callback that can setup the input and output stream shards in a
|
||||
// newly constructed calculator context. Then, initializes the default
|
||||
// calculator context.
|
||||
::mediapipe::Status PrepareForRun(
|
||||
std::function<::mediapipe::Status(CalculatorContext*)>
|
||||
mediapipe::Status PrepareForRun(
|
||||
std::function<mediapipe::Status(CalculatorContext*)>
|
||||
setup_shards_callback);
|
||||
|
||||
// Invoked by CalculatorNode::CleanupAfterRun().
|
||||
@@ -108,7 +108,7 @@ class CalculatorContextManager {
|
||||
}
|
||||
|
||||
void SetGraphStatusInContext(CalculatorContext* calculator_context,
|
||||
const ::mediapipe::Status& status) {
|
||||
const mediapipe::Status& status) {
|
||||
CHECK(calculator_context);
|
||||
calculator_context->SetGraphStatus(status);
|
||||
}
|
||||
@@ -124,7 +124,7 @@ class CalculatorContextManager {
|
||||
// NOTE: This callback invokes input/output stream handler methods.
|
||||
// The callback is used to break the circular dependency between
|
||||
// calculator context manager and input/output stream handlers.
|
||||
std::function<::mediapipe::Status(CalculatorContext*)> setup_shards_callback_;
|
||||
std::function<mediapipe::Status(CalculatorContext*)> setup_shards_callback_;
|
||||
|
||||
// The default calculator context that is always reused for sequential
|
||||
// execution. It is also used by Open() and Close() method of a parallel
|
||||
|
||||
@@ -24,9 +24,9 @@
|
||||
|
||||
namespace mediapipe {
|
||||
|
||||
::mediapipe::Status CalculatorContract::Initialize(
|
||||
mediapipe::Status CalculatorContract::Initialize(
|
||||
const CalculatorGraphConfig::Node& node) {
|
||||
std::vector<::mediapipe::Status> statuses;
|
||||
std::vector<mediapipe::Status> statuses;
|
||||
|
||||
auto input_stream_statusor = tool::TagMap::Create(node.input_stream());
|
||||
if (!input_stream_statusor.ok()) {
|
||||
@@ -48,7 +48,7 @@ namespace mediapipe {
|
||||
}
|
||||
|
||||
if (!statuses.empty()) {
|
||||
auto builder = ::mediapipe::UnknownErrorBuilder(MEDIAPIPE_LOC)
|
||||
auto builder = mediapipe::UnknownErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "Unable to initialize TagMaps for node.";
|
||||
for (const auto& status : statuses) {
|
||||
builder << "\n" << status.message();
|
||||
@@ -71,12 +71,12 @@ namespace mediapipe {
|
||||
std::move(input_side_packet_statusor).ValueOrDie());
|
||||
output_side_packets_ = absl::make_unique<PacketTypeSet>(
|
||||
std::move(output_side_packet_statusor).ValueOrDie());
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorContract::Initialize(
|
||||
mediapipe::Status CalculatorContract::Initialize(
|
||||
const PacketGeneratorConfig& node) {
|
||||
std::vector<::mediapipe::Status> statuses;
|
||||
std::vector<mediapipe::Status> statuses;
|
||||
|
||||
auto input_side_packet_statusor =
|
||||
tool::TagMap::Create(node.input_side_packet());
|
||||
@@ -106,12 +106,12 @@ namespace mediapipe {
|
||||
std::move(input_side_packet_statusor).ValueOrDie());
|
||||
output_side_packets_ = absl::make_unique<PacketTypeSet>(
|
||||
std::move(output_side_packet_statusor).ValueOrDie());
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorContract::Initialize(
|
||||
mediapipe::Status CalculatorContract::Initialize(
|
||||
const StatusHandlerConfig& node) {
|
||||
std::vector<::mediapipe::Status> statuses;
|
||||
std::vector<mediapipe::Status> statuses;
|
||||
|
||||
auto input_side_packet_statusor =
|
||||
tool::TagMap::Create(node.input_side_packet());
|
||||
@@ -120,7 +120,7 @@ namespace mediapipe {
|
||||
}
|
||||
|
||||
if (!statuses.empty()) {
|
||||
auto builder = ::mediapipe::UnknownErrorBuilder(MEDIAPIPE_LOC)
|
||||
auto builder = mediapipe::UnknownErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "NodeTypeInfo Initialization failed.";
|
||||
for (const auto& status : statuses) {
|
||||
builder << "\n" << status.message();
|
||||
@@ -134,7 +134,7 @@ namespace mediapipe {
|
||||
|
||||
input_side_packets_ = absl::make_unique<PacketTypeSet>(
|
||||
std::move(input_side_packet_statusor).ValueOrDie());
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
} // namespace mediapipe
|
||||
|
||||
@@ -47,9 +47,9 @@ namespace mediapipe {
|
||||
//
|
||||
class CalculatorContract {
|
||||
public:
|
||||
::mediapipe::Status Initialize(const CalculatorGraphConfig::Node& node);
|
||||
::mediapipe::Status Initialize(const PacketGeneratorConfig& node);
|
||||
::mediapipe::Status Initialize(const StatusHandlerConfig& node);
|
||||
mediapipe::Status Initialize(const CalculatorGraphConfig::Node& node);
|
||||
mediapipe::Status Initialize(const PacketGeneratorConfig& node);
|
||||
mediapipe::Status Initialize(const StatusHandlerConfig& node);
|
||||
void SetNodeName(const std::string& node_name) { node_name_ = node_name; }
|
||||
|
||||
// Returns the options given to this node.
|
||||
|
||||
@@ -30,7 +30,7 @@ namespace {
|
||||
|
||||
TEST(CalculatorContractTest, Calculator) {
|
||||
const CalculatorGraphConfig::Node node =
|
||||
::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig::Node>(R"(
|
||||
mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig::Node>(R"(
|
||||
calculator: "MixtureOfExpertsFusionCalculator"
|
||||
input_stream: "FRAME:fdense_pca_moe_aggregated_detection"
|
||||
input_stream: "FNET:fnet_logreg_aggregated_detection"
|
||||
@@ -49,7 +49,7 @@ TEST(CalculatorContractTest, Calculator) {
|
||||
|
||||
TEST(CalculatorContractTest, CalculatorOptions) {
|
||||
const CalculatorGraphConfig::Node node =
|
||||
::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig::Node>(R"(
|
||||
mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig::Node>(R"(
|
||||
calculator: "CalculatorTestCalculator"
|
||||
input_stream: "DATA:ycbcr_frames"
|
||||
input_stream: "VIDEO_HEADER:ycbcr_frames_prestream"
|
||||
@@ -71,7 +71,7 @@ TEST(CalculatorContractTest, CalculatorOptions) {
|
||||
|
||||
TEST(CalculatorContractTest, PacketGenerator) {
|
||||
const PacketGeneratorConfig node =
|
||||
::mediapipe::ParseTextProtoOrDie<PacketGeneratorConfig>(R"(
|
||||
mediapipe::ParseTextProtoOrDie<PacketGeneratorConfig>(R"(
|
||||
packet_generator: "DaredevilLabeledTimeSeriesGenerator"
|
||||
input_side_packet: "labeled_time_series"
|
||||
output_side_packet: "time_series_header"
|
||||
@@ -87,7 +87,7 @@ TEST(CalculatorContractTest, PacketGenerator) {
|
||||
|
||||
TEST(CalculatorContractTest, StatusHandler) {
|
||||
const StatusHandlerConfig node =
|
||||
::mediapipe::ParseTextProtoOrDie<StatusHandlerConfig>(R"(
|
||||
mediapipe::ParseTextProtoOrDie<StatusHandlerConfig>(R"(
|
||||
status_handler: "TaskInjectorStatusHandler"
|
||||
input_side_packet: "ROW:cid"
|
||||
input_side_packet: "SPEC:task_specification"
|
||||
|
||||
@@ -129,13 +129,13 @@ CalculatorGraph::CalculatorGraph(const CalculatorGraphConfig& config)
|
||||
// instantiated.
|
||||
CalculatorGraph::~CalculatorGraph() {
|
||||
// Stop periodic profiler output to ublock Executor destructors.
|
||||
::mediapipe::Status status = profiler()->Stop();
|
||||
mediapipe::Status status = profiler()->Stop();
|
||||
if (!status.ok()) {
|
||||
LOG(ERROR) << "During graph destruction: " << status;
|
||||
}
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorGraph::InitializePacketGeneratorGraph(
|
||||
mediapipe::Status CalculatorGraph::InitializePacketGeneratorGraph(
|
||||
const std::map<std::string, Packet>& side_packets) {
|
||||
// Create and initialize the output side packets.
|
||||
if (!validated_graph_->OutputSidePacketInfos().empty()) {
|
||||
@@ -164,7 +164,7 @@ CalculatorGraph::~CalculatorGraph() {
|
||||
default_executor, side_packets);
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorGraph::InitializeStreams() {
|
||||
mediapipe::Status CalculatorGraph::InitializeStreams() {
|
||||
any_packet_type_.SetAny();
|
||||
|
||||
// Create and initialize the input streams.
|
||||
@@ -193,7 +193,7 @@ CalculatorGraph::~CalculatorGraph() {
|
||||
auto input_tag_map,
|
||||
tool::TagMap::Create(validated_graph_->Config().input_stream()));
|
||||
for (const auto& stream_name : input_tag_map->Names()) {
|
||||
RET_CHECK(!::mediapipe::ContainsKey(graph_input_streams_, stream_name))
|
||||
RET_CHECK(!mediapipe::ContainsKey(graph_input_streams_, stream_name))
|
||||
.SetNoLogging()
|
||||
<< "CalculatorGraph Initialization failed, graph input stream \""
|
||||
<< stream_name << "\" was specified twice.";
|
||||
@@ -221,16 +221,16 @@ CalculatorGraph::~CalculatorGraph() {
|
||||
graph_input_stream_add_mode_ = GraphInputStreamAddMode::WAIT_TILL_NOT_FULL;
|
||||
}
|
||||
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorGraph::InitializeCalculatorNodes() {
|
||||
mediapipe::Status CalculatorGraph::InitializeCalculatorNodes() {
|
||||
// Check if the user has specified a maximum queue size for an input stream.
|
||||
max_queue_size_ = validated_graph_->Config().max_queue_size();
|
||||
max_queue_size_ = max_queue_size_ ? max_queue_size_ : 100;
|
||||
|
||||
// Use a local variable to avoid needing to lock errors_.
|
||||
std::vector<::mediapipe::Status> errors;
|
||||
std::vector<mediapipe::Status> errors;
|
||||
|
||||
// Create and initialize all the nodes in the graph.
|
||||
nodes_ = absl::make_unique<absl::FixedArray<CalculatorNode>>(
|
||||
@@ -240,7 +240,7 @@ CalculatorGraph::~CalculatorGraph() {
|
||||
// buffer_size_hint will be positive if one was specified in
|
||||
// the graph proto.
|
||||
int buffer_size_hint = 0;
|
||||
const ::mediapipe::Status result = (*nodes_)[node_id].Initialize(
|
||||
const mediapipe::Status result = (*nodes_)[node_id].Initialize(
|
||||
validated_graph_.get(), node_id, input_stream_managers_.get(),
|
||||
output_stream_managers_.get(), output_side_packets_.get(),
|
||||
&buffer_size_hint, profiler_);
|
||||
@@ -259,15 +259,15 @@ CalculatorGraph::~CalculatorGraph() {
|
||||
|
||||
VLOG(2) << "Maximum input stream queue size based on graph config: "
|
||||
<< max_queue_size_;
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorGraph::InitializeProfiler() {
|
||||
mediapipe::Status CalculatorGraph::InitializeProfiler() {
|
||||
profiler_->Initialize(*validated_graph_);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorGraph::InitializeExecutors() {
|
||||
mediapipe::Status CalculatorGraph::InitializeExecutors() {
|
||||
// If the ExecutorConfig for the default executor leaves the executor type
|
||||
// unspecified, default_executor_options points to the
|
||||
// ThreadPoolExecutorOptions in that ExecutorConfig. Otherwise,
|
||||
@@ -276,9 +276,9 @@ CalculatorGraph::~CalculatorGraph() {
|
||||
bool use_application_thread = false;
|
||||
for (const ExecutorConfig& executor_config :
|
||||
validated_graph_->Config().executor()) {
|
||||
if (::mediapipe::ContainsKey(executors_, executor_config.name())) {
|
||||
if (mediapipe::ContainsKey(executors_, executor_config.name())) {
|
||||
if (!executor_config.type().empty()) {
|
||||
return ::mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
|
||||
return mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "ExecutorConfig for \"" << executor_config.name()
|
||||
<< "\" has a \"type\" field but is also provided to the graph "
|
||||
"with a CalculatorGraph::SetExecutor() call.";
|
||||
@@ -302,7 +302,7 @@ CalculatorGraph::~CalculatorGraph() {
|
||||
}
|
||||
}
|
||||
if (executor_config.type().empty()) {
|
||||
return ::mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
|
||||
return mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "ExecutorConfig for \"" << executor_config.name()
|
||||
<< "\" does not have a \"type\" field. The executor \""
|
||||
<< executor_config.name()
|
||||
@@ -319,15 +319,15 @@ CalculatorGraph::~CalculatorGraph() {
|
||||
executor_config.name(), std::shared_ptr<Executor>(executor)));
|
||||
}
|
||||
|
||||
if (!::mediapipe::ContainsKey(executors_, "")) {
|
||||
if (!mediapipe::ContainsKey(executors_, "")) {
|
||||
MP_RETURN_IF_ERROR(InitializeDefaultExecutor(default_executor_options,
|
||||
use_application_thread));
|
||||
}
|
||||
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorGraph::InitializeDefaultExecutor(
|
||||
mediapipe::Status CalculatorGraph::InitializeDefaultExecutor(
|
||||
const ThreadPoolExecutorOptions* default_executor_options,
|
||||
bool use_application_thread) {
|
||||
#ifdef __EMSCRIPTEN__
|
||||
@@ -340,7 +340,7 @@ CalculatorGraph::~CalculatorGraph() {
|
||||
"", std::make_shared<internal::DelegatingExecutor>(
|
||||
std::bind(&internal::Scheduler::AddApplicationThreadTask,
|
||||
&scheduler_, std::placeholders::_1))));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
// Check the number of threads specified in the proto.
|
||||
@@ -359,10 +359,10 @@ CalculatorGraph::~CalculatorGraph() {
|
||||
}
|
||||
MP_RETURN_IF_ERROR(
|
||||
CreateDefaultThreadPool(default_executor_options, num_threads));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorGraph::Initialize(
|
||||
mediapipe::Status CalculatorGraph::Initialize(
|
||||
std::unique_ptr<ValidatedGraphConfig> validated_graph,
|
||||
const std::map<std::string, Packet>& side_packets) {
|
||||
RET_CHECK(!initialized_).SetNoLogging()
|
||||
@@ -380,15 +380,15 @@ CalculatorGraph::~CalculatorGraph() {
|
||||
#endif
|
||||
|
||||
initialized_ = true;
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorGraph::Initialize(
|
||||
mediapipe::Status CalculatorGraph::Initialize(
|
||||
const CalculatorGraphConfig& input_config) {
|
||||
return Initialize(input_config, {});
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorGraph::Initialize(
|
||||
mediapipe::Status CalculatorGraph::Initialize(
|
||||
const CalculatorGraphConfig& input_config,
|
||||
const std::map<std::string, Packet>& side_packets) {
|
||||
auto validated_graph = absl::make_unique<ValidatedGraphConfig>();
|
||||
@@ -396,7 +396,7 @@ CalculatorGraph::~CalculatorGraph() {
|
||||
return Initialize(std::move(validated_graph), side_packets);
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorGraph::Initialize(
|
||||
mediapipe::Status CalculatorGraph::Initialize(
|
||||
const std::vector<CalculatorGraphConfig>& input_configs,
|
||||
const std::vector<CalculatorGraphTemplate>& input_templates,
|
||||
const std::map<std::string, Packet>& side_packets,
|
||||
@@ -407,16 +407,16 @@ CalculatorGraph::~CalculatorGraph() {
|
||||
return Initialize(std::move(validated_graph), side_packets);
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorGraph::ObserveOutputStream(
|
||||
mediapipe::Status CalculatorGraph::ObserveOutputStream(
|
||||
const std::string& stream_name,
|
||||
std::function<::mediapipe::Status(const Packet&)> packet_callback) {
|
||||
std::function<mediapipe::Status(const Packet&)> packet_callback) {
|
||||
RET_CHECK(initialized_).SetNoLogging()
|
||||
<< "CalculatorGraph is not initialized.";
|
||||
// TODO Allow output observers to be attached by graph level
|
||||
// tag/index.
|
||||
int output_stream_index = validated_graph_->OutputStreamIndex(stream_name);
|
||||
if (output_stream_index < 0) {
|
||||
return ::mediapipe::NotFoundErrorBuilder(MEDIAPIPE_LOC)
|
||||
return mediapipe::NotFoundErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "Unable to attach observer to output stream \"" << stream_name
|
||||
<< "\" because it doesn't exist.";
|
||||
}
|
||||
@@ -425,16 +425,16 @@ CalculatorGraph::~CalculatorGraph() {
|
||||
stream_name, &any_packet_type_, std::move(packet_callback),
|
||||
&output_stream_managers_[output_stream_index]));
|
||||
graph_output_streams_.push_back(std::move(observer));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::StatusOr<OutputStreamPoller>
|
||||
CalculatorGraph::AddOutputStreamPoller(const std::string& stream_name) {
|
||||
mediapipe::StatusOr<OutputStreamPoller> CalculatorGraph::AddOutputStreamPoller(
|
||||
const std::string& stream_name) {
|
||||
RET_CHECK(initialized_).SetNoLogging()
|
||||
<< "CalculatorGraph is not initialized.";
|
||||
int output_stream_index = validated_graph_->OutputStreamIndex(stream_name);
|
||||
if (output_stream_index < 0) {
|
||||
return ::mediapipe::NotFoundErrorBuilder(MEDIAPIPE_LOC)
|
||||
return mediapipe::NotFoundErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "Unable to attach observer to output stream \"" << stream_name
|
||||
<< "\" because it doesn't exist.";
|
||||
}
|
||||
@@ -449,11 +449,11 @@ CalculatorGraph::AddOutputStreamPoller(const std::string& stream_name) {
|
||||
return std::move(poller);
|
||||
}
|
||||
|
||||
::mediapipe::StatusOr<Packet> CalculatorGraph::GetOutputSidePacket(
|
||||
mediapipe::StatusOr<Packet> CalculatorGraph::GetOutputSidePacket(
|
||||
const std::string& packet_name) {
|
||||
int side_packet_index = validated_graph_->OutputSidePacketIndex(packet_name);
|
||||
if (side_packet_index < 0) {
|
||||
return ::mediapipe::NotFoundErrorBuilder(MEDIAPIPE_LOC)
|
||||
return mediapipe::NotFoundErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "Unable to get the output side packet \"" << packet_name
|
||||
<< "\" because it doesn't exist.";
|
||||
}
|
||||
@@ -478,7 +478,7 @@ CalculatorGraph::AddOutputStreamPoller(const std::string& stream_name) {
|
||||
!current_run_side_packet_iter->second.IsEmpty()) {
|
||||
output_packet = current_run_side_packet_iter->second;
|
||||
} else {
|
||||
return ::mediapipe::UnavailableErrorBuilder(MEDIAPIPE_LOC)
|
||||
return mediapipe::UnavailableErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "The output side packet \"" << packet_name
|
||||
<< "\" is unavailable.";
|
||||
}
|
||||
@@ -486,7 +486,7 @@ CalculatorGraph::AddOutputStreamPoller(const std::string& stream_name) {
|
||||
return output_packet;
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorGraph::Run(
|
||||
mediapipe::Status CalculatorGraph::Run(
|
||||
const std::map<std::string, Packet>& extra_side_packets) {
|
||||
RET_CHECK(graph_input_streams_.empty()).SetNoLogging()
|
||||
<< "When using graph input streams, call StartRun() instead of Run() so "
|
||||
@@ -495,7 +495,7 @@ CalculatorGraph::AddOutputStreamPoller(const std::string& stream_name) {
|
||||
return WaitUntilDone();
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorGraph::StartRun(
|
||||
mediapipe::Status CalculatorGraph::StartRun(
|
||||
const std::map<std::string, Packet>& extra_side_packets,
|
||||
const std::map<std::string, Packet>& stream_headers) {
|
||||
RET_CHECK(initialized_).SetNoLogging()
|
||||
@@ -503,18 +503,18 @@ CalculatorGraph::AddOutputStreamPoller(const std::string& stream_name) {
|
||||
MP_RETURN_IF_ERROR(PrepareForRun(extra_side_packets, stream_headers));
|
||||
MP_RETURN_IF_ERROR(profiler_->Start(executors_[""].get()));
|
||||
scheduler_.Start();
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
#ifndef MEDIAPIPE_DISABLE_GPU
|
||||
::mediapipe::Status CalculatorGraph::SetGpuResources(
|
||||
mediapipe::Status CalculatorGraph::SetGpuResources(
|
||||
std::shared_ptr<::mediapipe::GpuResources> resources) {
|
||||
RET_CHECK(!ContainsKey(service_packets_, kGpuService.key))
|
||||
<< "The GPU resources have already been configured.";
|
||||
service_packets_[kGpuService.key] =
|
||||
MakePacket<std::shared_ptr<::mediapipe::GpuResources>>(
|
||||
std::move(resources));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
std::shared_ptr<::mediapipe::GpuResources> CalculatorGraph::GetGpuResources()
|
||||
@@ -524,8 +524,8 @@ std::shared_ptr<::mediapipe::GpuResources> CalculatorGraph::GetGpuResources()
|
||||
return service_iter->second.Get<std::shared_ptr<::mediapipe::GpuResources>>();
|
||||
}
|
||||
|
||||
::mediapipe::StatusOr<std::map<std::string, Packet>>
|
||||
CalculatorGraph::PrepareGpu(const std::map<std::string, Packet>& side_packets) {
|
||||
mediapipe::StatusOr<std::map<std::string, Packet>> CalculatorGraph::PrepareGpu(
|
||||
const std::map<std::string, Packet>& side_packets) {
|
||||
std::map<std::string, Packet> additional_side_packets;
|
||||
bool update_sp = false;
|
||||
bool uses_gpu = false;
|
||||
@@ -590,7 +590,7 @@ CalculatorGraph::PrepareGpu(const std::map<std::string, Packet>& side_packets) {
|
||||
}
|
||||
#endif // !defined(MEDIAPIPE_DISABLE_GPU)
|
||||
|
||||
::mediapipe::Status CalculatorGraph::PrepareForRun(
|
||||
mediapipe::Status CalculatorGraph::PrepareForRun(
|
||||
const std::map<std::string, Packet>& extra_side_packets,
|
||||
const std::map<std::string, Packet>& stream_headers) {
|
||||
if (VLOG_IS_ON(1)) {
|
||||
@@ -621,7 +621,7 @@ CalculatorGraph::PrepareGpu(const std::map<std::string, Packet>& side_packets) {
|
||||
}
|
||||
|
||||
current_run_side_packets_.clear();
|
||||
::mediapipe::Status generator_status = packet_generator_graph_.RunGraphSetup(
|
||||
mediapipe::Status generator_status = packet_generator_graph_.RunGraphSetup(
|
||||
*input_side_packets, ¤t_run_side_packets_);
|
||||
|
||||
CallStatusHandlers(GraphRunState::PRE_RUN, generator_status);
|
||||
@@ -632,7 +632,7 @@ CalculatorGraph::PrepareGpu(const std::map<std::string, Packet>& side_packets) {
|
||||
|
||||
// If there was an error on the CallStatusHandlers (PRE_RUN), it was stored
|
||||
// in the error list. We return immediately notifying this to the caller.
|
||||
::mediapipe::Status error_status;
|
||||
mediapipe::Status error_status;
|
||||
if (has_error_) {
|
||||
GetCombinedErrors(&error_status);
|
||||
LOG(ERROR) << error_status;
|
||||
@@ -682,7 +682,7 @@ CalculatorGraph::PrepareGpu(const std::map<std::string, Packet>& side_packets) {
|
||||
std::placeholders::_1, std::placeholders::_2);
|
||||
node.SetQueueSizeCallbacks(queue_size_callback, queue_size_callback);
|
||||
scheduler_.AssignNodeToSchedulerQueue(&node);
|
||||
const ::mediapipe::Status result = node.PrepareForRun(
|
||||
const mediapipe::Status result = node.PrepareForRun(
|
||||
current_run_side_packets_, service_packets_,
|
||||
std::bind(&internal::Scheduler::ScheduleNodeForOpen, &scheduler_,
|
||||
&node),
|
||||
@@ -700,13 +700,13 @@ CalculatorGraph::PrepareGpu(const std::map<std::string, Packet>& side_packets) {
|
||||
for (auto& graph_output_stream : graph_output_streams_) {
|
||||
graph_output_stream->PrepareForRun(
|
||||
[&graph_output_stream, this] {
|
||||
::mediapipe::Status status = graph_output_stream->Notify();
|
||||
mediapipe::Status status = graph_output_stream->Notify();
|
||||
if (!status.ok()) {
|
||||
RecordError(status);
|
||||
}
|
||||
scheduler_.EmittedObservedOutput();
|
||||
},
|
||||
[this](::mediapipe::Status status) { RecordError(status); });
|
||||
[this](mediapipe::Status status) { RecordError(status); });
|
||||
}
|
||||
|
||||
if (GetCombinedErrors(&error_status)) {
|
||||
@@ -724,7 +724,7 @@ CalculatorGraph::PrepareGpu(const std::map<std::string, Packet>& side_packets) {
|
||||
// Allow graph input streams to override the global max queue size.
|
||||
for (const auto& name_max : graph_input_stream_max_queue_size_) {
|
||||
std::unique_ptr<GraphInputStream>* stream =
|
||||
::mediapipe::FindOrNull(graph_input_streams_, name_max.first);
|
||||
mediapipe::FindOrNull(graph_input_streams_, name_max.first);
|
||||
RET_CHECK(stream).SetNoLogging() << absl::Substitute(
|
||||
"SetInputStreamMaxQueueSize called on \"$0\" which is not a "
|
||||
"graph input stream.",
|
||||
@@ -759,20 +759,20 @@ CalculatorGraph::PrepareGpu(const std::map<std::string, Packet>& side_packets) {
|
||||
}
|
||||
}
|
||||
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorGraph::WaitUntilIdle() {
|
||||
mediapipe::Status CalculatorGraph::WaitUntilIdle() {
|
||||
MP_RETURN_IF_ERROR(scheduler_.WaitUntilIdle());
|
||||
VLOG(2) << "Scheduler idle.";
|
||||
::mediapipe::Status status = ::mediapipe::OkStatus();
|
||||
mediapipe::Status status = mediapipe::OkStatus();
|
||||
if (GetCombinedErrors(&status)) {
|
||||
LOG(ERROR) << status;
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorGraph::WaitUntilDone() {
|
||||
mediapipe::Status CalculatorGraph::WaitUntilDone() {
|
||||
VLOG(2) << "Waiting for scheduler to terminate...";
|
||||
MP_RETURN_IF_ERROR(scheduler_.WaitUntilDone());
|
||||
VLOG(2) << "Scheduler terminated.";
|
||||
@@ -780,16 +780,16 @@ CalculatorGraph::PrepareGpu(const std::map<std::string, Packet>& side_packets) {
|
||||
return FinishRun();
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorGraph::WaitForObservedOutput() {
|
||||
mediapipe::Status CalculatorGraph::WaitForObservedOutput() {
|
||||
return scheduler_.WaitForObservedOutput();
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorGraph::AddPacketToInputStream(
|
||||
mediapipe::Status CalculatorGraph::AddPacketToInputStream(
|
||||
const std::string& stream_name, const Packet& packet) {
|
||||
return AddPacketToInputStreamInternal(stream_name, packet);
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorGraph::AddPacketToInputStream(
|
||||
mediapipe::Status CalculatorGraph::AddPacketToInputStream(
|
||||
const std::string& stream_name, Packet&& packet) {
|
||||
return AddPacketToInputStreamInternal(stream_name, std::move(packet));
|
||||
}
|
||||
@@ -799,29 +799,28 @@ CalculatorGraph::PrepareGpu(const std::map<std::string, Packet>& side_packets) {
|
||||
// internal-only templated version. T&& is a forwarding reference here, so
|
||||
// std::forward will deduce the correct type as we pass along packet.
|
||||
template <typename T>
|
||||
::mediapipe::Status CalculatorGraph::AddPacketToInputStreamInternal(
|
||||
mediapipe::Status CalculatorGraph::AddPacketToInputStreamInternal(
|
||||
const std::string& stream_name, T&& packet) {
|
||||
std::unique_ptr<GraphInputStream>* stream =
|
||||
::mediapipe::FindOrNull(graph_input_streams_, stream_name);
|
||||
mediapipe::FindOrNull(graph_input_streams_, stream_name);
|
||||
RET_CHECK(stream).SetNoLogging() << absl::Substitute(
|
||||
"AddPacketToInputStream called on input stream \"$0\" which is not a "
|
||||
"graph input stream.",
|
||||
stream_name);
|
||||
int node_id =
|
||||
::mediapipe::FindOrDie(graph_input_stream_node_ids_, stream_name);
|
||||
int node_id = mediapipe::FindOrDie(graph_input_stream_node_ids_, stream_name);
|
||||
CHECK_GE(node_id, validated_graph_->CalculatorInfos().size());
|
||||
{
|
||||
absl::MutexLock lock(&full_input_streams_mutex_);
|
||||
if (graph_input_stream_add_mode_ ==
|
||||
GraphInputStreamAddMode::ADD_IF_NOT_FULL) {
|
||||
if (has_error_) {
|
||||
::mediapipe::Status error_status;
|
||||
mediapipe::Status error_status;
|
||||
GetCombinedErrors("Graph has errors: ", &error_status);
|
||||
return error_status;
|
||||
}
|
||||
// Return with StatusUnavailable if this stream is being throttled.
|
||||
if (!full_input_streams_[node_id].empty()) {
|
||||
return ::mediapipe::UnavailableErrorBuilder(MEDIAPIPE_LOC)
|
||||
return mediapipe::UnavailableErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "Graph is throttled.";
|
||||
}
|
||||
} else if (graph_input_stream_add_mode_ ==
|
||||
@@ -836,7 +835,7 @@ template <typename T>
|
||||
&full_input_streams_mutex_);
|
||||
}
|
||||
if (has_error_) {
|
||||
::mediapipe::Status error_status;
|
||||
mediapipe::Status error_status;
|
||||
GetCombinedErrors("Graph has errors: ", &error_status);
|
||||
return error_status;
|
||||
}
|
||||
@@ -858,7 +857,7 @@ template <typename T>
|
||||
// because we don't have the lock over the input stream.
|
||||
(*stream)->AddPacket(std::forward<T>(packet));
|
||||
if (has_error_) {
|
||||
::mediapipe::Status error_status;
|
||||
mediapipe::Status error_status;
|
||||
GetCombinedErrors("Graph has errors: ", &error_status);
|
||||
return error_status;
|
||||
}
|
||||
@@ -870,25 +869,25 @@ template <typename T>
|
||||
// again if the graph is still idle. Unthrottling basically only lets in one
|
||||
// packet at a time. TODO: add test.
|
||||
scheduler_.AddedPacketToGraphInputStream();
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorGraph::SetInputStreamMaxQueueSize(
|
||||
mediapipe::Status CalculatorGraph::SetInputStreamMaxQueueSize(
|
||||
const std::string& stream_name, int max_queue_size) {
|
||||
// graph_input_streams_ has not been filled in yet, so we'll check this when
|
||||
// it is applied when the graph is started.
|
||||
graph_input_stream_max_queue_size_[stream_name] = max_queue_size;
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
bool CalculatorGraph::HasInputStream(const std::string& stream_name) {
|
||||
return ::mediapipe::FindOrNull(graph_input_streams_, stream_name) != nullptr;
|
||||
return mediapipe::FindOrNull(graph_input_streams_, stream_name) != nullptr;
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorGraph::CloseInputStream(
|
||||
mediapipe::Status CalculatorGraph::CloseInputStream(
|
||||
const std::string& stream_name) {
|
||||
std::unique_ptr<GraphInputStream>* stream =
|
||||
::mediapipe::FindOrNull(graph_input_streams_, stream_name);
|
||||
mediapipe::FindOrNull(graph_input_streams_, stream_name);
|
||||
RET_CHECK(stream).SetNoLogging() << absl::Substitute(
|
||||
"CloseInputStream called on input stream \"$0\" which is not a graph "
|
||||
"input stream.",
|
||||
@@ -897,7 +896,7 @@ bool CalculatorGraph::HasInputStream(const std::string& stream_name) {
|
||||
// threads cannot call CloseInputStream() on the same stream_name at the same
|
||||
// time.
|
||||
if ((*stream)->IsClosed()) {
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
(*stream)->Close();
|
||||
@@ -906,10 +905,10 @@ bool CalculatorGraph::HasInputStream(const std::string& stream_name) {
|
||||
scheduler_.ClosedAllGraphInputStreams();
|
||||
}
|
||||
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorGraph::CloseAllInputStreams() {
|
||||
mediapipe::Status CalculatorGraph::CloseAllInputStreams() {
|
||||
for (auto& item : graph_input_streams_) {
|
||||
item.second->Close();
|
||||
}
|
||||
@@ -917,10 +916,10 @@ bool CalculatorGraph::HasInputStream(const std::string& stream_name) {
|
||||
num_closed_graph_input_streams_ = graph_input_streams_.size();
|
||||
scheduler_.ClosedAllGraphInputStreams();
|
||||
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorGraph::CloseAllPacketSources() {
|
||||
mediapipe::Status CalculatorGraph::CloseAllPacketSources() {
|
||||
for (auto& item : graph_input_streams_) {
|
||||
item.second->Close();
|
||||
}
|
||||
@@ -929,10 +928,10 @@ bool CalculatorGraph::HasInputStream(const std::string& stream_name) {
|
||||
scheduler_.ClosedAllGraphInputStreams();
|
||||
scheduler_.CloseAllSourceNodes();
|
||||
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
void CalculatorGraph::RecordError(const ::mediapipe::Status& error) {
|
||||
void CalculatorGraph::RecordError(const mediapipe::Status& error) {
|
||||
VLOG(2) << "RecordError called with " << error;
|
||||
{
|
||||
absl::MutexLock lock(&error_mutex_);
|
||||
@@ -943,7 +942,7 @@ void CalculatorGraph::RecordError(const ::mediapipe::Status& error) {
|
||||
stream->NotifyError();
|
||||
}
|
||||
if (errors_.size() > kMaxNumAccumulatedErrors) {
|
||||
for (const ::mediapipe::Status& error : errors_) {
|
||||
for (const mediapipe::Status& error : errors_) {
|
||||
LOG(ERROR) << error;
|
||||
}
|
||||
LOG(FATAL) << "Forcefully aborting to prevent the framework running out "
|
||||
@@ -952,13 +951,13 @@ void CalculatorGraph::RecordError(const ::mediapipe::Status& error) {
|
||||
}
|
||||
}
|
||||
|
||||
bool CalculatorGraph::GetCombinedErrors(::mediapipe::Status* error_status) {
|
||||
bool CalculatorGraph::GetCombinedErrors(mediapipe::Status* error_status) {
|
||||
return GetCombinedErrors("CalculatorGraph::Run() failed in Run: ",
|
||||
error_status);
|
||||
}
|
||||
|
||||
bool CalculatorGraph::GetCombinedErrors(const std::string& error_prefix,
|
||||
::mediapipe::Status* error_status) {
|
||||
mediapipe::Status* error_status) {
|
||||
absl::MutexLock lock(&error_mutex_);
|
||||
if (!errors_.empty()) {
|
||||
*error_status = tool::CombinedStatus(error_prefix, errors_);
|
||||
@@ -968,7 +967,7 @@ bool CalculatorGraph::GetCombinedErrors(const std::string& error_prefix,
|
||||
}
|
||||
|
||||
void CalculatorGraph::CallStatusHandlers(GraphRunState graph_run_state,
|
||||
const ::mediapipe::Status& status) {
|
||||
const mediapipe::Status& status) {
|
||||
for (int status_handler_index = 0;
|
||||
status_handler_index < validated_graph_->Config().status_handler_size();
|
||||
++status_handler_index) {
|
||||
@@ -980,23 +979,22 @@ void CalculatorGraph::CallStatusHandlers(GraphRunState graph_run_state,
|
||||
validated_graph_->StatusHandlerInfos()[status_handler_index];
|
||||
const PacketTypeSet& packet_type_set =
|
||||
status_handler_info.InputSidePacketTypes();
|
||||
::mediapipe::StatusOr<std::unique_ptr<PacketSet>> packet_set_statusor =
|
||||
mediapipe::StatusOr<std::unique_ptr<PacketSet>> packet_set_statusor =
|
||||
tool::FillPacketSet(packet_type_set, current_run_side_packets_,
|
||||
nullptr);
|
||||
if (!packet_set_statusor.ok()) {
|
||||
RecordError(::mediapipe::StatusBuilder(
|
||||
RecordError(mediapipe::StatusBuilder(
|
||||
std::move(packet_set_statusor).status(), MEDIAPIPE_LOC)
|
||||
.SetPrepend()
|
||||
<< "Skipping run of " << handler_type << ": ");
|
||||
continue;
|
||||
}
|
||||
::mediapipe::StatusOr<
|
||||
std::unique_ptr<internal::StaticAccessToStatusHandler>>
|
||||
mediapipe::StatusOr<std::unique_ptr<internal::StaticAccessToStatusHandler>>
|
||||
static_access_statusor = internal::StaticAccessToStatusHandlerRegistry::
|
||||
CreateByNameInNamespace(validated_graph_->Package(), handler_type);
|
||||
CHECK(static_access_statusor.ok()) << handler_type << " is not registered.";
|
||||
auto static_access = std::move(static_access_statusor).ValueOrDie();
|
||||
::mediapipe::Status handler_result;
|
||||
mediapipe::Status handler_result;
|
||||
if (graph_run_state == GraphRunState::PRE_RUN) {
|
||||
handler_result = static_access->HandlePreRunStatus(
|
||||
handler_config.options(), *packet_set_statusor.ValueOrDie(), status);
|
||||
@@ -1005,8 +1003,8 @@ void CalculatorGraph::CallStatusHandlers(GraphRunState graph_run_state,
|
||||
handler_config.options(), *packet_set_statusor.ValueOrDie(), status);
|
||||
}
|
||||
if (!handler_result.ok()) {
|
||||
::mediapipe::StatusBuilder builder(std::move(handler_result),
|
||||
MEDIAPIPE_LOC);
|
||||
mediapipe::StatusBuilder builder(std::move(handler_result),
|
||||
MEDIAPIPE_LOC);
|
||||
builder.SetPrepend() << handler_type;
|
||||
if (graph_run_state == GraphRunState::PRE_RUN) {
|
||||
builder << "::HandlePreRunStatus failed: ";
|
||||
@@ -1051,11 +1049,10 @@ void CalculatorGraph::UpdateThrottledNodes(InputStreamManager* stream,
|
||||
VLOG(2) << "Stream \"" << stream->Name() << "\" is "
|
||||
<< (stream_is_full ? "throttling" : "no longer throttling")
|
||||
<< " node with node ID " << node_id;
|
||||
::mediapipe::LogEvent(
|
||||
profiler_.get(),
|
||||
TraceEvent(stream_is_full ? TraceEvent::THROTTLED
|
||||
: TraceEvent::UNTHROTTLED)
|
||||
.set_stream_id(&stream->Name()));
|
||||
mediapipe::LogEvent(profiler_.get(),
|
||||
TraceEvent(stream_is_full ? TraceEvent::THROTTLED
|
||||
: TraceEvent::UNTHROTTLED)
|
||||
.set_stream_id(&stream->Name()));
|
||||
bool was_throttled = !full_input_streams_[node_id].empty();
|
||||
if (stream_is_full) {
|
||||
DCHECK_EQ(full_input_streams_[node_id].count(stream), 0);
|
||||
@@ -1137,7 +1134,7 @@ bool CalculatorGraph::UnthrottleSources() {
|
||||
}
|
||||
for (InputStreamManager* stream : full_streams) {
|
||||
if (Config().report_deadlock()) {
|
||||
RecordError(::mediapipe::UnavailableError(absl::StrCat(
|
||||
RecordError(mediapipe::UnavailableError(absl::StrCat(
|
||||
"Detected a deadlock due to input throttling for: \"", stream->Name(),
|
||||
"\". All calculators are idle while packet sources remain active "
|
||||
"and throttled. Consider adjusting \"max_queue_size\" or "
|
||||
@@ -1166,7 +1163,7 @@ void CalculatorGraph::SetGraphInputStreamAddMode(GraphInputStreamAddMode mode) {
|
||||
}
|
||||
|
||||
void CalculatorGraph::Cancel() {
|
||||
// TODO This function should return ::mediapipe::Status.
|
||||
// TODO This function should return mediapipe::Status.
|
||||
scheduler_.Cancel();
|
||||
}
|
||||
|
||||
@@ -1174,11 +1171,11 @@ void CalculatorGraph::Pause() { scheduler_.Pause(); }
|
||||
|
||||
void CalculatorGraph::Resume() { scheduler_.Resume(); }
|
||||
|
||||
::mediapipe::Status CalculatorGraph::SetServicePacket(
|
||||
mediapipe::Status CalculatorGraph::SetServicePacket(
|
||||
const GraphServiceBase& service, Packet p) {
|
||||
// TODO: check that the graph has not been started!
|
||||
service_packets_[service.key] = std::move(p);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
Packet CalculatorGraph::GetServicePacket(const GraphServiceBase& service) {
|
||||
@@ -1189,10 +1186,10 @@ Packet CalculatorGraph::GetServicePacket(const GraphServiceBase& service) {
|
||||
return it->second;
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorGraph::SetExecutorInternal(
|
||||
mediapipe::Status CalculatorGraph::SetExecutorInternal(
|
||||
const std::string& name, std::shared_ptr<Executor> executor) {
|
||||
if (!executors_.emplace(name, executor).second) {
|
||||
return ::mediapipe::AlreadyExistsErrorBuilder(MEDIAPIPE_LOC)
|
||||
return mediapipe::AlreadyExistsErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "SetExecutor must be called only once for the executor \"" << name
|
||||
<< "\"";
|
||||
}
|
||||
@@ -1201,21 +1198,21 @@ Packet CalculatorGraph::GetServicePacket(const GraphServiceBase& service) {
|
||||
} else {
|
||||
MP_RETURN_IF_ERROR(scheduler_.SetNonDefaultExecutor(name, executor.get()));
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorGraph::SetExecutor(
|
||||
mediapipe::Status CalculatorGraph::SetExecutor(
|
||||
const std::string& name, std::shared_ptr<Executor> executor) {
|
||||
RET_CHECK(!initialized_)
|
||||
<< "SetExecutor can only be called before Initialize()";
|
||||
if (IsReservedExecutorName(name)) {
|
||||
return ::mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
|
||||
return mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "\"" << name << "\" is a reserved executor name.";
|
||||
}
|
||||
return SetExecutorInternal(name, std::move(executor));
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorGraph::CreateDefaultThreadPool(
|
||||
mediapipe::Status CalculatorGraph::CreateDefaultThreadPool(
|
||||
const ThreadPoolExecutorOptions* default_executor_options,
|
||||
int num_threads) {
|
||||
MediaPipeOptions extendable_options;
|
||||
@@ -1237,16 +1234,16 @@ bool CalculatorGraph::IsReservedExecutorName(const std::string& name) {
|
||||
return ValidatedGraphConfig::IsReservedExecutorName(name);
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorGraph::FinishRun() {
|
||||
mediapipe::Status CalculatorGraph::FinishRun() {
|
||||
// Check for any errors that may have occurred.
|
||||
::mediapipe::Status status = ::mediapipe::OkStatus();
|
||||
mediapipe::Status status = mediapipe::OkStatus();
|
||||
MP_RETURN_IF_ERROR(profiler_->Stop());
|
||||
GetCombinedErrors(&status);
|
||||
CleanupAfterRun(&status);
|
||||
return status;
|
||||
}
|
||||
|
||||
void CalculatorGraph::CleanupAfterRun(::mediapipe::Status* status) {
|
||||
void CalculatorGraph::CleanupAfterRun(mediapipe::Status* status) {
|
||||
for (auto& item : graph_input_streams_) {
|
||||
item.second->Close();
|
||||
}
|
||||
@@ -1313,7 +1310,7 @@ bool MetricElementComparator(const std::pair<std::string, int64>& e1,
|
||||
}
|
||||
} // namespace
|
||||
|
||||
::mediapipe::Status CalculatorGraph::GetCalculatorProfiles(
|
||||
mediapipe::Status CalculatorGraph::GetCalculatorProfiles(
|
||||
std::vector<CalculatorProfile>* profiles) const {
|
||||
return profiler_->GetCalculatorProfiles(profiles);
|
||||
}
|
||||
|
||||
@@ -62,7 +62,7 @@ struct GpuSharedData;
|
||||
|
||||
namespace mediapipe {
|
||||
|
||||
typedef ::mediapipe::StatusOr<OutputStreamPoller> StatusOrPoller;
|
||||
typedef mediapipe::StatusOr<OutputStreamPoller> StatusOrPoller;
|
||||
|
||||
// The class representing a DAG of calculator nodes.
|
||||
//
|
||||
@@ -126,12 +126,12 @@ class CalculatorGraph {
|
||||
// Initializes the graph from a its proto description.
|
||||
// side_packets that are provided at this stage are common across all Run()
|
||||
// invocations and could be used to execute PacketGenerators immediately.
|
||||
::mediapipe::Status Initialize(
|
||||
mediapipe::Status Initialize(
|
||||
const CalculatorGraphConfig& config,
|
||||
const std::map<std::string, Packet>& side_packets);
|
||||
|
||||
// Convenience version which does not take side packets.
|
||||
::mediapipe::Status Initialize(const CalculatorGraphConfig& config);
|
||||
mediapipe::Status Initialize(const CalculatorGraphConfig& config);
|
||||
|
||||
// Initializes the CalculatorGraph from the specified graph and subgraph
|
||||
// configs. Template graph and subgraph configs can be specified through
|
||||
@@ -139,7 +139,7 @@ class CalculatorGraph {
|
||||
// CalclatorGraphConfig.type. A subgraph can be instantiated directly by
|
||||
// specifying its type in |graph_type|. A template graph can be instantiated
|
||||
// directly by specifying its template arguments in |options|.
|
||||
::mediapipe::Status Initialize(
|
||||
mediapipe::Status Initialize(
|
||||
const std::vector<CalculatorGraphConfig>& configs,
|
||||
const std::vector<CalculatorGraphTemplate>& templates,
|
||||
const std::map<std::string, Packet>& side_packets = {},
|
||||
@@ -155,9 +155,9 @@ class CalculatorGraph {
|
||||
// packet emitted by the output stream. Can only be called before Run() or
|
||||
// StartRun().
|
||||
// TODO: Rename to AddOutputStreamCallback.
|
||||
::mediapipe::Status ObserveOutputStream(
|
||||
mediapipe::Status ObserveOutputStream(
|
||||
const std::string& stream_name,
|
||||
std::function<::mediapipe::Status(const Packet&)> packet_callback);
|
||||
std::function<mediapipe::Status(const Packet&)> packet_callback);
|
||||
|
||||
// Adds an OutputStreamPoller for a stream. This provides a synchronous,
|
||||
// polling API for accessing a stream's output. Should only be called before
|
||||
@@ -169,17 +169,17 @@ class CalculatorGraph {
|
||||
// packets (generated by PacketGenerators) can be retrieved before
|
||||
// graph is done. Returns error if the graph is still running (for non-base
|
||||
// packets) or the output side packet is not found or empty.
|
||||
::mediapipe::StatusOr<Packet> GetOutputSidePacket(
|
||||
mediapipe::StatusOr<Packet> GetOutputSidePacket(
|
||||
const std::string& packet_name);
|
||||
|
||||
// Runs the graph after adding the given extra input side packets. All
|
||||
// arguments are forgotten after Run() returns.
|
||||
// Run() is a blocking call and will return when all calculators are done.
|
||||
virtual ::mediapipe::Status Run(
|
||||
virtual mediapipe::Status Run(
|
||||
const std::map<std::string, Packet>& extra_side_packets);
|
||||
|
||||
// Run the graph without adding any input side packets.
|
||||
::mediapipe::Status Run() { return Run({}); }
|
||||
mediapipe::Status Run() { return Run({}); }
|
||||
|
||||
// Start a run of the graph. StartRun, WaitUntilDone, HasError,
|
||||
// AddPacketToInputStream, and CloseInputStream allow more control over
|
||||
@@ -199,7 +199,7 @@ class CalculatorGraph {
|
||||
// MP_RETURN_IF_ERROR(graph.CloseInputStream(stream));
|
||||
// }
|
||||
// MP_RETURN_IF_ERROR(graph.WaitUntilDone());
|
||||
::mediapipe::Status StartRun(
|
||||
mediapipe::Status StartRun(
|
||||
const std::map<std::string, Packet>& extra_side_packets) {
|
||||
return StartRun(extra_side_packets, {});
|
||||
}
|
||||
@@ -208,7 +208,7 @@ class CalculatorGraph {
|
||||
// stream header before running.
|
||||
// Note: We highly discourage the use of stream headers, this is added for the
|
||||
// compatibility of existing calculators that use headers during Open().
|
||||
::mediapipe::Status StartRun(
|
||||
mediapipe::Status StartRun(
|
||||
const std::map<std::string, Packet>& extra_side_packets,
|
||||
const std::map<std::string, Packet>& stream_headers);
|
||||
|
||||
@@ -216,20 +216,20 @@ class CalculatorGraph {
|
||||
// until all source calculators have returned StatusStop(), all
|
||||
// graph_input_streams_ have been closed, and no more calculators can
|
||||
// be run). This function can be called only after StartRun().
|
||||
::mediapipe::Status WaitUntilDone();
|
||||
mediapipe::Status WaitUntilDone();
|
||||
|
||||
// Wait until the running graph is in the idle mode, which is when nothing can
|
||||
// be scheduled and nothing is running in the worker threads. This function
|
||||
// can be called only after StartRun().
|
||||
// NOTE: The graph must not have any source nodes because source nodes prevent
|
||||
// the running graph from becoming idle until the source nodes are done.
|
||||
::mediapipe::Status WaitUntilIdle();
|
||||
mediapipe::Status WaitUntilIdle();
|
||||
|
||||
// Wait until a packet is emitted on one of the observed output streams.
|
||||
// Returns immediately if a packet has already been emitted since the last
|
||||
// call to this function.
|
||||
// Returns OutOfRangeError if the graph terminated while waiting.
|
||||
::mediapipe::Status WaitForObservedOutput();
|
||||
mediapipe::Status WaitForObservedOutput();
|
||||
|
||||
// Quick non-locking means of checking if the graph has encountered an error.
|
||||
bool HasError() const { return has_error_; }
|
||||
@@ -243,8 +243,8 @@ class CalculatorGraph {
|
||||
// sizes of the queues in the graph. The input stream must have been specified
|
||||
// in the configuration as a graph level input_stream. On error, nothing is
|
||||
// added.
|
||||
::mediapipe::Status AddPacketToInputStream(const std::string& stream_name,
|
||||
const Packet& packet);
|
||||
mediapipe::Status AddPacketToInputStream(const std::string& stream_name,
|
||||
const Packet& packet);
|
||||
|
||||
// Same as the l-value version of this function by the same name, but moves
|
||||
// the r-value referenced packet into the stream instead of copying it over.
|
||||
@@ -253,12 +253,12 @@ class CalculatorGraph {
|
||||
// packet may remain valid. In particular, when using the ADD_IF_NOT_FULL
|
||||
// mode with a full queue, this will return StatusUnavailable and the caller
|
||||
// may try adding the packet again later.
|
||||
::mediapipe::Status AddPacketToInputStream(const std::string& stream_name,
|
||||
Packet&& packet);
|
||||
mediapipe::Status AddPacketToInputStream(const std::string& stream_name,
|
||||
Packet&& packet);
|
||||
|
||||
// Sets the queue size of a graph input stream, overriding the graph default.
|
||||
::mediapipe::Status SetInputStreamMaxQueueSize(const std::string& stream_name,
|
||||
int max_queue_size);
|
||||
mediapipe::Status SetInputStreamMaxQueueSize(const std::string& stream_name,
|
||||
int max_queue_size);
|
||||
|
||||
// Check if an input stream exists in the graph
|
||||
bool HasInputStream(const std::string& name);
|
||||
@@ -268,14 +268,14 @@ class CalculatorGraph {
|
||||
// been closed (and all packets propagate through the graph).
|
||||
// Note that multiple threads cannot call CloseInputStream() on the same
|
||||
// stream_name at the same time.
|
||||
::mediapipe::Status CloseInputStream(const std::string& stream_name);
|
||||
mediapipe::Status CloseInputStream(const std::string& stream_name);
|
||||
|
||||
// Closes all the graph input streams.
|
||||
// TODO: deprecate this function in favor of CloseAllPacketSources.
|
||||
::mediapipe::Status CloseAllInputStreams();
|
||||
mediapipe::Status CloseAllInputStreams();
|
||||
|
||||
// Closes all the graph input streams and source calculator nodes.
|
||||
::mediapipe::Status CloseAllPacketSources();
|
||||
mediapipe::Status CloseAllPacketSources();
|
||||
|
||||
// Returns the pointer to the stream with the given name, or dies if none
|
||||
// exists. The result remains owned by the CalculatorGraph.
|
||||
@@ -290,7 +290,7 @@ class CalculatorGraph {
|
||||
// calculator in the graph. May be called at any time after the graph has been
|
||||
// initialized.
|
||||
ABSL_DEPRECATED("Use profiler()->GetCalculatorProfiles() instead")
|
||||
::mediapipe::Status GetCalculatorProfiles(
|
||||
mediapipe::Status GetCalculatorProfiles(
|
||||
std::vector<CalculatorProfile>*) const;
|
||||
|
||||
// Set the type of counter used in this graph.
|
||||
@@ -301,15 +301,15 @@ class CalculatorGraph {
|
||||
|
||||
// Callback when an error is encountered.
|
||||
// Adds the error to the vector of errors.
|
||||
void RecordError(const ::mediapipe::Status& error)
|
||||
void RecordError(const mediapipe::Status& error)
|
||||
ABSL_LOCKS_EXCLUDED(error_mutex_);
|
||||
|
||||
// Combines errors into a status. Returns true if the vector of errors is
|
||||
// non-empty.
|
||||
bool GetCombinedErrors(const std::string& error_prefix,
|
||||
::mediapipe::Status* error_status);
|
||||
mediapipe::Status* error_status);
|
||||
// Convenience overload which specifies a default error prefix.
|
||||
bool GetCombinedErrors(::mediapipe::Status* error_status);
|
||||
bool GetCombinedErrors(mediapipe::Status* error_status);
|
||||
|
||||
// Returns the maximum input stream queue size.
|
||||
int GetMaxInputStreamQueueSize();
|
||||
@@ -338,8 +338,8 @@ class CalculatorGraph {
|
||||
// Sets the executor that will run the nodes assigned to the executor
|
||||
// named |name|. If |name| is empty, this sets the default executor. Must
|
||||
// be called before the graph is initialized.
|
||||
::mediapipe::Status SetExecutor(const std::string& name,
|
||||
std::shared_ptr<Executor> executor);
|
||||
mediapipe::Status SetExecutor(const std::string& name,
|
||||
std::shared_ptr<Executor> executor);
|
||||
|
||||
// WARNING: the following public methods are exposed to Scheduler only.
|
||||
|
||||
@@ -370,18 +370,18 @@ class CalculatorGraph {
|
||||
// Only meant for internal use.
|
||||
std::shared_ptr<::mediapipe::GpuResources> GetGpuResources() const;
|
||||
|
||||
::mediapipe::Status SetGpuResources(
|
||||
mediapipe::Status SetGpuResources(
|
||||
std::shared_ptr<::mediapipe::GpuResources> resources);
|
||||
|
||||
// Helper for PrepareForRun. If it returns a non-empty map, those packets
|
||||
// must be added to the existing side packets, replacing existing values
|
||||
// that have the same key.
|
||||
::mediapipe::StatusOr<std::map<std::string, Packet>> PrepareGpu(
|
||||
mediapipe::StatusOr<std::map<std::string, Packet>> PrepareGpu(
|
||||
const std::map<std::string, Packet>& side_packets);
|
||||
#endif // !defined(MEDIAPIPE_DISABLE_GPU)
|
||||
template <typename T>
|
||||
::mediapipe::Status SetServiceObject(const GraphService<T>& service,
|
||||
std::shared_ptr<T> object) {
|
||||
mediapipe::Status SetServiceObject(const GraphService<T>& service,
|
||||
std::shared_ptr<T> object) {
|
||||
return SetServicePacket(service,
|
||||
MakePacket<std::shared_ptr<T>>(std::move(object)));
|
||||
}
|
||||
@@ -394,8 +394,7 @@ class CalculatorGraph {
|
||||
}
|
||||
|
||||
// Only the Java API should call this directly.
|
||||
::mediapipe::Status SetServicePacket(const GraphServiceBase& service,
|
||||
Packet p);
|
||||
mediapipe::Status SetServicePacket(const GraphServiceBase& service, Packet p);
|
||||
|
||||
private:
|
||||
// GraphRunState is used as a parameter in the function CallStatusHandlers.
|
||||
@@ -419,8 +418,7 @@ class CalculatorGraph {
|
||||
shard_.SetSpec(manager_->Spec());
|
||||
}
|
||||
|
||||
void PrepareForRun(
|
||||
std::function<void(::mediapipe::Status)> error_callback) {
|
||||
void PrepareForRun(std::function<void(mediapipe::Status)> error_callback) {
|
||||
manager_->PrepareForRun(std::move(error_callback));
|
||||
}
|
||||
|
||||
@@ -448,7 +446,7 @@ class CalculatorGraph {
|
||||
};
|
||||
|
||||
// Initializes the graph from a ValidatedGraphConfig object.
|
||||
::mediapipe::Status Initialize(
|
||||
mediapipe::Status Initialize(
|
||||
std::unique_ptr<ValidatedGraphConfig> validated_graph,
|
||||
const std::map<std::string, Packet>& side_packets);
|
||||
|
||||
@@ -456,28 +454,28 @@ class CalculatorGraph {
|
||||
// AddPacketToInputStream(Packet&& packet) or
|
||||
// AddPacketToInputStream(const Packet& packet).
|
||||
template <typename T>
|
||||
::mediapipe::Status AddPacketToInputStreamInternal(
|
||||
mediapipe::Status AddPacketToInputStreamInternal(
|
||||
const std::string& stream_name, T&& packet);
|
||||
|
||||
// Sets the executor that will run the nodes assigned to the executor
|
||||
// named |name|. If |name| is empty, this sets the default executor.
|
||||
// Does not check that the graph is uninitialized and |name| is not a
|
||||
// reserved executor name.
|
||||
::mediapipe::Status SetExecutorInternal(const std::string& name,
|
||||
std::shared_ptr<Executor> executor);
|
||||
mediapipe::Status SetExecutorInternal(const std::string& name,
|
||||
std::shared_ptr<Executor> executor);
|
||||
|
||||
// If the num_threads field in default_executor_options is not specified,
|
||||
// assigns a reasonable value based on system configuration and the graph.
|
||||
// Then, creates the default thread pool if appropriate.
|
||||
//
|
||||
// Only called by InitializeExecutors().
|
||||
::mediapipe::Status InitializeDefaultExecutor(
|
||||
mediapipe::Status InitializeDefaultExecutor(
|
||||
const ThreadPoolExecutorOptions* default_executor_options,
|
||||
bool use_application_thread);
|
||||
|
||||
// Creates a thread pool as the default executor. The num_threads argument
|
||||
// overrides the num_threads field in default_executor_options.
|
||||
::mediapipe::Status CreateDefaultThreadPool(
|
||||
mediapipe::Status CreateDefaultThreadPool(
|
||||
const ThreadPoolExecutorOptions* default_executor_options,
|
||||
int num_threads);
|
||||
|
||||
@@ -485,31 +483,31 @@ class CalculatorGraph {
|
||||
static bool IsReservedExecutorName(const std::string& name);
|
||||
|
||||
// Helper functions for Initialize().
|
||||
::mediapipe::Status InitializeExecutors();
|
||||
::mediapipe::Status InitializePacketGeneratorGraph(
|
||||
mediapipe::Status InitializeExecutors();
|
||||
mediapipe::Status InitializePacketGeneratorGraph(
|
||||
const std::map<std::string, Packet>& side_packets);
|
||||
::mediapipe::Status InitializeStreams();
|
||||
::mediapipe::Status InitializeProfiler();
|
||||
::mediapipe::Status InitializeCalculatorNodes();
|
||||
mediapipe::Status InitializeStreams();
|
||||
mediapipe::Status InitializeProfiler();
|
||||
mediapipe::Status InitializeCalculatorNodes();
|
||||
|
||||
// Iterates through all nodes and schedules any that can be opened.
|
||||
void ScheduleAllOpenableNodes();
|
||||
|
||||
// Does the bulk of the work for StartRun but does not start the scheduler.
|
||||
::mediapipe::Status PrepareForRun(
|
||||
mediapipe::Status PrepareForRun(
|
||||
const std::map<std::string, Packet>& extra_side_packets,
|
||||
const std::map<std::string, Packet>& stream_headers);
|
||||
|
||||
// Cleans up any remaining state after the run and returns any errors that may
|
||||
// have occurred during the run. Called after the scheduler has terminated.
|
||||
::mediapipe::Status FinishRun();
|
||||
mediapipe::Status FinishRun();
|
||||
|
||||
// Cleans up any remaining state after the run. All status handlers run here
|
||||
// if their requested input side packets exist.
|
||||
// The original |*status| is passed to all the status handlers. If any status
|
||||
// handler fails, it appends its error to errors_, and CleanupAfterRun sets
|
||||
// |*status| to the new combined errors on return.
|
||||
void CleanupAfterRun(::mediapipe::Status* status)
|
||||
void CleanupAfterRun(mediapipe::Status* status)
|
||||
ABSL_LOCKS_EXCLUDED(error_mutex_);
|
||||
|
||||
// Calls HandlePreRunStatus or HandleStatus on the StatusHandlers. Which one
|
||||
@@ -517,7 +515,7 @@ class CalculatorGraph {
|
||||
// current_run_side_packets_ must be set before this function is called.
|
||||
// On error, has_error_ will be set.
|
||||
void CallStatusHandlers(GraphRunState graph_run_state,
|
||||
const ::mediapipe::Status& status);
|
||||
const mediapipe::Status& status);
|
||||
|
||||
// Callback function to throttle or unthrottle source nodes when a stream
|
||||
// becomes full or non-full. A node is throttled (i.e. prevented being
|
||||
@@ -611,7 +609,7 @@ class CalculatorGraph {
|
||||
|
||||
// Vector of errors encountered while running graph. Always use RecordError()
|
||||
// to add an error to this vector.
|
||||
std::vector<::mediapipe::Status> errors_ ABSL_GUARDED_BY(error_mutex_);
|
||||
std::vector<mediapipe::Status> errors_ ABSL_GUARDED_BY(error_mutex_);
|
||||
|
||||
// True if the default executor uses the application thread.
|
||||
bool use_application_thread_ = false;
|
||||
|
||||
@@ -30,7 +30,7 @@ namespace {
|
||||
|
||||
constexpr int kIntTestValue = 33;
|
||||
|
||||
typedef std::function<::mediapipe::Status(CalculatorContext* cc)>
|
||||
typedef std::function<mediapipe::Status(CalculatorContext* cc)>
|
||||
CalculatorContextFunction;
|
||||
|
||||
// Returns the contents of a set of Packets.
|
||||
@@ -87,26 +87,26 @@ class CountingExecutor : public Executor {
|
||||
// streams and outputs the sum to the output stream.
|
||||
class IntAdderCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
for (int i = 0; i < cc->Inputs().NumEntries(); ++i) {
|
||||
cc->Inputs().Index(i).Set<int>();
|
||||
}
|
||||
cc->Outputs().Index(0).Set<int>();
|
||||
cc->SetTimestampOffset(TimestampDiff(0));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Open(CalculatorContext* cc) final {
|
||||
return ::mediapipe::OkStatus();
|
||||
mediapipe::Status Open(CalculatorContext* cc) final {
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
int sum = 0;
|
||||
for (int i = 0; i < cc->Inputs().NumEntries(); ++i) {
|
||||
sum += cc->Inputs().Index(i).Get<int>();
|
||||
}
|
||||
cc->Outputs().Index(0).Add(new int(sum), cc->InputTimestamp());
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
};
|
||||
REGISTER_CALCULATOR(IntAdderCalculator);
|
||||
@@ -114,13 +114,13 @@ REGISTER_CALCULATOR(IntAdderCalculator);
|
||||
template <typename InputType>
|
||||
class TypedSinkCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
cc->Inputs().Index(0).Set<InputType>();
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Process(CalculatorContext* cc) override {
|
||||
return ::mediapipe::OkStatus();
|
||||
mediapipe::Status Process(CalculatorContext* cc) override {
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
};
|
||||
typedef TypedSinkCalculator<std::string> StringSinkCalculator;
|
||||
@@ -132,13 +132,13 @@ REGISTER_CALCULATOR(IntSinkCalculator);
|
||||
// integer.
|
||||
class EvenIntFilterCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
cc->Inputs().Index(0).Set<int>();
|
||||
cc->Outputs().Index(0).Set<int>();
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
int value = cc->Inputs().Index(0).Get<int>();
|
||||
if (value % 2 == 0) {
|
||||
cc->Outputs().Index(0).AddPacket(cc->Inputs().Index(0).Value());
|
||||
@@ -146,7 +146,7 @@ class EvenIntFilterCalculator : public CalculatorBase {
|
||||
cc->Outputs().Index(0).SetNextTimestampBound(
|
||||
cc->InputTimestamp().NextAllowedInStream());
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
};
|
||||
REGISTER_CALCULATOR(EvenIntFilterCalculator);
|
||||
@@ -156,19 +156,19 @@ REGISTER_CALCULATOR(EvenIntFilterCalculator);
|
||||
// input stream carries the value true.
|
||||
class ValveCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
cc->Inputs().Index(0).SetAny();
|
||||
cc->Inputs().Index(1).Set<bool>();
|
||||
cc->Outputs().Index(0).SetSameAs(&cc->Inputs().Index(0));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Open(CalculatorContext* cc) final {
|
||||
mediapipe::Status Open(CalculatorContext* cc) final {
|
||||
cc->Outputs().Index(0).SetHeader(cc->Inputs().Index(0).Header());
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
if (cc->Inputs().Index(1).Get<bool>()) {
|
||||
cc->GetCounter("PassThrough")->Increment();
|
||||
cc->Outputs().Index(0).AddPacket(cc->Inputs().Index(0).Value());
|
||||
@@ -182,7 +182,7 @@ class ValveCalculator : public CalculatorBase {
|
||||
cc->Outputs().Index(0).SetNextTimestampBound(
|
||||
cc->InputTimestamp().NextAllowedInStream());
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
};
|
||||
REGISTER_CALCULATOR(ValveCalculator);
|
||||
@@ -191,27 +191,27 @@ REGISTER_CALCULATOR(ValveCalculator);
|
||||
// but shifts the timestamp.
|
||||
class TimeShiftCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
cc->Inputs().Index(0).SetAny();
|
||||
cc->Outputs().Index(0).SetSameAs(&cc->Inputs().Index(0));
|
||||
cc->InputSidePackets().Index(0).Set<TimestampDiff>();
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Open(CalculatorContext* cc) final {
|
||||
mediapipe::Status Open(CalculatorContext* cc) final {
|
||||
// Input: arbitrary Packets.
|
||||
// Output: copy of the input.
|
||||
cc->Outputs().Index(0).SetHeader(cc->Inputs().Index(0).Header());
|
||||
shift_ = cc->InputSidePackets().Index(0).Get<TimestampDiff>();
|
||||
cc->SetOffset(shift_);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
cc->GetCounter("PassThrough")->Increment();
|
||||
cc->Outputs().Index(0).AddPacket(
|
||||
cc->Inputs().Index(0).Value().At(cc->InputTimestamp() + shift_));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -231,17 +231,17 @@ REGISTER_CALCULATOR(TimeShiftCalculator);
|
||||
// T=2000 Output 100
|
||||
class OutputAndBoundSourceCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
cc->Outputs().Index(0).Set<int>();
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Open(CalculatorContext* cc) override {
|
||||
mediapipe::Status Open(CalculatorContext* cc) override {
|
||||
counter_ = 0;
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Process(CalculatorContext* cc) override {
|
||||
mediapipe::Status Process(CalculatorContext* cc) override {
|
||||
Timestamp timestamp(counter_);
|
||||
if (counter_ % 20 == 0) {
|
||||
cc->Outputs().Index(0).AddPacket(
|
||||
@@ -253,7 +253,7 @@ class OutputAndBoundSourceCalculator : public CalculatorBase {
|
||||
return tool::StatusStop();
|
||||
}
|
||||
counter_ += 10;
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -266,42 +266,42 @@ REGISTER_CALCULATOR(OutputAndBoundSourceCalculator);
|
||||
// Process() method. The input stream and output stream have the integer type.
|
||||
class Delay20Calculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
cc->Inputs().Index(0).Set<int>();
|
||||
cc->Outputs().Index(0).Set<int>();
|
||||
cc->SetTimestampOffset(TimestampDiff(20));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Open(CalculatorContext* cc) final {
|
||||
mediapipe::Status Open(CalculatorContext* cc) final {
|
||||
cc->Outputs().Index(0).AddPacket(MakePacket<int>(0).At(Timestamp(0)));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
const Packet& packet = cc->Inputs().Index(0).Value();
|
||||
Timestamp timestamp = packet.Timestamp() + 20;
|
||||
cc->Outputs().Index(0).AddPacket(packet.At(timestamp));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
};
|
||||
REGISTER_CALCULATOR(Delay20Calculator);
|
||||
|
||||
class CustomBoundCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
cc->Inputs().Index(0).Set<int>();
|
||||
cc->Outputs().Index(0).Set<int>();
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Open(CalculatorContext* cc) final {
|
||||
return ::mediapipe::OkStatus();
|
||||
mediapipe::Status Open(CalculatorContext* cc) final {
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
cc->Outputs().Index(0).SetNextTimestampBound(cc->InputTimestamp() + 1);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
};
|
||||
REGISTER_CALCULATOR(CustomBoundCalculator);
|
||||
@@ -310,7 +310,7 @@ REGISTER_CALCULATOR(CustomBoundCalculator);
|
||||
TEST(CalculatorGraph, SetNextTimestampBoundPropagation) {
|
||||
CalculatorGraph graph;
|
||||
CalculatorGraphConfig config =
|
||||
::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
input_stream: 'in'
|
||||
input_stream: 'gate'
|
||||
node {
|
||||
@@ -435,7 +435,7 @@ TEST(CalculatorGraph, NotAllInputPacketsAtNextTimestampBoundAvailable) {
|
||||
//
|
||||
CalculatorGraph graph;
|
||||
CalculatorGraphConfig config =
|
||||
::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
input_stream: 'in0_unfiltered'
|
||||
input_stream: 'in1_to_be_filtered'
|
||||
node {
|
||||
@@ -507,7 +507,7 @@ TEST(CalculatorGraph, NotAllInputPacketsAtNextTimestampBoundAvailable) {
|
||||
|
||||
TEST(CalculatorGraph, PropagateBoundLoop) {
|
||||
CalculatorGraphConfig config =
|
||||
::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
node {
|
||||
calculator: 'OutputAndBoundSourceCalculator'
|
||||
output_stream: 'integers'
|
||||
@@ -553,7 +553,7 @@ TEST(CalculatorGraph, CheckBatchProcessingBoundPropagation) {
|
||||
// the sink calculator's input stream should report packet timestamp
|
||||
// mismatches.
|
||||
CalculatorGraphConfig config =
|
||||
::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
node {
|
||||
calculator: 'OutputAndBoundSourceCalculator'
|
||||
output_stream: 'integers'
|
||||
@@ -585,7 +585,7 @@ TEST(CalculatorGraphBoundsTest, ImmediateHandlerBounds) {
|
||||
// The second PassthroughCalculator delivers an output packet whenever the
|
||||
// first PassThroughCalculator delivers a timestamp bound.
|
||||
CalculatorGraphConfig config =
|
||||
::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
input_stream: 'input'
|
||||
node {
|
||||
calculator: 'CustomBoundCalculator'
|
||||
@@ -613,7 +613,7 @@ TEST(CalculatorGraphBoundsTest, ImmediateHandlerBounds) {
|
||||
MP_ASSERT_OK(graph.Initialize(config));
|
||||
MP_ASSERT_OK(graph.ObserveOutputStream("output", [&](const Packet& p) {
|
||||
output_packets.push_back(p);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}));
|
||||
MP_ASSERT_OK(graph.StartRun({}));
|
||||
MP_ASSERT_OK(graph.WaitUntilIdle());
|
||||
@@ -638,19 +638,19 @@ TEST(CalculatorGraphBoundsTest, ImmediateHandlerBounds) {
|
||||
// A Calculator that only sets timestamp bound by SetOffset().
|
||||
class OffsetBoundCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
cc->Inputs().Index(0).Set<int>();
|
||||
cc->Outputs().Index(0).Set<int>();
|
||||
cc->SetTimestampOffset(TimestampDiff(0));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Open(CalculatorContext* cc) final {
|
||||
return ::mediapipe::OkStatus();
|
||||
mediapipe::Status Open(CalculatorContext* cc) final {
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
return ::mediapipe::OkStatus();
|
||||
mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
};
|
||||
REGISTER_CALCULATOR(OffsetBoundCalculator);
|
||||
@@ -658,27 +658,27 @@ REGISTER_CALCULATOR(OffsetBoundCalculator);
|
||||
// A Calculator that produces a packet for each call to Process.
|
||||
class BoundToPacketCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
for (int i = 0; i < cc->Inputs().NumEntries(); ++i) {
|
||||
cc->Inputs().Index(i).SetAny();
|
||||
}
|
||||
for (int i = 0; i < cc->Outputs().NumEntries(); ++i) {
|
||||
cc->Outputs().Index(i).Set<Timestamp>();
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Open(CalculatorContext* cc) final {
|
||||
return ::mediapipe::OkStatus();
|
||||
mediapipe::Status Open(CalculatorContext* cc) final {
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
for (int i = 0; i < cc->Outputs().NumEntries(); ++i) {
|
||||
Timestamp t = cc->Inputs().Index(i).Value().Timestamp();
|
||||
cc->Outputs().Index(i).AddPacket(
|
||||
mediapipe::MakePacket<Timestamp>(t).At(cc->InputTimestamp()));
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
};
|
||||
REGISTER_CALCULATOR(BoundToPacketCalculator);
|
||||
@@ -688,22 +688,22 @@ class FuturePacketCalculator : public CalculatorBase {
|
||||
public:
|
||||
static constexpr int64 kOutputFutureMicros = 3;
|
||||
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
cc->Inputs().Index(0).Set<int>();
|
||||
cc->Outputs().Index(0).Set<int>();
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Open(CalculatorContext* cc) final {
|
||||
return ::mediapipe::OkStatus();
|
||||
mediapipe::Status Open(CalculatorContext* cc) final {
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
const Packet& packet = cc->Inputs().Index(0).Value();
|
||||
Timestamp timestamp =
|
||||
Timestamp(packet.Timestamp().Value() + kOutputFutureMicros);
|
||||
cc->Outputs().Index(0).AddPacket(packet.At(timestamp));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
};
|
||||
REGISTER_CALCULATOR(FuturePacketCalculator);
|
||||
@@ -715,7 +715,7 @@ TEST(CalculatorGraphBoundsTest, OffsetBoundPropagation) {
|
||||
// The PassThroughCalculator delivers an output packet whenever the
|
||||
// OffsetBoundCalculator delivers a timestamp bound.
|
||||
CalculatorGraphConfig config =
|
||||
::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
input_stream: 'input'
|
||||
node {
|
||||
calculator: 'OffsetBoundCalculator'
|
||||
@@ -735,7 +735,7 @@ TEST(CalculatorGraphBoundsTest, OffsetBoundPropagation) {
|
||||
MP_ASSERT_OK(graph.Initialize(config));
|
||||
MP_ASSERT_OK(graph.ObserveOutputStream("output", [&](const Packet& p) {
|
||||
output_packets.push_back(p);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}));
|
||||
MP_ASSERT_OK(graph.StartRun({}));
|
||||
MP_ASSERT_OK(graph.WaitUntilIdle());
|
||||
@@ -763,7 +763,7 @@ TEST(CalculatorGraphBoundsTest, BoundWithoutInputPackets) {
|
||||
// The BoundToPacketCalculator delivers an output packet whenever the
|
||||
// OffsetBoundCalculator delivers a timestamp bound.
|
||||
CalculatorGraphConfig config =
|
||||
::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
input_stream: 'input'
|
||||
node {
|
||||
calculator: 'FuturePacketCalculator'
|
||||
@@ -786,7 +786,7 @@ TEST(CalculatorGraphBoundsTest, BoundWithoutInputPackets) {
|
||||
MP_ASSERT_OK(graph.Initialize(config));
|
||||
MP_ASSERT_OK(graph.ObserveOutputStream("output", [&](const Packet& p) {
|
||||
output_packets.push_back(p);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}));
|
||||
MP_ASSERT_OK(graph.StartRun({}));
|
||||
MP_ASSERT_OK(graph.WaitUntilIdle());
|
||||
@@ -821,7 +821,7 @@ TEST(CalculatorGraphBoundsTest, FixedSizeHandlerBounds) {
|
||||
// The PassthroughCalculator delivers an output packet whenever the
|
||||
// LambdaCalculator delivers a timestamp bound.
|
||||
CalculatorGraphConfig config =
|
||||
::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
input_stream: 'input'
|
||||
input_side_packet: 'open_function'
|
||||
input_side_packet: 'process_function'
|
||||
@@ -860,13 +860,13 @@ TEST(CalculatorGraphBoundsTest, FixedSizeHandlerBounds) {
|
||||
std::vector<Packet> outputs;
|
||||
MP_ASSERT_OK(graph.ObserveOutputStream("output", [&](const Packet& p) {
|
||||
outputs.push_back(p);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}));
|
||||
std::vector<Packet> thinned_outputs;
|
||||
MP_ASSERT_OK(
|
||||
graph.ObserveOutputStream("thinned_output", [&](const Packet& p) {
|
||||
thinned_outputs.push_back(p);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}));
|
||||
|
||||
// The enter_semaphore is used to wait for LambdaCalculator::Process.
|
||||
@@ -875,13 +875,13 @@ TEST(CalculatorGraphBoundsTest, FixedSizeHandlerBounds) {
|
||||
AtomicSemaphore exit_semaphore(0);
|
||||
CalculatorContextFunction open_fn = [&](CalculatorContext* cc) {
|
||||
cc->SetOffset(0);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
};
|
||||
CalculatorContextFunction process_fn = [&](CalculatorContext* cc) {
|
||||
enter_semaphore.Release(1);
|
||||
exit_semaphore.Acquire(1);
|
||||
cc->Outputs().Index(0).AddPacket(cc->Inputs().Index(0).Value());
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
};
|
||||
MP_ASSERT_OK(graph.StartRun({
|
||||
{"open_fn", Adopt(new auto(open_fn))},
|
||||
@@ -935,22 +935,22 @@ TEST(CalculatorGraphBoundsTest, FixedSizeHandlerBounds) {
|
||||
// A Calculator that outputs only the last packet from its input stream.
|
||||
class LastPacketCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
cc->Inputs().Index(0).SetAny();
|
||||
cc->Outputs().Index(0).SetAny();
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
::mediapipe::Status Open(CalculatorContext* cc) final {
|
||||
return ::mediapipe::OkStatus();
|
||||
mediapipe::Status Open(CalculatorContext* cc) final {
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
::mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
cc->Outputs().Index(0).SetNextTimestampBound(cc->InputTimestamp());
|
||||
last_packet_ = cc->Inputs().Index(0).Value();
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
::mediapipe::Status Close(CalculatorContext* cc) final {
|
||||
mediapipe::Status Close(CalculatorContext* cc) final {
|
||||
cc->Outputs().Index(0).AddPacket(last_packet_);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -965,7 +965,7 @@ TEST(CalculatorGraphBoundsTest, LastPacketCheck) {
|
||||
// packet or input stream close. The output "last_output" shows the
|
||||
// last packet, and "output" shows the timestamp bounds.
|
||||
CalculatorGraphConfig config =
|
||||
::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
input_stream: 'input'
|
||||
output_stream: 'output'
|
||||
output_stream: 'last_output'
|
||||
@@ -992,12 +992,12 @@ TEST(CalculatorGraphBoundsTest, LastPacketCheck) {
|
||||
MP_ASSERT_OK(graph.Initialize(config));
|
||||
MP_ASSERT_OK(graph.ObserveOutputStream("output", [&](const Packet& p) {
|
||||
output_packets.push_back(p);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}));
|
||||
std::vector<Packet> last_output_packets;
|
||||
MP_ASSERT_OK(graph.ObserveOutputStream("last_output", [&](const Packet& p) {
|
||||
last_output_packets.push_back(p);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}));
|
||||
MP_ASSERT_OK(graph.StartRun({}));
|
||||
MP_ASSERT_OK(graph.WaitUntilIdle());
|
||||
@@ -1048,18 +1048,18 @@ void TestBoundsForEmptyInputs(std::string input_stream_handler) {
|
||||
absl::StrReplaceAll({{"$input_stream_handler", input_stream_handler}},
|
||||
&config_str);
|
||||
CalculatorGraphConfig config =
|
||||
::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(config_str);
|
||||
mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(config_str);
|
||||
CalculatorGraph graph;
|
||||
std::vector<Packet> input_ts_packets;
|
||||
std::vector<Packet> bounds_ts_packets;
|
||||
MP_ASSERT_OK(graph.Initialize(config));
|
||||
MP_ASSERT_OK(graph.ObserveOutputStream("input_ts", [&](const Packet& p) {
|
||||
input_ts_packets.push_back(p);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}));
|
||||
MP_ASSERT_OK(graph.ObserveOutputStream("bounds_ts", [&](const Packet& p) {
|
||||
bounds_ts_packets.push_back(p);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}));
|
||||
MP_ASSERT_OK(graph.StartRun({}));
|
||||
MP_ASSERT_OK(graph.WaitUntilIdle());
|
||||
@@ -1129,7 +1129,7 @@ TEST(CalculatorGraphBoundsTest, BoundsForEmptyInputs_SyncSets) {
|
||||
// A Calculator that produces a packet for each timestamp bounds update.
|
||||
class ProcessBoundToPacketCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
for (int i = 0; i < cc->Inputs().NumEntries(); ++i) {
|
||||
cc->Inputs().Index(i).SetAny();
|
||||
}
|
||||
@@ -1138,10 +1138,10 @@ class ProcessBoundToPacketCalculator : public CalculatorBase {
|
||||
}
|
||||
cc->SetInputStreamHandler("ImmediateInputStreamHandler");
|
||||
cc->SetProcessTimestampBounds(true);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
for (int i = 0; i < cc->Outputs().NumEntries(); ++i) {
|
||||
Timestamp t = cc->Inputs().Index(i).Value().Timestamp();
|
||||
// Create a new packet for each input stream with a new timestamp bound,
|
||||
@@ -1151,7 +1151,7 @@ class ProcessBoundToPacketCalculator : public CalculatorBase {
|
||||
cc->Outputs().Index(i).Add(new auto(t), t);
|
||||
}
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
};
|
||||
REGISTER_CALCULATOR(ProcessBoundToPacketCalculator);
|
||||
@@ -1159,7 +1159,7 @@ REGISTER_CALCULATOR(ProcessBoundToPacketCalculator);
|
||||
// A Calculator that passes through each packet and timestamp immediately.
|
||||
class ImmediatePassthroughCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
for (int i = 0; i < cc->Inputs().NumEntries(); ++i) {
|
||||
cc->Inputs().Index(i).SetAny();
|
||||
}
|
||||
@@ -1168,10 +1168,10 @@ class ImmediatePassthroughCalculator : public CalculatorBase {
|
||||
}
|
||||
cc->SetInputStreamHandler("ImmediateInputStreamHandler");
|
||||
cc->SetProcessTimestampBounds(true);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
for (int i = 0; i < cc->Outputs().NumEntries(); ++i) {
|
||||
if (!cc->Inputs().Index(i).IsEmpty()) {
|
||||
cc->Outputs().Index(i).AddPacket(cc->Inputs().Index(i).Value());
|
||||
@@ -1185,7 +1185,7 @@ class ImmediatePassthroughCalculator : public CalculatorBase {
|
||||
}
|
||||
}
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
};
|
||||
REGISTER_CALCULATOR(ImmediatePassthroughCalculator);
|
||||
@@ -1217,14 +1217,14 @@ void TestProcessForEmptyInputs(const std::string& input_stream_handler) {
|
||||
absl::StrReplaceAll({{"$input_stream_handler", input_stream_handler}},
|
||||
&config_str);
|
||||
CalculatorGraphConfig config =
|
||||
::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(config_str);
|
||||
mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(config_str);
|
||||
CalculatorGraph graph;
|
||||
std::vector<Packet> input_ts_packets;
|
||||
std::vector<Packet> bounds_ts_packets;
|
||||
MP_ASSERT_OK(graph.Initialize(config));
|
||||
MP_ASSERT_OK(graph.ObserveOutputStream("bounds_ts", [&](const Packet& p) {
|
||||
bounds_ts_packets.push_back(p);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}));
|
||||
MP_ASSERT_OK(graph.StartRun({}));
|
||||
MP_ASSERT_OK(graph.WaitUntilIdle());
|
||||
@@ -1317,18 +1317,18 @@ TEST(CalculatorGraphBoundsTest, ProcessTimestampBounds_Passthrough) {
|
||||
}
|
||||
)";
|
||||
CalculatorGraphConfig config =
|
||||
::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(config_str);
|
||||
mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(config_str);
|
||||
CalculatorGraph graph;
|
||||
std::vector<Packet> output_0_packets;
|
||||
std::vector<Packet> output_1_packets;
|
||||
MP_ASSERT_OK(graph.Initialize(config));
|
||||
MP_ASSERT_OK(graph.ObserveOutputStream("output_0", [&](const Packet& p) {
|
||||
output_0_packets.push_back(p);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}));
|
||||
MP_ASSERT_OK(graph.ObserveOutputStream("output_1", [&](const Packet& p) {
|
||||
output_1_packets.push_back(p);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}));
|
||||
MP_ASSERT_OK(graph.StartRun({}));
|
||||
MP_ASSERT_OK(graph.WaitUntilIdle());
|
||||
@@ -1378,20 +1378,20 @@ TEST(CalculatorGraphBoundsTest, ProcessTimestampBounds_Passthrough) {
|
||||
// A Calculator that sends a timestamp bound for every other input.
|
||||
class OccasionalBoundCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
cc->Inputs().Index(0).Set<int>();
|
||||
cc->Outputs().Index(0).SetSameAs(&cc->Inputs().Index(0));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
absl::SleepFor(absl::Milliseconds(1));
|
||||
if (cc->InputTimestamp().Value() % 20 == 0) {
|
||||
Timestamp bound = cc->InputTimestamp().NextAllowedInStream();
|
||||
cc->Outputs().Index(0).SetNextTimestampBound(
|
||||
std::max(bound, cc->Outputs().Index(0).NextTimestampBound()));
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
};
|
||||
REGISTER_CALCULATOR(OccasionalBoundCalculator);
|
||||
@@ -1413,13 +1413,13 @@ TEST(CalculatorGraphBoundsTest, MaxInFlightWithOccasionalBound) {
|
||||
num_threads: 4
|
||||
)";
|
||||
CalculatorGraphConfig config =
|
||||
::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(config_str);
|
||||
mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(config_str);
|
||||
CalculatorGraph graph;
|
||||
std::vector<Packet> output_0_packets;
|
||||
MP_ASSERT_OK(graph.Initialize(config));
|
||||
MP_ASSERT_OK(graph.ObserveOutputStream("output_0", [&](const Packet& p) {
|
||||
output_0_packets.push_back(p);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}));
|
||||
MP_ASSERT_OK(graph.StartRun({}));
|
||||
MP_ASSERT_OK(graph.WaitUntilIdle());
|
||||
@@ -1443,20 +1443,20 @@ TEST(CalculatorGraphBoundsTest, MaxInFlightWithOccasionalBound) {
|
||||
// A Calculator that uses both SetTimestampOffset and SetNextTimestampBound.
|
||||
class OffsetAndBoundCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
cc->Inputs().Index(0).Set<int>();
|
||||
cc->Outputs().Index(0).SetSameAs(&cc->Inputs().Index(0));
|
||||
cc->SetTimestampOffset(TimestampDiff(0));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
::mediapipe::Status Open(CalculatorContext* cc) final {
|
||||
return ::mediapipe::OkStatus();
|
||||
mediapipe::Status Open(CalculatorContext* cc) final {
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
::mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
if (cc->InputTimestamp().Value() % 20 == 0) {
|
||||
cc->Outputs().Index(0).SetNextTimestampBound(Timestamp(10000));
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
};
|
||||
REGISTER_CALCULATOR(OffsetAndBoundCalculator);
|
||||
@@ -1475,13 +1475,13 @@ TEST(CalculatorGraphBoundsTest, OffsetAndBound) {
|
||||
}
|
||||
)";
|
||||
CalculatorGraphConfig config =
|
||||
::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(config_str);
|
||||
mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(config_str);
|
||||
CalculatorGraph graph;
|
||||
std::vector<Packet> output_0_packets;
|
||||
MP_ASSERT_OK(graph.Initialize(config));
|
||||
MP_ASSERT_OK(graph.ObserveOutputStream("output_0", [&](const Packet& p) {
|
||||
output_0_packets.push_back(p);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}));
|
||||
MP_ASSERT_OK(graph.StartRun({}));
|
||||
MP_ASSERT_OK(graph.WaitUntilIdle());
|
||||
|
||||
@@ -53,25 +53,25 @@ class CalculatorGraphEventLoopTest : public testing::Test {
|
||||
// testing.
|
||||
class BlockingPassThroughCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
cc->Inputs().Index(0).SetAny();
|
||||
cc->Outputs().Index(0).SetSameAs(&cc->Inputs().Index(0));
|
||||
cc->InputSidePackets().Index(0).Set<std::unique_ptr<absl::Mutex>>();
|
||||
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Open(CalculatorContext* cc) final {
|
||||
mediapipe::Status Open(CalculatorContext* cc) final {
|
||||
mutex_ = GetFromUniquePtr<absl::Mutex>(cc->InputSidePackets().Index(0));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
mutex_->Lock();
|
||||
cc->Outputs().Index(0).AddPacket(
|
||||
cc->Inputs().Index(0).Value().At(cc->InputTimestamp()));
|
||||
mutex_->Unlock();
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -87,15 +87,15 @@ struct SimpleHeader {
|
||||
|
||||
class UsingHeaderCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
cc->Inputs().Index(0).SetAny();
|
||||
cc->Outputs().Index(0).SetSameAs(&cc->Inputs().Index(0));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Open(CalculatorContext* cc) final {
|
||||
mediapipe::Status Open(CalculatorContext* cc) final {
|
||||
if (cc->Inputs().Index(0).Header().IsEmpty()) {
|
||||
return ::mediapipe::UnknownError("No stream header present.");
|
||||
return mediapipe::UnknownError("No stream header present.");
|
||||
}
|
||||
|
||||
const SimpleHeader& header =
|
||||
@@ -105,13 +105,13 @@ class UsingHeaderCalculator : public CalculatorBase {
|
||||
output_header->height = header.height;
|
||||
|
||||
cc->Outputs().Index(0).SetHeader(Adopt(output_header.release()));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
cc->Outputs().Index(0).AddPacket(
|
||||
cc->Inputs().Index(0).Value().At(cc->InputTimestamp()));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
};
|
||||
REGISTER_CALCULATOR(UsingHeaderCalculator);
|
||||
@@ -187,21 +187,21 @@ TEST_F(CalculatorGraphEventLoopTest, WellProvisionedEventLoop) {
|
||||
// Pass-Through calculator that fails upon receiving the 10th packet.
|
||||
class FailingPassThroughCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
cc->Inputs().Index(0).SetAny();
|
||||
cc->Outputs().Index(0).SetSameAs(&cc->Inputs().Index(0));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
Timestamp timestamp = cc->InputTimestamp();
|
||||
if (timestamp.Value() == 9) {
|
||||
return ::mediapipe::UnknownError(
|
||||
return mediapipe::UnknownError(
|
||||
"Meant to fail (magicstringincludedhere).");
|
||||
}
|
||||
cc->Outputs().Index(0).AddPacket(
|
||||
cc->Inputs().Index(0).Value().At(timestamp));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
};
|
||||
REGISTER_CALCULATOR(FailingPassThroughCalculator);
|
||||
@@ -231,7 +231,7 @@ TEST_F(CalculatorGraphEventLoopTest, FailingEventLoop) {
|
||||
this, std::placeholders::_1))}}));
|
||||
|
||||
// Insert packets.
|
||||
::mediapipe::Status status;
|
||||
mediapipe::Status status;
|
||||
for (int i = 0; true; ++i) {
|
||||
status = graph.AddPacketToInputStream("input_numbers",
|
||||
Adopt(new int(i)).At(Timestamp(i)));
|
||||
@@ -315,10 +315,10 @@ TEST_F(CalculatorGraphEventLoopTest, SetStreamHeader) {
|
||||
&CalculatorGraphEventLoopTest::AddThreadSafeVectorSink,
|
||||
this, std::placeholders::_1))}}));
|
||||
|
||||
::mediapipe::Status status = graph.WaitUntilIdle();
|
||||
mediapipe::Status status = graph.WaitUntilIdle();
|
||||
// Expect to fail if header not set.
|
||||
ASSERT_FALSE(status.ok());
|
||||
EXPECT_EQ(status.code(), ::mediapipe::StatusCode::kUnknown);
|
||||
EXPECT_EQ(status.code(), mediapipe::StatusCode::kUnknown);
|
||||
EXPECT_THAT(status.message(),
|
||||
testing::HasSubstr("No stream header present."));
|
||||
|
||||
@@ -387,7 +387,7 @@ TEST_F(CalculatorGraphEventLoopTest, TryToAddPacketToInputStream) {
|
||||
// mechanism could be off by 1 at most due to the order of acquisition of
|
||||
// locks.
|
||||
for (int i = 0; i < kNumInputPackets; ++i) {
|
||||
::mediapipe::Status status = graph.AddPacketToInputStream(
|
||||
mediapipe::Status status = graph.AddPacketToInputStream(
|
||||
"input_numbers", Adopt(new int(i)).At(Timestamp(i)));
|
||||
if (!status.ok()) {
|
||||
++fail_count;
|
||||
@@ -472,7 +472,7 @@ TEST_F(CalculatorGraphEventLoopTest, ThrottleGraphInputStreamTwice) {
|
||||
// Lock the mutex so that the BlockingPassThroughCalculator cannot read any
|
||||
// of these packets.
|
||||
mutex->Lock();
|
||||
::mediapipe::Status status = ::mediapipe::OkStatus();
|
||||
mediapipe::Status status = mediapipe::OkStatus();
|
||||
for (int i = 0; i < 10; ++i) {
|
||||
status = graph.AddPacketToInputStream("input_numbers",
|
||||
Adopt(new int(i)).At(Timestamp(i)));
|
||||
@@ -482,7 +482,7 @@ TEST_F(CalculatorGraphEventLoopTest, ThrottleGraphInputStreamTwice) {
|
||||
}
|
||||
mutex->Unlock();
|
||||
ASSERT_FALSE(status.ok());
|
||||
EXPECT_EQ(status.code(), ::mediapipe::StatusCode::kUnavailable);
|
||||
EXPECT_EQ(status.code(), mediapipe::StatusCode::kUnavailable);
|
||||
EXPECT_THAT(status.message(), testing::HasSubstr("Graph is throttled."));
|
||||
MP_ASSERT_OK(graph.CloseInputStream("input_numbers"));
|
||||
MP_ASSERT_OK(graph.WaitUntilDone());
|
||||
@@ -523,7 +523,7 @@ TEST_F(CalculatorGraphEventLoopTest, WaitToAddPacketToInputStream) {
|
||||
// All of these packets should be accepted by the graph.
|
||||
int fail_count = 0;
|
||||
for (int i = 0; i < kNumInputPackets; ++i) {
|
||||
::mediapipe::Status status = graph.AddPacketToInputStream(
|
||||
mediapipe::Status status = graph.AddPacketToInputStream(
|
||||
"input_numbers", Adopt(new int(i)).At(Timestamp(i)));
|
||||
if (!status.ok()) {
|
||||
++fail_count;
|
||||
|
||||
@@ -38,16 +38,16 @@ namespace {
|
||||
// output side packet.
|
||||
class OutputSidePacketInProcessCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
cc->Inputs().Index(0).SetAny();
|
||||
cc->OutputSidePackets().Index(0).SetSameAs(&cc->Inputs().Index(0));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
cc->OutputSidePackets().Index(0).Set(
|
||||
cc->Inputs().Index(0).Value().At(Timestamp::Unset()));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
};
|
||||
REGISTER_CALCULATOR(OutputSidePacketInProcessCalculator);
|
||||
@@ -56,22 +56,22 @@ REGISTER_CALCULATOR(OutputSidePacketInProcessCalculator);
|
||||
// receives. Outputs the total number of packets as a side packet in Close.
|
||||
class CountAndOutputSummarySidePacketInCloseCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
cc->Inputs().Index(0).SetAny();
|
||||
cc->OutputSidePackets().Index(0).Set<int>();
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
++count_;
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Close(CalculatorContext* cc) final {
|
||||
mediapipe::Status Close(CalculatorContext* cc) final {
|
||||
absl::SleepFor(absl::Milliseconds(300)); // For GetOutputSidePacket test.
|
||||
cc->OutputSidePackets().Index(0).Set(
|
||||
MakePacket<int>(count_).At(Timestamp::Unset()));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
int count_ = 0;
|
||||
@@ -82,15 +82,15 @@ REGISTER_CALCULATOR(CountAndOutputSummarySidePacketInCloseCalculator);
|
||||
// output side packet. This triggers an error in the graph.
|
||||
class OutputSidePacketWithTimestampCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
cc->Inputs().Index(0).SetAny();
|
||||
cc->OutputSidePackets().Index(0).SetSameAs(&cc->Inputs().Index(0));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
cc->OutputSidePackets().Index(0).Set(cc->Inputs().Index(0).Value());
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
};
|
||||
REGISTER_CALCULATOR(OutputSidePacketWithTimestampCalculator);
|
||||
@@ -98,19 +98,19 @@ REGISTER_CALCULATOR(OutputSidePacketWithTimestampCalculator);
|
||||
// Generates an output side packet containing the integer 1.
|
||||
class IntegerOutputSidePacketCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
cc->OutputSidePackets().Index(0).Set<int>();
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Open(CalculatorContext* cc) final {
|
||||
mediapipe::Status Open(CalculatorContext* cc) final {
|
||||
cc->OutputSidePackets().Index(0).Set(MakePacket<int>(1));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
LOG(FATAL) << "Not reached.";
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
};
|
||||
REGISTER_CALCULATOR(IntegerOutputSidePacketCalculator);
|
||||
@@ -119,23 +119,23 @@ REGISTER_CALCULATOR(IntegerOutputSidePacketCalculator);
|
||||
// side packets.
|
||||
class SidePacketAdderCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
cc->InputSidePackets().Index(0).Set<int>();
|
||||
cc->InputSidePackets().Index(1).Set<int>();
|
||||
cc->OutputSidePackets().Index(0).Set<int>();
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Open(CalculatorContext* cc) final {
|
||||
mediapipe::Status Open(CalculatorContext* cc) final {
|
||||
cc->OutputSidePackets().Index(0).Set(
|
||||
MakePacket<int>(cc->InputSidePackets().Index(1).Get<int>() +
|
||||
cc->InputSidePackets().Index(0).Get<int>()));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
LOG(FATAL) << "Not reached.";
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
};
|
||||
REGISTER_CALCULATOR(SidePacketAdderCalculator);
|
||||
@@ -144,21 +144,21 @@ REGISTER_CALCULATOR(SidePacketAdderCalculator);
|
||||
// input side packet.
|
||||
class SidePacketToStreamPacketCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
cc->InputSidePackets().Index(0).SetAny();
|
||||
cc->Outputs().Index(0).SetSameAs(&cc->InputSidePackets().Index(0));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Open(CalculatorContext* cc) final {
|
||||
mediapipe::Status Open(CalculatorContext* cc) final {
|
||||
cc->Outputs().Index(0).AddPacket(
|
||||
cc->InputSidePackets().Index(0).At(Timestamp::PostStream()));
|
||||
cc->Outputs().Index(0).Close();
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
return ::mediapipe::tool::StatusStop();
|
||||
mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
return mediapipe::tool::StatusStop();
|
||||
}
|
||||
};
|
||||
REGISTER_CALCULATOR(SidePacketToStreamPacketCalculator);
|
||||
@@ -166,18 +166,18 @@ REGISTER_CALCULATOR(SidePacketToStreamPacketCalculator);
|
||||
// Packet generator for an arbitrary unit64 packet.
|
||||
class Uint64PacketGenerator : public PacketGenerator {
|
||||
public:
|
||||
static ::mediapipe::Status FillExpectations(
|
||||
static mediapipe::Status FillExpectations(
|
||||
const PacketGeneratorOptions& extendable_options,
|
||||
PacketTypeSet* input_side_packets, PacketTypeSet* output_side_packets) {
|
||||
output_side_packets->Index(0).Set<uint64>();
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
static ::mediapipe::Status Generate(
|
||||
static mediapipe::Status Generate(
|
||||
const PacketGeneratorOptions& extendable_options,
|
||||
const PacketSet& input_side_packets, PacketSet* output_side_packets) {
|
||||
output_side_packets->Index(0) = Adopt(new uint64(15LL << 32 | 5));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
};
|
||||
REGISTER_PACKET_GENERATOR(Uint64PacketGenerator);
|
||||
@@ -185,7 +185,7 @@ REGISTER_PACKET_GENERATOR(Uint64PacketGenerator);
|
||||
TEST(CalculatorGraph, OutputSidePacketInProcess) {
|
||||
const int64 offset = 100;
|
||||
CalculatorGraphConfig config =
|
||||
::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
input_stream: "offset"
|
||||
node {
|
||||
calculator: "OutputSidePacketInProcessCalculator"
|
||||
@@ -204,7 +204,7 @@ TEST(CalculatorGraph, OutputSidePacketInProcess) {
|
||||
MP_ASSERT_OK(graph.ObserveOutputStream(
|
||||
"output", [&output_packets](const Packet& packet) {
|
||||
output_packets.push_back(packet);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}));
|
||||
|
||||
// Run the graph twice.
|
||||
@@ -226,11 +226,11 @@ TEST(CalculatorGraph, OutputSidePacketInProcess) {
|
||||
// also be ignored.
|
||||
class PassThroughGenerator : public PacketGenerator {
|
||||
public:
|
||||
static ::mediapipe::Status FillExpectations(
|
||||
static mediapipe::Status FillExpectations(
|
||||
const PacketGeneratorOptions& extendable_options, PacketTypeSet* inputs,
|
||||
PacketTypeSet* outputs) {
|
||||
if (!inputs->TagMap()->SameAs(*outputs->TagMap())) {
|
||||
return ::mediapipe::InvalidArgumentError(
|
||||
return mediapipe::InvalidArgumentError(
|
||||
"Input and outputs to PassThroughGenerator must use the same tags "
|
||||
"and indexes.");
|
||||
}
|
||||
@@ -238,24 +238,24 @@ class PassThroughGenerator : public PacketGenerator {
|
||||
inputs->Get(id).SetAny();
|
||||
outputs->Get(id).SetSameAs(&inputs->Get(id));
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
static ::mediapipe::Status Generate(
|
||||
static mediapipe::Status Generate(
|
||||
const PacketGeneratorOptions& extendable_options,
|
||||
const PacketSet& input_side_packets, PacketSet* output_side_packets) {
|
||||
for (CollectionItemId id = input_side_packets.BeginId();
|
||||
id < input_side_packets.EndId(); ++id) {
|
||||
output_side_packets->Get(id) = input_side_packets.Get(id);
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
};
|
||||
REGISTER_PACKET_GENERATOR(PassThroughGenerator);
|
||||
|
||||
TEST(CalculatorGraph, SharePacketGeneratorGraph) {
|
||||
CalculatorGraphConfig config =
|
||||
::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
node {
|
||||
calculator: 'CountingSourceCalculator'
|
||||
output_stream: 'count1'
|
||||
@@ -383,7 +383,7 @@ TEST(CalculatorGraph, SharePacketGeneratorGraph) {
|
||||
TEST(CalculatorGraph, OutputSidePacketAlreadySet) {
|
||||
const int64 offset = 100;
|
||||
CalculatorGraphConfig config =
|
||||
::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
input_stream: "offset"
|
||||
node {
|
||||
calculator: "OutputSidePacketInProcessCalculator"
|
||||
@@ -402,15 +402,15 @@ TEST(CalculatorGraph, OutputSidePacketAlreadySet) {
|
||||
"offset", MakePacket<TimestampDiff>(offset).At(Timestamp(1))));
|
||||
MP_ASSERT_OK(graph.CloseInputStream("offset"));
|
||||
|
||||
::mediapipe::Status status = graph.WaitUntilDone();
|
||||
EXPECT_EQ(status.code(), ::mediapipe::StatusCode::kAlreadyExists);
|
||||
mediapipe::Status status = graph.WaitUntilDone();
|
||||
EXPECT_EQ(status.code(), mediapipe::StatusCode::kAlreadyExists);
|
||||
EXPECT_THAT(status.message(), testing::HasSubstr("was already set."));
|
||||
}
|
||||
|
||||
TEST(CalculatorGraph, OutputSidePacketWithTimestamp) {
|
||||
const int64 offset = 100;
|
||||
CalculatorGraphConfig config =
|
||||
::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
input_stream: "offset"
|
||||
node {
|
||||
calculator: "OutputSidePacketWithTimestampCalculator"
|
||||
@@ -428,15 +428,15 @@ TEST(CalculatorGraph, OutputSidePacketWithTimestamp) {
|
||||
MP_ASSERT_OK(graph.AddPacketToInputStream(
|
||||
"offset", MakePacket<TimestampDiff>(offset).At(Timestamp(237))));
|
||||
MP_ASSERT_OK(graph.CloseInputStream("offset"));
|
||||
::mediapipe::Status status = graph.WaitUntilDone();
|
||||
EXPECT_EQ(status.code(), ::mediapipe::StatusCode::kInvalidArgument);
|
||||
mediapipe::Status status = graph.WaitUntilDone();
|
||||
EXPECT_EQ(status.code(), mediapipe::StatusCode::kInvalidArgument);
|
||||
EXPECT_THAT(status.message(), testing::HasSubstr("has a timestamp 237."));
|
||||
}
|
||||
|
||||
TEST(CalculatorGraph, OutputSidePacketConsumedBySourceNode) {
|
||||
const int max_count = 10;
|
||||
CalculatorGraphConfig config =
|
||||
::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
input_stream: "max_count"
|
||||
node {
|
||||
calculator: "OutputSidePacketInProcessCalculator"
|
||||
@@ -460,7 +460,7 @@ TEST(CalculatorGraph, OutputSidePacketConsumedBySourceNode) {
|
||||
MP_ASSERT_OK(graph.ObserveOutputStream(
|
||||
"output", [&output_packets](const Packet& packet) {
|
||||
output_packets.push_back(packet);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}));
|
||||
MP_ASSERT_OK(graph.StartRun({}));
|
||||
// Wait until the graph is idle so that
|
||||
@@ -486,19 +486,19 @@ class FirstPacketFilterCalculator : public CalculatorBase {
|
||||
FirstPacketFilterCalculator() {}
|
||||
~FirstPacketFilterCalculator() override {}
|
||||
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
cc->Inputs().Index(0).SetAny();
|
||||
cc->Outputs().Index(0).SetSameAs(&cc->Inputs().Index(0));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Process(CalculatorContext* cc) override {
|
||||
mediapipe::Status Process(CalculatorContext* cc) override {
|
||||
if (!seen_first_packet_) {
|
||||
cc->Outputs().Index(0).AddPacket(cc->Inputs().Index(0).Value());
|
||||
cc->Outputs().Index(0).Close();
|
||||
seen_first_packet_ = true;
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -529,7 +529,7 @@ TEST(CalculatorGraph, SourceLayerInversion) {
|
||||
// Set num_threads to 1 to force sequential execution for deterministic
|
||||
// outputs.
|
||||
CalculatorGraphConfig config =
|
||||
::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
num_threads: 1
|
||||
node {
|
||||
calculator: "CountingSourceCalculator"
|
||||
@@ -568,8 +568,8 @@ TEST(CalculatorGraph, SourceLayerInversion) {
|
||||
MP_ASSERT_OK(graph.Initialize(
|
||||
config, {{"max_count", MakePacket<int>(max_count)},
|
||||
{"initial_value1", MakePacket<int>(initial_value1)}}));
|
||||
::mediapipe::Status status = graph.Run();
|
||||
EXPECT_EQ(status.code(), ::mediapipe::StatusCode::kUnknown);
|
||||
mediapipe::Status status = graph.Run();
|
||||
EXPECT_EQ(status.code(), mediapipe::StatusCode::kUnknown);
|
||||
EXPECT_THAT(status.message(), testing::HasSubstr("deadlock"));
|
||||
}
|
||||
|
||||
@@ -577,7 +577,7 @@ TEST(CalculatorGraph, SourceLayerInversion) {
|
||||
// streams and no output streams.
|
||||
TEST(CalculatorGraph, PacketGeneratorLikeCalculators) {
|
||||
CalculatorGraphConfig config =
|
||||
::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
node {
|
||||
calculator: "IntegerOutputSidePacketCalculator"
|
||||
output_side_packet: "one"
|
||||
@@ -614,7 +614,7 @@ TEST(CalculatorGraph, PacketGeneratorLikeCalculators) {
|
||||
MP_ASSERT_OK(graph.ObserveOutputStream(
|
||||
"output", [&output_packets](const Packet& packet) {
|
||||
output_packets.push_back(packet);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}));
|
||||
MP_ASSERT_OK(graph.Run());
|
||||
ASSERT_EQ(1, output_packets.size());
|
||||
@@ -624,7 +624,7 @@ TEST(CalculatorGraph, PacketGeneratorLikeCalculators) {
|
||||
|
||||
TEST(CalculatorGraph, OutputSummarySidePacketInClose) {
|
||||
CalculatorGraphConfig config =
|
||||
::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
input_stream: "input_packets"
|
||||
node {
|
||||
calculator: "CountAndOutputSummarySidePacketInCloseCalculator"
|
||||
@@ -643,7 +643,7 @@ TEST(CalculatorGraph, OutputSummarySidePacketInClose) {
|
||||
MP_ASSERT_OK(graph.ObserveOutputStream(
|
||||
"output", [&output_packets](const Packet& packet) {
|
||||
output_packets.push_back(packet);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}));
|
||||
|
||||
// Run the graph twice.
|
||||
@@ -665,7 +665,7 @@ TEST(CalculatorGraph, OutputSummarySidePacketInClose) {
|
||||
|
||||
TEST(CalculatorGraph, GetOutputSidePacket) {
|
||||
CalculatorGraphConfig config =
|
||||
::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
input_stream: "input_packets"
|
||||
node {
|
||||
calculator: "CountAndOutputSummarySidePacketInCloseCalculator"
|
||||
@@ -686,14 +686,14 @@ TEST(CalculatorGraph, GetOutputSidePacket) {
|
||||
MP_ASSERT_OK(graph.Initialize(config));
|
||||
// Check a packet generated by the PacketGenerator, which is available after
|
||||
// graph initialization, can be fetched before graph starts.
|
||||
::mediapipe::StatusOr<Packet> status_or_packet =
|
||||
mediapipe::StatusOr<Packet> status_or_packet =
|
||||
graph.GetOutputSidePacket("output_uint64");
|
||||
MP_ASSERT_OK(status_or_packet);
|
||||
EXPECT_EQ(Timestamp::Unset(), status_or_packet.ValueOrDie().Timestamp());
|
||||
// IntSplitterPacketGenerator is missing its input side packet and we
|
||||
// won't be able to get its output side packet now.
|
||||
status_or_packet = graph.GetOutputSidePacket("output_uint32_pair");
|
||||
EXPECT_EQ(::mediapipe::StatusCode::kUnavailable,
|
||||
EXPECT_EQ(mediapipe::StatusCode::kUnavailable,
|
||||
status_or_packet.status().code());
|
||||
// Run the graph twice.
|
||||
int max_count = 100;
|
||||
@@ -713,13 +713,13 @@ TEST(CalculatorGraph, GetOutputSidePacket) {
|
||||
// Should return NOT_FOUND for invalid side packets.
|
||||
status_or_packet = graph.GetOutputSidePacket("unknown");
|
||||
EXPECT_FALSE(status_or_packet.ok());
|
||||
EXPECT_EQ(::mediapipe::StatusCode::kNotFound,
|
||||
EXPECT_EQ(mediapipe::StatusCode::kNotFound,
|
||||
status_or_packet.status().code());
|
||||
// Should return UNAVAILABLE before graph is done for valid non-base
|
||||
// packets.
|
||||
status_or_packet = graph.GetOutputSidePacket("num_of_packets");
|
||||
EXPECT_FALSE(status_or_packet.ok());
|
||||
EXPECT_EQ(::mediapipe::StatusCode::kUnavailable,
|
||||
EXPECT_EQ(mediapipe::StatusCode::kUnavailable,
|
||||
status_or_packet.status().code());
|
||||
// Should stil return a base even before graph is done.
|
||||
status_or_packet = graph.GetOutputSidePacket("output_uint64");
|
||||
@@ -749,20 +749,20 @@ typedef std::string HugeModel;
|
||||
// Generates an output-side-packet once for each calculator-graph.
|
||||
class OutputSidePacketCachedCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
cc->OutputSidePackets().Index(0).Set<HugeModel>();
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Open(CalculatorContext* cc) final {
|
||||
mediapipe::Status Open(CalculatorContext* cc) final {
|
||||
cc->OutputSidePackets().Index(0).Set(MakePacket<HugeModel>(
|
||||
R"(An expensive side-packet created only once per graph)"));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
LOG(FATAL) << "Not reached.";
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
};
|
||||
REGISTER_CALCULATOR(OutputSidePacketCachedCalculator);
|
||||
@@ -774,7 +774,7 @@ bool Equals(Packet p1, Packet p2) {
|
||||
|
||||
TEST(CalculatorGraph, OutputSidePacketCached) {
|
||||
CalculatorGraphConfig config =
|
||||
::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
node {
|
||||
calculator: "OutputSidePacketCachedCalculator"
|
||||
output_side_packet: "model"
|
||||
@@ -791,7 +791,7 @@ TEST(CalculatorGraph, OutputSidePacketCached) {
|
||||
MP_ASSERT_OK(graph.ObserveOutputStream(
|
||||
"output", [&output_packets](const Packet& packet) {
|
||||
output_packets.push_back(packet);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}));
|
||||
|
||||
// Run the graph three times.
|
||||
|
||||
@@ -34,39 +34,39 @@
|
||||
namespace mediapipe {}
|
||||
|
||||
namespace testing_ns {
|
||||
using ::mediapipe::CalculatorBase;
|
||||
using ::mediapipe::CalculatorContext;
|
||||
using ::mediapipe::CalculatorContract;
|
||||
using ::mediapipe::CalculatorGraphConfig;
|
||||
using ::mediapipe::GetFromUniquePtr;
|
||||
using ::mediapipe::InputStreamShardSet;
|
||||
using ::mediapipe::MakePacket;
|
||||
using ::mediapipe::OutputStreamShardSet;
|
||||
using ::mediapipe::Timestamp;
|
||||
namespace proto_ns = ::mediapipe::proto_ns;
|
||||
using ::mediapipe::CalculatorGraph;
|
||||
using ::mediapipe::Packet;
|
||||
using mediapipe::CalculatorBase;
|
||||
using mediapipe::CalculatorContext;
|
||||
using mediapipe::CalculatorContract;
|
||||
using mediapipe::CalculatorGraphConfig;
|
||||
using mediapipe::GetFromUniquePtr;
|
||||
using mediapipe::InputStreamShardSet;
|
||||
using mediapipe::MakePacket;
|
||||
using mediapipe::OutputStreamShardSet;
|
||||
using mediapipe::Timestamp;
|
||||
namespace proto_ns = mediapipe::proto_ns;
|
||||
using mediapipe::CalculatorGraph;
|
||||
using mediapipe::Packet;
|
||||
|
||||
class InfiniteSequenceCalculator : public mediapipe::CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(mediapipe::CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(mediapipe::CalculatorContract* cc) {
|
||||
cc->Outputs().Tag("OUT").Set<int>();
|
||||
cc->Outputs().Tag("EVENT").Set<int>();
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
::mediapipe::Status Open(CalculatorContext* cc) override {
|
||||
mediapipe::Status Open(CalculatorContext* cc) override {
|
||||
cc->Outputs().Tag("EVENT").AddPacket(MakePacket<int>(1).At(Timestamp(1)));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
::mediapipe::Status Process(CalculatorContext* cc) override {
|
||||
mediapipe::Status Process(CalculatorContext* cc) override {
|
||||
cc->Outputs().Tag("OUT").AddPacket(
|
||||
MakePacket<int>(count_).At(Timestamp(count_)));
|
||||
count_++;
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
::mediapipe::Status Close(CalculatorContext* cc) override {
|
||||
mediapipe::Status Close(CalculatorContext* cc) override {
|
||||
cc->Outputs().Tag("EVENT").AddPacket(MakePacket<int>(2).At(Timestamp(2)));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -76,30 +76,30 @@ REGISTER_CALCULATOR(::testing_ns::InfiniteSequenceCalculator);
|
||||
|
||||
class StoppingPassThroughCalculator : public mediapipe::CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
for (int i = 0; i < cc->Inputs().NumEntries(""); ++i) {
|
||||
cc->Inputs().Get("", i).SetAny();
|
||||
cc->Outputs().Get("", i).SetSameAs(&cc->Inputs().Get("", i));
|
||||
}
|
||||
cc->Outputs().Tag("EVENT").Set<int>();
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
::mediapipe::Status Open(CalculatorContext* cc) override {
|
||||
mediapipe::Status Open(CalculatorContext* cc) override {
|
||||
cc->Outputs().Tag("EVENT").AddPacket(MakePacket<int>(1).At(Timestamp(1)));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
::mediapipe::Status Process(CalculatorContext* cc) override {
|
||||
mediapipe::Status Process(CalculatorContext* cc) override {
|
||||
for (int i = 0; i < cc->Inputs().NumEntries(""); ++i) {
|
||||
if (!cc->Inputs().Get("", i).IsEmpty()) {
|
||||
cc->Outputs().Get("", i).AddPacket(cc->Inputs().Get("", i).Value());
|
||||
}
|
||||
}
|
||||
return (++count_ <= max_count_) ? ::mediapipe::OkStatus()
|
||||
: ::mediapipe::tool::StatusStop();
|
||||
return (++count_ <= max_count_) ? mediapipe::OkStatus()
|
||||
: mediapipe::tool::StatusStop();
|
||||
}
|
||||
::mediapipe::Status Close(CalculatorContext* cc) override {
|
||||
mediapipe::Status Close(CalculatorContext* cc) override {
|
||||
cc->Outputs().Tag("EVENT").AddPacket(MakePacket<int>(2).At(Timestamp(2)));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -124,39 +124,39 @@ class AtomicSemaphore {
|
||||
};
|
||||
|
||||
// A ProcessFunction that passes through all packets.
|
||||
::mediapipe::Status DoProcess(const InputStreamShardSet& inputs,
|
||||
OutputStreamShardSet* outputs) {
|
||||
mediapipe::Status DoProcess(const InputStreamShardSet& inputs,
|
||||
OutputStreamShardSet* outputs) {
|
||||
for (int i = 0; i < inputs.NumEntries(); ++i) {
|
||||
if (!inputs.Index(i).Value().IsEmpty()) {
|
||||
outputs->Index(i).AddPacket(inputs.Index(i).Value());
|
||||
}
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
typedef std::function<::mediapipe::Status(const InputStreamShardSet&,
|
||||
OutputStreamShardSet*)>
|
||||
typedef std::function<mediapipe::Status(const InputStreamShardSet&,
|
||||
OutputStreamShardSet*)>
|
||||
ProcessFunction;
|
||||
|
||||
// A Calculator that delegates its Process function to a callback function.
|
||||
class ProcessCallbackCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
for (int i = 0; i < cc->Inputs().NumEntries(); ++i) {
|
||||
cc->Inputs().Index(i).SetAny();
|
||||
cc->Outputs().Index(i).SetSameAs(&cc->Inputs().Index(0));
|
||||
}
|
||||
cc->InputSidePackets().Index(0).Set<std::unique_ptr<ProcessFunction>>();
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Open(CalculatorContext* cc) final {
|
||||
mediapipe::Status Open(CalculatorContext* cc) final {
|
||||
callback_ =
|
||||
*GetFromUniquePtr<ProcessFunction>(cc->InputSidePackets().Index(0));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
return callback_(cc->Inputs(), &(cc->Outputs()));
|
||||
}
|
||||
|
||||
@@ -202,22 +202,22 @@ TEST(CalculatorGraphStoppingTest, CloseAllPacketSources) {
|
||||
if (out_packets.size() >= kNumPackets) {
|
||||
MP_EXPECT_OK(graph.CloseAllPacketSources());
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}));
|
||||
MP_ASSERT_OK(graph.ObserveOutputStream( //
|
||||
"count_out", [&](const Packet& packet) {
|
||||
count_packets.push_back(packet);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}));
|
||||
MP_ASSERT_OK(graph.ObserveOutputStream( //
|
||||
"event", [&](const Packet& packet) {
|
||||
event_packets.push_back(packet.Get<int>());
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}));
|
||||
MP_ASSERT_OK(graph.ObserveOutputStream( //
|
||||
"event_out", [&](const Packet& packet) {
|
||||
event_out_packets.push_back(packet.Get<int>());
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}));
|
||||
MP_ASSERT_OK(graph.StartRun({}));
|
||||
for (int i = 0; i < kNumPackets; ++i) {
|
||||
@@ -261,7 +261,7 @@ TEST(CalculatorGraphStoppingTest, DeadlockReporting) {
|
||||
MP_ASSERT_OK(
|
||||
graph.ObserveOutputStream("out_1", [&out_packets](const Packet& packet) {
|
||||
out_packets.push_back(packet);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}));
|
||||
|
||||
// Lambda that waits for a local semaphore.
|
||||
@@ -289,8 +289,8 @@ TEST(CalculatorGraphStoppingTest, DeadlockReporting) {
|
||||
MP_EXPECT_OK(add_packet("in_1", 2));
|
||||
EXPECT_FALSE(add_packet("in_1", 3).ok());
|
||||
|
||||
::mediapipe::Status status = graph.WaitUntilIdle();
|
||||
EXPECT_EQ(status.code(), ::mediapipe::StatusCode::kUnavailable);
|
||||
mediapipe::Status status = graph.WaitUntilIdle();
|
||||
EXPECT_EQ(status.code(), mediapipe::StatusCode::kUnavailable);
|
||||
EXPECT_THAT(
|
||||
status.message(),
|
||||
testing::HasSubstr("Detected a deadlock due to input throttling"));
|
||||
@@ -326,7 +326,7 @@ TEST(CalculatorGraphStoppingTest, DeadlockResolution) {
|
||||
MP_ASSERT_OK(
|
||||
graph.ObserveOutputStream("out_1", [&out_packets](const Packet& packet) {
|
||||
out_packets.push_back(packet);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}));
|
||||
|
||||
// Lambda that waits for a local semaphore.
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -73,7 +73,7 @@ Timestamp CalculatorNode::SourceProcessOrder(
|
||||
return calculator_->SourceProcessOrder(cc);
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorNode::Initialize(
|
||||
mediapipe::Status CalculatorNode::Initialize(
|
||||
const ValidatedGraphConfig* validated_graph, int node_id,
|
||||
InputStreamManager* input_stream_managers,
|
||||
OutputStreamManager* output_stream_managers,
|
||||
@@ -159,7 +159,7 @@ Timestamp CalculatorNode::SourceProcessOrder(
|
||||
return InitializeInputStreams(input_stream_managers, output_stream_managers);
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorNode::InitializeOutputSidePackets(
|
||||
mediapipe::Status CalculatorNode::InitializeOutputSidePackets(
|
||||
const PacketTypeSet& output_side_packet_types,
|
||||
OutputSidePacketImpl* output_side_packets) {
|
||||
output_side_packets_ =
|
||||
@@ -173,10 +173,10 @@ Timestamp CalculatorNode::SourceProcessOrder(
|
||||
output_side_packets_->GetPtr(id) =
|
||||
&output_side_packets[base_index + id.value()];
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorNode::InitializeInputSidePackets(
|
||||
mediapipe::Status CalculatorNode::InitializeInputSidePackets(
|
||||
OutputSidePacketImpl* output_side_packets) {
|
||||
const NodeTypeInfo& node_type_info =
|
||||
validated_graph_->CalculatorInfos()[node_id_];
|
||||
@@ -201,10 +201,10 @@ Timestamp CalculatorNode::SourceProcessOrder(
|
||||
<< output_side_packet_index;
|
||||
origin_output_side_packet->AddMirror(&input_side_packet_handler_, id);
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorNode::InitializeOutputStreams(
|
||||
mediapipe::Status CalculatorNode::InitializeOutputStreams(
|
||||
OutputStreamManager* output_stream_managers) {
|
||||
RET_CHECK(output_stream_managers) << "output_stream_managers is NULL";
|
||||
const NodeTypeInfo& node_type_info =
|
||||
@@ -216,7 +216,7 @@ Timestamp CalculatorNode::SourceProcessOrder(
|
||||
current_output_stream_managers);
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorNode::InitializeInputStreams(
|
||||
mediapipe::Status CalculatorNode::InitializeInputStreams(
|
||||
InputStreamManager* input_stream_managers,
|
||||
OutputStreamManager* output_stream_managers) {
|
||||
RET_CHECK(input_stream_managers) << "input_stream_managers is NULL";
|
||||
@@ -247,10 +247,10 @@ Timestamp CalculatorNode::SourceProcessOrder(
|
||||
<< output_stream_index;
|
||||
origin_output_stream_manager->AddMirror(input_stream_handler_.get(), id);
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorNode::InitializeInputStreamHandler(
|
||||
mediapipe::Status CalculatorNode::InitializeInputStreamHandler(
|
||||
const InputStreamHandlerConfig& handler_config,
|
||||
const PacketTypeSet& input_stream_types) {
|
||||
const ProtoString& input_stream_handler_name =
|
||||
@@ -265,10 +265,10 @@ Timestamp CalculatorNode::SourceProcessOrder(
|
||||
_ << "\"" << input_stream_handler_name
|
||||
<< "\" is not a registered input stream handler.");
|
||||
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorNode::InitializeOutputStreamHandler(
|
||||
mediapipe::Status CalculatorNode::InitializeOutputStreamHandler(
|
||||
const OutputStreamHandlerConfig& handler_config,
|
||||
const PacketTypeSet& output_stream_types) {
|
||||
const ProtoString& output_stream_handler_name =
|
||||
@@ -282,10 +282,10 @@ Timestamp CalculatorNode::SourceProcessOrder(
|
||||
/*calculator_run_in_parallel=*/max_in_flight_ > 1),
|
||||
_ << "\"" << output_stream_handler_name
|
||||
<< "\" is not a registered output stream handler.");
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorNode::ConnectShardsToStreams(
|
||||
mediapipe::Status CalculatorNode::ConnectShardsToStreams(
|
||||
CalculatorContext* calculator_context) {
|
||||
RET_CHECK(calculator_context);
|
||||
MP_RETURN_IF_ERROR(
|
||||
@@ -325,13 +325,13 @@ void CalculatorNode::SetMaxInputStreamQueueSize(int max_queue_size) {
|
||||
input_stream_handler_->SetMaxQueueSize(max_queue_size);
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorNode::PrepareForRun(
|
||||
mediapipe::Status CalculatorNode::PrepareForRun(
|
||||
const std::map<std::string, Packet>& all_side_packets,
|
||||
const std::map<std::string, Packet>& service_packets,
|
||||
std::function<void()> ready_for_open_callback,
|
||||
std::function<void()> source_node_opened_callback,
|
||||
std::function<void(CalculatorContext*)> schedule_callback,
|
||||
std::function<void(::mediapipe::Status)> error_callback,
|
||||
std::function<void(mediapipe::Status)> error_callback,
|
||||
CounterFactory* counter_factory) {
|
||||
RET_CHECK(ready_for_open_callback) << "ready_for_open_callback is NULL";
|
||||
RET_CHECK(schedule_callback) << "schedule_callback is NULL";
|
||||
@@ -398,7 +398,7 @@ void CalculatorNode::SetMaxInputStreamQueueSize(int max_queue_size) {
|
||||
input_side_packets_ready_ =
|
||||
(input_side_packet_handler_.MissingInputSidePacketCount() == 0);
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
namespace {
|
||||
@@ -410,7 +410,7 @@ const Packet GetPacket(const OutputSidePacket& out) {
|
||||
}
|
||||
|
||||
// Resends the output-side-packets from the previous graph run.
|
||||
::mediapipe::Status ResendSidePackets(CalculatorContext* cc) {
|
||||
mediapipe::Status ResendSidePackets(CalculatorContext* cc) {
|
||||
auto& outs = cc->OutputSidePackets();
|
||||
for (CollectionItemId id = outs.BeginId(); id < outs.EndId(); ++id) {
|
||||
Packet packet = GetPacket(outs.Get(id));
|
||||
@@ -419,7 +419,7 @@ const Packet GetPacket(const OutputSidePacket& out) {
|
||||
outs.Get(id).Set(packet);
|
||||
}
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
} // namespace
|
||||
|
||||
@@ -433,7 +433,7 @@ bool CalculatorNode::OutputsAreConstant(CalculatorContext* cc) {
|
||||
return true;
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorNode::OpenNode() {
|
||||
mediapipe::Status CalculatorNode::OpenNode() {
|
||||
VLOG(2) << "CalculatorNode::OpenNode() for " << DebugName();
|
||||
|
||||
CalculatorContext* default_context =
|
||||
@@ -448,7 +448,7 @@ bool CalculatorNode::OutputsAreConstant(CalculatorContext* cc) {
|
||||
calculator_context_manager_.PushInputTimestampToContext(
|
||||
default_context, Timestamp::Unstarted());
|
||||
|
||||
::mediapipe::Status result;
|
||||
mediapipe::Status result;
|
||||
if (OutputsAreConstant(default_context)) {
|
||||
result = ResendSidePackets(default_context);
|
||||
} else {
|
||||
@@ -493,7 +493,7 @@ bool CalculatorNode::OutputsAreConstant(CalculatorContext* cc) {
|
||||
status_ = kStateOpened;
|
||||
}
|
||||
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
void CalculatorNode::ActivateNode() {
|
||||
@@ -527,8 +527,8 @@ void CalculatorNode::CloseOutputStreams(OutputStreamShardSet* outputs) {
|
||||
output_stream_handler_->Close(outputs);
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorNode::CloseNode(
|
||||
const ::mediapipe::Status& graph_status, bool graph_run_ended) {
|
||||
mediapipe::Status CalculatorNode::CloseNode(
|
||||
const mediapipe::Status& graph_status, bool graph_run_ended) {
|
||||
{
|
||||
absl::MutexLock status_lock(&status_mutex_);
|
||||
RET_CHECK_NE(status_, kStateClosed)
|
||||
@@ -548,11 +548,11 @@ void CalculatorNode::CloseOutputStreams(OutputStreamShardSet* outputs) {
|
||||
calculator_context_manager_.SetGraphStatusInContext(default_context,
|
||||
graph_status);
|
||||
|
||||
::mediapipe::Status result;
|
||||
mediapipe::Status result;
|
||||
|
||||
if (OutputsAreConstant(default_context)) {
|
||||
// Do nothing.
|
||||
result = ::mediapipe::OkStatus();
|
||||
result = mediapipe::OkStatus();
|
||||
} else {
|
||||
MEDIAPIPE_PROFILING(CLOSE, default_context);
|
||||
LegacyCalculatorSupport::Scoped<CalculatorContext> s(default_context);
|
||||
@@ -582,10 +582,10 @@ void CalculatorNode::CloseOutputStreams(OutputStreamShardSet* outputs) {
|
||||
"Calculator::Close() for node \"$0\" failed: ", DebugName());
|
||||
|
||||
VLOG(2) << "Closed node " << DebugName();
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
void CalculatorNode::CleanupAfterRun(const ::mediapipe::Status& graph_status) {
|
||||
void CalculatorNode::CleanupAfterRun(const mediapipe::Status& graph_status) {
|
||||
if (needs_to_close_) {
|
||||
calculator_context_manager_.PushInputTimestampToContext(
|
||||
calculator_context_manager_.GetDefaultCalculatorContext(),
|
||||
@@ -754,12 +754,12 @@ std::string CalculatorNode::DebugName() const {
|
||||
}
|
||||
|
||||
// TODO: Split this function.
|
||||
::mediapipe::Status CalculatorNode::ProcessNode(
|
||||
mediapipe::Status CalculatorNode::ProcessNode(
|
||||
CalculatorContext* calculator_context) {
|
||||
if (IsSource()) {
|
||||
// This is a source Calculator.
|
||||
if (Closed()) {
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
const Timestamp input_timestamp = calculator_context->InputTimestamp();
|
||||
@@ -768,7 +768,7 @@ std::string CalculatorNode::DebugName() const {
|
||||
output_stream_handler_->PrepareOutputs(input_timestamp, outputs);
|
||||
|
||||
VLOG(2) << "Calling Calculator::Process() for node: " << DebugName();
|
||||
::mediapipe::Status result;
|
||||
mediapipe::Status result;
|
||||
|
||||
{
|
||||
MEDIAPIPE_PROFILING(PROCESS, calculator_context);
|
||||
@@ -782,7 +782,7 @@ std::string CalculatorNode::DebugName() const {
|
||||
// Needs to call CloseNode().
|
||||
node_stopped = true;
|
||||
} else {
|
||||
return ::mediapipe::StatusBuilder(result, MEDIAPIPE_LOC).SetPrepend()
|
||||
return mediapipe::StatusBuilder(result, MEDIAPIPE_LOC).SetPrepend()
|
||||
<< absl::Substitute(
|
||||
"Calculator::Process() for node \"$0\" failed: ",
|
||||
DebugName());
|
||||
@@ -791,15 +791,15 @@ std::string CalculatorNode::DebugName() const {
|
||||
output_stream_handler_->PostProcess(input_timestamp);
|
||||
if (node_stopped) {
|
||||
MP_RETURN_IF_ERROR(
|
||||
CloseNode(::mediapipe::OkStatus(), /*graph_run_ended=*/false));
|
||||
CloseNode(mediapipe::OkStatus(), /*graph_run_ended=*/false));
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
} else {
|
||||
// This is not a source Calculator.
|
||||
InputStreamShardSet* const inputs = &calculator_context->Inputs();
|
||||
OutputStreamShardSet* const outputs = &calculator_context->Outputs();
|
||||
::mediapipe::Status result =
|
||||
::mediapipe::InternalError("Calculator context has no input packets.");
|
||||
mediapipe::Status result =
|
||||
mediapipe::InternalError("Calculator context has no input packets.");
|
||||
|
||||
int num_invocations = calculator_context_manager_.NumberOfContextTimestamps(
|
||||
*calculator_context);
|
||||
@@ -818,7 +818,7 @@ std::string CalculatorNode::DebugName() const {
|
||||
|
||||
if (OutputsAreConstant(calculator_context)) {
|
||||
// Do nothing.
|
||||
result = ::mediapipe::OkStatus();
|
||||
result = mediapipe::OkStatus();
|
||||
} else {
|
||||
MEDIAPIPE_PROFILING(PROCESS, calculator_context);
|
||||
LegacyCalculatorSupport::Scoped<CalculatorContext> s(
|
||||
@@ -838,7 +838,7 @@ std::string CalculatorNode::DebugName() const {
|
||||
// ensure that all sources will be closed and that packets in input
|
||||
// streams will be processed before the graph is terminated.
|
||||
if (!result.ok() && result != tool::StatusStop()) {
|
||||
return ::mediapipe::StatusBuilder(result, MEDIAPIPE_LOC).SetPrepend()
|
||||
return mediapipe::StatusBuilder(result, MEDIAPIPE_LOC).SetPrepend()
|
||||
<< absl::Substitute(
|
||||
"Calculator::Process() for node \"$0\" failed: ",
|
||||
DebugName());
|
||||
@@ -855,7 +855,7 @@ std::string CalculatorNode::DebugName() const {
|
||||
CHECK_EQ(calculator_context_manager_.NumberOfContextTimestamps(
|
||||
*calculator_context),
|
||||
1);
|
||||
return CloseNode(::mediapipe::OkStatus(), /*graph_run_ended=*/false);
|
||||
return CloseNode(mediapipe::OkStatus(), /*graph_run_ended=*/false);
|
||||
} else {
|
||||
RET_CHECK_FAIL()
|
||||
<< "Invalid input timestamp in ProcessNode(). timestamp: "
|
||||
|
||||
@@ -95,7 +95,7 @@ class CalculatorNode {
|
||||
void SetExecutor(const std::string& executor);
|
||||
|
||||
// Calls Process() on the Calculator corresponding to this node.
|
||||
::mediapipe::Status ProcessNode(CalculatorContext* calculator_context);
|
||||
mediapipe::Status ProcessNode(CalculatorContext* calculator_context);
|
||||
|
||||
// Initializes the node. The buffer_size_hint argument is
|
||||
// set to the value specified in the graph proto for this field.
|
||||
@@ -105,7 +105,7 @@ class CalculatorNode {
|
||||
// output_side_packets is expected to point to a contiguous flat array with
|
||||
// OutputSidePacketImpls corresponding to the output side packet indexes in
|
||||
// validated_graph.
|
||||
::mediapipe::Status Initialize(
|
||||
mediapipe::Status Initialize(
|
||||
const ValidatedGraphConfig* validated_graph, int node_id,
|
||||
InputStreamManager* input_stream_managers,
|
||||
OutputStreamManager* output_stream_managers,
|
||||
@@ -121,22 +121,22 @@ class CalculatorNode {
|
||||
// can be scheduled. source_node_opened_callback is called when a source
|
||||
// node is opened. schedule_callback is passed to the InputStreamHandler
|
||||
// and is called each time a new invocation can be scheduled.
|
||||
::mediapipe::Status PrepareForRun(
|
||||
mediapipe::Status PrepareForRun(
|
||||
const std::map<std::string, Packet>& all_side_packets,
|
||||
const std::map<std::string, Packet>& service_packets,
|
||||
std::function<void()> ready_for_open_callback,
|
||||
std::function<void()> source_node_opened_callback,
|
||||
std::function<void(CalculatorContext*)> schedule_callback,
|
||||
std::function<void(::mediapipe::Status)> error_callback,
|
||||
std::function<void(mediapipe::Status)> error_callback,
|
||||
CounterFactory* counter_factory) ABSL_LOCKS_EXCLUDED(status_mutex_);
|
||||
// Opens the node.
|
||||
::mediapipe::Status OpenNode() ABSL_LOCKS_EXCLUDED(status_mutex_);
|
||||
mediapipe::Status OpenNode() ABSL_LOCKS_EXCLUDED(status_mutex_);
|
||||
// Called when a source node's layer becomes active.
|
||||
void ActivateNode() ABSL_LOCKS_EXCLUDED(status_mutex_);
|
||||
// Cleans up the node after the CalculatorGraph has been run. Deletes
|
||||
// the Calculator managed by this node. graph_status is the status of
|
||||
// the graph run.
|
||||
void CleanupAfterRun(const ::mediapipe::Status& graph_status)
|
||||
void CleanupAfterRun(const mediapipe::Status& graph_status)
|
||||
ABSL_LOCKS_EXCLUDED(status_mutex_);
|
||||
|
||||
// Returns true iff PrepareForRun() has been called (and types verified).
|
||||
@@ -218,8 +218,8 @@ class CalculatorNode {
|
||||
// Closes the node's calculator and input and output streams.
|
||||
// graph_status is the current status of the graph run. graph_run_ended
|
||||
// indicates whether the graph run has ended.
|
||||
::mediapipe::Status CloseNode(const ::mediapipe::Status& graph_status,
|
||||
bool graph_run_ended)
|
||||
mediapipe::Status CloseNode(const mediapipe::Status& graph_status,
|
||||
bool graph_run_ended)
|
||||
ABSL_LOCKS_EXCLUDED(status_mutex_);
|
||||
|
||||
// Returns a pointer to the default calculator context that is used for
|
||||
@@ -235,34 +235,34 @@ class CalculatorNode {
|
||||
|
||||
private:
|
||||
// Sets up the output side packets from the master flat array.
|
||||
::mediapipe::Status InitializeOutputSidePackets(
|
||||
mediapipe::Status InitializeOutputSidePackets(
|
||||
const PacketTypeSet& output_side_packet_types,
|
||||
OutputSidePacketImpl* output_side_packets);
|
||||
// Connects the input side packets as mirrors on the output side packets.
|
||||
// Output side packets are looked up in the master flat array which is
|
||||
// provided.
|
||||
::mediapipe::Status InitializeInputSidePackets(
|
||||
mediapipe::Status InitializeInputSidePackets(
|
||||
OutputSidePacketImpl* output_side_packets);
|
||||
// Sets up the output streams from the master flat array.
|
||||
::mediapipe::Status InitializeOutputStreams(
|
||||
mediapipe::Status InitializeOutputStreams(
|
||||
OutputStreamManager* output_stream_managers);
|
||||
// Sets up the input streams and connects them as mirrors on the
|
||||
// output streams. Both input streams and output streams are looked
|
||||
// up in the master flat arrays which are provided.
|
||||
::mediapipe::Status InitializeInputStreams(
|
||||
mediapipe::Status InitializeInputStreams(
|
||||
InputStreamManager* input_stream_managers,
|
||||
OutputStreamManager* output_stream_managers);
|
||||
|
||||
::mediapipe::Status InitializeInputStreamHandler(
|
||||
mediapipe::Status InitializeInputStreamHandler(
|
||||
const InputStreamHandlerConfig& handler_config,
|
||||
const PacketTypeSet& input_stream_types);
|
||||
::mediapipe::Status InitializeOutputStreamHandler(
|
||||
mediapipe::Status InitializeOutputStreamHandler(
|
||||
const OutputStreamHandlerConfig& handler_config,
|
||||
const PacketTypeSet& output_stream_types);
|
||||
|
||||
// Connects the input/output stream shards in the given calculator context to
|
||||
// the input/output streams of the node.
|
||||
::mediapipe::Status ConnectShardsToStreams(
|
||||
mediapipe::Status ConnectShardsToStreams(
|
||||
CalculatorContext* calculator_context);
|
||||
|
||||
// The general scheduling logic shared by EndScheduling() and
|
||||
|
||||
@@ -37,23 +37,23 @@ class CountCalculator : public CalculatorBase {
|
||||
CountCalculator() { ++num_constructed_; }
|
||||
~CountCalculator() override { ++num_destroyed_; }
|
||||
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
++num_fill_expectations_;
|
||||
cc->Inputs().Get(cc->Inputs().BeginId()).Set<int>();
|
||||
cc->Outputs().Get(cc->Outputs().BeginId()).Set<int>();
|
||||
cc->InputSidePackets().Get(cc->InputSidePackets().BeginId()).Set<int>();
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Open(CalculatorContext* cc) override {
|
||||
mediapipe::Status Open(CalculatorContext* cc) override {
|
||||
++num_open_;
|
||||
// Simulate doing nontrivial work to ensure that the time spent in the
|
||||
// method will register on streamz each time it is called.
|
||||
usleep(100);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Process(CalculatorContext* cc) override {
|
||||
mediapipe::Status Process(CalculatorContext* cc) override {
|
||||
++num_process_;
|
||||
int input_stream_int = cc->Inputs().Get(cc->Inputs().BeginId()).Get<int>();
|
||||
int side_packet_int =
|
||||
@@ -65,15 +65,15 @@ class CountCalculator : public CalculatorBase {
|
||||
// Simulate doing nontrivial work to ensure that the time spent in the
|
||||
// method will register on streamz each time it is called.
|
||||
usleep(100);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Close(CalculatorContext* cc) override {
|
||||
mediapipe::Status Close(CalculatorContext* cc) override {
|
||||
++num_close_;
|
||||
// Simulate doing nontrivial work to ensure that the time spent in the
|
||||
// method will register on streamz each time it is called.
|
||||
usleep(100);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
static int num_constructed_;
|
||||
@@ -94,7 +94,7 @@ int CountCalculator::num_destroyed_ = 0;
|
||||
|
||||
void SourceNodeOpenedNoOp() {}
|
||||
|
||||
void CheckFail(const ::mediapipe::Status& status) {
|
||||
void CheckFail(const mediapipe::Status& status) {
|
||||
LOG(FATAL) << "The test triggered the error callback with status: " << status;
|
||||
}
|
||||
|
||||
@@ -133,7 +133,7 @@ class CalculatorNodeTest : public ::testing::Test {
|
||||
CalculatorGraphConfig graph_config;
|
||||
// Add the test for the node under test.
|
||||
if (use_tags) {
|
||||
graph_config = ::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(
|
||||
graph_config = mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(
|
||||
first_two_nodes_string +
|
||||
"node {\n" // Node index 2
|
||||
" calculator: \"CountCalculator\"\n"
|
||||
@@ -143,7 +143,7 @@ class CalculatorNodeTest : public ::testing::Test {
|
||||
" input_side_packet: \"INPUT_SIDE_PACKET_TAG:input_a\"\n"
|
||||
"}\n");
|
||||
} else {
|
||||
graph_config = ::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(
|
||||
graph_config = mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(
|
||||
first_two_nodes_string +
|
||||
"node {\n" // Node index 2
|
||||
" calculator: \"CountCalculator\"\n"
|
||||
@@ -165,7 +165,7 @@ class CalculatorNodeTest : public ::testing::Test {
|
||||
&buffer_size_hint_, graph_profiler_));
|
||||
}
|
||||
|
||||
::mediapipe::Status PrepareNodeForRun() {
|
||||
mediapipe::Status PrepareNodeForRun() {
|
||||
return node_->PrepareForRun( //
|
||||
input_side_packets_, //
|
||||
service_packets_, //
|
||||
@@ -180,7 +180,7 @@ class CalculatorNodeTest : public ::testing::Test {
|
||||
nullptr);
|
||||
}
|
||||
|
||||
::mediapipe::Status InitializeStreams() {
|
||||
mediapipe::Status InitializeStreams() {
|
||||
// START OF: code is copied from
|
||||
// CalculatorGraph::InitializePacketGeneratorGraph.
|
||||
// Create and initialize the output side packets.
|
||||
@@ -220,7 +220,7 @@ class CalculatorNodeTest : public ::testing::Test {
|
||||
|
||||
stream_a_manager_ = &output_stream_managers_[1];
|
||||
stream_b_manager_ = &output_stream_managers_[2];
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
virtual void SimulateParentOpenNode() { stream_a_manager_->LockIntroData(); }
|
||||
@@ -482,7 +482,7 @@ TEST_F(CalculatorNodeTest, CleanupAfterRun) {
|
||||
node_->EndScheduling();
|
||||
// The max parallelism is already reached.
|
||||
EXPECT_FALSE(node_->TryToBeginScheduling());
|
||||
node_->CleanupAfterRun(::mediapipe::OkStatus());
|
||||
node_->CleanupAfterRun(mediapipe::OkStatus());
|
||||
|
||||
EXPECT_FALSE(node_->Prepared());
|
||||
EXPECT_FALSE(node_->Opened());
|
||||
@@ -517,7 +517,7 @@ void CalculatorNodeTest::TestCleanupAfterRunTwice() {
|
||||
EXPECT_TRUE(node_->TryToBeginScheduling());
|
||||
MP_EXPECT_OK(node_->ProcessNode(cc_));
|
||||
node_->EndScheduling();
|
||||
node_->CleanupAfterRun(::mediapipe::OkStatus());
|
||||
node_->CleanupAfterRun(mediapipe::OkStatus());
|
||||
|
||||
stream_a_manager_->PrepareForRun(nullptr);
|
||||
|
||||
@@ -543,7 +543,7 @@ void CalculatorNodeTest::TestCleanupAfterRunTwice() {
|
||||
node_->EndScheduling();
|
||||
// The max parallelism is already reached.
|
||||
EXPECT_FALSE(node_->TryToBeginScheduling());
|
||||
node_->CleanupAfterRun(::mediapipe::OkStatus());
|
||||
node_->CleanupAfterRun(mediapipe::OkStatus());
|
||||
|
||||
EXPECT_FALSE(node_->Prepared());
|
||||
EXPECT_FALSE(node_->Opened());
|
||||
|
||||
@@ -50,20 +50,20 @@ inline void BusySleep(absl::Duration duration) {
|
||||
|
||||
class SlowPlusOneCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
cc->Inputs().Index(0).Set<int>();
|
||||
cc->Outputs().Index(0).Set<int>();
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Open(CalculatorContext* cc) override {
|
||||
mediapipe::Status Open(CalculatorContext* cc) override {
|
||||
cc->SetOffset(mediapipe::TimestampDiff(0));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Process(CalculatorContext* cc) override {
|
||||
mediapipe::Status Process(CalculatorContext* cc) override {
|
||||
if (cc->InputTimestamp().Value() % 4 == 0) {
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
RandomEngine random(testing::UnitTest::GetInstance()->random_seed());
|
||||
@@ -71,7 +71,7 @@ class SlowPlusOneCalculator : public CalculatorBase {
|
||||
BusySleep(absl::Milliseconds(90 + uniform_dist(random)));
|
||||
cc->Outputs().Index(0).Add(new int(cc->Inputs().Index(0).Get<int>() + 1),
|
||||
cc->InputTimestamp());
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -91,7 +91,7 @@ class ParallelExecutionTest : public testing::Test {
|
||||
|
||||
TEST_F(ParallelExecutionTest, SlowPlusOneCalculatorsTest) {
|
||||
CalculatorGraphConfig graph_config =
|
||||
::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
input_stream: "input"
|
||||
node {
|
||||
calculator: "SlowPlusOneCalculator"
|
||||
@@ -124,7 +124,7 @@ TEST_F(ParallelExecutionTest, SlowPlusOneCalculatorsTest) {
|
||||
const int kTotalNums = 100;
|
||||
int fail_count = 0;
|
||||
for (int i = 0; i < kTotalNums; ++i) {
|
||||
::mediapipe::Status status = graph.AddPacketToInputStream(
|
||||
mediapipe::Status status = graph.AddPacketToInputStream(
|
||||
"input", Adopt(new int(i)).At(Timestamp(i)));
|
||||
if (!status.ok()) {
|
||||
++fail_count;
|
||||
|
||||
@@ -19,14 +19,14 @@
|
||||
|
||||
#include "mediapipe/framework/calculator_base.h"
|
||||
|
||||
#define REGISTER_CALCULATOR(name) \
|
||||
REGISTER_FACTORY_FUNCTION_QUALIFIED(::mediapipe::CalculatorBaseRegistry, \
|
||||
calculator_registration, name, \
|
||||
absl::make_unique<name>); \
|
||||
REGISTER_FACTORY_FUNCTION_QUALIFIED( \
|
||||
::mediapipe::internal::StaticAccessToCalculatorBaseRegistry, \
|
||||
access_registration, name, \
|
||||
absl::make_unique< \
|
||||
::mediapipe::internal::StaticAccessToCalculatorBaseTyped<name>>)
|
||||
#define REGISTER_CALCULATOR(name) \
|
||||
REGISTER_FACTORY_FUNCTION_QUALIFIED(mediapipe::CalculatorBaseRegistry, \
|
||||
calculator_registration, name, \
|
||||
absl::make_unique<name>); \
|
||||
REGISTER_FACTORY_FUNCTION_QUALIFIED( \
|
||||
mediapipe::internal::StaticAccessToCalculatorBaseRegistry, \
|
||||
access_registration, name, \
|
||||
absl::make_unique< \
|
||||
mediapipe::internal::StaticAccessToCalculatorBaseTyped<name>>)
|
||||
|
||||
#endif // MEDIAPIPE_FRAMEWORK_CALCULATOR_REGISTRY_H_
|
||||
|
||||
@@ -30,9 +30,9 @@ bool IsLegacyCalculator(const std::string& package_name,
|
||||
return false;
|
||||
}
|
||||
|
||||
::mediapipe::Status VerifyCalculatorWithContract(
|
||||
const std::string& package_name, const std::string& node_class,
|
||||
CalculatorContract* contract) {
|
||||
mediapipe::Status VerifyCalculatorWithContract(const std::string& package_name,
|
||||
const std::string& node_class,
|
||||
CalculatorContract* contract) {
|
||||
// A number of calculators use the non-CC methods on GlCalculatorHelper
|
||||
// even though they are CalculatorBase-based.
|
||||
ASSIGN_OR_RETURN(
|
||||
@@ -43,10 +43,10 @@ bool IsLegacyCalculator(const std::string& package_name,
|
||||
MP_RETURN_IF_ERROR(static_access_to_calculator_base->GetContract(contract))
|
||||
.SetPrepend()
|
||||
<< node_class << ": ";
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::StatusOr<std::unique_ptr<CalculatorBase>> CreateCalculator(
|
||||
mediapipe::StatusOr<std::unique_ptr<CalculatorBase>> CreateCalculator(
|
||||
const std::shared_ptr<tool::TagMap>& input_tag_map,
|
||||
const std::shared_ptr<tool::TagMap>& output_tag_map,
|
||||
const std::string& package_name, CalculatorState* calculator_state,
|
||||
|
||||
@@ -31,11 +31,11 @@ namespace mediapipe {
|
||||
bool IsLegacyCalculator(const std::string& package_name,
|
||||
const std::string& node_class);
|
||||
|
||||
::mediapipe::Status VerifyCalculatorWithContract(
|
||||
const std::string& package_name, const std::string& node_class,
|
||||
CalculatorContract* contract);
|
||||
mediapipe::Status VerifyCalculatorWithContract(const std::string& package_name,
|
||||
const std::string& node_class,
|
||||
CalculatorContract* contract);
|
||||
|
||||
::mediapipe::StatusOr<std::unique_ptr<CalculatorBase>> CreateCalculator(
|
||||
mediapipe::StatusOr<std::unique_ptr<CalculatorBase>> CreateCalculator(
|
||||
const std::shared_ptr<tool::TagMap>& input_tag_map,
|
||||
const std::shared_ptr<tool::TagMap>& output_tag_map,
|
||||
const std::string& package_name, CalculatorState* calculator_state,
|
||||
|
||||
@@ -36,15 +36,15 @@ namespace {
|
||||
// Input side packets: 1, pointing to CalculatorRunner::StreamContents.
|
||||
class CalculatorRunnerSourceCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
cc->InputSidePackets()
|
||||
.Index(0)
|
||||
.Set<const CalculatorRunner::StreamContents*>();
|
||||
cc->Outputs().Index(0).SetAny();
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Open(CalculatorContext* cc) override {
|
||||
mediapipe::Status Open(CalculatorContext* cc) override {
|
||||
const auto* contents = cc->InputSidePackets()
|
||||
.Index(0)
|
||||
.Get<const CalculatorRunner::StreamContents*>();
|
||||
@@ -53,9 +53,9 @@ class CalculatorRunnerSourceCalculator : public CalculatorBase {
|
||||
for (const Packet& packet : contents->packets) {
|
||||
cc->Outputs().Index(0).AddPacket(packet);
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
::mediapipe::Status Process(CalculatorContext* cc) override {
|
||||
mediapipe::Status Process(CalculatorContext* cc) override {
|
||||
return tool::StatusStop();
|
||||
}
|
||||
};
|
||||
@@ -67,23 +67,23 @@ REGISTER_CALCULATOR(CalculatorRunnerSourceCalculator);
|
||||
// Input side packets: 1, pointing to CalculatorRunner::StreamContents.
|
||||
class CalculatorRunnerSinkCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
cc->Inputs().Index(0).SetAny();
|
||||
cc->InputSidePackets().Index(0).Set<CalculatorRunner::StreamContents*>();
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Open(CalculatorContext* cc) override {
|
||||
mediapipe::Status Open(CalculatorContext* cc) override {
|
||||
contents_ = cc->InputSidePackets()
|
||||
.Index(0)
|
||||
.Get<CalculatorRunner::StreamContents*>();
|
||||
contents_->header = cc->Inputs().Index(0).Header();
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Process(CalculatorContext* cc) override {
|
||||
mediapipe::Status Process(CalculatorContext* cc) override {
|
||||
contents_->packets.push_back(cc->Inputs().Index(0).Value());
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -98,7 +98,7 @@ CalculatorRunner::CalculatorRunner(
|
||||
MEDIAPIPE_CHECK_OK(InitializeFromNodeConfig(node_config));
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorRunner::InitializeFromNodeConfig(
|
||||
mediapipe::Status CalculatorRunner::InitializeFromNodeConfig(
|
||||
const CalculatorGraphConfig::Node& node_config) {
|
||||
node_config_ = node_config;
|
||||
|
||||
@@ -126,7 +126,7 @@ CalculatorRunner::CalculatorRunner(
|
||||
tool::TagMap::Create(node_config_.output_side_packet()));
|
||||
output_side_packets_ = absl::make_unique<PacketSet>(output_side_map);
|
||||
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
CalculatorRunner::CalculatorRunner(const std::string& calculator_type,
|
||||
@@ -220,10 +220,10 @@ std::map<std::string, int64> CalculatorRunner::GetCountersValues() {
|
||||
return graph_->GetCounterFactory()->GetCounterSet()->GetCountersValues();
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorRunner::BuildGraph() {
|
||||
mediapipe::Status CalculatorRunner::BuildGraph() {
|
||||
if (graph_ != nullptr) {
|
||||
// The graph was already built.
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
RET_CHECK(inputs_) << "The inputs were not initialized.";
|
||||
RET_CHECK(outputs_) << "The outputs were not initialized.";
|
||||
@@ -277,10 +277,10 @@ std::map<std::string, int64> CalculatorRunner::GetCountersValues() {
|
||||
|
||||
graph_ = absl::make_unique<CalculatorGraph>();
|
||||
MP_RETURN_IF_ERROR(graph_->Initialize(config));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status CalculatorRunner::Run() {
|
||||
mediapipe::Status CalculatorRunner::Run() {
|
||||
MP_RETURN_IF_ERROR(BuildGraph());
|
||||
// Set the input side packets for the sources.
|
||||
std::map<std::string, Packet> input_side_packets;
|
||||
@@ -352,7 +352,7 @@ std::map<std::string, int64> CalculatorRunner::GetCountersValues() {
|
||||
tag, (index == -1) ? ++positional_index : index);
|
||||
ASSIGN_OR_RETURN(contents, graph_->GetOutputSidePacket(name));
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
} // namespace mediapipe
|
||||
|
||||
@@ -109,11 +109,11 @@ class CalculatorRunner {
|
||||
|
||||
// Runs the calculator, by calling Open(), Process() with the
|
||||
// inputs provided via mutable_inputs(), and Close(). Returns the
|
||||
// ::mediapipe::Status from CalculatorGraph::Run(). Internally, Run()
|
||||
// mediapipe::Status from CalculatorGraph::Run(). Internally, Run()
|
||||
// constructs a CalculatorGraph in the first call, and calls
|
||||
// CalculatorGraph::Run(). A single instance of CalculatorRunner
|
||||
// uses the same instance of CalculatorGraph for all runs.
|
||||
::mediapipe::Status Run();
|
||||
mediapipe::Status Run();
|
||||
|
||||
// Returns the vector of contents of the output streams. The .header
|
||||
// field contains the stream header and the .packets field contains
|
||||
@@ -135,11 +135,11 @@ class CalculatorRunner {
|
||||
static const char kSinkPrefix[];
|
||||
|
||||
// Initialize using a node config (does the constructor's work).
|
||||
::mediapipe::Status InitializeFromNodeConfig(
|
||||
mediapipe::Status InitializeFromNodeConfig(
|
||||
const CalculatorGraphConfig::Node& node_config);
|
||||
|
||||
// Builds the graph if one does not already exist.
|
||||
::mediapipe::Status BuildGraph();
|
||||
mediapipe::Status BuildGraph();
|
||||
|
||||
CalculatorGraphConfig::Node node_config_;
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ namespace {
|
||||
// at InputTimestamp. The headers are strings.
|
||||
class CalculatorRunnerTestCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
cc->Inputs().Index(0).Set<int>();
|
||||
cc->Inputs().Index(1).Set<int>();
|
||||
cc->Outputs().Index(0).Set<int>();
|
||||
@@ -50,10 +50,10 @@ class CalculatorRunnerTestCalculator : public CalculatorBase {
|
||||
cc->OutputSidePackets()
|
||||
.Tag("SIDE_OUTPUT")
|
||||
.SetSameAs(&cc->InputSidePackets().Index(0));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Open(CalculatorContext* cc) override {
|
||||
mediapipe::Status Open(CalculatorContext* cc) override {
|
||||
std::string input_header_string =
|
||||
absl::StrCat(cc->Inputs().Index(0).Header().Get<std::string>(),
|
||||
cc->Inputs().Index(1).Header().Get<std::string>());
|
||||
@@ -66,17 +66,17 @@ class CalculatorRunnerTestCalculator : public CalculatorBase {
|
||||
cc->OutputSidePackets()
|
||||
.Tag("SIDE_OUTPUT")
|
||||
.Set(cc->InputSidePackets().Index(0));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Process(CalculatorContext* cc) override {
|
||||
mediapipe::Status Process(CalculatorContext* cc) override {
|
||||
for (int index = 0; index < 2; ++index) {
|
||||
cc->Outputs().Index(index).Add(
|
||||
new int(-cc->Inputs().Index(index).Get<int>()), cc->InputTimestamp());
|
||||
}
|
||||
cc->Outputs().Index(2).AddPacket(
|
||||
cc->InputSidePackets().Index(0).At(cc->InputTimestamp()));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
};
|
||||
REGISTER_CALCULATOR(CalculatorRunnerTestCalculator);
|
||||
@@ -87,7 +87,7 @@ REGISTER_CALCULATOR(CalculatorRunnerTestCalculator);
|
||||
// with the same tag name (and any index).
|
||||
class CalculatorRunnerMultiTagTestCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
for (const std::string& tag : cc->Inputs().GetTags()) {
|
||||
for (CollectionItemId item_id = cc->Inputs().BeginId(tag);
|
||||
item_id < cc->Inputs().EndId(tag); ++item_id) {
|
||||
@@ -95,10 +95,10 @@ class CalculatorRunnerMultiTagTestCalculator : public CalculatorBase {
|
||||
}
|
||||
cc->Outputs().Get(tag, 0).Set<int>();
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Process(CalculatorContext* cc) override {
|
||||
mediapipe::Status Process(CalculatorContext* cc) override {
|
||||
for (const std::string& tag : cc->Inputs().GetTags()) {
|
||||
auto sum = absl::make_unique<int>(0);
|
||||
for (CollectionItemId item_id = cc->Inputs().BeginId(tag);
|
||||
@@ -109,7 +109,7 @@ class CalculatorRunnerMultiTagTestCalculator : public CalculatorBase {
|
||||
}
|
||||
cc->Outputs().Get(tag, 0).Add(sum.release(), cc->InputTimestamp());
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
};
|
||||
REGISTER_CALCULATOR(CalculatorRunnerMultiTagTestCalculator);
|
||||
|
||||
@@ -448,7 +448,7 @@ template <typename T, CollectionStorage storage, typename ErrorHandler>
|
||||
typename Collection<T, storage, ErrorHandler>::value_type*&
|
||||
Collection<T, storage, ErrorHandler>::GetPtr(CollectionItemId id) {
|
||||
static_assert(storage == CollectionStorage::kStorePointer,
|
||||
"::mediapipe::internal::Collection<T>::GetPtr() is only "
|
||||
"mediapipe::internal::Collection<T>::GetPtr() is only "
|
||||
"available for collections that were defined with template "
|
||||
"argument storage == CollectionStorage::kStorePointer.");
|
||||
CHECK_LE(BeginId(), id);
|
||||
@@ -460,7 +460,7 @@ template <typename T, CollectionStorage storage, typename ErrorHandler>
|
||||
const typename Collection<T, storage, ErrorHandler>::value_type*
|
||||
Collection<T, storage, ErrorHandler>::GetPtr(CollectionItemId id) const {
|
||||
static_assert(storage == CollectionStorage::kStorePointer,
|
||||
"::mediapipe::internal::Collection<T>::GetPtr() is only "
|
||||
"mediapipe::internal::Collection<T>::GetPtr() is only "
|
||||
"available for collections that were defined with template "
|
||||
"argument storage == CollectionStorage::kStorePointer.");
|
||||
CHECK_LE(BeginId(), id);
|
||||
|
||||
@@ -157,7 +157,7 @@ class CollectionItemId {
|
||||
}
|
||||
|
||||
private:
|
||||
friend class ::mediapipe::tool::TagMap;
|
||||
friend class mediapipe::tool::TagMap;
|
||||
|
||||
// Initialization from a value.
|
||||
explicit constexpr CollectionItemId(int init_value) : value_(init_value) {}
|
||||
|
||||
@@ -183,7 +183,7 @@ TEST(CollectionTest, StaticEmptyCollectionHeapCheck) {
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
::mediapipe::Status TestCollectionWithPointers(
|
||||
mediapipe::Status TestCollectionWithPointers(
|
||||
const std::vector<T>& original_values, const T& inject1, const T& inject2) {
|
||||
std::shared_ptr<tool::TagMap> tag_map =
|
||||
tool::CreateTagMap({"TAG_A:a", "TAG_B:1:b", "TAG_A:2:c", "TAG_B:d",
|
||||
@@ -451,7 +451,7 @@ template <typename T>
|
||||
++i;
|
||||
}
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
TEST(CollectionTest, TestCollectionWithPointersIntAndString) {
|
||||
|
||||
@@ -67,7 +67,7 @@ void CounterSet::PrintCounters() ABSL_LOCKS_EXCLUDED(mu_) {
|
||||
|
||||
Counter* CounterSet::Get(const std::string& name) ABSL_LOCKS_EXCLUDED(mu_) {
|
||||
absl::ReaderMutexLock lock(&mu_);
|
||||
if (!::mediapipe::ContainsKey(counters_, name)) {
|
||||
if (!mediapipe::ContainsKey(counters_, name)) {
|
||||
return nullptr;
|
||||
}
|
||||
return counters_[name].get();
|
||||
|
||||
@@ -22,63 +22,60 @@ namespace mediapipe {
|
||||
// Each of the functions below creates a canonical error with the given
|
||||
// message. The error code of the returned status object matches the name of
|
||||
// the function.
|
||||
inline ::mediapipe::Status AlreadyExistsError(absl::string_view message) {
|
||||
return ::mediapipe::Status(::mediapipe::StatusCode::kAlreadyExists, message);
|
||||
inline mediapipe::Status AlreadyExistsError(absl::string_view message) {
|
||||
return mediapipe::Status(mediapipe::StatusCode::kAlreadyExists, message);
|
||||
}
|
||||
|
||||
inline ::mediapipe::Status CancelledError() {
|
||||
return ::mediapipe::Status(::mediapipe::StatusCode::kCancelled, "");
|
||||
inline mediapipe::Status CancelledError() {
|
||||
return mediapipe::Status(mediapipe::StatusCode::kCancelled, "");
|
||||
}
|
||||
|
||||
inline ::mediapipe::Status CancelledError(absl::string_view message) {
|
||||
return ::mediapipe::Status(::mediapipe::StatusCode::kCancelled, message);
|
||||
inline mediapipe::Status CancelledError(absl::string_view message) {
|
||||
return mediapipe::Status(mediapipe::StatusCode::kCancelled, message);
|
||||
}
|
||||
|
||||
inline ::mediapipe::Status InternalError(absl::string_view message) {
|
||||
return ::mediapipe::Status(::mediapipe::StatusCode::kInternal, message);
|
||||
inline mediapipe::Status InternalError(absl::string_view message) {
|
||||
return mediapipe::Status(mediapipe::StatusCode::kInternal, message);
|
||||
}
|
||||
|
||||
inline ::mediapipe::Status InvalidArgumentError(absl::string_view message) {
|
||||
return ::mediapipe::Status(::mediapipe::StatusCode::kInvalidArgument,
|
||||
message);
|
||||
inline mediapipe::Status InvalidArgumentError(absl::string_view message) {
|
||||
return mediapipe::Status(mediapipe::StatusCode::kInvalidArgument, message);
|
||||
}
|
||||
|
||||
inline ::mediapipe::Status FailedPreconditionError(absl::string_view message) {
|
||||
return ::mediapipe::Status(::mediapipe::StatusCode::kFailedPrecondition,
|
||||
message);
|
||||
inline mediapipe::Status FailedPreconditionError(absl::string_view message) {
|
||||
return mediapipe::Status(mediapipe::StatusCode::kFailedPrecondition, message);
|
||||
}
|
||||
|
||||
inline ::mediapipe::Status NotFoundError(absl::string_view message) {
|
||||
return ::mediapipe::Status(::mediapipe::StatusCode::kNotFound, message);
|
||||
inline mediapipe::Status NotFoundError(absl::string_view message) {
|
||||
return mediapipe::Status(mediapipe::StatusCode::kNotFound, message);
|
||||
}
|
||||
|
||||
inline ::mediapipe::Status OutOfRangeError(absl::string_view message) {
|
||||
return ::mediapipe::Status(::mediapipe::StatusCode::kOutOfRange, message);
|
||||
inline mediapipe::Status OutOfRangeError(absl::string_view message) {
|
||||
return mediapipe::Status(mediapipe::StatusCode::kOutOfRange, message);
|
||||
}
|
||||
|
||||
inline ::mediapipe::Status PermissionDeniedError(absl::string_view message) {
|
||||
return ::mediapipe::Status(::mediapipe::StatusCode::kPermissionDenied,
|
||||
message);
|
||||
inline mediapipe::Status PermissionDeniedError(absl::string_view message) {
|
||||
return mediapipe::Status(mediapipe::StatusCode::kPermissionDenied, message);
|
||||
}
|
||||
|
||||
inline ::mediapipe::Status UnimplementedError(absl::string_view message) {
|
||||
return ::mediapipe::Status(::mediapipe::StatusCode::kUnimplemented, message);
|
||||
inline mediapipe::Status UnimplementedError(absl::string_view message) {
|
||||
return mediapipe::Status(mediapipe::StatusCode::kUnimplemented, message);
|
||||
}
|
||||
|
||||
inline ::mediapipe::Status UnknownError(absl::string_view message) {
|
||||
return ::mediapipe::Status(::mediapipe::StatusCode::kUnknown, message);
|
||||
inline mediapipe::Status UnknownError(absl::string_view message) {
|
||||
return mediapipe::Status(mediapipe::StatusCode::kUnknown, message);
|
||||
}
|
||||
|
||||
inline ::mediapipe::Status UnavailableError(absl::string_view message) {
|
||||
return ::mediapipe::Status(::mediapipe::StatusCode::kUnavailable, message);
|
||||
inline mediapipe::Status UnavailableError(absl::string_view message) {
|
||||
return mediapipe::Status(mediapipe::StatusCode::kUnavailable, message);
|
||||
}
|
||||
|
||||
inline bool IsCancelled(const ::mediapipe::Status& status) {
|
||||
return status.code() == ::mediapipe::StatusCode::kCancelled;
|
||||
inline bool IsCancelled(const mediapipe::Status& status) {
|
||||
return status.code() == mediapipe::StatusCode::kCancelled;
|
||||
}
|
||||
|
||||
inline bool IsNotFound(const ::mediapipe::Status& status) {
|
||||
return status.code() == ::mediapipe::StatusCode::kNotFound;
|
||||
inline bool IsNotFound(const mediapipe::Status& status) {
|
||||
return status.code() == mediapipe::StatusCode::kNotFound;
|
||||
}
|
||||
|
||||
} // namespace mediapipe
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
// void func() {}
|
||||
// FILE* fp = fopen("data.txt", "r");
|
||||
// if (fp == nullptr) return;
|
||||
// auto fp_cleaner = ::mediapipe::MakeCleanup([fp] { fclose(fp); });
|
||||
// auto fp_cleaner = mediapipe::MakeCleanup([fp] { fclose(fp); });
|
||||
// // No matter what, fclose(fp) will happen.
|
||||
// DataObject d;
|
||||
// while (ReadDataObject(fp, &d)) {
|
||||
|
||||
@@ -138,11 +138,11 @@ class DirectoryListing {
|
||||
|
||||
} // namespace
|
||||
|
||||
::mediapipe::Status GetContents(absl::string_view file_name,
|
||||
std::string* output) {
|
||||
FILE* fp = fopen(file_name.data(), "r");
|
||||
mediapipe::Status GetContents(absl::string_view file_name, std::string* output,
|
||||
bool read_as_binary) {
|
||||
FILE* fp = fopen(file_name.data(), read_as_binary ? "rb" : "r");
|
||||
if (fp == NULL) {
|
||||
return ::mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
|
||||
return mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "Can't find file: " << file_name;
|
||||
}
|
||||
|
||||
@@ -151,36 +151,36 @@ class DirectoryListing {
|
||||
char buf[4096];
|
||||
size_t ret = fread(buf, 1, 4096, fp);
|
||||
if (ret == 0 && ferror(fp)) {
|
||||
return ::mediapipe::InternalErrorBuilder(MEDIAPIPE_LOC)
|
||||
return mediapipe::InternalErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "Error while reading file: " << file_name;
|
||||
}
|
||||
output->append(std::string(buf, ret));
|
||||
}
|
||||
fclose(fp);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status SetContents(absl::string_view file_name,
|
||||
absl::string_view content) {
|
||||
mediapipe::Status SetContents(absl::string_view file_name,
|
||||
absl::string_view content) {
|
||||
FILE* fp = fopen(file_name.data(), "w");
|
||||
if (fp == NULL) {
|
||||
return ::mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
|
||||
return mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "Can't open file: " << file_name;
|
||||
}
|
||||
|
||||
fwrite(content.data(), sizeof(char), content.size(), fp);
|
||||
size_t write_error = ferror(fp);
|
||||
if (fclose(fp) != 0 || write_error) {
|
||||
return ::mediapipe::InternalErrorBuilder(MEDIAPIPE_LOC)
|
||||
return mediapipe::InternalErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "Error while writing file: " << file_name
|
||||
<< ". Error message: " << strerror(write_error);
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status MatchInTopSubdirectories(
|
||||
const std::string& parent_directory, const std::string& file_name,
|
||||
std::vector<std::string>* results) {
|
||||
mediapipe::Status MatchInTopSubdirectories(const std::string& parent_directory,
|
||||
const std::string& file_name,
|
||||
std::vector<std::string>* results) {
|
||||
DirectoryListing parent_listing(parent_directory);
|
||||
|
||||
while (parent_listing.HasNextEntry()) {
|
||||
@@ -194,12 +194,12 @@ class DirectoryListing {
|
||||
}
|
||||
}
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status MatchFileTypeInDirectory(
|
||||
const std::string& directory, const std::string& file_suffix,
|
||||
std::vector<std::string>* results) {
|
||||
mediapipe::Status MatchFileTypeInDirectory(const std::string& directory,
|
||||
const std::string& file_suffix,
|
||||
std::vector<std::string>* results) {
|
||||
DirectoryListing directory_listing(directory);
|
||||
|
||||
while (directory_listing.HasNextEntry()) {
|
||||
@@ -209,21 +209,21 @@ class DirectoryListing {
|
||||
}
|
||||
}
|
||||
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Exists(absl::string_view file_name) {
|
||||
mediapipe::Status Exists(absl::string_view file_name) {
|
||||
struct stat buffer;
|
||||
int status;
|
||||
status = stat(std::string(file_name).c_str(), &buffer);
|
||||
if (status == 0) {
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
switch (errno) {
|
||||
case EACCES:
|
||||
return ::mediapipe::PermissionDeniedError("Insufficient permissions.");
|
||||
return mediapipe::PermissionDeniedError("Insufficient permissions.");
|
||||
default:
|
||||
return ::mediapipe::NotFoundError("The path does not exist.");
|
||||
return mediapipe::NotFoundError("The path does not exist.");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -235,7 +235,7 @@ int mkdir(std::string path) {
|
||||
int mkdir(std::string path) { return _mkdir(path.c_str()); }
|
||||
#endif
|
||||
|
||||
::mediapipe::Status RecursivelyCreateDir(absl::string_view path) {
|
||||
mediapipe::Status RecursivelyCreateDir(absl::string_view path) {
|
||||
if (path.empty() || Exists(path).ok()) {
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
@@ -244,9 +244,9 @@ int mkdir(std::string path) { return _mkdir(path.c_str()); }
|
||||
if (mkdir(std::string(path)) != 0) {
|
||||
switch (errno) {
|
||||
case EACCES:
|
||||
return ::mediapipe::PermissionDeniedError("Insufficient permissions.");
|
||||
return mediapipe::PermissionDeniedError("Insufficient permissions.");
|
||||
default:
|
||||
return ::mediapipe::UnavailableError("Failed to create directory.");
|
||||
return mediapipe::UnavailableError("Failed to create directory.");
|
||||
}
|
||||
}
|
||||
return mediapipe::OkStatus();
|
||||
|
||||
@@ -20,23 +20,23 @@
|
||||
|
||||
namespace mediapipe {
|
||||
namespace file {
|
||||
::mediapipe::Status GetContents(absl::string_view file_name,
|
||||
std::string* output);
|
||||
mediapipe::Status GetContents(absl::string_view file_name, std::string* output,
|
||||
bool read_as_binary = false);
|
||||
|
||||
::mediapipe::Status SetContents(absl::string_view file_name,
|
||||
absl::string_view content);
|
||||
mediapipe::Status SetContents(absl::string_view file_name,
|
||||
absl::string_view content);
|
||||
|
||||
::mediapipe::Status MatchInTopSubdirectories(
|
||||
const std::string& parent_directory, const std::string& file_name,
|
||||
std::vector<std::string>* results);
|
||||
mediapipe::Status MatchInTopSubdirectories(const std::string& parent_directory,
|
||||
const std::string& file_name,
|
||||
std::vector<std::string>* results);
|
||||
|
||||
::mediapipe::Status MatchFileTypeInDirectory(const std::string& directory,
|
||||
const std::string& file_suffix,
|
||||
std::vector<std::string>* results);
|
||||
mediapipe::Status MatchFileTypeInDirectory(const std::string& directory,
|
||||
const std::string& file_suffix,
|
||||
std::vector<std::string>* results);
|
||||
|
||||
::mediapipe::Status Exists(absl::string_view file_name);
|
||||
mediapipe::Status Exists(absl::string_view file_name);
|
||||
|
||||
::mediapipe::Status RecursivelyCreateDir(absl::string_view path);
|
||||
mediapipe::Status RecursivelyCreateDir(absl::string_view path);
|
||||
|
||||
} // namespace file
|
||||
} // namespace mediapipe
|
||||
|
||||
@@ -92,7 +92,7 @@ class MonotonicClockAccess {
|
||||
// Create a monotonic clock based on the given state. Caller owns state
|
||||
// so that multiple such clocks can be created from the same state.
|
||||
static MonotonicClock* CreateMonotonicClock(State* state);
|
||||
friend class ::mediapipe::MonotonicClockTest;
|
||||
friend class mediapipe::MonotonicClockTest;
|
||||
};
|
||||
|
||||
} // namespace mediapipe
|
||||
|
||||
@@ -428,7 +428,7 @@ class ClockFrenzy {
|
||||
void Start(int nthreads) {
|
||||
absl::MutexLock l(&lock_);
|
||||
running_ = true;
|
||||
threads_ = absl::make_unique<::mediapipe::ThreadPool>("Frenzy", nthreads);
|
||||
threads_ = absl::make_unique<mediapipe::ThreadPool>("Frenzy", nthreads);
|
||||
threads_->StartWorkers();
|
||||
for (int i = 0; i < nthreads; ++i) {
|
||||
threads_->Schedule([&]() { Feed(); });
|
||||
@@ -452,7 +452,7 @@ class ClockFrenzy {
|
||||
Clock* real_clock_;
|
||||
std::vector<SimulationClock*> sim_clocks_;
|
||||
std::vector<MonotonicClock*> mono_clocks_;
|
||||
std::unique_ptr<::mediapipe::ThreadPool> threads_;
|
||||
std::unique_ptr<mediapipe::ThreadPool> threads_;
|
||||
|
||||
// Provide a lock to avoid race conditions in non-threadsafe ACMRandom.
|
||||
mutable absl::Mutex lock_;
|
||||
|
||||
@@ -67,7 +67,7 @@ namespace mediapipe {
|
||||
// class Client {};
|
||||
//
|
||||
// using ClientRegistry =
|
||||
// GlobalFactoryRegistry<::mediapipe::StatusOr<unique_ptr<Client>>;
|
||||
// GlobalFactoryRegistry<mediapipe::StatusOr<unique_ptr<Client>>;
|
||||
//
|
||||
// class MyClient : public Client {
|
||||
// public:
|
||||
@@ -84,7 +84,7 @@ namespace mediapipe {
|
||||
// ::my_ns::MyClient,
|
||||
// []() {
|
||||
// auto backend = absl::make_unique<Backend>("/path/to/backend");
|
||||
// const ::mediapipe::Status status = backend->Init();
|
||||
// const mediapipe::Status status = backend->Init();
|
||||
// if (!status.ok()) {
|
||||
// return status;
|
||||
// }
|
||||
@@ -95,8 +95,8 @@ namespace mediapipe {
|
||||
//
|
||||
// === Using the registry to create instances ==============================
|
||||
//
|
||||
// // Registry will return ::mediapipe::StatusOr<Object>
|
||||
// ::mediapipe::StatusOr<unique_ptr<Widget>> s_or_widget =
|
||||
// // Registry will return mediapipe::StatusOr<Object>
|
||||
// mediapipe::StatusOr<unique_ptr<Widget>> s_or_widget =
|
||||
// WidgetRegistry::CreateByName(
|
||||
// "my_ns.MyWidget", std::move(gadget), thing);
|
||||
// // Registry will return NOT_FOUND if the name is unknown.
|
||||
@@ -115,7 +115,7 @@ namespace mediapipe {
|
||||
// // This might be useful if clients outside of your codebase are registering
|
||||
// // plugins.
|
||||
// for (const auto& name : WidgetRegistry::GetRegisteredNames()) {
|
||||
// ::mediapipe::StatusOr<unique_ptr<Widget>> s_or_widget =
|
||||
// mediapipe::StatusOr<unique_ptr<Widget>> s_or_widget =
|
||||
// WidgetRegistry::CreateByName(name, std::move(gadget), thing);
|
||||
// ...
|
||||
// }
|
||||
@@ -134,13 +134,13 @@ constexpr char kNameSep[] = ".";
|
||||
|
||||
template <typename T>
|
||||
struct WrapStatusOr {
|
||||
using type = ::mediapipe::StatusOr<T>;
|
||||
using type = mediapipe::StatusOr<T>;
|
||||
};
|
||||
|
||||
// Specialization to avoid double-wrapping types that are already StatusOrs.
|
||||
template <typename T>
|
||||
struct WrapStatusOr<::mediapipe::StatusOr<T>> {
|
||||
using type = ::mediapipe::StatusOr<T>;
|
||||
struct WrapStatusOr<mediapipe::StatusOr<T>> {
|
||||
using type = mediapipe::StatusOr<T>;
|
||||
};
|
||||
} // namespace registration_internal
|
||||
|
||||
@@ -196,8 +196,8 @@ class FunctionRegistry {
|
||||
absl::ReaderMutexLock lock(&lock_);
|
||||
auto it = functions_.find(name);
|
||||
if (it == functions_.end()) {
|
||||
return ::mediapipe::NotFoundError("No registered object with name: " +
|
||||
name);
|
||||
return mediapipe::NotFoundError("No registered object with name: " +
|
||||
name);
|
||||
}
|
||||
function = it->second;
|
||||
}
|
||||
@@ -379,12 +379,12 @@ class GlobalFactoryRegistry {
|
||||
|
||||
#define MEDIAPIPE_REGISTER_FACTORY_FUNCTION(RegistryType, name, ...) \
|
||||
static auto* REGISTRY_STATIC_VAR(registration_##name, __LINE__) = \
|
||||
new ::mediapipe::RegistrationToken( \
|
||||
new mediapipe::RegistrationToken( \
|
||||
RegistryType::Register(#name, __VA_ARGS__))
|
||||
|
||||
#define REGISTER_FACTORY_FUNCTION_QUALIFIED(RegistryType, var_name, name, ...) \
|
||||
static auto* REGISTRY_STATIC_VAR(var_name, __LINE__) = \
|
||||
new ::mediapipe::RegistrationToken( \
|
||||
new mediapipe::RegistrationToken( \
|
||||
RegistryType::Register(#name, __VA_ARGS__))
|
||||
|
||||
} // namespace mediapipe
|
||||
|
||||
@@ -16,23 +16,23 @@
|
||||
|
||||
namespace mediapipe {
|
||||
|
||||
::mediapipe::StatusBuilder RetCheckFailSlowPath(
|
||||
::mediapipe::source_location location) {
|
||||
mediapipe::StatusBuilder RetCheckFailSlowPath(
|
||||
mediapipe::source_location location) {
|
||||
// TODO Implement LogWithStackTrace().
|
||||
return ::mediapipe::InternalErrorBuilder(location)
|
||||
return mediapipe::InternalErrorBuilder(location)
|
||||
<< "RET_CHECK failure (" << location.file_name() << ":"
|
||||
<< location.line() << ") ";
|
||||
}
|
||||
|
||||
::mediapipe::StatusBuilder RetCheckFailSlowPath(
|
||||
::mediapipe::source_location location, const char* condition) {
|
||||
return ::mediapipe::RetCheckFailSlowPath(location) << condition;
|
||||
mediapipe::StatusBuilder RetCheckFailSlowPath(
|
||||
mediapipe::source_location location, const char* condition) {
|
||||
return mediapipe::RetCheckFailSlowPath(location) << condition;
|
||||
}
|
||||
|
||||
::mediapipe::StatusBuilder RetCheckFailSlowPath(
|
||||
::mediapipe::source_location location, const char* condition,
|
||||
const ::mediapipe::Status& status) {
|
||||
return ::mediapipe::RetCheckFailSlowPath(location)
|
||||
mediapipe::StatusBuilder RetCheckFailSlowPath(
|
||||
mediapipe::source_location location, const char* condition,
|
||||
const mediapipe::Status& status) {
|
||||
return mediapipe::RetCheckFailSlowPath(location)
|
||||
<< condition << " returned " << status << " ";
|
||||
}
|
||||
|
||||
|
||||
@@ -21,23 +21,23 @@
|
||||
|
||||
namespace mediapipe {
|
||||
// Returns a StatusBuilder that corresponds to a `RET_CHECK` failure.
|
||||
::mediapipe::StatusBuilder RetCheckFailSlowPath(
|
||||
::mediapipe::source_location location);
|
||||
mediapipe::StatusBuilder RetCheckFailSlowPath(
|
||||
mediapipe::source_location location);
|
||||
|
||||
// Returns a StatusBuilder that corresponds to a `RET_CHECK` failure.
|
||||
::mediapipe::StatusBuilder RetCheckFailSlowPath(
|
||||
::mediapipe::source_location location, const char* condition);
|
||||
mediapipe::StatusBuilder RetCheckFailSlowPath(
|
||||
mediapipe::source_location location, const char* condition);
|
||||
|
||||
// Returns a StatusBuilder that corresponds to a `RET_CHECK` failure.
|
||||
::mediapipe::StatusBuilder RetCheckFailSlowPath(
|
||||
::mediapipe::source_location location, const char* condition,
|
||||
const ::mediapipe::Status& status);
|
||||
mediapipe::StatusBuilder RetCheckFailSlowPath(
|
||||
mediapipe::source_location location, const char* condition,
|
||||
const mediapipe::Status& status);
|
||||
|
||||
inline StatusBuilder RetCheckImpl(const ::mediapipe::Status& status,
|
||||
inline StatusBuilder RetCheckImpl(const mediapipe::Status& status,
|
||||
const char* condition,
|
||||
::mediapipe::source_location location) {
|
||||
mediapipe::source_location location) {
|
||||
if (ABSL_PREDICT_TRUE(status.ok()))
|
||||
return ::mediapipe::StatusBuilder(OkStatus(), location);
|
||||
return mediapipe::StatusBuilder(OkStatus(), location);
|
||||
return RetCheckFailSlowPath(location, condition, status);
|
||||
}
|
||||
|
||||
@@ -45,13 +45,12 @@ inline StatusBuilder RetCheckImpl(const ::mediapipe::Status& status,
|
||||
|
||||
#define RET_CHECK(cond) \
|
||||
while (ABSL_PREDICT_FALSE(!(cond))) \
|
||||
return ::mediapipe::RetCheckFailSlowPath(MEDIAPIPE_LOC, #cond)
|
||||
return mediapipe::RetCheckFailSlowPath(MEDIAPIPE_LOC, #cond)
|
||||
|
||||
#define RET_CHECK_OK(status) \
|
||||
MP_RETURN_IF_ERROR( \
|
||||
::mediapipe::RetCheckImpl((status), #status, MEDIAPIPE_LOC))
|
||||
MP_RETURN_IF_ERROR(mediapipe::RetCheckImpl((status), #status, MEDIAPIPE_LOC))
|
||||
|
||||
#define RET_CHECK_FAIL() return ::mediapipe::RetCheckFailSlowPath(MEDIAPIPE_LOC)
|
||||
#define RET_CHECK_FAIL() return mediapipe::RetCheckFailSlowPath(MEDIAPIPE_LOC)
|
||||
|
||||
#define MEDIAPIPE_INTERNAL_RET_CHECK_OP(name, op, lhs, rhs) \
|
||||
RET_CHECK((lhs)op(rhs))
|
||||
|
||||
@@ -302,9 +302,9 @@ struct LogFatalOnError {
|
||||
// type is created per type_name.
|
||||
#define MEDIAPIPE_DEFINE_SAFE_INT_TYPE(type_name, value_type, policy_type) \
|
||||
struct type_name##_safe_tag_ {}; \
|
||||
typedef ::mediapipe::intops::StrongInt< \
|
||||
typedef mediapipe::intops::StrongInt< \
|
||||
type_name##_safe_tag_, value_type, \
|
||||
::mediapipe::intops::SafeIntStrongIntValidator<policy_type>> \
|
||||
mediapipe::intops::SafeIntStrongIntValidator<policy_type>> \
|
||||
type_name;
|
||||
|
||||
#endif // MEDIAPIPE_DEPS_SAFE_INT_H_
|
||||
|
||||
@@ -21,21 +21,21 @@
|
||||
#include "mediapipe/framework/port/gtest.h"
|
||||
|
||||
MEDIAPIPE_DEFINE_SAFE_INT_TYPE(SafeInt8, int8,
|
||||
::mediapipe::intops::LogFatalOnError);
|
||||
mediapipe::intops::LogFatalOnError);
|
||||
MEDIAPIPE_DEFINE_SAFE_INT_TYPE(SafeUInt8, uint8,
|
||||
::mediapipe::intops::LogFatalOnError);
|
||||
mediapipe::intops::LogFatalOnError);
|
||||
MEDIAPIPE_DEFINE_SAFE_INT_TYPE(SafeInt16, int16,
|
||||
::mediapipe::intops::LogFatalOnError);
|
||||
mediapipe::intops::LogFatalOnError);
|
||||
MEDIAPIPE_DEFINE_SAFE_INT_TYPE(SafeUInt16, uint16,
|
||||
::mediapipe::intops::LogFatalOnError);
|
||||
mediapipe::intops::LogFatalOnError);
|
||||
MEDIAPIPE_DEFINE_SAFE_INT_TYPE(SafeInt32, int32,
|
||||
::mediapipe::intops::LogFatalOnError);
|
||||
mediapipe::intops::LogFatalOnError);
|
||||
MEDIAPIPE_DEFINE_SAFE_INT_TYPE(SafeInt64, int64,
|
||||
::mediapipe::intops::LogFatalOnError);
|
||||
mediapipe::intops::LogFatalOnError);
|
||||
MEDIAPIPE_DEFINE_SAFE_INT_TYPE(SafeUInt32, uint32,
|
||||
::mediapipe::intops::LogFatalOnError);
|
||||
mediapipe::intops::LogFatalOnError);
|
||||
MEDIAPIPE_DEFINE_SAFE_INT_TYPE(SafeUInt64, uint64,
|
||||
::mediapipe::intops::LogFatalOnError);
|
||||
mediapipe::intops::LogFatalOnError);
|
||||
|
||||
namespace mediapipe {
|
||||
namespace intops {
|
||||
|
||||
@@ -59,6 +59,6 @@ class source_location {
|
||||
|
||||
// If a function takes a source_location parameter, pass this as the argument.
|
||||
#define MEDIAPIPE_LOC \
|
||||
::mediapipe::source_location::DoNotInvokeDirectly(__LINE__, __FILE__)
|
||||
mediapipe::source_location::DoNotInvokeDirectly(__LINE__, __FILE__)
|
||||
|
||||
#endif // MEDIAPIPE_DEPS_SOURCE_LOCATION_H_
|
||||
|
||||
@@ -23,7 +23,7 @@ std::ostream& operator<<(std::ostream& os, const Status& x) {
|
||||
return os;
|
||||
}
|
||||
|
||||
std::string* MediaPipeCheckOpHelperOutOfLine(const ::mediapipe::Status& v,
|
||||
std::string* MediaPipeCheckOpHelperOutOfLine(const mediapipe::Status& v,
|
||||
const char* msg) {
|
||||
std::string r("Non-OK-status: ");
|
||||
r += msg;
|
||||
|
||||
@@ -29,24 +29,21 @@ namespace mediapipe {
|
||||
using Status = absl::Status;
|
||||
using StatusCode = absl::StatusCode;
|
||||
|
||||
inline ::mediapipe::Status OkStatus() { return absl::OkStatus(); }
|
||||
inline mediapipe::Status OkStatus() { return absl::OkStatus(); }
|
||||
|
||||
extern std::string* MediaPipeCheckOpHelperOutOfLine(
|
||||
const ::mediapipe::Status& v, const char* msg);
|
||||
extern std::string* MediaPipeCheckOpHelperOutOfLine(const mediapipe::Status& v,
|
||||
const char* msg);
|
||||
|
||||
inline std::string* MediaPipeCheckOpHelper(::mediapipe::Status v,
|
||||
inline std::string* MediaPipeCheckOpHelper(mediapipe::Status v,
|
||||
const char* msg) {
|
||||
if (v.ok()) return nullptr;
|
||||
return MediaPipeCheckOpHelperOutOfLine(v, msg);
|
||||
}
|
||||
|
||||
#define MEDIAPIPE_DO_CHECK_OK(val, level) \
|
||||
while (auto _result = ::mediapipe::MediaPipeCheckOpHelper(val, #val)) \
|
||||
#define MEDIAPIPE_DO_CHECK_OK(val, level) \
|
||||
while (auto _result = mediapipe::MediaPipeCheckOpHelper(val, #val)) \
|
||||
LOG(level) << *(_result)
|
||||
|
||||
// To be consistent with MP_EXPECT_OK, we add prefix MEDIAPIPE_ to
|
||||
// CHECK_OK, QCHECK_OK, and DCHECK_OK. We prefer to use the marcos with
|
||||
// MEDIAPIPE_ prefix in mediapipe's codebase.
|
||||
#define MEDIAPIPE_CHECK_OK(val) MEDIAPIPE_DO_CHECK_OK(val, FATAL)
|
||||
#define MEDIAPIPE_QCHECK_OK(val) MEDIAPIPE_DO_CHECK_OK(val, QFATAL)
|
||||
|
||||
@@ -54,9 +51,13 @@ inline std::string* MediaPipeCheckOpHelper(::mediapipe::Status v,
|
||||
#define MEDIAPIPE_DCHECK_OK(val) MEDIAPIPE_CHECK_OK(val)
|
||||
#else
|
||||
#define MEDIAPIPE_DCHECK_OK(val) \
|
||||
while (false && (::mediapipe::OkStatus() == (val))) LOG(FATAL)
|
||||
while (false && (mediapipe::OkStatus() == (val))) LOG(FATAL)
|
||||
#endif
|
||||
|
||||
#define CHECK_OK MEDIAPIPE_CHECK_OK
|
||||
#define QCHECK_OK MEDIAPIPE_QCHECK_OK
|
||||
#define DCHECK_OK MEDIAPIPE_DCHECK_OK
|
||||
|
||||
} // namespace mediapipe
|
||||
|
||||
#endif // MEDIAPIPE_DEPS_STATUS_H_
|
||||
|
||||
@@ -68,7 +68,7 @@ StatusBuilder::operator Status() && {
|
||||
return JoinMessageToStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status StatusBuilder::JoinMessageToStatus() {
|
||||
mediapipe::Status StatusBuilder::JoinMessageToStatus() {
|
||||
std::string message;
|
||||
if (join_style_ == MessageJoinStyle::kAnnotate) {
|
||||
if (!status_.ok()) {
|
||||
|
||||
@@ -30,15 +30,15 @@ class ABSL_MUST_USE_RESULT StatusBuilder {
|
||||
// Creates a `StatusBuilder` based on an original status. If logging is
|
||||
// enabled, it will use `location` as the location from which the log message
|
||||
// occurs. A typical user will call this with `MEDIAPIPE_LOC`.
|
||||
StatusBuilder(const ::mediapipe::Status& original_status,
|
||||
::mediapipe::source_location location)
|
||||
StatusBuilder(const mediapipe::Status& original_status,
|
||||
mediapipe::source_location location)
|
||||
: status_(original_status),
|
||||
line_(location.line()),
|
||||
file_(location.file_name()),
|
||||
stream_(new std::ostringstream) {}
|
||||
|
||||
StatusBuilder(::mediapipe::Status&& original_status,
|
||||
::mediapipe::source_location location)
|
||||
StatusBuilder(mediapipe::Status&& original_status,
|
||||
mediapipe::source_location location)
|
||||
: status_(std::move(original_status)),
|
||||
line_(location.line()),
|
||||
file_(location.file_name()),
|
||||
@@ -47,14 +47,13 @@ class ABSL_MUST_USE_RESULT StatusBuilder {
|
||||
// Creates a `StatusBuilder` from a mediapipe status code. If logging is
|
||||
// enabled, it will use `location` as the location from which the log message
|
||||
// occurs. A typical user will call this with `MEDIAPIPE_LOC`.
|
||||
StatusBuilder(::mediapipe::StatusCode code,
|
||||
::mediapipe::source_location location)
|
||||
StatusBuilder(mediapipe::StatusCode code, mediapipe::source_location location)
|
||||
: status_(code, ""),
|
||||
line_(location.line()),
|
||||
file_(location.file_name()),
|
||||
stream_(new std::ostringstream) {}
|
||||
|
||||
StatusBuilder(const ::mediapipe::Status& original_status, const char* file,
|
||||
StatusBuilder(const mediapipe::Status& original_status, const char* file,
|
||||
int line)
|
||||
: status_(original_status),
|
||||
line_(line),
|
||||
@@ -79,7 +78,7 @@ class ABSL_MUST_USE_RESULT StatusBuilder {
|
||||
operator Status() const&;
|
||||
operator Status() &&;
|
||||
|
||||
::mediapipe::Status JoinMessageToStatus();
|
||||
mediapipe::Status JoinMessageToStatus();
|
||||
|
||||
private:
|
||||
// Specifies how to join the error message in the original status and any
|
||||
@@ -91,7 +90,7 @@ class ABSL_MUST_USE_RESULT StatusBuilder {
|
||||
};
|
||||
|
||||
// The status that the result will be based on.
|
||||
::mediapipe::Status status_;
|
||||
mediapipe::Status status_;
|
||||
// The line to record if this file is logged.
|
||||
int line_;
|
||||
// Not-owned: The file to record if this status is logged.
|
||||
@@ -104,43 +103,40 @@ class ABSL_MUST_USE_RESULT StatusBuilder {
|
||||
};
|
||||
|
||||
inline StatusBuilder AlreadyExistsErrorBuilder(
|
||||
::mediapipe::source_location location) {
|
||||
return StatusBuilder(::mediapipe::StatusCode::kAlreadyExists, location);
|
||||
mediapipe::source_location location) {
|
||||
return StatusBuilder(mediapipe::StatusCode::kAlreadyExists, location);
|
||||
}
|
||||
|
||||
inline StatusBuilder FailedPreconditionErrorBuilder(
|
||||
::mediapipe::source_location location) {
|
||||
return StatusBuilder(::mediapipe::StatusCode::kFailedPrecondition, location);
|
||||
mediapipe::source_location location) {
|
||||
return StatusBuilder(mediapipe::StatusCode::kFailedPrecondition, location);
|
||||
}
|
||||
|
||||
inline StatusBuilder InternalErrorBuilder(
|
||||
::mediapipe::source_location location) {
|
||||
return StatusBuilder(::mediapipe::StatusCode::kInternal, location);
|
||||
inline StatusBuilder InternalErrorBuilder(mediapipe::source_location location) {
|
||||
return StatusBuilder(mediapipe::StatusCode::kInternal, location);
|
||||
}
|
||||
|
||||
inline StatusBuilder InvalidArgumentErrorBuilder(
|
||||
::mediapipe::source_location location) {
|
||||
return StatusBuilder(::mediapipe::StatusCode::kInvalidArgument, location);
|
||||
mediapipe::source_location location) {
|
||||
return StatusBuilder(mediapipe::StatusCode::kInvalidArgument, location);
|
||||
}
|
||||
|
||||
inline StatusBuilder NotFoundErrorBuilder(
|
||||
::mediapipe::source_location location) {
|
||||
return StatusBuilder(::mediapipe::StatusCode::kNotFound, location);
|
||||
inline StatusBuilder NotFoundErrorBuilder(mediapipe::source_location location) {
|
||||
return StatusBuilder(mediapipe::StatusCode::kNotFound, location);
|
||||
}
|
||||
|
||||
inline StatusBuilder UnavailableErrorBuilder(
|
||||
::mediapipe::source_location location) {
|
||||
return StatusBuilder(::mediapipe::StatusCode::kUnavailable, location);
|
||||
mediapipe::source_location location) {
|
||||
return StatusBuilder(mediapipe::StatusCode::kUnavailable, location);
|
||||
}
|
||||
|
||||
inline StatusBuilder UnimplementedErrorBuilder(
|
||||
::mediapipe::source_location location) {
|
||||
return StatusBuilder(::mediapipe::StatusCode::kUnimplemented, location);
|
||||
mediapipe::source_location location) {
|
||||
return StatusBuilder(mediapipe::StatusCode::kUnimplemented, location);
|
||||
}
|
||||
|
||||
inline StatusBuilder UnknownErrorBuilder(
|
||||
::mediapipe::source_location location) {
|
||||
return StatusBuilder(::mediapipe::StatusCode::kUnknown, location);
|
||||
inline StatusBuilder UnknownErrorBuilder(mediapipe::source_location location) {
|
||||
return StatusBuilder(mediapipe::StatusCode::kUnknown, location);
|
||||
}
|
||||
|
||||
} // namespace mediapipe
|
||||
|
||||
@@ -19,55 +19,54 @@
|
||||
namespace mediapipe {
|
||||
|
||||
TEST(StatusBuilder, AnnotateMode) {
|
||||
::mediapipe::Status status =
|
||||
StatusBuilder(::mediapipe::Status(::mediapipe::StatusCode::kNotFound,
|
||||
"original message"),
|
||||
mediapipe::Status status =
|
||||
StatusBuilder(mediapipe::Status(mediapipe::StatusCode::kNotFound,
|
||||
"original message"),
|
||||
MEDIAPIPE_LOC)
|
||||
<< "annotated message1 "
|
||||
<< "annotated message2";
|
||||
ASSERT_FALSE(status.ok());
|
||||
EXPECT_EQ(status.code(), ::mediapipe::StatusCode::kNotFound);
|
||||
EXPECT_EQ(status.code(), mediapipe::StatusCode::kNotFound);
|
||||
EXPECT_EQ(status.message(),
|
||||
"original message; annotated message1 annotated message2");
|
||||
}
|
||||
|
||||
TEST(StatusBuilder, PrependMode) {
|
||||
::mediapipe::Status status =
|
||||
StatusBuilder(
|
||||
::mediapipe::Status(::mediapipe::StatusCode::kInvalidArgument,
|
||||
"original message"),
|
||||
MEDIAPIPE_LOC)
|
||||
mediapipe::Status status =
|
||||
StatusBuilder(mediapipe::Status(mediapipe::StatusCode::kInvalidArgument,
|
||||
"original message"),
|
||||
MEDIAPIPE_LOC)
|
||||
.SetPrepend()
|
||||
<< "prepended message1 "
|
||||
<< "prepended message2 ";
|
||||
ASSERT_FALSE(status.ok());
|
||||
EXPECT_EQ(status.code(), ::mediapipe::StatusCode::kInvalidArgument);
|
||||
EXPECT_EQ(status.code(), mediapipe::StatusCode::kInvalidArgument);
|
||||
EXPECT_EQ(status.message(),
|
||||
"prepended message1 prepended message2 original message");
|
||||
}
|
||||
|
||||
TEST(StatusBuilder, AppendMode) {
|
||||
::mediapipe::Status status =
|
||||
StatusBuilder(::mediapipe::Status(::mediapipe::StatusCode::kInternal,
|
||||
"original message"),
|
||||
mediapipe::Status status =
|
||||
StatusBuilder(mediapipe::Status(mediapipe::StatusCode::kInternal,
|
||||
"original message"),
|
||||
MEDIAPIPE_LOC)
|
||||
.SetAppend()
|
||||
<< " extra message1"
|
||||
<< " extra message2";
|
||||
ASSERT_FALSE(status.ok());
|
||||
EXPECT_EQ(status.code(), ::mediapipe::StatusCode::kInternal);
|
||||
EXPECT_EQ(status.code(), mediapipe::StatusCode::kInternal);
|
||||
EXPECT_EQ(status.message(), "original message extra message1 extra message2");
|
||||
}
|
||||
|
||||
TEST(StatusBuilder, NoLoggingMode) {
|
||||
::mediapipe::Status status =
|
||||
StatusBuilder(::mediapipe::Status(::mediapipe::StatusCode::kUnavailable,
|
||||
"original message"),
|
||||
mediapipe::Status status =
|
||||
StatusBuilder(mediapipe::Status(mediapipe::StatusCode::kUnavailable,
|
||||
"original message"),
|
||||
MEDIAPIPE_LOC)
|
||||
.SetNoLogging()
|
||||
<< " extra message";
|
||||
ASSERT_FALSE(status.ok());
|
||||
EXPECT_EQ(status.code(), ::mediapipe::StatusCode::kUnavailable);
|
||||
EXPECT_EQ(status.code(), mediapipe::StatusCode::kUnavailable);
|
||||
EXPECT_EQ(status.message(), "original message");
|
||||
}
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
// limitations under the License.
|
||||
//
|
||||
// Helper macros and methods to return and propagate errors with
|
||||
// `::mediapipe::Status`.
|
||||
// `mediapipe::Status`.
|
||||
//
|
||||
// The owners of mediapipe do not endorse use of these macros as a good
|
||||
// programming practice, and would prefer that you write the equivalent C++
|
||||
@@ -26,29 +26,29 @@
|
||||
#include "mediapipe/framework/deps/status.h"
|
||||
#include "mediapipe/framework/deps/status_builder.h"
|
||||
|
||||
// Evaluates an expression that produces a `::mediapipe::Status`. If the status
|
||||
// Evaluates an expression that produces a `mediapipe::Status`. If the status
|
||||
// is not ok, returns it from the current function.
|
||||
//
|
||||
// For example:
|
||||
// ::mediapipe::Status MultiStepFunction() {
|
||||
// mediapipe::Status MultiStepFunction() {
|
||||
// MP_RETURN_IF_ERROR(Function(args...));
|
||||
// MP_RETURN_IF_ERROR(foo.Method(args...));
|
||||
// return ::mediapipe::OkStatus();
|
||||
// return mediapipe::OkStatus();
|
||||
// }
|
||||
//
|
||||
// The macro ends with a `::mediapipe::StatusBuilder` which allows the returned
|
||||
// The macro ends with a `mediapipe::StatusBuilder` which allows the returned
|
||||
// status to be extended with more details. Any chained expressions after the
|
||||
// macro will not be evaluated unless there is an error.
|
||||
//
|
||||
// For example:
|
||||
// ::mediapipe::Status MultiStepFunction() {
|
||||
// mediapipe::Status MultiStepFunction() {
|
||||
// MP_RETURN_IF_ERROR(Function(args...)) << "in MultiStepFunction";
|
||||
// MP_RETURN_IF_ERROR(foo.Method(args...)).Log(base_logging::ERROR)
|
||||
// << "while processing query: " << query.DebugString();
|
||||
// return ::mediapipe::OkStatus();
|
||||
// return mediapipe::OkStatus();
|
||||
// }
|
||||
//
|
||||
// `::mediapipe::StatusBuilder` supports adapting the builder chain using a
|
||||
// `mediapipe::StatusBuilder` supports adapting the builder chain using a
|
||||
// `With` method and a functor. This allows for powerful extensions to the
|
||||
// macro.
|
||||
//
|
||||
@@ -62,10 +62,10 @@
|
||||
// MP_RETURN_IF_ERROR(bar()).With(TeamPolicy);
|
||||
//
|
||||
// Changing the return type allows the macro to be used with Task and Rpc
|
||||
// interfaces. See `::mediapipe::TaskReturn` and `rpc::RpcSetStatus` for
|
||||
// interfaces. See `mediapipe::TaskReturn` and `rpc::RpcSetStatus` for
|
||||
// details.
|
||||
//
|
||||
// void Read(StringPiece name, ::mediapipe::Task* task) {
|
||||
// void Read(StringPiece name, mediapipe::Task* task) {
|
||||
// int64 id;
|
||||
// MP_RETURN_IF_ERROR(GetIdForName(name, &id)).With(TaskReturn(task));
|
||||
// MP_RETURN_IF_ERROR(ReadForId(id)).With(TaskReturn(task));
|
||||
@@ -73,22 +73,22 @@
|
||||
// }
|
||||
//
|
||||
// If using this macro inside a lambda, you need to annotate the return type
|
||||
// to avoid confusion between a `::mediapipe::StatusBuilder` and a
|
||||
// `::mediapipe::Status` type. E.g.
|
||||
// to avoid confusion between a `mediapipe::StatusBuilder` and a
|
||||
// `mediapipe::Status` type. E.g.
|
||||
//
|
||||
// []() -> ::mediapipe::Status {
|
||||
// []() -> mediapipe::Status {
|
||||
// MP_RETURN_IF_ERROR(Function(args...));
|
||||
// MP_RETURN_IF_ERROR(foo.Method(args...));
|
||||
// return ::mediapipe::OkStatus();
|
||||
// return mediapipe::OkStatus();
|
||||
// }
|
||||
#define MP_RETURN_IF_ERROR(expr) \
|
||||
STATUS_MACROS_IMPL_ELSE_BLOCKER_ \
|
||||
if (::mediapipe::status_macro_internal::StatusAdaptorForMacros \
|
||||
if (mediapipe::status_macro_internal::StatusAdaptorForMacros \
|
||||
status_macro_internal_adaptor = {(expr), __FILE__, __LINE__}) { \
|
||||
} else /* NOLINT */ \
|
||||
return status_macro_internal_adaptor.Consume()
|
||||
|
||||
// Executes an expression `rexpr` that returns a `::mediapipe::StatusOr<T>`. On
|
||||
// Executes an expression `rexpr` that returns a `mediapipe::StatusOr<T>`. On
|
||||
// OK, extracts its value into the variable defined by `lhs`, otherwise returns
|
||||
// from the current function. By default the error status is returned
|
||||
// unchanged, but it may be modified by an `error_expression`. If there is an
|
||||
@@ -121,7 +121,7 @@
|
||||
//
|
||||
// If passed, the `error_expression` is evaluated to produce the return
|
||||
// value. The expression may reference any variable visible in scope, as
|
||||
// well as a `::mediapipe::StatusBuilder` object populated with the error and
|
||||
// well as a `mediapipe::StatusBuilder` object populated with the error and
|
||||
// named by a single underscore `_`. The expression typically uses the
|
||||
// builder to modify the status and is returned directly in manner similar
|
||||
// to MP_RETURN_IF_ERROR. The expression may, however, evaluate to any type
|
||||
@@ -156,15 +156,15 @@
|
||||
STATUS_MACROS_IMPL_ASSIGN_OR_RETURN_( \
|
||||
STATUS_MACROS_IMPL_CONCAT_(_status_or_value, __LINE__), lhs, rexpr, \
|
||||
error_expression)
|
||||
#define STATUS_MACROS_IMPL_ASSIGN_OR_RETURN_(statusor, lhs, rexpr, \
|
||||
error_expression) \
|
||||
auto statusor = (rexpr); \
|
||||
if (ABSL_PREDICT_FALSE(!statusor.ok())) { \
|
||||
::mediapipe::StatusBuilder _(std::move(statusor).status(), __FILE__, \
|
||||
__LINE__); \
|
||||
(void)_; /* error_expression is allowed to not use this variable */ \
|
||||
return (error_expression); \
|
||||
} \
|
||||
#define STATUS_MACROS_IMPL_ASSIGN_OR_RETURN_(statusor, lhs, rexpr, \
|
||||
error_expression) \
|
||||
auto statusor = (rexpr); \
|
||||
if (ABSL_PREDICT_FALSE(!statusor.ok())) { \
|
||||
mediapipe::StatusBuilder _(std::move(statusor).status(), __FILE__, \
|
||||
__LINE__); \
|
||||
(void)_; /* error_expression is allowed to not use this variable */ \
|
||||
return (error_expression); \
|
||||
} \
|
||||
lhs = std::move(statusor).ValueOrDie()
|
||||
|
||||
// Internal helper for concatenating macro values.
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
namespace mediapipe {
|
||||
|
||||
TEST(Status, OK) {
|
||||
EXPECT_EQ(OkStatus().code(), ::mediapipe::StatusCode::kOk);
|
||||
EXPECT_EQ(OkStatus().code(), mediapipe::StatusCode::kOk);
|
||||
EXPECT_EQ(OkStatus().message(), "");
|
||||
MP_EXPECT_OK(OkStatus());
|
||||
MP_ASSERT_OK(OkStatus());
|
||||
@@ -30,25 +30,25 @@ TEST(Status, OK) {
|
||||
}
|
||||
|
||||
TEST(DeathStatus, CheckOK) {
|
||||
Status status(::mediapipe::StatusCode::kInvalidArgument, "Invalid");
|
||||
Status status(mediapipe::StatusCode::kInvalidArgument, "Invalid");
|
||||
ASSERT_DEATH(MEDIAPIPE_CHECK_OK(status), "Invalid");
|
||||
}
|
||||
|
||||
TEST(Status, Set) {
|
||||
Status status;
|
||||
status = Status(::mediapipe::StatusCode::kCancelled, "Error message");
|
||||
EXPECT_EQ(status.code(), ::mediapipe::StatusCode::kCancelled);
|
||||
status = Status(mediapipe::StatusCode::kCancelled, "Error message");
|
||||
EXPECT_EQ(status.code(), mediapipe::StatusCode::kCancelled);
|
||||
EXPECT_EQ(status.message(), "Error message");
|
||||
}
|
||||
|
||||
TEST(Status, Copy) {
|
||||
Status a(::mediapipe::StatusCode::kInvalidArgument, "Invalid");
|
||||
Status a(mediapipe::StatusCode::kInvalidArgument, "Invalid");
|
||||
Status b(a);
|
||||
ASSERT_EQ(a.ToString(), b.ToString());
|
||||
}
|
||||
|
||||
TEST(Status, Assign) {
|
||||
Status a(::mediapipe::StatusCode::kInvalidArgument, "Invalid");
|
||||
Status a(mediapipe::StatusCode::kInvalidArgument, "Invalid");
|
||||
Status b;
|
||||
b = a;
|
||||
ASSERT_EQ(a.ToString(), b.ToString());
|
||||
@@ -58,10 +58,10 @@ TEST(Status, Update) {
|
||||
Status s;
|
||||
s.Update(OkStatus());
|
||||
ASSERT_TRUE(s.ok());
|
||||
Status a(::mediapipe::StatusCode::kInvalidArgument, "Invalid");
|
||||
Status a(mediapipe::StatusCode::kInvalidArgument, "Invalid");
|
||||
s.Update(a);
|
||||
ASSERT_EQ(s.ToString(), a.ToString());
|
||||
Status b(::mediapipe::StatusCode::kInternal, "Invalid");
|
||||
Status b(mediapipe::StatusCode::kInternal, "Invalid");
|
||||
s.Update(b);
|
||||
ASSERT_EQ(s.ToString(), a.ToString());
|
||||
s.Update(OkStatus());
|
||||
@@ -72,26 +72,26 @@ TEST(Status, Update) {
|
||||
TEST(Status, EqualsOK) { ASSERT_EQ(OkStatus(), Status()); }
|
||||
|
||||
TEST(Status, EqualsSame) {
|
||||
Status a(::mediapipe::StatusCode::kInvalidArgument, "Invalid");
|
||||
Status b(::mediapipe::StatusCode::kInvalidArgument, "Invalid");
|
||||
Status a(mediapipe::StatusCode::kInvalidArgument, "Invalid");
|
||||
Status b(mediapipe::StatusCode::kInvalidArgument, "Invalid");
|
||||
ASSERT_EQ(a, b);
|
||||
}
|
||||
|
||||
TEST(Status, EqualsCopy) {
|
||||
const Status a(::mediapipe::StatusCode::kInvalidArgument, "Invalid");
|
||||
const Status a(mediapipe::StatusCode::kInvalidArgument, "Invalid");
|
||||
const Status b = a;
|
||||
ASSERT_EQ(a, b);
|
||||
}
|
||||
|
||||
TEST(Status, EqualsDifferentCode) {
|
||||
const Status a(::mediapipe::StatusCode::kInvalidArgument, "Invalid");
|
||||
const Status b(::mediapipe::StatusCode::kInternal, "Internal");
|
||||
const Status a(mediapipe::StatusCode::kInvalidArgument, "Invalid");
|
||||
const Status b(mediapipe::StatusCode::kInternal, "Internal");
|
||||
ASSERT_NE(a, b);
|
||||
}
|
||||
|
||||
TEST(Status, EqualsDifferentMessage) {
|
||||
const Status a(::mediapipe::StatusCode::kInvalidArgument, "message");
|
||||
const Status b(::mediapipe::StatusCode::kInvalidArgument, "another");
|
||||
const Status a(mediapipe::StatusCode::kInvalidArgument, "message");
|
||||
const Status b(mediapipe::StatusCode::kInvalidArgument, "another");
|
||||
ASSERT_NE(a, b);
|
||||
}
|
||||
|
||||
|
||||
@@ -22,14 +22,14 @@
|
||||
namespace mediapipe {
|
||||
namespace internal_statusor {
|
||||
|
||||
void Helper::HandleInvalidStatusCtorArg(::mediapipe::Status* status) {
|
||||
void Helper::HandleInvalidStatusCtorArg(mediapipe::Status* status) {
|
||||
const char* kMessage =
|
||||
"An OK status is not a valid constructor argument to StatusOr<T>";
|
||||
LOG(ERROR) << kMessage;
|
||||
*status = ::mediapipe::InternalError(kMessage);
|
||||
*status = mediapipe::InternalError(kMessage);
|
||||
}
|
||||
|
||||
void Helper::Crash(const ::mediapipe::Status& status) {
|
||||
void Helper::Crash(const mediapipe::Status& status) {
|
||||
LOG(FATAL) << "Attempting to fetch value instead of handling error "
|
||||
<< status;
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
//
|
||||
// Example client usage for a StatusOr<T>, where T is not a pointer:
|
||||
//
|
||||
// ::mediapipe::StatusOr<float> result = DoBigCalculationThatCouldFail();
|
||||
// mediapipe::StatusOr<float> result = DoBigCalculationThatCouldFail();
|
||||
// if (result.ok()) {
|
||||
// float answer = result.ValueOrDie();
|
||||
// printf("Big calculation yielded: %f", answer);
|
||||
@@ -35,7 +35,7 @@
|
||||
//
|
||||
// Example client usage for a StatusOr<T*>:
|
||||
//
|
||||
// ::mediapipe::StatusOr<Foo*> result = FooFactory::MakeNewFoo(arg);
|
||||
// mediapipe::StatusOr<Foo*> result = FooFactory::MakeNewFoo(arg);
|
||||
// if (result.ok()) {
|
||||
// std::unique_ptr<Foo> foo(result.ValueOrDie());
|
||||
// foo->DoSomethingCool();
|
||||
@@ -45,7 +45,7 @@
|
||||
//
|
||||
// Example client usage for a StatusOr<std::unique_ptr<T>>:
|
||||
//
|
||||
// ::mediapipe::StatusOr<std::unique_ptr<Foo>> result =
|
||||
// mediapipe::StatusOr<std::unique_ptr<Foo>> result =
|
||||
// FooFactory::MakeNewFoo(arg);
|
||||
// if (result.ok()) {
|
||||
// std::unique_ptr<Foo> foo = std::move(result.ValueOrDie());
|
||||
@@ -56,9 +56,9 @@
|
||||
//
|
||||
// Example factory implementation returning StatusOr<T*>:
|
||||
//
|
||||
// ::mediapipe::StatusOr<Foo*> FooFactory::MakeNewFoo(int arg) {
|
||||
// mediapipe::StatusOr<Foo*> FooFactory::MakeNewFoo(int arg) {
|
||||
// if (arg <= 0) {
|
||||
// return ::mediapipe::InvalidArgumentError("Arg must be positive");
|
||||
// return mediapipe::InvalidArgumentError("Arg must be positive");
|
||||
// } else {
|
||||
// return new Foo(arg);
|
||||
// }
|
||||
@@ -148,11 +148,11 @@ class StatusOr : private internal_statusor::StatusOrData<T>,
|
||||
//
|
||||
// REQUIRES: !status.ok(). This requirement is DCHECKed.
|
||||
// In optimized builds, passing Status::OK() here will have the effect
|
||||
// of passing ::mediapipe::StatusCode::kInternal as a fallback.
|
||||
StatusOr(const ::mediapipe::Status& status);
|
||||
StatusOr& operator=(const ::mediapipe::Status& status);
|
||||
StatusOr(const ::mediapipe::StatusBuilder& builder);
|
||||
StatusOr& operator=(const ::mediapipe::StatusBuilder& builder);
|
||||
// of passing mediapipe::StatusCode::kInternal as a fallback.
|
||||
StatusOr(const mediapipe::Status& status);
|
||||
StatusOr& operator=(const mediapipe::Status& status);
|
||||
StatusOr(const mediapipe::StatusBuilder& builder);
|
||||
StatusOr& operator=(const mediapipe::StatusBuilder& builder);
|
||||
|
||||
// TODO: Add operator=(T) overloads.
|
||||
|
||||
@@ -162,18 +162,18 @@ class StatusOr : private internal_statusor::StatusOrData<T>,
|
||||
StatusOr(T&& value);
|
||||
|
||||
// RValue versions of the operations declared above.
|
||||
StatusOr(::mediapipe::Status&& status);
|
||||
StatusOr& operator=(::mediapipe::Status&& status);
|
||||
StatusOr(::mediapipe::StatusBuilder&& builder);
|
||||
StatusOr& operator=(::mediapipe::StatusBuilder&& builder);
|
||||
StatusOr(mediapipe::Status&& status);
|
||||
StatusOr& operator=(mediapipe::Status&& status);
|
||||
StatusOr(mediapipe::StatusBuilder&& builder);
|
||||
StatusOr& operator=(mediapipe::StatusBuilder&& builder);
|
||||
|
||||
// Returns this->status().ok()
|
||||
bool ok() const { return this->status_.ok(); }
|
||||
|
||||
// Returns a reference to mediapipe status. If this contains a T, then
|
||||
// returns Status::OK().
|
||||
const ::mediapipe::Status& status() const&;
|
||||
::mediapipe::Status status() &&;
|
||||
const mediapipe::Status& status() const&;
|
||||
mediapipe::Status status() &&;
|
||||
|
||||
// Returns a reference to our current value, or CHECK-fails if !this->ok().
|
||||
//
|
||||
@@ -213,48 +213,48 @@ class StatusOr : private internal_statusor::StatusOrData<T>,
|
||||
|
||||
template <typename T>
|
||||
StatusOr<T>::StatusOr()
|
||||
: Base(::mediapipe::Status(::mediapipe::StatusCode::kUnknown, "")) {}
|
||||
: Base(mediapipe::Status(mediapipe::StatusCode::kUnknown, "")) {}
|
||||
|
||||
template <typename T>
|
||||
StatusOr<T>::StatusOr(const T& value) : Base(value) {}
|
||||
|
||||
template <typename T>
|
||||
StatusOr<T>::StatusOr(const ::mediapipe::Status& status) : Base(status) {}
|
||||
StatusOr<T>::StatusOr(const mediapipe::Status& status) : Base(status) {}
|
||||
|
||||
template <typename T>
|
||||
StatusOr<T>::StatusOr(const ::mediapipe::StatusBuilder& builder)
|
||||
StatusOr<T>::StatusOr(const mediapipe::StatusBuilder& builder)
|
||||
: Base(builder) {}
|
||||
|
||||
template <typename T>
|
||||
StatusOr<T>& StatusOr<T>::operator=(const ::mediapipe::Status& status) {
|
||||
StatusOr<T>& StatusOr<T>::operator=(const mediapipe::Status& status) {
|
||||
this->Assign(status);
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
StatusOr<T>& StatusOr<T>::operator=(const ::mediapipe::StatusBuilder& builder) {
|
||||
return *this = static_cast<::mediapipe::Status>(builder);
|
||||
StatusOr<T>& StatusOr<T>::operator=(const mediapipe::StatusBuilder& builder) {
|
||||
return *this = static_cast<mediapipe::Status>(builder);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
StatusOr<T>::StatusOr(T&& value) : Base(std::move(value)) {}
|
||||
|
||||
template <typename T>
|
||||
StatusOr<T>::StatusOr(::mediapipe::Status&& status) : Base(std::move(status)) {}
|
||||
StatusOr<T>::StatusOr(mediapipe::Status&& status) : Base(std::move(status)) {}
|
||||
|
||||
template <typename T>
|
||||
StatusOr<T>::StatusOr(::mediapipe::StatusBuilder&& builder)
|
||||
StatusOr<T>::StatusOr(mediapipe::StatusBuilder&& builder)
|
||||
: Base(std::move(builder)) {}
|
||||
|
||||
template <typename T>
|
||||
StatusOr<T>& StatusOr<T>::operator=(::mediapipe::Status&& status) {
|
||||
StatusOr<T>& StatusOr<T>::operator=(mediapipe::Status&& status) {
|
||||
this->Assign(std::move(status));
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
StatusOr<T>& StatusOr<T>::operator=(::mediapipe::StatusBuilder&& builder) {
|
||||
return *this = static_cast<::mediapipe::Status>(std::move(builder));
|
||||
StatusOr<T>& StatusOr<T>::operator=(mediapipe::StatusBuilder&& builder) {
|
||||
return *this = static_cast<mediapipe::Status>(std::move(builder));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
@@ -289,12 +289,12 @@ inline StatusOr<T>& StatusOr<T>::operator=(StatusOr<U>&& other) {
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
const ::mediapipe::Status& StatusOr<T>::status() const& {
|
||||
const mediapipe::Status& StatusOr<T>::status() const& {
|
||||
return this->status_;
|
||||
}
|
||||
template <typename T>
|
||||
::mediapipe::Status StatusOr<T>::status() && {
|
||||
return ok() ? ::mediapipe::OkStatus() : std::move(this->status_);
|
||||
mediapipe::Status StatusOr<T>::status() && {
|
||||
return ok() ? mediapipe::OkStatus() : std::move(this->status_);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
|
||||
@@ -24,8 +24,8 @@ namespace internal_statusor {
|
||||
class Helper {
|
||||
public:
|
||||
// Move type-agnostic error handling to the .cc.
|
||||
static void HandleInvalidStatusCtorArg(::mediapipe::Status*);
|
||||
ABSL_ATTRIBUTE_NORETURN static void Crash(const ::mediapipe::Status& status);
|
||||
static void HandleInvalidStatusCtorArg(mediapipe::Status*);
|
||||
ABSL_ATTRIBUTE_NORETURN static void Crash(const mediapipe::Status& status);
|
||||
};
|
||||
|
||||
// Construct an instance of T in `p` through placement new, passing Args... to
|
||||
@@ -92,10 +92,10 @@ class StatusOrData {
|
||||
explicit StatusOrData(const T& value) : data_(value) { MakeStatus(); }
|
||||
explicit StatusOrData(T&& value) : data_(std::move(value)) { MakeStatus(); }
|
||||
|
||||
explicit StatusOrData(const ::mediapipe::Status& status) : status_(status) {
|
||||
explicit StatusOrData(const mediapipe::Status& status) : status_(status) {
|
||||
EnsureNotOk();
|
||||
}
|
||||
explicit StatusOrData(::mediapipe::Status&& status)
|
||||
explicit StatusOrData(mediapipe::Status&& status)
|
||||
: status_(std::move(status)) {
|
||||
EnsureNotOk();
|
||||
}
|
||||
@@ -133,7 +133,7 @@ class StatusOrData {
|
||||
MakeValue(value);
|
||||
} else {
|
||||
MakeValue(value);
|
||||
status_ = ::mediapipe::OkStatus();
|
||||
status_ = mediapipe::OkStatus();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -143,17 +143,17 @@ class StatusOrData {
|
||||
MakeValue(std::move(value));
|
||||
} else {
|
||||
MakeValue(std::move(value));
|
||||
status_ = ::mediapipe::OkStatus();
|
||||
status_ = mediapipe::OkStatus();
|
||||
}
|
||||
}
|
||||
|
||||
void Assign(const ::mediapipe::Status& status) {
|
||||
void Assign(const mediapipe::Status& status) {
|
||||
Clear();
|
||||
status_ = status;
|
||||
EnsureNotOk();
|
||||
}
|
||||
|
||||
void Assign(::mediapipe::Status&& status) {
|
||||
void Assign(mediapipe::Status&& status) {
|
||||
Clear();
|
||||
status_ = std::move(status);
|
||||
EnsureNotOk();
|
||||
@@ -168,7 +168,7 @@ class StatusOrData {
|
||||
// Eg. in the copy constructor we use the default constructor of Status in
|
||||
// the ok() path to avoid an extra Ref call.
|
||||
union {
|
||||
::mediapipe::Status status_;
|
||||
mediapipe::Status status_;
|
||||
};
|
||||
|
||||
// data_ is active iff status_.ok()==true
|
||||
@@ -203,7 +203,7 @@ class StatusOrData {
|
||||
// argument.
|
||||
template <typename... Args>
|
||||
void MakeStatus(Args&&... args) {
|
||||
internal_statusor::PlacementNew<::mediapipe::Status>(
|
||||
internal_statusor::PlacementNew<mediapipe::Status>(
|
||||
&status_, std::forward<Args>(args)...);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -74,19 +74,19 @@ TEST(StatusOr, ElementType) {
|
||||
|
||||
TEST(StatusOr, TestNoDefaultConstructorInitialization) {
|
||||
// Explicitly initialize it with an error code.
|
||||
::mediapipe::StatusOr<NoDefaultConstructor> statusor(
|
||||
::mediapipe::CancelledError(""));
|
||||
mediapipe::StatusOr<NoDefaultConstructor> statusor(
|
||||
mediapipe::CancelledError(""));
|
||||
EXPECT_FALSE(statusor.ok());
|
||||
EXPECT_EQ(statusor.status().code(), ::mediapipe::StatusCode::kCancelled);
|
||||
EXPECT_EQ(statusor.status().code(), mediapipe::StatusCode::kCancelled);
|
||||
|
||||
// Default construction of StatusOr initializes it with an UNKNOWN error code.
|
||||
::mediapipe::StatusOr<NoDefaultConstructor> statusor2;
|
||||
mediapipe::StatusOr<NoDefaultConstructor> statusor2;
|
||||
EXPECT_FALSE(statusor2.ok());
|
||||
EXPECT_EQ(statusor2.status().code(), ::mediapipe::StatusCode::kUnknown);
|
||||
EXPECT_EQ(statusor2.status().code(), mediapipe::StatusCode::kUnknown);
|
||||
}
|
||||
|
||||
TEST(StatusOr, TestMoveOnlyInitialization) {
|
||||
::mediapipe::StatusOr<std::unique_ptr<int>> thing(ReturnUniquePtr());
|
||||
mediapipe::StatusOr<std::unique_ptr<int>> thing(ReturnUniquePtr());
|
||||
ASSERT_TRUE(thing.ok());
|
||||
EXPECT_EQ(0, *thing.ValueOrDie());
|
||||
int* previous = thing.ValueOrDie().get();
|
||||
@@ -98,13 +98,13 @@ TEST(StatusOr, TestMoveOnlyInitialization) {
|
||||
}
|
||||
|
||||
TEST(StatusOr, TestMoveOnlyStatusCtr) {
|
||||
::mediapipe::StatusOr<std::unique_ptr<int>> thing(
|
||||
::mediapipe::CancelledError(""));
|
||||
mediapipe::StatusOr<std::unique_ptr<int>> thing(
|
||||
mediapipe::CancelledError(""));
|
||||
ASSERT_FALSE(thing.ok());
|
||||
}
|
||||
|
||||
TEST(StatusOr, TestMoveOnlyValueExtraction) {
|
||||
::mediapipe::StatusOr<std::unique_ptr<int>> thing(ReturnUniquePtr());
|
||||
mediapipe::StatusOr<std::unique_ptr<int>> thing(ReturnUniquePtr());
|
||||
ASSERT_TRUE(thing.ok());
|
||||
std::unique_ptr<int> ptr = thing.ConsumeValueOrDie();
|
||||
EXPECT_EQ(0, *ptr);
|
||||
@@ -115,7 +115,7 @@ TEST(StatusOr, TestMoveOnlyValueExtraction) {
|
||||
}
|
||||
|
||||
TEST(StatusOr, TestMoveOnlyConversion) {
|
||||
::mediapipe::StatusOr<std::unique_ptr<const int>> const_thing(
|
||||
mediapipe::StatusOr<std::unique_ptr<const int>> const_thing(
|
||||
ReturnUniquePtr());
|
||||
EXPECT_TRUE(const_thing.ok());
|
||||
EXPECT_EQ(0, *const_thing.ValueOrDie());
|
||||
@@ -129,23 +129,23 @@ TEST(StatusOr, TestMoveOnlyConversion) {
|
||||
}
|
||||
|
||||
TEST(StatusOr, TestMoveOnlyVector) {
|
||||
// Sanity check that ::mediapipe::StatusOr<MoveOnly> works in vector.
|
||||
std::vector<::mediapipe::StatusOr<std::unique_ptr<int>>> vec;
|
||||
// Sanity check that mediapipe::StatusOr<MoveOnly> works in vector.
|
||||
std::vector<mediapipe::StatusOr<std::unique_ptr<int>>> vec;
|
||||
vec.push_back(ReturnUniquePtr());
|
||||
vec.resize(2);
|
||||
auto another_vec = std::move(vec);
|
||||
EXPECT_EQ(0, *another_vec[0].ValueOrDie());
|
||||
EXPECT_EQ(::mediapipe::StatusCode::kUnknown, another_vec[1].status().code());
|
||||
EXPECT_EQ(mediapipe::StatusCode::kUnknown, another_vec[1].status().code());
|
||||
}
|
||||
|
||||
TEST(StatusOr, TestMoveWithValuesAndErrors) {
|
||||
::mediapipe::StatusOr<std::string> status_or(std::string(1000, '0'));
|
||||
::mediapipe::StatusOr<std::string> value1(std::string(1000, '1'));
|
||||
::mediapipe::StatusOr<std::string> value2(std::string(1000, '2'));
|
||||
::mediapipe::StatusOr<std::string> error1(
|
||||
Status(::mediapipe::StatusCode::kUnknown, "error1"));
|
||||
::mediapipe::StatusOr<std::string> error2(
|
||||
Status(::mediapipe::StatusCode::kUnknown, "error2"));
|
||||
mediapipe::StatusOr<std::string> status_or(std::string(1000, '0'));
|
||||
mediapipe::StatusOr<std::string> value1(std::string(1000, '1'));
|
||||
mediapipe::StatusOr<std::string> value2(std::string(1000, '2'));
|
||||
mediapipe::StatusOr<std::string> error1(
|
||||
Status(mediapipe::StatusCode::kUnknown, "error1"));
|
||||
mediapipe::StatusOr<std::string> error2(
|
||||
Status(mediapipe::StatusCode::kUnknown, "error2"));
|
||||
|
||||
ASSERT_TRUE(status_or.ok());
|
||||
EXPECT_EQ(std::string(1000, '0'), status_or.ValueOrDie());
|
||||
@@ -172,13 +172,13 @@ TEST(StatusOr, TestMoveWithValuesAndErrors) {
|
||||
}
|
||||
|
||||
TEST(StatusOr, TestCopyWithValuesAndErrors) {
|
||||
::mediapipe::StatusOr<std::string> status_or(std::string(1000, '0'));
|
||||
::mediapipe::StatusOr<std::string> value1(std::string(1000, '1'));
|
||||
::mediapipe::StatusOr<std::string> value2(std::string(1000, '2'));
|
||||
::mediapipe::StatusOr<std::string> error1(
|
||||
Status(::mediapipe::StatusCode::kUnknown, "error1"));
|
||||
::mediapipe::StatusOr<std::string> error2(
|
||||
Status(::mediapipe::StatusCode::kUnknown, "error2"));
|
||||
mediapipe::StatusOr<std::string> status_or(std::string(1000, '0'));
|
||||
mediapipe::StatusOr<std::string> value1(std::string(1000, '1'));
|
||||
mediapipe::StatusOr<std::string> value2(std::string(1000, '2'));
|
||||
mediapipe::StatusOr<std::string> error1(
|
||||
Status(mediapipe::StatusCode::kUnknown, "error1"));
|
||||
mediapipe::StatusOr<std::string> error2(
|
||||
Status(mediapipe::StatusCode::kUnknown, "error2"));
|
||||
|
||||
ASSERT_TRUE(status_or.ok());
|
||||
EXPECT_EQ(std::string(1000, '0'), status_or.ValueOrDie());
|
||||
@@ -211,226 +211,225 @@ TEST(StatusOr, TestCopyWithValuesAndErrors) {
|
||||
}
|
||||
|
||||
TEST(StatusOr, TestDefaultCtor) {
|
||||
::mediapipe::StatusOr<int> thing;
|
||||
mediapipe::StatusOr<int> thing;
|
||||
EXPECT_FALSE(thing.ok());
|
||||
EXPECT_EQ(thing.status().code(), ::mediapipe::StatusCode::kUnknown);
|
||||
EXPECT_EQ(thing.status().code(), mediapipe::StatusCode::kUnknown);
|
||||
}
|
||||
|
||||
TEST(StatusOrDeathTest, TestDefaultCtorValue) {
|
||||
::mediapipe::StatusOr<int> thing;
|
||||
mediapipe::StatusOr<int> thing;
|
||||
EXPECT_DEATH(thing.ValueOrDie(), "");
|
||||
|
||||
const ::mediapipe::StatusOr<int> thing2;
|
||||
const mediapipe::StatusOr<int> thing2;
|
||||
EXPECT_DEATH(thing.ValueOrDie(), "");
|
||||
}
|
||||
|
||||
TEST(StatusOr, TestStatusCtor) {
|
||||
::mediapipe::StatusOr<int> thing(
|
||||
::mediapipe::Status(::mediapipe::StatusCode::kCancelled, ""));
|
||||
mediapipe::StatusOr<int> thing(
|
||||
mediapipe::Status(mediapipe::StatusCode::kCancelled, ""));
|
||||
EXPECT_FALSE(thing.ok());
|
||||
EXPECT_EQ(thing.status().code(), ::mediapipe::StatusCode::kCancelled);
|
||||
EXPECT_EQ(thing.status().code(), mediapipe::StatusCode::kCancelled);
|
||||
}
|
||||
|
||||
TEST(StatusOr, TestValueCtor) {
|
||||
const int kI = 4;
|
||||
const ::mediapipe::StatusOr<int> thing(kI);
|
||||
const mediapipe::StatusOr<int> thing(kI);
|
||||
EXPECT_TRUE(thing.ok());
|
||||
EXPECT_EQ(kI, thing.ValueOrDie());
|
||||
}
|
||||
|
||||
TEST(StatusOr, TestCopyCtorStatusOk) {
|
||||
const int kI = 4;
|
||||
const ::mediapipe::StatusOr<int> original(kI);
|
||||
const ::mediapipe::StatusOr<int> copy(original);
|
||||
const mediapipe::StatusOr<int> original(kI);
|
||||
const mediapipe::StatusOr<int> copy(original);
|
||||
EXPECT_EQ(copy.status(), original.status());
|
||||
EXPECT_EQ(original.ValueOrDie(), copy.ValueOrDie());
|
||||
}
|
||||
|
||||
TEST(StatusOr, TestCopyCtorStatusNotOk) {
|
||||
::mediapipe::StatusOr<int> original(
|
||||
Status(::mediapipe::StatusCode::kCancelled, ""));
|
||||
::mediapipe::StatusOr<int> copy(original);
|
||||
mediapipe::StatusOr<int> original(
|
||||
Status(mediapipe::StatusCode::kCancelled, ""));
|
||||
mediapipe::StatusOr<int> copy(original);
|
||||
EXPECT_EQ(copy.status(), original.status());
|
||||
}
|
||||
|
||||
TEST(StatusOr, TestCopyCtorNonAssignable) {
|
||||
const int kI = 4;
|
||||
CopyNoAssign value(kI);
|
||||
::mediapipe::StatusOr<CopyNoAssign> original(value);
|
||||
::mediapipe::StatusOr<CopyNoAssign> copy(original);
|
||||
mediapipe::StatusOr<CopyNoAssign> original(value);
|
||||
mediapipe::StatusOr<CopyNoAssign> copy(original);
|
||||
EXPECT_EQ(copy.status(), original.status());
|
||||
EXPECT_EQ(original.ValueOrDie().foo_, copy.ValueOrDie().foo_);
|
||||
}
|
||||
|
||||
TEST(StatusOr, TestCopyCtorStatusOKConverting) {
|
||||
const int kI = 4;
|
||||
::mediapipe::StatusOr<int> original(kI);
|
||||
::mediapipe::StatusOr<double> copy(original);
|
||||
mediapipe::StatusOr<int> original(kI);
|
||||
mediapipe::StatusOr<double> copy(original);
|
||||
EXPECT_EQ(copy.status(), original.status());
|
||||
EXPECT_DOUBLE_EQ(original.ValueOrDie(), copy.ValueOrDie());
|
||||
}
|
||||
|
||||
TEST(StatusOr, TestCopyCtorStatusNotOkConverting) {
|
||||
::mediapipe::StatusOr<int> original(
|
||||
Status(::mediapipe::StatusCode::kCancelled, ""));
|
||||
::mediapipe::StatusOr<double> copy(original);
|
||||
mediapipe::StatusOr<int> original(
|
||||
Status(mediapipe::StatusCode::kCancelled, ""));
|
||||
mediapipe::StatusOr<double> copy(original);
|
||||
EXPECT_EQ(copy.status(), original.status());
|
||||
}
|
||||
|
||||
TEST(StatusOr, TestAssignmentStatusOk) {
|
||||
const int kI = 4;
|
||||
::mediapipe::StatusOr<int> source(kI);
|
||||
::mediapipe::StatusOr<int> target;
|
||||
mediapipe::StatusOr<int> source(kI);
|
||||
mediapipe::StatusOr<int> target;
|
||||
target = source;
|
||||
EXPECT_EQ(target.status(), source.status());
|
||||
EXPECT_EQ(source.ValueOrDie(), target.ValueOrDie());
|
||||
}
|
||||
|
||||
TEST(StatusOr, TestAssignmentStatusNotOk) {
|
||||
::mediapipe::StatusOr<int> source(
|
||||
Status(::mediapipe::StatusCode::kCancelled, ""));
|
||||
::mediapipe::StatusOr<int> target;
|
||||
mediapipe::StatusOr<int> source(
|
||||
Status(mediapipe::StatusCode::kCancelled, ""));
|
||||
mediapipe::StatusOr<int> target;
|
||||
target = source;
|
||||
EXPECT_EQ(target.status(), source.status());
|
||||
}
|
||||
|
||||
TEST(StatusOr, TestStatus) {
|
||||
::mediapipe::StatusOr<int> good(4);
|
||||
mediapipe::StatusOr<int> good(4);
|
||||
EXPECT_TRUE(good.ok());
|
||||
::mediapipe::StatusOr<int> bad(
|
||||
Status(::mediapipe::StatusCode::kCancelled, ""));
|
||||
mediapipe::StatusOr<int> bad(Status(mediapipe::StatusCode::kCancelled, ""));
|
||||
EXPECT_FALSE(bad.ok());
|
||||
EXPECT_EQ(bad.status(), Status(::mediapipe::StatusCode::kCancelled, ""));
|
||||
EXPECT_EQ(bad.status(), Status(mediapipe::StatusCode::kCancelled, ""));
|
||||
}
|
||||
|
||||
TEST(StatusOr, TestValue) {
|
||||
const int kI = 4;
|
||||
::mediapipe::StatusOr<int> thing(kI);
|
||||
mediapipe::StatusOr<int> thing(kI);
|
||||
EXPECT_EQ(kI, thing.ValueOrDie());
|
||||
}
|
||||
|
||||
TEST(StatusOr, TestValueConst) {
|
||||
const int kI = 4;
|
||||
const ::mediapipe::StatusOr<int> thing(kI);
|
||||
const mediapipe::StatusOr<int> thing(kI);
|
||||
EXPECT_EQ(kI, thing.ValueOrDie());
|
||||
}
|
||||
|
||||
TEST(StatusOrDeathTest, TestValueNotOk) {
|
||||
::mediapipe::StatusOr<int> thing(
|
||||
::mediapipe::Status(::mediapipe::StatusCode::kCancelled, "cancelled"));
|
||||
mediapipe::StatusOr<int> thing(
|
||||
mediapipe::Status(mediapipe::StatusCode::kCancelled, "cancelled"));
|
||||
EXPECT_DEATH(thing.ValueOrDie(), "cancelled");
|
||||
}
|
||||
|
||||
TEST(StatusOrDeathTest, TestValueNotOkConst) {
|
||||
const ::mediapipe::StatusOr<int> thing(
|
||||
::mediapipe::Status(::mediapipe::StatusCode::kUnknown, ""));
|
||||
const mediapipe::StatusOr<int> thing(
|
||||
mediapipe::Status(mediapipe::StatusCode::kUnknown, ""));
|
||||
EXPECT_DEATH(thing.ValueOrDie(), "");
|
||||
}
|
||||
|
||||
TEST(StatusOr, TestPointerDefaultCtor) {
|
||||
::mediapipe::StatusOr<int*> thing;
|
||||
mediapipe::StatusOr<int*> thing;
|
||||
EXPECT_FALSE(thing.ok());
|
||||
EXPECT_EQ(thing.status().code(), ::mediapipe::StatusCode::kUnknown);
|
||||
EXPECT_EQ(thing.status().code(), mediapipe::StatusCode::kUnknown);
|
||||
}
|
||||
|
||||
TEST(StatusOrDeathTest, TestPointerDefaultCtorValue) {
|
||||
::mediapipe::StatusOr<int*> thing;
|
||||
mediapipe::StatusOr<int*> thing;
|
||||
EXPECT_DEATH(thing.ValueOrDie(), "");
|
||||
}
|
||||
|
||||
TEST(StatusOr, TestPointerStatusCtor) {
|
||||
::mediapipe::StatusOr<int*> thing(
|
||||
Status(::mediapipe::StatusCode::kCancelled, ""));
|
||||
mediapipe::StatusOr<int*> thing(
|
||||
Status(mediapipe::StatusCode::kCancelled, ""));
|
||||
EXPECT_FALSE(thing.ok());
|
||||
EXPECT_EQ(thing.status(), Status(::mediapipe::StatusCode::kCancelled, ""));
|
||||
EXPECT_EQ(thing.status(), Status(mediapipe::StatusCode::kCancelled, ""));
|
||||
}
|
||||
|
||||
TEST(StatusOr, TestPointerValueCtor) {
|
||||
const int kI = 4;
|
||||
::mediapipe::StatusOr<const int*> thing(&kI);
|
||||
mediapipe::StatusOr<const int*> thing(&kI);
|
||||
EXPECT_TRUE(thing.ok());
|
||||
EXPECT_EQ(&kI, thing.ValueOrDie());
|
||||
}
|
||||
|
||||
TEST(StatusOr, TestPointerCopyCtorStatusOk) {
|
||||
const int kI = 0;
|
||||
::mediapipe::StatusOr<const int*> original(&kI);
|
||||
::mediapipe::StatusOr<const int*> copy(original);
|
||||
mediapipe::StatusOr<const int*> original(&kI);
|
||||
mediapipe::StatusOr<const int*> copy(original);
|
||||
EXPECT_EQ(copy.status(), original.status());
|
||||
EXPECT_EQ(original.ValueOrDie(), copy.ValueOrDie());
|
||||
}
|
||||
|
||||
TEST(StatusOr, TestPointerCopyCtorStatusNotOk) {
|
||||
::mediapipe::StatusOr<int*> original(
|
||||
Status(::mediapipe::StatusCode::kCancelled, ""));
|
||||
::mediapipe::StatusOr<int*> copy(original);
|
||||
mediapipe::StatusOr<int*> original(
|
||||
Status(mediapipe::StatusCode::kCancelled, ""));
|
||||
mediapipe::StatusOr<int*> copy(original);
|
||||
EXPECT_EQ(copy.status(), original.status());
|
||||
}
|
||||
|
||||
TEST(StatusOr, TestPointerCopyCtorStatusOKConverting) {
|
||||
Derived derived;
|
||||
::mediapipe::StatusOr<Derived*> original(&derived);
|
||||
::mediapipe::StatusOr<Base2*> copy(original);
|
||||
mediapipe::StatusOr<Derived*> original(&derived);
|
||||
mediapipe::StatusOr<Base2*> copy(original);
|
||||
EXPECT_EQ(copy.status(), original.status());
|
||||
EXPECT_EQ(static_cast<const Base2*>(original.ValueOrDie()),
|
||||
copy.ValueOrDie());
|
||||
}
|
||||
|
||||
TEST(StatusOr, TestPointerCopyCtorStatusNotOkConverting) {
|
||||
::mediapipe::StatusOr<Derived*> original(
|
||||
::mediapipe::Status(::mediapipe::StatusCode::kCancelled, ""));
|
||||
::mediapipe::StatusOr<Base2*> copy(original);
|
||||
mediapipe::StatusOr<Derived*> original(
|
||||
mediapipe::Status(mediapipe::StatusCode::kCancelled, ""));
|
||||
mediapipe::StatusOr<Base2*> copy(original);
|
||||
EXPECT_EQ(copy.status(), original.status());
|
||||
}
|
||||
|
||||
TEST(StatusOr, TestPointerAssignmentStatusOk) {
|
||||
const int kI = 0;
|
||||
::mediapipe::StatusOr<const int*> source(&kI);
|
||||
::mediapipe::StatusOr<const int*> target;
|
||||
mediapipe::StatusOr<const int*> source(&kI);
|
||||
mediapipe::StatusOr<const int*> target;
|
||||
target = source;
|
||||
EXPECT_EQ(target.status(), source.status());
|
||||
EXPECT_EQ(source.ValueOrDie(), target.ValueOrDie());
|
||||
}
|
||||
|
||||
TEST(StatusOr, TestPointerAssignmentStatusNotOk) {
|
||||
::mediapipe::StatusOr<int*> source(
|
||||
::mediapipe::Status(::mediapipe::StatusCode::kCancelled, ""));
|
||||
::mediapipe::StatusOr<int*> target;
|
||||
mediapipe::StatusOr<int*> source(
|
||||
mediapipe::Status(mediapipe::StatusCode::kCancelled, ""));
|
||||
mediapipe::StatusOr<int*> target;
|
||||
target = source;
|
||||
EXPECT_EQ(target.status(), source.status());
|
||||
}
|
||||
|
||||
TEST(StatusOr, TestPointerStatus) {
|
||||
const int kI = 0;
|
||||
::mediapipe::StatusOr<const int*> good(&kI);
|
||||
mediapipe::StatusOr<const int*> good(&kI);
|
||||
EXPECT_TRUE(good.ok());
|
||||
::mediapipe::StatusOr<const int*> bad(
|
||||
::mediapipe::Status(::mediapipe::StatusCode::kCancelled, ""));
|
||||
mediapipe::StatusOr<const int*> bad(
|
||||
mediapipe::Status(mediapipe::StatusCode::kCancelled, ""));
|
||||
EXPECT_EQ(bad.status(),
|
||||
::mediapipe::Status(::mediapipe::StatusCode::kCancelled, ""));
|
||||
mediapipe::Status(mediapipe::StatusCode::kCancelled, ""));
|
||||
}
|
||||
|
||||
TEST(StatusOr, TestPointerValue) {
|
||||
const int kI = 0;
|
||||
::mediapipe::StatusOr<const int*> thing(&kI);
|
||||
mediapipe::StatusOr<const int*> thing(&kI);
|
||||
EXPECT_EQ(&kI, thing.ValueOrDie());
|
||||
}
|
||||
|
||||
TEST(StatusOr, TestPointerValueConst) {
|
||||
const int kI = 0;
|
||||
const ::mediapipe::StatusOr<const int*> thing(&kI);
|
||||
const mediapipe::StatusOr<const int*> thing(&kI);
|
||||
EXPECT_EQ(&kI, thing.ValueOrDie());
|
||||
}
|
||||
|
||||
TEST(StatusOrDeathTest, TestPointerValueNotOk) {
|
||||
::mediapipe::StatusOr<int*> thing(
|
||||
::mediapipe::Status(::mediapipe::StatusCode::kCancelled, "cancelled"));
|
||||
mediapipe::StatusOr<int*> thing(
|
||||
mediapipe::Status(mediapipe::StatusCode::kCancelled, "cancelled"));
|
||||
EXPECT_DEATH(thing.ValueOrDie(), "cancelled");
|
||||
}
|
||||
|
||||
TEST(StatusOrDeathTest, TestPointerValueNotOkConst) {
|
||||
const ::mediapipe::StatusOr<int*> thing(
|
||||
::mediapipe::Status(::mediapipe::StatusCode::kCancelled, "cancelled"));
|
||||
const mediapipe::StatusOr<int*> thing(
|
||||
mediapipe::Status(mediapipe::StatusCode::kCancelled, "cancelled"));
|
||||
EXPECT_DEATH(thing.ValueOrDie(), "cancelled");
|
||||
}
|
||||
|
||||
|
||||
@@ -313,9 +313,9 @@ VT2<T2> operator/(const K& k, const BasicVector<VT2, T2, N2>& a) {
|
||||
// ======================================================================
|
||||
template <typename T>
|
||||
class Vector2
|
||||
: public ::mediapipe::deps::internal_vector::BasicVector<Vector2, T, 2> {
|
||||
: public mediapipe::deps::internal_vector::BasicVector<Vector2, T, 2> {
|
||||
private:
|
||||
using Base = ::mediapipe::deps::internal_vector::BasicVector<::Vector2, T, 2>;
|
||||
using Base = mediapipe::deps::internal_vector::BasicVector<::Vector2, T, 2>;
|
||||
using VType = T;
|
||||
|
||||
public:
|
||||
@@ -383,9 +383,9 @@ class Vector2
|
||||
|
||||
template <typename T>
|
||||
class Vector3
|
||||
: public ::mediapipe::deps::internal_vector::BasicVector<Vector3, T, 3> {
|
||||
: public mediapipe::deps::internal_vector::BasicVector<Vector3, T, 3> {
|
||||
private:
|
||||
using Base = ::mediapipe::deps::internal_vector::BasicVector<::Vector3, T, 3>;
|
||||
using Base = mediapipe::deps::internal_vector::BasicVector<::Vector3, T, 3>;
|
||||
using VType = T;
|
||||
|
||||
public:
|
||||
@@ -479,9 +479,9 @@ class Vector3
|
||||
|
||||
template <typename T>
|
||||
class Vector4
|
||||
: public ::mediapipe::deps::internal_vector::BasicVector<Vector4, T, 4> {
|
||||
: public mediapipe::deps::internal_vector::BasicVector<Vector4, T, 4> {
|
||||
private:
|
||||
using Base = ::mediapipe::deps::internal_vector::BasicVector<::Vector4, T, 4>;
|
||||
using Base = mediapipe::deps::internal_vector::BasicVector<::Vector4, T, 4>;
|
||||
using VType = T;
|
||||
|
||||
public:
|
||||
|
||||
@@ -48,7 +48,7 @@ class Executor {
|
||||
// A registered Executor subclass must implement the static factory method
|
||||
// Create. The Executor subclass cannot be registered without it.
|
||||
//
|
||||
// static ::mediapipe::StatusOr<Executor*> Create(
|
||||
// static mediapipe::StatusOr<Executor*> Create(
|
||||
// const MediaPipeOptions& extendable_options);
|
||||
//
|
||||
// Create validates extendable_options, then calls the constructor, and
|
||||
@@ -65,14 +65,13 @@ class Executor {
|
||||
virtual void Schedule(std::function<void()> task) = 0;
|
||||
};
|
||||
|
||||
using ExecutorRegistry = GlobalFactoryRegistry<::mediapipe::StatusOr<Executor*>,
|
||||
using ExecutorRegistry = GlobalFactoryRegistry<mediapipe::StatusOr<Executor*>,
|
||||
const MediaPipeOptions&>;
|
||||
|
||||
// Macro for registering the executor.
|
||||
#define REGISTER_EXECUTOR(name) \
|
||||
REGISTER_FACTORY_FUNCTION_QUALIFIED(::mediapipe::ExecutorRegistry, \
|
||||
executor_registration, name, \
|
||||
name::Create)
|
||||
#define REGISTER_EXECUTOR(name) \
|
||||
REGISTER_FACTORY_FUNCTION_QUALIFIED( \
|
||||
mediapipe::ExecutorRegistry, executor_registration, name, name::Create)
|
||||
|
||||
} // namespace mediapipe
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ namespace {
|
||||
// NOTE: If we need to update this class, that means there is a
|
||||
// backward-incompatible change in the MediaPipe API and MediaPipe clients also
|
||||
// need to update their mediapipe::Executor subclasses.
|
||||
class MyExecutor : public ::mediapipe::Executor {
|
||||
class MyExecutor : public mediapipe::Executor {
|
||||
public:
|
||||
MyExecutor();
|
||||
~MyExecutor() override;
|
||||
@@ -37,21 +37,21 @@ class MyExecutor : public ::mediapipe::Executor {
|
||||
// To verify a mediapipe::Executor subclass outside the mediapipe namespace
|
||||
// can override any method, override every method in the mediapipe::Executor
|
||||
// interface.
|
||||
void AddTask(::mediapipe::TaskQueue* task_queue) override;
|
||||
void AddTask(mediapipe::TaskQueue* task_queue) override;
|
||||
void Schedule(std::function<void()> task) override;
|
||||
|
||||
private:
|
||||
std::unique_ptr<::mediapipe::ThreadPool> thread_pool_;
|
||||
std::unique_ptr<mediapipe::ThreadPool> thread_pool_;
|
||||
};
|
||||
|
||||
MyExecutor::MyExecutor() {
|
||||
thread_pool_ = absl::make_unique<::mediapipe::ThreadPool>("my_executor", 1);
|
||||
thread_pool_ = absl::make_unique<mediapipe::ThreadPool>("my_executor", 1);
|
||||
thread_pool_->StartWorkers();
|
||||
}
|
||||
|
||||
MyExecutor::~MyExecutor() { thread_pool_.reset(nullptr); }
|
||||
|
||||
void MyExecutor::AddTask(::mediapipe::TaskQueue* task_queue) {
|
||||
void MyExecutor::AddTask(mediapipe::TaskQueue* task_queue) {
|
||||
thread_pool_->Schedule([task_queue] { task_queue->RunNextTask(); });
|
||||
}
|
||||
|
||||
@@ -59,7 +59,7 @@ void MyExecutor::Schedule(std::function<void()> task) {
|
||||
thread_pool_->Schedule(std::move(task));
|
||||
}
|
||||
|
||||
class NoOpTaskQueue : public ::mediapipe::TaskQueue {
|
||||
class NoOpTaskQueue : public mediapipe::TaskQueue {
|
||||
public:
|
||||
// Returns the number of times RunNextTask() was called.
|
||||
int call_count() const { return call_count_; }
|
||||
|
||||
@@ -20,6 +20,8 @@ syntax = "proto2";
|
||||
|
||||
package mediapipe;
|
||||
|
||||
option objc_class_prefix = "MediaPipe";
|
||||
|
||||
message Classification {
|
||||
// The index of the class in the corresponding label map.
|
||||
optional int32 index = 1;
|
||||
|
||||
@@ -27,17 +27,18 @@ message Landmark {
|
||||
optional float y = 2;
|
||||
optional float z = 3;
|
||||
|
||||
// Landmark visibility. Float score of whether landmark is visible or occluded
|
||||
// by other objects. Landmark considered as invisible also if it is
|
||||
// not present on the screen (out of scene bounds).
|
||||
// Depending on the model, visibility value is either a
|
||||
// Landmark visibility. Should stay unset if not supported.
|
||||
// Float score of whether landmark is visible or occluded by other objects.
|
||||
// Landmark considered as invisible also if it is not present on the screen
|
||||
// (out of scene bounds). Depending on the model, visibility value is either a
|
||||
// sigmoid or an argument of sigmoid.
|
||||
optional float visibility = 4;
|
||||
|
||||
// Landmark presence. Float score of whether landmark is present on the scene
|
||||
// (located within scene bounds).
|
||||
// Depending on the model, presence value is either a result of sigmoid
|
||||
// or an argument of sigmoid function to get landmark presence probability.
|
||||
// Landmark presence. Should stay unset if not supported.
|
||||
// Float score of whether landmark is present on the scene (located within
|
||||
// scene bounds). Depending on the model, presence value is either a result of
|
||||
// sigmoid or an argument of sigmoid function to get landmark presence
|
||||
// probability.
|
||||
optional float presence = 5;
|
||||
}
|
||||
|
||||
|
||||
@@ -72,13 +72,13 @@ std::unique_ptr<cv::Mat> MaskToMat(const LocationData::BinaryMask& mask) {
|
||||
}
|
||||
return image;
|
||||
}
|
||||
::mediapipe::StatusOr<std::unique_ptr<cv::Mat>> RectangleToMat(
|
||||
mediapipe::StatusOr<std::unique_ptr<cv::Mat>> RectangleToMat(
|
||||
int image_width, int image_height, const Rectangle_i& rect) {
|
||||
// These checks prevent undefined behavior caused when setting memory for
|
||||
// rectangles whose edges lie outside image edges.
|
||||
if (rect.ymin() < 0 || rect.xmin() < 0 || rect.xmax() > image_width ||
|
||||
rect.ymax() > image_height) {
|
||||
return ::mediapipe::InvalidArgumentError(absl::Substitute(
|
||||
return mediapipe::InvalidArgumentError(absl::Substitute(
|
||||
"Rectangle must be bounded by image boundaries.\nImage Width: "
|
||||
"$0\nImage Height: $1\nRectangle: [($2, $3), ($4, $5)]",
|
||||
image_width, image_height, rect.xmin(), rect.ymin(), rect.xmax(),
|
||||
@@ -564,7 +564,6 @@ Rectangle_f Location::ConvertToRelativeBBox(int image_width,
|
||||
switch (location_data_.format()) {
|
||||
case LocationData::GLOBAL: {
|
||||
return Rectangle_f(0.0f, 0.0f, 1.0f, 1.0f);
|
||||
break;
|
||||
}
|
||||
case LocationData::BOUNDING_BOX: {
|
||||
const auto& box = location_data_.bounding_box();
|
||||
|
||||
@@ -132,9 +132,6 @@ void Tensor::AllocateMtlBuffer(id<MTLDevice> device) const {
|
||||
|
||||
#if MEDIAPIPE_OPENGL_ES_VERSION >= MEDIAPIPE_OPENGL_ES_30
|
||||
Tensor::OpenGlTexture2dView Tensor::GetOpenGlTexture2dReadView() const {
|
||||
LOG_IF(FATAL, BhwcDepthFromShape(shape_) > 4)
|
||||
<< "OpenGlTexture2d supports depth <= 4. Current depth is "
|
||||
<< BhwcDepthFromShape(shape_);
|
||||
LOG_IF(FATAL, valid_ == kValidNone)
|
||||
<< "Tensor must be written prior to read from.";
|
||||
LOG_IF(FATAL, !(valid_ & (kValidCpu | kValidOpenGlTexture2d)))
|
||||
@@ -145,10 +142,11 @@ Tensor::OpenGlTexture2dView Tensor::GetOpenGlTexture2dReadView() const {
|
||||
if (!(valid_ & kValidOpenGlTexture2d)) {
|
||||
uint8_t* buffer;
|
||||
std::unique_ptr<uint8_t[]> temp_buffer;
|
||||
if (BhwcDepthFromShape(shape_) == 4) {
|
||||
if (BhwcDepthFromShape(shape_) % 4 == 0) {
|
||||
// No padding exists because number of channels are multiple of 4.
|
||||
buffer = reinterpret_cast<uint8_t*>(cpu_buffer_);
|
||||
} else {
|
||||
const int padded_depth = 4;
|
||||
const int padded_depth = (BhwcDepthFromShape(shape_) + 3) / 4 * 4;
|
||||
const int padded_depth_size = padded_depth * element_size();
|
||||
const int padded_size = BhwcBatchFromShape(shape_) *
|
||||
BhwcHeightFromShape(shape_) *
|
||||
@@ -194,9 +192,14 @@ void Tensor::AllocateOpenGlTexture2d() const {
|
||||
// supported from floating point textures.
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA32F, BhwcWidthFromShape(shape_),
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
|
||||
const int pixels_per_depth = (BhwcDepthFromShape(shape_) + 3) / 4;
|
||||
const int width = BhwcWidthFromShape(shape_) * pixels_per_depth;
|
||||
glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA32F, width,
|
||||
BhwcHeightFromShape(shape_));
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
glGenFramebuffers(1, &frame_buffer_);
|
||||
}
|
||||
}
|
||||
#endif // MEDIAPIPE_OPENGL_ES_VERSION >= MEDIAPIPE_OPENGL_ES_30
|
||||
@@ -265,6 +268,8 @@ void Tensor::Move(Tensor* src) {
|
||||
|
||||
#if MEDIAPIPE_OPENGL_ES_VERSION >= MEDIAPIPE_OPENGL_ES_30
|
||||
gl_context_ = std::move(src->gl_context_);
|
||||
frame_buffer_ = src->frame_buffer_;
|
||||
src->frame_buffer_ = GL_INVALID_INDEX;
|
||||
opengl_texture2d_ = src->opengl_texture2d_;
|
||||
src->opengl_texture2d_ = GL_INVALID_INDEX;
|
||||
#if MEDIAPIPE_OPENGL_ES_VERSION >= MEDIAPIPE_OPENGL_ES_31
|
||||
@@ -298,9 +303,13 @@ void Tensor::Invalidate() {
|
||||
#if MEDIAPIPE_OPENGL_ES_VERSION >= MEDIAPIPE_OPENGL_ES_30
|
||||
if (opengl_texture2d_ != GL_INVALID_INDEX) {
|
||||
GLuint opengl_texture2d = opengl_texture2d_;
|
||||
gl_context_->RunWithoutWaiting(
|
||||
[opengl_texture2d]() { glDeleteTextures(1, &opengl_texture2d); });
|
||||
GLuint frame_buffer = frame_buffer_;
|
||||
gl_context_->RunWithoutWaiting([opengl_texture2d, frame_buffer]() {
|
||||
glDeleteTextures(1, &opengl_texture2d);
|
||||
glDeleteFramebuffers(1, &frame_buffer);
|
||||
});
|
||||
opengl_texture2d_ = GL_INVALID_INDEX;
|
||||
frame_buffer_ = GL_INVALID_INDEX;
|
||||
}
|
||||
#if MEDIAPIPE_OPENGL_ES_VERSION >= MEDIAPIPE_OPENGL_ES_31
|
||||
if (opengl_buffer_ != GL_INVALID_INDEX) {
|
||||
@@ -347,53 +356,34 @@ Tensor::CpuReadView Tensor::GetCpuReadView() const {
|
||||
// yet.
|
||||
if (valid_ & kValidOpenGlTexture2d) {
|
||||
gl_context_->Run([this]() {
|
||||
GLint current_fbo;
|
||||
glGetIntegerv(GL_FRAMEBUFFER_BINDING, ¤t_fbo);
|
||||
const int pixels_per_depth = (BhwcDepthFromShape(shape_) + 3) / 4;
|
||||
const int width = BhwcWidthFromShape(shape_) * pixels_per_depth;
|
||||
|
||||
uint8_t* buffer;
|
||||
std::unique_ptr<uint8_t[]> temp_buffer;
|
||||
if (BhwcDepthFromShape(shape_) == 4) {
|
||||
if (BhwcDepthFromShape(shape_) % 4 == 0) {
|
||||
buffer = reinterpret_cast<uint8_t*>(cpu_buffer_);
|
||||
} else {
|
||||
const int padded_depth = (BhwcDepthFromShape(shape_) + 3) / 4 * 4;
|
||||
const int padded_size =
|
||||
BhwcBatchFromShape(shape_) * BhwcHeightFromShape(shape_) *
|
||||
BhwcWidthFromShape(shape_) * padded_depth * element_size();
|
||||
const int padded_size = BhwcBatchFromShape(shape_) *
|
||||
BhwcHeightFromShape(shape_) * width *
|
||||
pixels_per_depth * 4 * element_size();
|
||||
temp_buffer = absl::make_unique<uint8_t[]>(padded_size);
|
||||
buffer = temp_buffer.get();
|
||||
}
|
||||
|
||||
GLint color_attachment_name;
|
||||
glGetFramebufferAttachmentParameteriv(
|
||||
GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
|
||||
GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &color_attachment_name);
|
||||
if (color_attachment_name != opengl_texture2d_) {
|
||||
// Save the viewport. Note that we assume that the color attachment is
|
||||
// a GL_TEXTURE_2D texture.
|
||||
GLint viewport[4];
|
||||
glGetIntegerv(GL_VIEWPORT, viewport);
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, frame_buffer_);
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
|
||||
GL_TEXTURE_2D, opengl_texture2d_, 0);
|
||||
glPixelStorei(GL_PACK_ROW_LENGTH, width);
|
||||
glPixelStorei(GL_PACK_ALIGNMENT, 1);
|
||||
glReadPixels(0, 0, width, BhwcHeightFromShape(shape_), GL_RGBA,
|
||||
GL_FLOAT, buffer);
|
||||
|
||||
// Set the data from GLTexture object.
|
||||
glViewport(0, 0, BhwcWidthFromShape(shape_),
|
||||
BhwcHeightFromShape(shape_));
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
|
||||
GL_TEXTURE_2D, opengl_texture2d_, 0);
|
||||
glReadPixels(0, 0, BhwcWidthFromShape(shape_),
|
||||
BhwcHeightFromShape(shape_), GL_RGBA, GL_FLOAT, buffer);
|
||||
|
||||
// Restore from the saved viewport and color attachment name.
|
||||
glViewport(viewport[0], viewport[1], viewport[2], viewport[3]);
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
|
||||
GL_TEXTURE_2D, color_attachment_name, 0);
|
||||
} else {
|
||||
glReadPixels(0, 0, BhwcWidthFromShape(shape_),
|
||||
BhwcHeightFromShape(shape_), GL_RGBA, GL_FLOAT, buffer);
|
||||
}
|
||||
if (BhwcDepthFromShape(shape_) < 4) {
|
||||
if (BhwcDepthFromShape(shape_) % 4) {
|
||||
uint8_t* dest_buffer = reinterpret_cast<uint8_t*>(cpu_buffer_);
|
||||
const int actual_depth_size =
|
||||
BhwcDepthFromShape(shape_) * element_size();
|
||||
const int padded_depth_size = 4 * element_size();
|
||||
const int padded_depth_size = pixels_per_depth * 4 * element_size();
|
||||
for (int e = 0;
|
||||
e < BhwcBatchFromShape(shape_) * BhwcHeightFromShape(shape_) *
|
||||
BhwcWidthFromShape(shape_);
|
||||
|
||||
@@ -253,6 +253,7 @@ class Tensor {
|
||||
#if MEDIAPIPE_OPENGL_ES_VERSION >= MEDIAPIPE_OPENGL_ES_30
|
||||
mutable std::shared_ptr<mediapipe::GlContext> gl_context_;
|
||||
mutable GLuint opengl_texture2d_ = GL_INVALID_INDEX;
|
||||
mutable GLuint frame_buffer_ = GL_INVALID_INDEX;
|
||||
void AllocateOpenGlTexture2d() const;
|
||||
#if MEDIAPIPE_OPENGL_ES_VERSION >= MEDIAPIPE_OPENGL_ES_31
|
||||
mutable GLuint opengl_buffer_ = GL_INVALID_INDEX;
|
||||
|
||||
@@ -18,7 +18,7 @@ namespace mediapipe {
|
||||
|
||||
namespace internal {
|
||||
|
||||
::mediapipe::Status GraphOutputStream::Initialize(
|
||||
mediapipe::Status GraphOutputStream::Initialize(
|
||||
const std::string& stream_name, const PacketType* packet_type,
|
||||
OutputStreamManager* output_stream_manager) {
|
||||
RET_CHECK(output_stream_manager);
|
||||
@@ -38,20 +38,20 @@ namespace internal {
|
||||
MP_RETURN_IF_ERROR(input_stream_handler_->InitializeInputStreamManagers(
|
||||
input_stream_.get()));
|
||||
output_stream_manager->AddMirror(input_stream_handler_.get(), id);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
void GraphOutputStream::PrepareForRun(
|
||||
std::function<void()> notification_callback,
|
||||
std::function<void(::mediapipe::Status)> error_callback) {
|
||||
std::function<void(mediapipe::Status)> error_callback) {
|
||||
input_stream_handler_->PrepareForRun(
|
||||
/*headers_ready_callback=*/[] {}, std::move(notification_callback),
|
||||
/*schedule_callback=*/nullptr, std::move(error_callback));
|
||||
}
|
||||
|
||||
::mediapipe::Status OutputStreamObserver::Initialize(
|
||||
mediapipe::Status OutputStreamObserver::Initialize(
|
||||
const std::string& stream_name, const PacketType* packet_type,
|
||||
std::function<::mediapipe::Status(const Packet&)> packet_callback,
|
||||
std::function<mediapipe::Status(const Packet&)> packet_callback,
|
||||
OutputStreamManager* output_stream_manager) {
|
||||
RET_CHECK(output_stream_manager);
|
||||
|
||||
@@ -60,7 +60,7 @@ void GraphOutputStream::PrepareForRun(
|
||||
output_stream_manager);
|
||||
}
|
||||
|
||||
::mediapipe::Status OutputStreamObserver::Notify() {
|
||||
mediapipe::Status OutputStreamObserver::Notify() {
|
||||
while (true) {
|
||||
bool empty;
|
||||
Timestamp min_timestamp = input_stream_->MinTimestampOrBound(&empty);
|
||||
@@ -76,10 +76,10 @@ void GraphOutputStream::PrepareForRun(
|
||||
num_packets_dropped, input_stream_->Name());
|
||||
MP_RETURN_IF_ERROR(packet_callback_(packet));
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status OutputStreamPollerImpl::Initialize(
|
||||
mediapipe::Status OutputStreamPollerImpl::Initialize(
|
||||
const std::string& stream_name, const PacketType* packet_type,
|
||||
std::function<void(InputStreamManager*, bool*)> queue_size_callback,
|
||||
OutputStreamManager* output_stream_manager) {
|
||||
@@ -87,12 +87,12 @@ void GraphOutputStream::PrepareForRun(
|
||||
output_stream_manager));
|
||||
input_stream_handler_->SetQueueSizeCallbacks(queue_size_callback,
|
||||
queue_size_callback);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
void OutputStreamPollerImpl::PrepareForRun(
|
||||
std::function<void()> notification_callback,
|
||||
std::function<void(::mediapipe::Status)> error_callback) {
|
||||
std::function<void(mediapipe::Status)> error_callback) {
|
||||
input_stream_handler_->PrepareForRun(
|
||||
/*headers_ready_callback=*/[] {}, std::move(notification_callback),
|
||||
/*schedule_callback=*/nullptr, std::move(error_callback));
|
||||
@@ -116,11 +116,11 @@ void OutputStreamPollerImpl::SetMaxQueueSize(int queue_size) {
|
||||
|
||||
int OutputStreamPollerImpl::QueueSize() { return input_stream_->QueueSize(); }
|
||||
|
||||
::mediapipe::Status OutputStreamPollerImpl::Notify() {
|
||||
mediapipe::Status OutputStreamPollerImpl::Notify() {
|
||||
mutex_.Lock();
|
||||
handler_condvar_.Signal();
|
||||
mutex_.Unlock();
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
void OutputStreamPollerImpl::NotifyError() {
|
||||
|
||||
@@ -50,18 +50,18 @@ class GraphOutputStream {
|
||||
// input stream and attaches the input stream to an output stream as
|
||||
// the mirror for observation/polling. Ownership of output_stream_manager
|
||||
// is not transferred to the graph output stream object.
|
||||
::mediapipe::Status Initialize(const std::string& stream_name,
|
||||
const PacketType* packet_type,
|
||||
OutputStreamManager* output_stream_manager);
|
||||
mediapipe::Status Initialize(const std::string& stream_name,
|
||||
const PacketType* packet_type,
|
||||
OutputStreamManager* output_stream_manager);
|
||||
|
||||
// Installs callbacks into its GraphOutputStreamHandler.
|
||||
virtual void PrepareForRun(
|
||||
std::function<void()> notification_callback,
|
||||
std::function<void(::mediapipe::Status)> error_callback);
|
||||
std::function<void(mediapipe::Status)> error_callback);
|
||||
|
||||
// Notifies the graph output stream of new packets emitted by the output
|
||||
// stream.
|
||||
virtual ::mediapipe::Status Notify() = 0;
|
||||
virtual mediapipe::Status Notify() = 0;
|
||||
|
||||
// Notifies the graph output stream of the errors in the calculator graph.
|
||||
virtual void NotifyError() = 0;
|
||||
@@ -110,21 +110,21 @@ class OutputStreamObserver : public GraphOutputStream {
|
||||
public:
|
||||
virtual ~OutputStreamObserver() {}
|
||||
|
||||
::mediapipe::Status Initialize(
|
||||
mediapipe::Status Initialize(
|
||||
const std::string& stream_name, const PacketType* packet_type,
|
||||
std::function<::mediapipe::Status(const Packet&)> packet_callback,
|
||||
std::function<mediapipe::Status(const Packet&)> packet_callback,
|
||||
OutputStreamManager* output_stream_manager);
|
||||
|
||||
// Notifies the observer of new packets emitted by the observed
|
||||
// output stream.
|
||||
::mediapipe::Status Notify() override;
|
||||
mediapipe::Status Notify() override;
|
||||
|
||||
// Notifies the observer of the errors in the calculator graph.
|
||||
void NotifyError() override {}
|
||||
|
||||
private:
|
||||
// Invoked on every packet emitted by the observed output stream.
|
||||
std::function<::mediapipe::Status(const Packet&)> packet_callback_;
|
||||
std::function<mediapipe::Status(const Packet&)> packet_callback_;
|
||||
};
|
||||
|
||||
// OutputStreamPollerImpl that returns packets to the caller via
|
||||
@@ -134,14 +134,14 @@ class OutputStreamPollerImpl : public GraphOutputStream {
|
||||
virtual ~OutputStreamPollerImpl() {}
|
||||
|
||||
// Initializes an OutputStreamPollerImpl.
|
||||
::mediapipe::Status Initialize(
|
||||
mediapipe::Status Initialize(
|
||||
const std::string& stream_name, const PacketType* packet_type,
|
||||
std::function<void(InputStreamManager*, bool*)> queue_size_callback,
|
||||
OutputStreamManager* output_stream_manager);
|
||||
|
||||
void PrepareForRun(
|
||||
std::function<void()> notification_callback,
|
||||
std::function<void(::mediapipe::Status)> error_callback) override;
|
||||
std::function<void(mediapipe::Status)> error_callback) override;
|
||||
|
||||
// Resets graph_has_error_ and cleans the internal packet queue.
|
||||
void Reset();
|
||||
@@ -152,7 +152,7 @@ class OutputStreamPollerImpl : public GraphOutputStream {
|
||||
int QueueSize();
|
||||
|
||||
// Notifies the poller of new packets emitted by the output stream.
|
||||
::mediapipe::Status Notify() override;
|
||||
mediapipe::Status Notify() override;
|
||||
|
||||
// Notifies the poller of the errors in the calculator graph.
|
||||
void NotifyError() override;
|
||||
|
||||
@@ -48,7 +48,7 @@ class GraphServiceTest : public ::testing::Test {
|
||||
protected:
|
||||
void SetUp() override {
|
||||
CalculatorGraphConfig config =
|
||||
::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
input_stream: "in"
|
||||
node {
|
||||
calculator: "TestServiceCalculator"
|
||||
@@ -60,7 +60,7 @@ class GraphServiceTest : public ::testing::Test {
|
||||
MP_ASSERT_OK(
|
||||
graph_.ObserveOutputStream("out", [this](const Packet& packet) {
|
||||
output_packets_.push_back(packet);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}));
|
||||
}
|
||||
|
||||
@@ -98,7 +98,7 @@ TEST_F(GraphServiceTest, UseInCalculator) {
|
||||
|
||||
TEST_F(GraphServiceTest, Contract) {
|
||||
const CalculatorGraphConfig::Node node =
|
||||
::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig::Node>(R"(
|
||||
mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig::Node>(R"(
|
||||
calculator: "TestServiceCalculator"
|
||||
input_stream: "in"
|
||||
output_stream: "out"
|
||||
|
||||
@@ -28,7 +28,7 @@ namespace mediapipe {
|
||||
class GraphValidation {
|
||||
public:
|
||||
// Validates the specified CalculatorGraphConfig.
|
||||
::mediapipe::Status Validate(
|
||||
mediapipe::Status Validate(
|
||||
const CalculatorGraphConfig& config,
|
||||
const std::map<std::string, Packet>& side_packets = {}) {
|
||||
return graph_.Initialize(config, side_packets);
|
||||
@@ -40,7 +40,7 @@ class GraphValidation {
|
||||
// CalclatorGraphConfig.type. A subgraph can be validated directly by
|
||||
// specifying its type in |graph_type|. A template graph can be validated
|
||||
// directly by specifying its template arguments in |arguments|.
|
||||
::mediapipe::Status Validate(
|
||||
mediapipe::Status Validate(
|
||||
const std::vector<CalculatorGraphConfig>& configs,
|
||||
const std::vector<CalculatorGraphTemplate>& templates,
|
||||
const std::map<std::string, Packet>& side_packets = {},
|
||||
|
||||
@@ -66,7 +66,7 @@ TEST(GraphValidationTest, InitializeGraphFromProtos) {
|
||||
graph_1.Initialize({config_1, config_2}, {}, {}, "PassThroughGraph"));
|
||||
EXPECT_THAT(
|
||||
graph_1.Config(),
|
||||
EqualsProto(::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
EqualsProto(mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
type: "PassThroughGraph"
|
||||
input_stream: "INPUT:stream_1"
|
||||
output_stream: "OUTPUT:stream_2"
|
||||
@@ -84,7 +84,7 @@ TEST(GraphValidationTest, InitializeGraphFromProtos) {
|
||||
MP_EXPECT_OK(graph_2.Initialize({config_1, config_2}, {}));
|
||||
EXPECT_THAT(
|
||||
graph_2.Config(),
|
||||
EqualsProto(::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
EqualsProto(mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
input_stream: "INPUT:stream_1"
|
||||
output_stream: "OUTPUT:stream_2"
|
||||
node {
|
||||
@@ -106,9 +106,9 @@ TEST(GraphValidationTest, InitializeGraphFromProtos) {
|
||||
TEST(GraphValidationTest, InitializeGraphFromLinker) {
|
||||
EXPECT_FALSE(SubgraphRegistry::IsRegistered("DubQuadTestSubgraph"));
|
||||
ValidatedGraphConfig builder_1;
|
||||
::mediapipe::Status status_1 =
|
||||
mediapipe::Status status_1 =
|
||||
builder_1.Initialize({}, {}, "DubQuadTestSubgraph");
|
||||
EXPECT_EQ(status_1.code(), ::mediapipe::StatusCode::kNotFound);
|
||||
EXPECT_EQ(status_1.code(), mediapipe::StatusCode::kNotFound);
|
||||
EXPECT_THAT(status_1.message(),
|
||||
testing::HasSubstr(
|
||||
R"(No registered object with name: DubQuadTestSubgraph)"));
|
||||
@@ -174,7 +174,7 @@ TEST(GraphValidationTest, InitializeTemplateFromProtos) {
|
||||
"PassThroughGraph", &options));
|
||||
EXPECT_THAT(
|
||||
graph_1.Config(),
|
||||
EqualsProto(::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
EqualsProto(mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
type: "PassThroughGraph"
|
||||
input_stream: "INPUT:stream_9"
|
||||
output_stream: "OUTPUT:stream_2"
|
||||
@@ -193,7 +193,7 @@ TEST(GraphValidationTest, InitializeTemplateFromProtos) {
|
||||
MP_EXPECT_OK(graph_2.Initialize({config_2}, {config_1}));
|
||||
EXPECT_THAT(
|
||||
graph_2.Config(),
|
||||
EqualsProto(::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
EqualsProto(mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
input_stream: "INPUT:stream_1"
|
||||
output_stream: "OUTPUT:stream_2"
|
||||
node {
|
||||
@@ -254,7 +254,7 @@ TEST(GraphValidationTest, OptionalSubgraphStreams) {
|
||||
graph_1.Config(),
|
||||
|
||||
// The result includes only the requested input and output streams.
|
||||
EqualsProto(::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
EqualsProto(mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
input_stream: "INPUT:foo_in"
|
||||
output_stream: "OUTPUT:foo_out"
|
||||
node {
|
||||
@@ -314,7 +314,7 @@ TEST(GraphValidationTest, OptionalSubgraphStreamsMismatched) {
|
||||
|
||||
GraphValidation validation_1;
|
||||
mediapipe::Status status = validation_1.Validate({config_1, config_2}, {});
|
||||
ASSERT_EQ(status.code(), ::mediapipe::StatusCode::kInvalidArgument);
|
||||
ASSERT_EQ(status.code(), mediapipe::StatusCode::kInvalidArgument);
|
||||
ASSERT_THAT(status.ToString(),
|
||||
testing::HasSubstr(
|
||||
"PassThroughCalculator must use matching tags and indexes"));
|
||||
@@ -323,22 +323,22 @@ TEST(GraphValidationTest, OptionalSubgraphStreamsMismatched) {
|
||||
// A calculator that optionally accepts an input-side-packet.
|
||||
class OptionalSideInputTestCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
cc->InputSidePackets().Tag("SIDEINPUT").Set<std::string>().Optional();
|
||||
cc->Inputs().Tag("SELECT").Set<int>().Optional();
|
||||
cc->Inputs().Tag("ENABLE").Set<bool>().Optional();
|
||||
cc->Outputs().Tag("OUTPUT").Set<std::string>();
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
mediapipe::Status Process(CalculatorContext* cc) final {
|
||||
std::string value("default");
|
||||
if (cc->InputSidePackets().HasTag("SIDEINPUT")) {
|
||||
value = cc->InputSidePackets().Tag("SIDEINPUT").Get<std::string>();
|
||||
}
|
||||
cc->Outputs().Tag("OUTPUT").Add(new std::string(value),
|
||||
cc->InputTimestamp());
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
};
|
||||
REGISTER_CALCULATOR(OptionalSideInputTestCalculator);
|
||||
@@ -374,7 +374,7 @@ TEST(GraphValidationTest, OptionalInputNotProvidedForSubgraphCalculator) {
|
||||
graph_1.Config(),
|
||||
|
||||
// The expanded graph omits the optional input-side-packet.
|
||||
EqualsProto(::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
EqualsProto(mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
input_side_packet: "INPUT:foo_in"
|
||||
output_stream: "OUTPUT:foo_out"
|
||||
node {
|
||||
@@ -431,7 +431,7 @@ TEST(GraphValidationTest, MultipleOptionalInputsForSubgraph) {
|
||||
// The expanded graph includes only the specified input, "SELECT".
|
||||
// Without the fix to RemoveIgnoredStreams(), the expanded graph
|
||||
// includes the wrong input.
|
||||
EqualsProto(::mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
EqualsProto(mediapipe::ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
|
||||
input_side_packet: "INPUT:foo_in"
|
||||
input_stream: "SELECT:foo_select"
|
||||
output_stream: "OUTPUT:foo_out"
|
||||
|
||||
@@ -21,11 +21,11 @@
|
||||
|
||||
namespace mediapipe {
|
||||
|
||||
::mediapipe::Status InputSidePacketHandler::PrepareForRun(
|
||||
mediapipe::Status InputSidePacketHandler::PrepareForRun(
|
||||
const PacketTypeSet* input_side_packet_types,
|
||||
const std::map<std::string, Packet>& all_side_packets,
|
||||
std::function<void()> input_side_packets_ready_callback,
|
||||
std::function<void(::mediapipe::Status)> error_callback) {
|
||||
std::function<void(mediapipe::Status)> error_callback) {
|
||||
int missing_input_side_packet_count;
|
||||
prev_input_side_packets_ = std::move(input_side_packets_);
|
||||
ASSIGN_OR_RETURN(
|
||||
@@ -39,7 +39,7 @@ namespace mediapipe {
|
||||
input_side_packets_ready_callback_ =
|
||||
std::move(input_side_packets_ready_callback);
|
||||
error_callback_ = std::move(error_callback);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
bool InputSidePacketHandler::InputSidePacketsChanged() {
|
||||
@@ -49,25 +49,24 @@ bool InputSidePacketHandler::InputSidePacketsChanged() {
|
||||
}
|
||||
|
||||
void InputSidePacketHandler::Set(CollectionItemId id, const Packet& packet) {
|
||||
::mediapipe::Status status = SetInternal(id, packet);
|
||||
mediapipe::Status status = SetInternal(id, packet);
|
||||
if (!status.ok()) {
|
||||
TriggerErrorCallback(status);
|
||||
}
|
||||
}
|
||||
|
||||
::mediapipe::Status InputSidePacketHandler::SetInternal(CollectionItemId id,
|
||||
const Packet& packet) {
|
||||
mediapipe::Status InputSidePacketHandler::SetInternal(CollectionItemId id,
|
||||
const Packet& packet) {
|
||||
RET_CHECK_GT(missing_input_side_packet_count_, 0);
|
||||
Packet& side_packet = input_side_packets_->Get(id);
|
||||
|
||||
if (!side_packet.IsEmpty()) {
|
||||
return ::mediapipe::AlreadyExistsErrorBuilder(MEDIAPIPE_LOC)
|
||||
return mediapipe::AlreadyExistsErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "Input side packet with id " << id << " was already set.";
|
||||
}
|
||||
::mediapipe::Status result =
|
||||
input_side_packet_types_->Get(id).Validate(packet);
|
||||
mediapipe::Status result = input_side_packet_types_->Get(id).Validate(packet);
|
||||
if (!result.ok()) {
|
||||
return ::mediapipe::StatusBuilder(result, MEDIAPIPE_LOC).SetPrepend()
|
||||
return mediapipe::StatusBuilder(result, MEDIAPIPE_LOC).SetPrepend()
|
||||
<< absl::StrCat(
|
||||
"Packet type mismatch on calculator input side packet with "
|
||||
"id ",
|
||||
@@ -78,11 +77,11 @@ void InputSidePacketHandler::Set(CollectionItemId id, const Packet& packet) {
|
||||
1, std::memory_order_acq_rel) == 1) {
|
||||
input_side_packets_ready_callback_();
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
void InputSidePacketHandler::TriggerErrorCallback(
|
||||
const ::mediapipe::Status& status) const {
|
||||
const mediapipe::Status& status) const {
|
||||
CHECK(error_callback_);
|
||||
error_callback_(status);
|
||||
}
|
||||
|
||||
@@ -41,11 +41,11 @@ class InputSidePacketHandler {
|
||||
|
||||
// Resets the input side packet handler and its underlying input side packets
|
||||
// for another run of the graph.
|
||||
::mediapipe::Status PrepareForRun(
|
||||
mediapipe::Status PrepareForRun(
|
||||
const PacketTypeSet* input_side_packet_types,
|
||||
const std::map<std::string, Packet>& all_side_packets,
|
||||
std::function<void()> input_side_packets_ready_callback,
|
||||
std::function<void(::mediapipe::Status)> error_callback);
|
||||
std::function<void(mediapipe::Status)> error_callback);
|
||||
|
||||
// Sets a particular input side packet.
|
||||
void Set(CollectionItemId id, const Packet& packet);
|
||||
@@ -63,11 +63,11 @@ class InputSidePacketHandler {
|
||||
|
||||
private:
|
||||
// Called by Set().
|
||||
::mediapipe::Status SetInternal(CollectionItemId id, const Packet& packet);
|
||||
mediapipe::Status SetInternal(CollectionItemId id, const Packet& packet);
|
||||
|
||||
// Triggers the error callback with ::mediapipe::Status info when an error
|
||||
// Triggers the error callback with mediapipe::Status info when an error
|
||||
// occurs.
|
||||
void TriggerErrorCallback(const ::mediapipe::Status& status) const;
|
||||
void TriggerErrorCallback(const mediapipe::Status& status) const;
|
||||
|
||||
const PacketTypeSet* input_side_packet_types_;
|
||||
|
||||
@@ -77,7 +77,7 @@ class InputSidePacketHandler {
|
||||
std::atomic<int> missing_input_side_packet_count_{0};
|
||||
|
||||
std::function<void()> input_side_packets_ready_callback_;
|
||||
std::function<void(::mediapipe::Status)> error_callback_;
|
||||
std::function<void(mediapipe::Status)> error_callback_;
|
||||
};
|
||||
|
||||
} // namespace mediapipe
|
||||
|
||||
@@ -24,13 +24,13 @@ namespace mediapipe {
|
||||
|
||||
using SyncSet = InputStreamHandler::SyncSet;
|
||||
|
||||
::mediapipe::Status InputStreamHandler::InitializeInputStreamManagers(
|
||||
mediapipe::Status InputStreamHandler::InitializeInputStreamManagers(
|
||||
InputStreamManager* flat_input_stream_managers) {
|
||||
for (CollectionItemId id = input_stream_managers_.BeginId();
|
||||
id < input_stream_managers_.EndId(); ++id) {
|
||||
input_stream_managers_.Get(id) = &flat_input_stream_managers[id.value()];
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
InputStreamManager* InputStreamHandler::GetInputStreamManager(
|
||||
@@ -38,7 +38,7 @@ InputStreamManager* InputStreamHandler::GetInputStreamManager(
|
||||
return input_stream_managers_.Get(id);
|
||||
}
|
||||
|
||||
::mediapipe::Status InputStreamHandler::SetupInputShards(
|
||||
mediapipe::Status InputStreamHandler::SetupInputShards(
|
||||
InputStreamShardSet* input_shards) {
|
||||
RET_CHECK(input_shards);
|
||||
for (CollectionItemId id = input_stream_managers_.BeginId();
|
||||
@@ -48,7 +48,7 @@ InputStreamManager* InputStreamHandler::GetInputStreamManager(
|
||||
input_shards->Get(id).SetName(&manager->Name());
|
||||
input_shards->Get(id).SetHeader(manager->Header());
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
std::vector<std::pair<std::string, int>>
|
||||
@@ -68,7 +68,7 @@ void InputStreamHandler::PrepareForRun(
|
||||
std::function<void()> headers_ready_callback,
|
||||
std::function<void()> notification_callback,
|
||||
std::function<void(CalculatorContext*)> schedule_callback,
|
||||
std::function<void(::mediapipe::Status)> error_callback) {
|
||||
std::function<void(mediapipe::Status)> error_callback) {
|
||||
headers_ready_callback_ = std::move(headers_ready_callback);
|
||||
notification_ = std::move(notification_callback);
|
||||
schedule_callback_ = std::move(schedule_callback);
|
||||
@@ -94,8 +94,7 @@ void InputStreamHandler::SetQueueSizeCallbacks(
|
||||
}
|
||||
|
||||
void InputStreamHandler::SetHeader(CollectionItemId id, const Packet& header) {
|
||||
::mediapipe::Status result =
|
||||
input_stream_managers_.Get(id)->SetHeader(header);
|
||||
mediapipe::Status result = input_stream_managers_.Get(id)->SetHeader(header);
|
||||
if (!result.ok()) {
|
||||
error_callback_(result);
|
||||
return;
|
||||
@@ -175,9 +174,9 @@ bool InputStreamHandler::ScheduleInvocations(int max_allowance,
|
||||
}
|
||||
CalculatorContext* default_context =
|
||||
calculator_context_manager_->GetDefaultCalculatorContext();
|
||||
::mediapipe::LogEvent(default_context->GetProfilingContext(),
|
||||
TraceEvent(TraceEvent::NOT_READY)
|
||||
.set_node_id(default_context->NodeId()));
|
||||
mediapipe::LogEvent(default_context->GetProfilingContext(),
|
||||
TraceEvent(TraceEvent::NOT_READY)
|
||||
.set_node_id(default_context->NodeId()));
|
||||
break;
|
||||
} else if (node_readiness == NodeReadiness::kReadyForProcess) {
|
||||
CalculatorContext* calculator_context =
|
||||
@@ -193,9 +192,9 @@ bool InputStreamHandler::ScheduleInvocations(int max_allowance,
|
||||
schedule_callback_(calculator_context);
|
||||
++invocations_scheduled;
|
||||
}
|
||||
::mediapipe::LogEvent(calculator_context->GetProfilingContext(),
|
||||
TraceEvent(TraceEvent::READY_FOR_PROCESS)
|
||||
.set_node_id(calculator_context->NodeId()));
|
||||
mediapipe::LogEvent(calculator_context->GetProfilingContext(),
|
||||
TraceEvent(TraceEvent::READY_FOR_PROCESS)
|
||||
.set_node_id(calculator_context->NodeId()));
|
||||
} else {
|
||||
CHECK(node_readiness == NodeReadiness::kReadyForClose);
|
||||
// If any parallel invocations are in progress or a calculator context has
|
||||
@@ -214,9 +213,9 @@ bool InputStreamHandler::ScheduleInvocations(int max_allowance,
|
||||
schedule_callback_(default_context);
|
||||
++invocations_scheduled;
|
||||
prepared_context_for_close_ = true;
|
||||
::mediapipe::LogEvent(default_context->GetProfilingContext(),
|
||||
TraceEvent(TraceEvent::READY_FOR_CLOSE)
|
||||
.set_node_id(default_context->NodeId()));
|
||||
mediapipe::LogEvent(default_context->GetProfilingContext(),
|
||||
TraceEvent(TraceEvent::READY_FOR_CLOSE)
|
||||
.set_node_id(default_context->NodeId()));
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -246,12 +245,12 @@ void LogQueuedPackets(CalculatorContext* context, InputStreamManager* stream,
|
||||
.set_input_ts(queue_tail.Timestamp())
|
||||
.set_stream_id(&stream->Name())
|
||||
.set_event_data(stream->QueueSize() + 1);
|
||||
::mediapipe::LogEvent(context->GetProfilingContext(),
|
||||
event.set_packet_ts(queue_tail.Timestamp()));
|
||||
mediapipe::LogEvent(context->GetProfilingContext(),
|
||||
event.set_packet_ts(queue_tail.Timestamp()));
|
||||
Packet queue_head = stream->QueueHead();
|
||||
if (!queue_head.IsEmpty()) {
|
||||
::mediapipe::LogEvent(context->GetProfilingContext(),
|
||||
event.set_packet_ts(queue_head.Timestamp()));
|
||||
mediapipe::LogEvent(context->GetProfilingContext(),
|
||||
event.set_packet_ts(queue_head.Timestamp()));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -261,7 +260,7 @@ void InputStreamHandler::AddPackets(CollectionItemId id,
|
||||
LogQueuedPackets(GetCalculatorContext(calculator_context_manager_),
|
||||
input_stream_managers_.Get(id), packets.back());
|
||||
bool notify = false;
|
||||
::mediapipe::Status result =
|
||||
mediapipe::Status result =
|
||||
input_stream_managers_.Get(id)->AddPackets(packets, ¬ify);
|
||||
if (!result.ok()) {
|
||||
error_callback_(result);
|
||||
@@ -276,7 +275,7 @@ void InputStreamHandler::MovePackets(CollectionItemId id,
|
||||
LogQueuedPackets(GetCalculatorContext(calculator_context_manager_),
|
||||
input_stream_managers_.Get(id), packets->back());
|
||||
bool notify = false;
|
||||
::mediapipe::Status result =
|
||||
mediapipe::Status result =
|
||||
input_stream_managers_.Get(id)->MovePackets(packets, ¬ify);
|
||||
if (!result.ok()) {
|
||||
error_callback_(result);
|
||||
@@ -289,7 +288,7 @@ void InputStreamHandler::MovePackets(CollectionItemId id,
|
||||
void InputStreamHandler::SetNextTimestampBound(CollectionItemId id,
|
||||
Timestamp bound) {
|
||||
bool notify = false;
|
||||
::mediapipe::Status result =
|
||||
mediapipe::Status result =
|
||||
input_stream_managers_.Get(id)->SetNextTimestampBound(bound, ¬ify);
|
||||
if (!result.ok()) {
|
||||
error_callback_(result);
|
||||
|
||||
@@ -84,13 +84,13 @@ class InputStreamHandler {
|
||||
// InputStreamHandler::input_stream_managers_ (meaning it should point
|
||||
// to somewhere in the middle of the master flat array of all input
|
||||
// stream managers).
|
||||
::mediapipe::Status InitializeInputStreamManagers(
|
||||
mediapipe::Status InitializeInputStreamManagers(
|
||||
InputStreamManager* flat_input_stream_managers);
|
||||
|
||||
InputStreamManager* GetInputStreamManager(CollectionItemId id);
|
||||
|
||||
// Sets up the InputStreamShardSet by propagating data from the managers.
|
||||
::mediapipe::Status SetupInputShards(InputStreamShardSet* input_shards);
|
||||
mediapipe::Status SetupInputShards(InputStreamShardSet* input_shards);
|
||||
|
||||
// Returns a vector of pairs of stream name and queue size for monitoring
|
||||
// purpose.
|
||||
@@ -106,7 +106,7 @@ class InputStreamHandler {
|
||||
std::function<void()> headers_ready_callback,
|
||||
std::function<void()> notification_callback,
|
||||
std::function<void(CalculatorContext*)> schedule_callback,
|
||||
std::function<void(::mediapipe::Status)> error_callback);
|
||||
std::function<void(mediapipe::Status)> error_callback);
|
||||
|
||||
int NumInputStreams() const { return input_stream_managers_.NumEntries(); }
|
||||
|
||||
@@ -286,7 +286,7 @@ class InputStreamHandler {
|
||||
std::function<void()> notification_;
|
||||
// A callback to schedule the node with the prepared calculator context.
|
||||
std::function<void(CalculatorContext*)> schedule_callback_;
|
||||
std::function<void(::mediapipe::Status)> error_callback_;
|
||||
std::function<void(mediapipe::Status)> error_callback_;
|
||||
|
||||
private:
|
||||
// Indicates when to fill the input set. If true, every input set will be
|
||||
@@ -318,12 +318,11 @@ using InputStreamHandlerRegistry = GlobalFactoryRegistry<
|
||||
} // namespace mediapipe
|
||||
|
||||
// Macro for registering the input stream handler.
|
||||
#define REGISTER_INPUT_STREAM_HANDLER(name) \
|
||||
REGISTER_FACTORY_FUNCTION_QUALIFIED( \
|
||||
::mediapipe::InputStreamHandlerRegistry, input_handler_registration, \
|
||||
name, \
|
||||
absl::make_unique<name, std::shared_ptr<tool::TagMap>, \
|
||||
CalculatorContextManager*, const MediaPipeOptions&, \
|
||||
#define REGISTER_INPUT_STREAM_HANDLER(name) \
|
||||
REGISTER_FACTORY_FUNCTION_QUALIFIED( \
|
||||
mediapipe::InputStreamHandlerRegistry, input_handler_registration, name, \
|
||||
absl::make_unique<name, std::shared_ptr<tool::TagMap>, \
|
||||
CalculatorContextManager*, const MediaPipeOptions&, \
|
||||
bool>)
|
||||
|
||||
#endif // MEDIAPIPE_FRAMEWORK_INPUT_STREAM_HANDLER_H_
|
||||
|
||||
@@ -27,13 +27,14 @@
|
||||
|
||||
namespace mediapipe {
|
||||
|
||||
::mediapipe::Status InputStreamManager::Initialize(
|
||||
const std::string& name, const PacketType* packet_type, bool back_edge) {
|
||||
mediapipe::Status InputStreamManager::Initialize(const std::string& name,
|
||||
const PacketType* packet_type,
|
||||
bool back_edge) {
|
||||
name_ = name;
|
||||
packet_type_ = packet_type;
|
||||
back_edge_ = back_edge;
|
||||
PrepareForRun();
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
const std::string& InputStreamManager::Name() const { return name_; }
|
||||
@@ -69,28 +70,28 @@ Packet InputStreamManager::QueueHead() const {
|
||||
return queue_.front();
|
||||
}
|
||||
|
||||
::mediapipe::Status InputStreamManager::SetHeader(const Packet& header) {
|
||||
mediapipe::Status InputStreamManager::SetHeader(const Packet& header) {
|
||||
if (header.Timestamp() != Timestamp::Unset()) {
|
||||
return ::mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
|
||||
return mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "Headers must not have a timestamp. Stream: \"" << name_
|
||||
<< "\".";
|
||||
}
|
||||
header_ = header;
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status InputStreamManager::AddPackets(
|
||||
mediapipe::Status InputStreamManager::AddPackets(
|
||||
const std::list<Packet>& container, bool* notify) {
|
||||
return AddOrMovePacketsInternal<const std::list<Packet>&>(container, notify);
|
||||
}
|
||||
|
||||
::mediapipe::Status InputStreamManager::MovePackets(
|
||||
std::list<Packet>* container, bool* notify) {
|
||||
mediapipe::Status InputStreamManager::MovePackets(std::list<Packet>* container,
|
||||
bool* notify) {
|
||||
return AddOrMovePacketsInternal<std::list<Packet>&>(*container, notify);
|
||||
}
|
||||
|
||||
template <typename Container>
|
||||
::mediapipe::Status InputStreamManager::AddOrMovePacketsInternal(
|
||||
mediapipe::Status InputStreamManager::AddOrMovePacketsInternal(
|
||||
Container container, bool* notify) {
|
||||
*notify = false;
|
||||
bool queue_became_non_empty = false;
|
||||
@@ -99,7 +100,7 @@ template <typename Container>
|
||||
// Scope to prevent locking the stream when notification is called.
|
||||
absl::MutexLock stream_lock(&stream_mutex_);
|
||||
if (closed_) {
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
// Check if the queue was full before packets came in.
|
||||
bool was_queue_full =
|
||||
@@ -107,7 +108,7 @@ template <typename Container>
|
||||
// Check if the queue becomes non-empty.
|
||||
queue_became_non_empty = queue_.empty() && !container.empty();
|
||||
for (auto& packet : container) {
|
||||
::mediapipe::Status result = packet_type_->Validate(packet);
|
||||
mediapipe::Status result = packet_type_->Validate(packet);
|
||||
if (!result.ok()) {
|
||||
return tool::AddStatusPrefix(
|
||||
absl::StrCat(
|
||||
@@ -118,7 +119,7 @@ template <typename Container>
|
||||
|
||||
const Timestamp timestamp = packet.Timestamp();
|
||||
if (!timestamp.IsAllowedInStream()) {
|
||||
return ::mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
|
||||
return mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "In stream \"" << name_
|
||||
<< "\", timestamp not specified or set to illegal value: "
|
||||
<< timestamp.DebugString();
|
||||
@@ -129,13 +130,13 @@ template <typename Container>
|
||||
// Timestamp::PreStream().NextAllowedInStream() is
|
||||
// Timestamp::OneOverPostStream().
|
||||
if (timestamp == Timestamp::PostStream() && num_packets_added_ > 0) {
|
||||
return ::mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
|
||||
return mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "In stream \"" << name_
|
||||
<< "\", a packet at Timestamp::PostStream() must be the only "
|
||||
"Packet in an InputStream.";
|
||||
}
|
||||
if (timestamp < next_timestamp_bound_) {
|
||||
return ::mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
|
||||
return mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "Packet timestamp mismatch on a calculator receiving from "
|
||||
"stream \""
|
||||
<< name_ << "\". Current minimum expected timestamp is "
|
||||
@@ -176,21 +177,21 @@ template <typename Container>
|
||||
becomes_full_callback_(this, &last_reported_stream_full_);
|
||||
}
|
||||
*notify = queue_became_non_empty;
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status InputStreamManager::SetNextTimestampBound(
|
||||
mediapipe::Status InputStreamManager::SetNextTimestampBound(
|
||||
const Timestamp bound, bool* notify) {
|
||||
*notify = false;
|
||||
{
|
||||
// Scope to prevent locking the stream when notification is called.
|
||||
absl::MutexLock stream_lock(&stream_mutex_);
|
||||
if (closed_) {
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
if (enable_timestamps_ && bound < next_timestamp_bound_) {
|
||||
return ::mediapipe::UnknownErrorBuilder(MEDIAPIPE_LOC)
|
||||
return mediapipe::UnknownErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "SetNextTimestampBound must be called with a timestamp greater "
|
||||
"than or equal to the current bound. In stream \""
|
||||
<< name_ << "\". Current minimum expected timestamp is "
|
||||
@@ -210,7 +211,7 @@ template <typename Container>
|
||||
}
|
||||
}
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
void InputStreamManager::DisableTimestamps() { enable_timestamps_ = false; }
|
||||
|
||||
@@ -57,8 +57,8 @@ class InputStreamManager {
|
||||
InputStreamManager() = default;
|
||||
|
||||
// Initializes the InputStreamManager.
|
||||
::mediapipe::Status Initialize(const std::string& name,
|
||||
const PacketType* packet_type, bool back_edge);
|
||||
mediapipe::Status Initialize(const std::string& name,
|
||||
const PacketType* packet_type, bool back_edge);
|
||||
|
||||
// Returns the stream name.
|
||||
const std::string& Name() const;
|
||||
@@ -67,7 +67,7 @@ class InputStreamManager {
|
||||
bool BackEdge() const { return back_edge_; }
|
||||
|
||||
// Sets the header Packet.
|
||||
::mediapipe::Status SetHeader(const Packet& header);
|
||||
mediapipe::Status SetHeader(const Packet& header);
|
||||
|
||||
const Packet& Header() const { return header_; }
|
||||
|
||||
@@ -87,13 +87,13 @@ class InputStreamManager {
|
||||
// Timestamp::PostStream(), the packet must be the only packet in the
|
||||
// stream.
|
||||
// Violation of any of these conditions causes an error status.
|
||||
::mediapipe::Status AddPackets(const std::list<Packet>& container,
|
||||
bool* notify);
|
||||
mediapipe::Status AddPackets(const std::list<Packet>& container,
|
||||
bool* notify);
|
||||
|
||||
// Move a list of timestamped packets. Sets "notify" to true if the queue
|
||||
// becomes non-empty. Does nothing if the input stream is closed. After the
|
||||
// move, all packets in the container must be empty.
|
||||
::mediapipe::Status MovePackets(std::list<Packet>* container, bool* notify);
|
||||
mediapipe::Status MovePackets(std::list<Packet>* container, bool* notify);
|
||||
|
||||
// Closes the input stream. This function can be called multiple times.
|
||||
void Close() ABSL_LOCKS_EXCLUDED(stream_mutex_);
|
||||
@@ -103,7 +103,7 @@ class InputStreamManager {
|
||||
// empty. Returns an error status if this decreases the bound, unless
|
||||
// DisableTimestamps() is called. Does nothing if the input stream is
|
||||
// closed.
|
||||
::mediapipe::Status SetNextTimestampBound(Timestamp bound, bool* notify)
|
||||
mediapipe::Status SetNextTimestampBound(Timestamp bound, bool* notify)
|
||||
ABSL_LOCKS_EXCLUDED(stream_mutex_);
|
||||
|
||||
// Returns the smallest timestamp at which we might see an input in
|
||||
@@ -182,8 +182,7 @@ class InputStreamManager {
|
||||
// Otherwise, the caller must be MovePackets() and Container should be
|
||||
// non-const reference.
|
||||
template <typename Container>
|
||||
::mediapipe::Status AddOrMovePacketsInternal(Container container,
|
||||
bool* notify)
|
||||
mediapipe::Status AddOrMovePacketsInternal(Container container, bool* notify)
|
||||
ABSL_LOCKS_EXCLUDED(stream_mutex_);
|
||||
|
||||
// Returns true if the next timestamp bound reaches Timestamp::Done().
|
||||
|
||||
@@ -133,7 +133,7 @@ TEST_F(InputStreamManagerTest, AddPacketUnset) {
|
||||
packets.push_back(MakePacket<std::string>("packet 1").At(Timestamp::Unset()));
|
||||
EXPECT_TRUE(input_stream_manager_->IsEmpty());
|
||||
|
||||
::mediapipe::Status result =
|
||||
mediapipe::Status result =
|
||||
input_stream_manager_->AddPackets(packets, ¬ify_); // No notification
|
||||
ASSERT_THAT(result.message(), testing::HasSubstr("Timestamp::Unset()"));
|
||||
EXPECT_FALSE(notify_);
|
||||
@@ -145,7 +145,7 @@ TEST_F(InputStreamManagerTest, AddPacketUnstarted) {
|
||||
MakePacket<std::string>("packet 1").At(Timestamp::Unstarted()));
|
||||
EXPECT_TRUE(input_stream_manager_->IsEmpty());
|
||||
|
||||
::mediapipe::Status result =
|
||||
mediapipe::Status result =
|
||||
input_stream_manager_->AddPackets(packets, ¬ify_); // No notification
|
||||
ASSERT_THAT(result.message(), testing::HasSubstr("Timestamp::Unstarted()"));
|
||||
EXPECT_FALSE(notify_);
|
||||
@@ -157,7 +157,7 @@ TEST_F(InputStreamManagerTest, AddPacketOneOverPostStream) {
|
||||
MakePacket<std::string>("packet 1").At(Timestamp::OneOverPostStream()));
|
||||
EXPECT_TRUE(input_stream_manager_->IsEmpty());
|
||||
|
||||
::mediapipe::Status result =
|
||||
mediapipe::Status result =
|
||||
input_stream_manager_->AddPackets(packets, ¬ify_); // No notification
|
||||
ASSERT_THAT(result.message(),
|
||||
testing::HasSubstr("Timestamp::OneOverPostStream()"));
|
||||
@@ -169,7 +169,7 @@ TEST_F(InputStreamManagerTest, AddPacketDone) {
|
||||
packets.push_back(MakePacket<std::string>("packet 1").At(Timestamp::Done()));
|
||||
EXPECT_TRUE(input_stream_manager_->IsEmpty());
|
||||
|
||||
::mediapipe::Status result =
|
||||
mediapipe::Status result =
|
||||
input_stream_manager_->AddPackets(packets, ¬ify_); // No notification
|
||||
ASSERT_THAT(result.message(), testing::HasSubstr("Timestamp::Done()"));
|
||||
EXPECT_FALSE(notify_);
|
||||
@@ -196,7 +196,7 @@ TEST_F(InputStreamManagerTest, AddPacketsAfterPreStream) {
|
||||
packets.push_back(MakePacket<std::string>("packet 2").At(Timestamp(10)));
|
||||
EXPECT_TRUE(input_stream_manager_->IsEmpty());
|
||||
|
||||
::mediapipe::Status result =
|
||||
mediapipe::Status result =
|
||||
input_stream_manager_->AddPackets(packets, ¬ify_); // No notification
|
||||
ASSERT_THAT(result.message(),
|
||||
testing::HasSubstr("Timestamp::OneOverPostStream()"));
|
||||
@@ -224,7 +224,7 @@ TEST_F(InputStreamManagerTest, AddPacketsBeforePostStream) {
|
||||
MakePacket<std::string>("packet 2").At(Timestamp::PostStream()));
|
||||
EXPECT_TRUE(input_stream_manager_->IsEmpty());
|
||||
|
||||
::mediapipe::Status result =
|
||||
mediapipe::Status result =
|
||||
input_stream_manager_->AddPackets(packets, ¬ify_); // No notification
|
||||
ASSERT_THAT(result.message(), testing::HasSubstr("Timestamp::PostStream()"));
|
||||
EXPECT_FALSE(notify_);
|
||||
@@ -237,7 +237,7 @@ TEST_F(InputStreamManagerTest, AddPacketsReverseTimestamps) {
|
||||
packets.push_back(MakePacket<std::string>("packet 3").At(Timestamp(30)));
|
||||
EXPECT_TRUE(input_stream_manager_->IsEmpty());
|
||||
|
||||
::mediapipe::Status result =
|
||||
mediapipe::Status result =
|
||||
input_stream_manager_->AddPackets(packets, ¬ify_); // No notification
|
||||
ASSERT_THAT(result.message(),
|
||||
testing::HasSubstr(
|
||||
@@ -398,7 +398,7 @@ TEST_F(InputStreamManagerTest, BadPacketType) {
|
||||
packets.push_back(MakePacket<int>(10).At(Timestamp(10)));
|
||||
EXPECT_TRUE(input_stream_manager_->IsEmpty());
|
||||
|
||||
::mediapipe::Status result =
|
||||
mediapipe::Status result =
|
||||
input_stream_manager_->AddPackets(packets, ¬ify_); // No notification
|
||||
ASSERT_THAT(result.message(), testing::HasSubstr("Packet type mismatch"));
|
||||
EXPECT_FALSE(notify_);
|
||||
@@ -543,7 +543,7 @@ TEST_F(InputStreamManagerTest, BackwardsInTime) {
|
||||
EXPECT_FALSE(notify_);
|
||||
|
||||
notify_ = false;
|
||||
::mediapipe::Status result = input_stream_manager_->SetNextTimestampBound(
|
||||
mediapipe::Status result = input_stream_manager_->SetNextTimestampBound(
|
||||
Timestamp(40), ¬ify_); // Set Timestamp bound backwards in time.
|
||||
ASSERT_THAT(result.message(), testing::HasSubstr("40"));
|
||||
ASSERT_THAT(result.message(), testing::HasSubstr("50"));
|
||||
@@ -554,7 +554,7 @@ TEST_F(InputStreamManagerTest, BackwardsInTime) {
|
||||
packets.clear();
|
||||
packets.push_back(MakePacket<std::string>("packet 3")
|
||||
.At(Timestamp(30))); // Backwards in time
|
||||
::mediapipe::Status result2 =
|
||||
mediapipe::Status result2 =
|
||||
input_stream_manager_->AddPackets(packets, ¬ify_); // No notification
|
||||
ASSERT_THAT(result2.message(), testing::HasSubstr("50"));
|
||||
ASSERT_THAT(result2.message(), testing::HasSubstr("30"));
|
||||
@@ -585,7 +585,7 @@ TEST_F(InputStreamManagerTest, BackwardsInTime) {
|
||||
packets.clear();
|
||||
packets.push_back(MakePacket<std::string>("packet 5")
|
||||
.At(Timestamp(130))); // Backwards in time.
|
||||
::mediapipe::Status result3 =
|
||||
mediapipe::Status result3 =
|
||||
input_stream_manager_->AddPackets(packets, ¬ify_); // No notification
|
||||
ASSERT_THAT(result3.message(), testing::HasSubstr("151"));
|
||||
ASSERT_THAT(result3.message(), testing::HasSubstr("130"));
|
||||
|
||||
@@ -20,21 +20,21 @@
|
||||
|
||||
namespace mediapipe {
|
||||
|
||||
::mediapipe::Status OutputSidePacketImpl::Initialize(
|
||||
mediapipe::Status OutputSidePacketImpl::Initialize(
|
||||
const std::string& name, const PacketType* packet_type) {
|
||||
name_ = name;
|
||||
packet_type_ = packet_type;
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
void OutputSidePacketImpl::PrepareForRun(
|
||||
std::function<void(::mediapipe::Status)> error_callback) {
|
||||
std::function<void(mediapipe::Status)> error_callback) {
|
||||
error_callback_ = std::move(error_callback);
|
||||
initialized_ = false;
|
||||
}
|
||||
|
||||
void OutputSidePacketImpl::Set(const Packet& packet) {
|
||||
::mediapipe::Status status = SetInternal(packet);
|
||||
mediapipe::Status status = SetInternal(packet);
|
||||
if (!status.ok()) {
|
||||
TriggerErrorCallback(status);
|
||||
}
|
||||
@@ -46,26 +46,26 @@ void OutputSidePacketImpl::AddMirror(
|
||||
mirrors_.emplace_back(input_side_packet_handler, id);
|
||||
}
|
||||
|
||||
::mediapipe::Status OutputSidePacketImpl::SetInternal(const Packet& packet) {
|
||||
mediapipe::Status OutputSidePacketImpl::SetInternal(const Packet& packet) {
|
||||
if (initialized_) {
|
||||
return ::mediapipe::AlreadyExistsErrorBuilder(MEDIAPIPE_LOC)
|
||||
return mediapipe::AlreadyExistsErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "Output side packet \"" << name_ << "\" was already set.";
|
||||
}
|
||||
|
||||
if (packet.IsEmpty()) {
|
||||
return ::mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
|
||||
return mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "Empty packet set on output side packet \"" << name_ << "\".";
|
||||
}
|
||||
|
||||
if (packet.Timestamp() != Timestamp::Unset()) {
|
||||
return ::mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
|
||||
return mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "Output side packet \"" << name_ << "\" has a timestamp "
|
||||
<< packet.Timestamp().DebugString() << ".";
|
||||
}
|
||||
|
||||
::mediapipe::Status result = packet_type_->Validate(packet);
|
||||
mediapipe::Status result = packet_type_->Validate(packet);
|
||||
if (!result.ok()) {
|
||||
return ::mediapipe::StatusBuilder(result, MEDIAPIPE_LOC).SetPrepend()
|
||||
return mediapipe::StatusBuilder(result, MEDIAPIPE_LOC).SetPrepend()
|
||||
<< absl::StrCat(
|
||||
"Packet type mismatch on calculator output side packet \"",
|
||||
name_, "\": ");
|
||||
@@ -76,11 +76,11 @@ void OutputSidePacketImpl::AddMirror(
|
||||
for (const auto& mirror : mirrors_) {
|
||||
mirror.input_side_packet_handler->Set(mirror.id, packet_);
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
void OutputSidePacketImpl::TriggerErrorCallback(
|
||||
const ::mediapipe::Status& status) const {
|
||||
const mediapipe::Status& status) const {
|
||||
CHECK(error_callback_);
|
||||
error_callback_(status);
|
||||
}
|
||||
|
||||
@@ -35,13 +35,13 @@ class OutputSidePacketImpl : public OutputSidePacket {
|
||||
~OutputSidePacketImpl() override = default;
|
||||
|
||||
// Initializes the OutputSidePacketImpl.
|
||||
::mediapipe::Status Initialize(const std::string& name,
|
||||
const PacketType* packet_type);
|
||||
mediapipe::Status Initialize(const std::string& name,
|
||||
const PacketType* packet_type);
|
||||
|
||||
// Prepares this for processing. If an error occurs in a user called function
|
||||
// (such as Set()) then error_callback will be called before returning
|
||||
// control to the user.
|
||||
void PrepareForRun(std::function<void(::mediapipe::Status)> error_callback);
|
||||
void PrepareForRun(std::function<void(mediapipe::Status)> error_callback);
|
||||
|
||||
// Gets the output side packet.
|
||||
Packet GetPacket() const { return packet_; }
|
||||
@@ -70,15 +70,15 @@ class OutputSidePacketImpl : public OutputSidePacket {
|
||||
};
|
||||
|
||||
// Called by Set().
|
||||
::mediapipe::Status SetInternal(const Packet& packet);
|
||||
mediapipe::Status SetInternal(const Packet& packet);
|
||||
|
||||
// Triggers the error callback with ::mediapipe::Status info when an error
|
||||
// Triggers the error callback with mediapipe::Status info when an error
|
||||
// occurs.
|
||||
void TriggerErrorCallback(const ::mediapipe::Status& status) const;
|
||||
void TriggerErrorCallback(const mediapipe::Status& status) const;
|
||||
|
||||
std::string name_;
|
||||
const PacketType* packet_type_;
|
||||
std::function<void(::mediapipe::Status)> error_callback_;
|
||||
std::function<void(mediapipe::Status)> error_callback_;
|
||||
Packet packet_;
|
||||
bool initialized_ = false;
|
||||
|
||||
|
||||
@@ -20,16 +20,16 @@
|
||||
|
||||
namespace mediapipe {
|
||||
|
||||
::mediapipe::Status OutputStreamHandler::InitializeOutputStreamManagers(
|
||||
mediapipe::Status OutputStreamHandler::InitializeOutputStreamManagers(
|
||||
OutputStreamManager* flat_output_stream_managers) {
|
||||
for (CollectionItemId id = output_stream_managers_.BeginId();
|
||||
id < output_stream_managers_.EndId(); ++id) {
|
||||
output_stream_managers_.Get(id) = &flat_output_stream_managers[id.value()];
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status OutputStreamHandler::SetupOutputShards(
|
||||
mediapipe::Status OutputStreamHandler::SetupOutputShards(
|
||||
OutputStreamShardSet* output_shards) {
|
||||
CHECK(output_shards);
|
||||
for (CollectionItemId id = output_stream_managers_.BeginId();
|
||||
@@ -37,11 +37,11 @@ namespace mediapipe {
|
||||
OutputStreamManager* manager = output_stream_managers_.Get(id);
|
||||
output_shards->Get(id).SetSpec(manager->Spec());
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
void OutputStreamHandler::PrepareForRun(
|
||||
const std::function<void(::mediapipe::Status)>& error_callback) {
|
||||
const std::function<void(mediapipe::Status)>& error_callback) {
|
||||
for (auto& manager : output_stream_managers_) {
|
||||
manager->PrepareForRun(error_callback);
|
||||
}
|
||||
|
||||
@@ -76,11 +76,11 @@ class OutputStreamHandler {
|
||||
// OutputStreamHandler::output_stream_managers_ (meaning it should
|
||||
// point to somewhere in the middle of the master flat array of all
|
||||
// output stream managers).
|
||||
::mediapipe::Status InitializeOutputStreamManagers(
|
||||
mediapipe::Status InitializeOutputStreamManagers(
|
||||
OutputStreamManager* flat_output_stream_managers);
|
||||
|
||||
// Sets up output shards by connecting to the managers.
|
||||
::mediapipe::Status SetupOutputShards(OutputStreamShardSet* output_shards);
|
||||
mediapipe::Status SetupOutputShards(OutputStreamShardSet* output_shards);
|
||||
|
||||
int NumOutputStreams() const { return output_stream_managers_.NumEntries(); }
|
||||
|
||||
@@ -92,7 +92,7 @@ class OutputStreamHandler {
|
||||
// Calls OutputStreamManager::PrepareForRun(error_callback) per stream, and
|
||||
// resets data memebers.
|
||||
void PrepareForRun(
|
||||
const std::function<void(::mediapipe::Status)>& error_callback)
|
||||
const std::function<void(mediapipe::Status)>& error_callback)
|
||||
ABSL_LOCKS_EXCLUDED(timestamp_mutex_);
|
||||
|
||||
// Marks the output streams as started and propagates any changes made in
|
||||
@@ -203,12 +203,12 @@ using OutputStreamHandlerRegistry = GlobalFactoryRegistry<
|
||||
} // namespace mediapipe
|
||||
|
||||
// Macro for registering the output stream handler.
|
||||
#define REGISTER_OUTPUT_STREAM_HANDLER(name) \
|
||||
REGISTER_FACTORY_FUNCTION_QUALIFIED( \
|
||||
::mediapipe::OutputStreamHandlerRegistry, output_handler_registration, \
|
||||
name, \
|
||||
absl::make_unique<name, std::shared_ptr<tool::TagMap>, \
|
||||
CalculatorContextManager*, const MediaPipeOptions&, \
|
||||
#define REGISTER_OUTPUT_STREAM_HANDLER(name) \
|
||||
REGISTER_FACTORY_FUNCTION_QUALIFIED( \
|
||||
mediapipe::OutputStreamHandlerRegistry, output_handler_registration, \
|
||||
name, \
|
||||
absl::make_unique<name, std::shared_ptr<tool::TagMap>, \
|
||||
CalculatorContextManager*, const MediaPipeOptions&, \
|
||||
bool>)
|
||||
|
||||
#endif // MEDIAPIPE_FRAMEWORK_OUTPUT_STREAM_HANDLER_H_
|
||||
|
||||
@@ -20,17 +20,17 @@
|
||||
|
||||
namespace mediapipe {
|
||||
|
||||
::mediapipe::Status OutputStreamManager::Initialize(
|
||||
mediapipe::Status OutputStreamManager::Initialize(
|
||||
const std::string& name, const PacketType* packet_type) {
|
||||
output_stream_spec_.name = name;
|
||||
output_stream_spec_.packet_type = packet_type;
|
||||
output_stream_spec_.offset_enabled = false;
|
||||
PrepareForRun(nullptr);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
void OutputStreamManager::PrepareForRun(
|
||||
std::function<void(::mediapipe::Status)> error_callback) {
|
||||
std::function<void(mediapipe::Status)> error_callback) {
|
||||
output_stream_spec_.error_callback = std::move(error_callback);
|
||||
|
||||
output_stream_spec_.locked_intro_data = false;
|
||||
@@ -66,7 +66,7 @@ bool OutputStreamManager::IsClosed() const {
|
||||
void OutputStreamManager::PropagateHeader() {
|
||||
if (output_stream_spec_.locked_intro_data) {
|
||||
output_stream_spec_.TriggerErrorCallback(
|
||||
::mediapipe::FailedPreconditionErrorBuilder(MEDIAPIPE_LOC)
|
||||
mediapipe::FailedPreconditionErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "PropagateHeader must be called in CalculatorNode::OpenNode(). "
|
||||
"Stream: \""
|
||||
<< output_stream_spec_.name << "\".");
|
||||
@@ -106,7 +106,7 @@ Timestamp OutputStreamManager::ComputeOutputTimestampBound(
|
||||
if (input_timestamp != Timestamp::Unstarted() &&
|
||||
!input_timestamp.IsAllowedInStream()) {
|
||||
output_stream_spec_.TriggerErrorCallback(
|
||||
::mediapipe::FailedPreconditionErrorBuilder(MEDIAPIPE_LOC)
|
||||
mediapipe::FailedPreconditionErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "Invalid input timestamp to compute the output timestamp bound. "
|
||||
"Stream: \""
|
||||
<< output_stream_spec_.name
|
||||
|
||||
@@ -40,13 +40,13 @@ class OutputStreamManager {
|
||||
OutputStreamManager() = default;
|
||||
|
||||
// Initializes the OutputStreamManager.
|
||||
::mediapipe::Status Initialize(const std::string& name,
|
||||
const PacketType* packet_type);
|
||||
mediapipe::Status Initialize(const std::string& name,
|
||||
const PacketType* packet_type);
|
||||
|
||||
// Prepares this for processing. If an error occurs in a user called function
|
||||
// (such as AddPacket()) then error_callback will be called before returning
|
||||
// control to the user.
|
||||
void PrepareForRun(std::function<void(::mediapipe::Status)> error_callback);
|
||||
void PrepareForRun(std::function<void(mediapipe::Status)> error_callback);
|
||||
|
||||
// Gets the stream name.
|
||||
const std::string& Name() const { return output_stream_spec_.name; }
|
||||
|
||||
@@ -85,9 +85,7 @@ class OutputStreamManagerTest : public ::testing::Test {
|
||||
|
||||
void ScheduleNoOp(CalculatorContext* cc) {}
|
||||
|
||||
void RecordError(const ::mediapipe::Status& error) {
|
||||
errors_.push_back(error);
|
||||
}
|
||||
void RecordError(const mediapipe::Status& error) { errors_.push_back(error); }
|
||||
|
||||
void ReportQueueNoOp(InputStreamManager* stream, bool* stream_was_full) {}
|
||||
|
||||
@@ -106,7 +104,7 @@ class OutputStreamManagerTest : public ::testing::Test {
|
||||
std::function<void()> headers_ready_callback_;
|
||||
std::function<void()> notification_callback_;
|
||||
std::function<void(CalculatorContext*)> schedule_callback_;
|
||||
std::function<void(::mediapipe::Status)> error_callback_;
|
||||
std::function<void(mediapipe::Status)> error_callback_;
|
||||
InputStreamManager::QueueSizeCallback queue_full_callback_;
|
||||
InputStreamManager::QueueSizeCallback queue_not_full_callback_;
|
||||
|
||||
@@ -116,7 +114,7 @@ class OutputStreamManagerTest : public ::testing::Test {
|
||||
InputStreamManager input_stream_manager_;
|
||||
|
||||
// Vector of errors encountered while using the stream.
|
||||
std::vector<::mediapipe::Status> errors_;
|
||||
std::vector<mediapipe::Status> errors_;
|
||||
};
|
||||
|
||||
TEST_F(OutputStreamManagerTest, Init) {}
|
||||
|
||||
@@ -34,7 +34,7 @@ const std::string& OutputStreamShard::Name() const {
|
||||
void OutputStreamShard::SetNextTimestampBound(Timestamp bound) {
|
||||
if (!bound.IsAllowedInStream() && bound != Timestamp::OneOverPostStream()) {
|
||||
output_stream_spec_->TriggerErrorCallback(
|
||||
::mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
|
||||
mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "In stream \"" << Name()
|
||||
<< "\", timestamp bound set to illegal value: " << bound.DebugString());
|
||||
return;
|
||||
@@ -54,7 +54,7 @@ bool OutputStreamShard::IsClosed() const { return closed_; }
|
||||
void OutputStreamShard::SetOffset(TimestampDiff offset) {
|
||||
if (output_stream_spec_->locked_intro_data) {
|
||||
output_stream_spec_->TriggerErrorCallback(
|
||||
::mediapipe::FailedPreconditionErrorBuilder(MEDIAPIPE_LOC)
|
||||
mediapipe::FailedPreconditionErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "SetOffset must be called from Calculator::Open(). Stream: \""
|
||||
<< output_stream_spec_->name << "\".");
|
||||
return;
|
||||
@@ -66,7 +66,7 @@ void OutputStreamShard::SetOffset(TimestampDiff offset) {
|
||||
void OutputStreamShard::SetHeader(const Packet& header) {
|
||||
if (closed_) {
|
||||
output_stream_spec_->TriggerErrorCallback(
|
||||
::mediapipe::FailedPreconditionErrorBuilder(MEDIAPIPE_LOC)
|
||||
mediapipe::FailedPreconditionErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "SetHeader must be called before the stream is closed. Stream: \""
|
||||
<< output_stream_spec_->name << "\".");
|
||||
return;
|
||||
@@ -74,7 +74,7 @@ void OutputStreamShard::SetHeader(const Packet& header) {
|
||||
|
||||
if (output_stream_spec_->locked_intro_data) {
|
||||
output_stream_spec_->TriggerErrorCallback(
|
||||
::mediapipe::FailedPreconditionErrorBuilder(MEDIAPIPE_LOC)
|
||||
mediapipe::FailedPreconditionErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "SetHeader must be called from Calculator::Open(). Stream: \""
|
||||
<< output_stream_spec_->name << "\".");
|
||||
return;
|
||||
@@ -96,18 +96,18 @@ const Packet& OutputStreamShard::Header() const {
|
||||
template <typename T>
|
||||
Status OutputStreamShard::AddPacketInternal(T&& packet) {
|
||||
if (IsClosed()) {
|
||||
return ::mediapipe::FailedPreconditionErrorBuilder(MEDIAPIPE_LOC)
|
||||
return mediapipe::FailedPreconditionErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "Packet sent to closed stream \"" << Name() << "\".";
|
||||
}
|
||||
|
||||
if (packet.IsEmpty()) {
|
||||
return ::mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
|
||||
return mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "Empty packet sent to stream \"" << Name() << "\".";
|
||||
}
|
||||
|
||||
const Timestamp timestamp = packet.Timestamp();
|
||||
if (!timestamp.IsAllowedInStream()) {
|
||||
return ::mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
|
||||
return mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "In stream \"" << Name()
|
||||
<< "\", timestamp not specified or set to illegal value: "
|
||||
<< timestamp.DebugString();
|
||||
@@ -128,7 +128,7 @@ Status OutputStreamShard::AddPacketInternal(T&& packet) {
|
||||
|
||||
// TODO debug log?
|
||||
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
void OutputStreamShard::AddPacket(const Packet& packet) {
|
||||
|
||||
@@ -31,16 +31,16 @@ class OutputStreamManager;
|
||||
// The output stream spec shared across all output stream shards and their
|
||||
// output stream manager.
|
||||
struct OutputStreamSpec {
|
||||
// Triggers the error callback with ::mediapipe::Status info when an error
|
||||
// Triggers the error callback with mediapipe::Status info when an error
|
||||
// occurs.
|
||||
void TriggerErrorCallback(const ::mediapipe::Status& status) const {
|
||||
void TriggerErrorCallback(const mediapipe::Status& status) const {
|
||||
CHECK(error_callback);
|
||||
error_callback(status);
|
||||
}
|
||||
|
||||
std::string name;
|
||||
const PacketType* packet_type;
|
||||
std::function<void(::mediapipe::Status)> error_callback;
|
||||
std::function<void(mediapipe::Status)> error_callback;
|
||||
bool locked_intro_data;
|
||||
// Those three variables are the intro data protected by locked_intro_data.
|
||||
bool offset_enabled;
|
||||
@@ -102,7 +102,7 @@ class OutputStreamShard : public OutputStream {
|
||||
// AddPacketInternal template is called by either AddPacket(Packet&& packet)
|
||||
// or AddPacket(const Packet& packet).
|
||||
template <typename T>
|
||||
::mediapipe::Status AddPacketInternal(T&& packet);
|
||||
mediapipe::Status AddPacketInternal(T&& packet);
|
||||
|
||||
// Returns a pointer to the output queue.
|
||||
std::list<Packet>* OutputQueue() { return &output_queue_; }
|
||||
|
||||
@@ -51,7 +51,7 @@ const HolderBase* GetHolder(const Packet& packet) {
|
||||
return packet.holder_.get();
|
||||
}
|
||||
|
||||
::mediapipe::StatusOr<Packet> PacketFromDynamicProto(
|
||||
mediapipe::StatusOr<Packet> PacketFromDynamicProto(
|
||||
const std::string& type_name, const std::string& serialized) {
|
||||
ASSIGN_OR_RETURN(
|
||||
auto message_holder,
|
||||
@@ -105,16 +105,16 @@ std::string Packet::DebugString() const {
|
||||
return result;
|
||||
}
|
||||
|
||||
::mediapipe::Status Packet::ValidateAsProtoMessageLite() const {
|
||||
mediapipe::Status Packet::ValidateAsProtoMessageLite() const {
|
||||
if (ABSL_PREDICT_FALSE(IsEmpty())) {
|
||||
return ::mediapipe::InternalError("Packet is empty.");
|
||||
return mediapipe::InternalError("Packet is empty.");
|
||||
}
|
||||
if (ABSL_PREDICT_FALSE(holder_->GetProtoMessageLite() == nullptr)) {
|
||||
return ::mediapipe::InvalidArgumentError(
|
||||
return mediapipe::InvalidArgumentError(
|
||||
absl::StrCat("The Packet stores \"", holder_->DebugTypeName(), "\"",
|
||||
"which is not convertible to proto_ns::MessageLite."));
|
||||
} else {
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -129,7 +129,7 @@ const proto_ns::MessageLite& Packet::GetProtoMessageLite() const {
|
||||
StatusOr<std::vector<const proto_ns::MessageLite*>>
|
||||
Packet::GetVectorOfProtoMessageLitePtrs() {
|
||||
if (holder_ == nullptr) {
|
||||
return ::mediapipe::InternalError("Packet is empty.");
|
||||
return mediapipe::InternalError("Packet is empty.");
|
||||
}
|
||||
return holder_->GetVectorOfProtoMessageLite();
|
||||
}
|
||||
|
||||
@@ -53,7 +53,7 @@ Packet Create(HolderBase* holder, Timestamp timestamp);
|
||||
Packet Create(std::shared_ptr<HolderBase> holder, Timestamp timestamp);
|
||||
const HolderBase* GetHolder(const Packet& packet);
|
||||
const std::shared_ptr<HolderBase>& GetHolderShared(const Packet& packet);
|
||||
::mediapipe::StatusOr<Packet> PacketFromDynamicProto(
|
||||
mediapipe::StatusOr<Packet> PacketFromDynamicProto(
|
||||
const std::string& type_name, const std::string& serialized);
|
||||
} // namespace packet_internal
|
||||
|
||||
@@ -111,7 +111,7 @@ class Packet {
|
||||
// holder. Otherwise, returns error when the packet can't be consumed.
|
||||
// See ConsumeOrCopy for threading requirements and example usage.
|
||||
template <typename T>
|
||||
::mediapipe::StatusOr<std::unique_ptr<T>> Consume();
|
||||
mediapipe::StatusOr<std::unique_ptr<T>> Consume();
|
||||
|
||||
// Consumes the packet and transfers the ownership of the data to a
|
||||
// unique pointer if the packet is the sole owner of a non-foreign
|
||||
@@ -131,11 +131,11 @@ class Packet {
|
||||
// ASSIGN_OR_RETURN(auto detection, p.ConsumeOrCopy<Detection>());
|
||||
// If you would like to crash on failure (prefer ASSIGN_OR_RETURN):
|
||||
// auto detection = p.ConsumeOrCopy<Detection>().ValueOrDie();
|
||||
// // In functions which do not return ::mediapipe::Status use an adaptor
|
||||
// // In functions which do not return mediapipe::Status use an adaptor
|
||||
// // function as the third argument to ASSIGN_OR_RETURN. In tests,
|
||||
// // use an adaptor which returns void.
|
||||
// ASSIGN_OR_RETURN(auto detection, p.ConsumeOrCopy<Detection>(),
|
||||
// _.With([](const ::mediapipe::Status& status) {
|
||||
// _.With([](const mediapipe::Status& status) {
|
||||
// MP_EXPECT_OK(status);
|
||||
// // Use CHECK_OK to crash and report a usable line
|
||||
// // number (which the ValueOrDie alternative does not).
|
||||
@@ -145,13 +145,13 @@ class Packet {
|
||||
//
|
||||
// Version for non-arrays.
|
||||
template <typename T>
|
||||
::mediapipe::StatusOr<std::unique_ptr<T>> ConsumeOrCopy(
|
||||
mediapipe::StatusOr<std::unique_ptr<T>> ConsumeOrCopy(
|
||||
bool* was_copied = nullptr,
|
||||
typename std::enable_if<!std::is_array<T>::value>::type* = nullptr);
|
||||
|
||||
// Version for bounded array.
|
||||
template <typename T>
|
||||
::mediapipe::StatusOr<std::unique_ptr<T>> ConsumeOrCopy(
|
||||
mediapipe::StatusOr<std::unique_ptr<T>> ConsumeOrCopy(
|
||||
bool* was_copied = nullptr,
|
||||
typename std::enable_if<std::is_array<T>::value &&
|
||||
std::extent<T>::value != 0>::type* = nullptr);
|
||||
@@ -160,7 +160,7 @@ class Packet {
|
||||
// delete helper.
|
||||
// Version for unbounded array.
|
||||
template <typename T>
|
||||
::mediapipe::StatusOr<std::unique_ptr<T>> ConsumeOrCopy(
|
||||
mediapipe::StatusOr<std::unique_ptr<T>> ConsumeOrCopy(
|
||||
bool* was_copied = nullptr,
|
||||
typename std::enable_if<std::is_array<T>::value &&
|
||||
std::extent<T>::value == 0>::type* = nullptr);
|
||||
@@ -178,11 +178,11 @@ class Packet {
|
||||
|
||||
// Returns an error if the packet does not contain data of type T.
|
||||
template <typename T>
|
||||
::mediapipe::Status ValidateAsType() const;
|
||||
mediapipe::Status ValidateAsType() const;
|
||||
|
||||
// Returns an error if the packet is not an instance of
|
||||
// a protocol buffer message.
|
||||
::mediapipe::Status ValidateAsProtoMessageLite() const;
|
||||
mediapipe::Status ValidateAsProtoMessageLite() const;
|
||||
|
||||
// Get the type id for the underlying type stored in the Packet.
|
||||
// Crashes if IsEmpty() == true.
|
||||
@@ -406,7 +406,7 @@ template <typename T>
|
||||
StatusOr<std::vector<const proto_ns::MessageLite*>>
|
||||
ConvertToVectorOfProtoMessageLitePtrs(const T* data,
|
||||
/*is_proto_vector=*/std::false_type) {
|
||||
return ::mediapipe::InvalidArgumentError(absl::StrCat(
|
||||
return mediapipe::InvalidArgumentError(absl::StrCat(
|
||||
"The Packet stores \"", tool::TypeId<T>().name(), "\"",
|
||||
"which is not convertible to vector<proto_ns::MessageLite*>."));
|
||||
}
|
||||
@@ -496,7 +496,7 @@ class Holder : public HolderBase {
|
||||
// This method is dangerous and is only used by Packet::Consume() if the
|
||||
// packet is the only owner of the holder.
|
||||
template <typename U = T>
|
||||
::mediapipe::StatusOr<std::unique_ptr<T>> Release(
|
||||
mediapipe::StatusOr<std::unique_ptr<T>> Release(
|
||||
typename std::enable_if<!std::is_array<U>::value ||
|
||||
std::extent<U>::value != 0>::type* = 0) {
|
||||
// Since C++ doesn't allow virtual, templated functions, check holder
|
||||
@@ -513,10 +513,10 @@ class Holder : public HolderBase {
|
||||
// TODO: support unbounded array after fixing the bug in holder's
|
||||
// delete helper.
|
||||
template <typename U = T>
|
||||
::mediapipe::StatusOr<std::unique_ptr<T>> Release(
|
||||
mediapipe::StatusOr<std::unique_ptr<T>> Release(
|
||||
typename std::enable_if<std::is_array<U>::value &&
|
||||
std::extent<U>::value == 0>::type* = 0) {
|
||||
return ::mediapipe::InternalError("Release T[] isn't supported.");
|
||||
return mediapipe::InternalError("Release T[] isn't supported.");
|
||||
}
|
||||
const std::string DebugTypeName() const final {
|
||||
return MediaPipeTypeStringOrDemangled<T>();
|
||||
@@ -580,8 +580,8 @@ class ForeignHolder : public Holder<T> {
|
||||
this->ptr_ = nullptr;
|
||||
}
|
||||
// Foreign holder can't release data pointer without ownership.
|
||||
::mediapipe::StatusOr<std::unique_ptr<T>> Release() {
|
||||
return ::mediapipe::InternalError(
|
||||
mediapipe::StatusOr<std::unique_ptr<T>> Release() {
|
||||
return mediapipe::InternalError(
|
||||
"Foreign holder can't release data ptr without ownership.");
|
||||
}
|
||||
};
|
||||
@@ -621,14 +621,14 @@ inline Packet& Packet::operator=(const Packet& packet) {
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline ::mediapipe::StatusOr<std::unique_ptr<T>> Packet::Consume() {
|
||||
inline mediapipe::StatusOr<std::unique_ptr<T>> Packet::Consume() {
|
||||
// If type validation fails, returns error.
|
||||
MP_RETURN_IF_ERROR(ValidateAsType<T>());
|
||||
// Clients who use this function are responsible for ensuring that no
|
||||
// other thread is doing anything with this Packet.
|
||||
if (holder_.unique()) {
|
||||
VLOG(2) << "Consuming the data of " << DebugString();
|
||||
::mediapipe::StatusOr<std::unique_ptr<T>> release_result =
|
||||
mediapipe::StatusOr<std::unique_ptr<T>> release_result =
|
||||
holder_->As<T>()->Release();
|
||||
if (release_result.ok()) {
|
||||
VLOG(2) << "Setting " << DebugString() << " to empty.";
|
||||
@@ -638,12 +638,12 @@ inline ::mediapipe::StatusOr<std::unique_ptr<T>> Packet::Consume() {
|
||||
}
|
||||
// If packet isn't the sole owner of the holder, returns kFailedPrecondition
|
||||
// error with message.
|
||||
return ::mediapipe::Status(::mediapipe::StatusCode::kFailedPrecondition,
|
||||
"Packet isn't the sole owner of the holder.");
|
||||
return mediapipe::Status(mediapipe::StatusCode::kFailedPrecondition,
|
||||
"Packet isn't the sole owner of the holder.");
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline ::mediapipe::StatusOr<std::unique_ptr<T>> Packet::ConsumeOrCopy(
|
||||
inline mediapipe::StatusOr<std::unique_ptr<T>> Packet::ConsumeOrCopy(
|
||||
bool* was_copied,
|
||||
typename std::enable_if<!std::is_array<T>::value>::type*) {
|
||||
MP_RETURN_IF_ERROR(ValidateAsType<T>());
|
||||
@@ -651,7 +651,7 @@ inline ::mediapipe::StatusOr<std::unique_ptr<T>> Packet::ConsumeOrCopy(
|
||||
if (!holder_->HolderIsOfType<packet_internal::ForeignHolder<T>>() &&
|
||||
holder_.unique()) {
|
||||
VLOG(2) << "Consuming the data of " << DebugString();
|
||||
::mediapipe::StatusOr<std::unique_ptr<T>> release_result =
|
||||
mediapipe::StatusOr<std::unique_ptr<T>> release_result =
|
||||
holder_->As<T>()->Release();
|
||||
if (release_result.ok()) {
|
||||
VLOG(2) << "Setting " << DebugString() << " to empty.";
|
||||
@@ -673,7 +673,7 @@ inline ::mediapipe::StatusOr<std::unique_ptr<T>> Packet::ConsumeOrCopy(
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline ::mediapipe::StatusOr<std::unique_ptr<T>> Packet::ConsumeOrCopy(
|
||||
inline mediapipe::StatusOr<std::unique_ptr<T>> Packet::ConsumeOrCopy(
|
||||
bool* was_copied,
|
||||
typename std::enable_if<std::is_array<T>::value &&
|
||||
std::extent<T>::value != 0>::type*) {
|
||||
@@ -682,7 +682,7 @@ inline ::mediapipe::StatusOr<std::unique_ptr<T>> Packet::ConsumeOrCopy(
|
||||
if (!holder_->HolderIsOfType<packet_internal::ForeignHolder<T>>() &&
|
||||
holder_.unique()) {
|
||||
VLOG(2) << "Consuming the data of " << DebugString();
|
||||
::mediapipe::StatusOr<std::unique_ptr<T>> release_result =
|
||||
mediapipe::StatusOr<std::unique_ptr<T>> release_result =
|
||||
holder_->As<T>()->Release();
|
||||
if (release_result.ok()) {
|
||||
VLOG(2) << "Setting " << DebugString() << " to empty.";
|
||||
@@ -710,11 +710,11 @@ inline ::mediapipe::StatusOr<std::unique_ptr<T>> Packet::ConsumeOrCopy(
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline ::mediapipe::StatusOr<std::unique_ptr<T>> Packet::ConsumeOrCopy(
|
||||
inline mediapipe::StatusOr<std::unique_ptr<T>> Packet::ConsumeOrCopy(
|
||||
bool* was_copied,
|
||||
typename std::enable_if<std::is_array<T>::value &&
|
||||
std::extent<T>::value == 0>::type*) {
|
||||
return ::mediapipe::InternalError("Unbounded array isn't supported.");
|
||||
return mediapipe::InternalError("Unbounded array isn't supported.");
|
||||
}
|
||||
|
||||
inline Packet::Packet(Packet&& packet) {
|
||||
@@ -746,25 +746,25 @@ inline const T& Packet::Get() const {
|
||||
packet_internal::Holder<T>* holder = IsEmpty() ? nullptr : holder_->As<T>();
|
||||
if (holder == nullptr) {
|
||||
// Produce a good error message.
|
||||
::mediapipe::Status status = ValidateAsType<T>();
|
||||
mediapipe::Status status = ValidateAsType<T>();
|
||||
LOG(FATAL) << "Packet::Get() failed: " << status.message();
|
||||
}
|
||||
return holder->data();
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
::mediapipe::Status Packet::ValidateAsType() const {
|
||||
mediapipe::Status Packet::ValidateAsType() const {
|
||||
if (ABSL_PREDICT_FALSE(IsEmpty())) {
|
||||
return ::mediapipe::InternalError(absl::StrCat(
|
||||
return mediapipe::InternalError(absl::StrCat(
|
||||
"Expected a Packet of type: ", MediaPipeTypeStringOrDemangled<T>(),
|
||||
", but received an empty Packet."));
|
||||
}
|
||||
if (ABSL_PREDICT_FALSE(holder_->As<T>() == nullptr)) {
|
||||
return ::mediapipe::InvalidArgumentError(absl::StrCat(
|
||||
return mediapipe::InvalidArgumentError(absl::StrCat(
|
||||
"The Packet stores \"", holder_->DebugTypeName(), "\", but \"",
|
||||
MediaPipeTypeStringOrDemangled<T>(), "\" was requested."));
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
inline Timestamp Packet::Timestamp() const { return timestamp_; }
|
||||
|
||||
@@ -49,12 +49,12 @@ class PacketGenerator {
|
||||
// and
|
||||
// produce output side packets.
|
||||
//
|
||||
// static ::mediapipe::Status FillExpectations(
|
||||
// static mediapipe::Status FillExpectations(
|
||||
// const PacketGeneratorOptions& extendable_options,
|
||||
// PacketTypeSet* input_side_packets,
|
||||
// PacketTypeSet* output_side_packets);
|
||||
//
|
||||
// static ::mediapipe::Status Generate(
|
||||
// static mediapipe::Status Generate(
|
||||
// const PacketGeneratorOptions& extendable_options,
|
||||
// const PacketSet& input_side_packets,
|
||||
// PacketSet* output_side_packets);
|
||||
@@ -69,11 +69,11 @@ namespace internal {
|
||||
class StaticAccessToGenerator {
|
||||
public:
|
||||
virtual ~StaticAccessToGenerator() {}
|
||||
virtual ::mediapipe::Status FillExpectations(
|
||||
virtual mediapipe::Status FillExpectations(
|
||||
const PacketGeneratorOptions& extendable_options, //
|
||||
PacketTypeSet* input_side_packets, //
|
||||
PacketTypeSet* output_side_packets) = 0;
|
||||
virtual ::mediapipe::Status Generate(
|
||||
virtual mediapipe::Status Generate(
|
||||
const PacketGeneratorOptions& extendable_options, //
|
||||
const PacketSet& input_side_packets, //
|
||||
PacketSet* output_side_packets) = 0;
|
||||
@@ -87,7 +87,7 @@ using StaticAccessToGeneratorRegistry =
|
||||
template <class T>
|
||||
constexpr bool PacketGeneratorHasFillExpectations(
|
||||
decltype(&T::FillExpectations) /*unused*/) {
|
||||
typedef ::mediapipe::Status (*FillExpectationsType)(
|
||||
typedef mediapipe::Status (*FillExpectationsType)(
|
||||
const PacketGeneratorOptions& extendable_options, //
|
||||
PacketTypeSet* input_side_packets, //
|
||||
PacketTypeSet* output_side_packets);
|
||||
@@ -100,7 +100,7 @@ constexpr bool PacketGeneratorHasFillExpectations(...) {
|
||||
}
|
||||
template <class T>
|
||||
constexpr bool PacketGeneratorHasGenerate(decltype(&T::Generate) /*unused*/) {
|
||||
typedef ::mediapipe::Status (*GenerateType)(
|
||||
typedef mediapipe::Status (*GenerateType)(
|
||||
const PacketGeneratorOptions& extendable_options, //
|
||||
const PacketSet& input_side_packets, //
|
||||
PacketSet* output_side_packets);
|
||||
@@ -117,10 +117,10 @@ constexpr bool PacketGeneratorHasGenerate(...) {
|
||||
template <typename PacketGeneratorSubclass>
|
||||
class StaticAccessToGeneratorTyped : public StaticAccessToGenerator {
|
||||
public:
|
||||
static_assert(std::is_base_of<::mediapipe::PacketGenerator,
|
||||
static_assert(std::is_base_of<mediapipe::PacketGenerator,
|
||||
PacketGeneratorSubclass>::value,
|
||||
"Classes registered with REGISTER_PACKET_GENERATOR must be "
|
||||
"subclasses of ::mediapipe::PacketGenerator.");
|
||||
"subclasses of mediapipe::PacketGenerator.");
|
||||
static_assert(
|
||||
PacketGeneratorHasFillExpectations<PacketGeneratorSubclass>(nullptr),
|
||||
"FillExpectations() must be defined with the correct signature in "
|
||||
@@ -129,7 +129,7 @@ class StaticAccessToGeneratorTyped : public StaticAccessToGenerator {
|
||||
"Generate() must be defined with the correct signature in "
|
||||
"every PacketGenerator.");
|
||||
|
||||
::mediapipe::Status FillExpectations(
|
||||
mediapipe::Status FillExpectations(
|
||||
const PacketGeneratorOptions& extendable_options, //
|
||||
PacketTypeSet* input_side_packets, //
|
||||
PacketTypeSet* output_side_packets) final {
|
||||
@@ -137,7 +137,7 @@ class StaticAccessToGeneratorTyped : public StaticAccessToGenerator {
|
||||
extendable_options, input_side_packets, output_side_packets);
|
||||
}
|
||||
|
||||
::mediapipe::Status Generate(
|
||||
mediapipe::Status Generate(
|
||||
const PacketGeneratorOptions& extendable_options, //
|
||||
const PacketSet& input_side_packets, //
|
||||
PacketSet* output_side_packets) final {
|
||||
@@ -150,12 +150,12 @@ class StaticAccessToGeneratorTyped : public StaticAccessToGenerator {
|
||||
|
||||
// Macro for registering PacketGenerators. It actually just registers
|
||||
// the StaticAccessToGeneratorTyped class.
|
||||
#define REGISTER_PACKET_GENERATOR(name) \
|
||||
REGISTER_FACTORY_FUNCTION_QUALIFIED( \
|
||||
::mediapipe::internal::StaticAccessToGeneratorRegistry, \
|
||||
generator_registration, name, \
|
||||
absl::make_unique< \
|
||||
::mediapipe::internal::StaticAccessToGeneratorTyped<name>>)
|
||||
#define REGISTER_PACKET_GENERATOR(name) \
|
||||
REGISTER_FACTORY_FUNCTION_QUALIFIED( \
|
||||
mediapipe::internal::StaticAccessToGeneratorRegistry, \
|
||||
generator_registration, name, \
|
||||
absl::make_unique< \
|
||||
mediapipe::internal::StaticAccessToGeneratorTyped<name>>)
|
||||
|
||||
} // namespace mediapipe
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ namespace {
|
||||
// generator cannot be run given the currently available side packets
|
||||
// (and false otherwise). If an error occurs then unrunnable and
|
||||
// input_side_packet_set are undefined.
|
||||
::mediapipe::Status CreateInputsForGenerator(
|
||||
mediapipe::Status CreateInputsForGenerator(
|
||||
const ValidatedGraphConfig& validated_graph, int generator_index,
|
||||
const std::map<std::string, Packet>& side_packets,
|
||||
PacketSet* input_side_packet_set, bool* unrunnable) {
|
||||
@@ -55,7 +55,7 @@ namespace {
|
||||
.packet_generator();
|
||||
// Fill the PacketSet (if possible).
|
||||
*unrunnable = false;
|
||||
std::vector<::mediapipe::Status> statuses;
|
||||
std::vector<mediapipe::Status> statuses;
|
||||
for (CollectionItemId id = node_type_info.InputSidePacketTypes().BeginId();
|
||||
id < node_type_info.InputSidePacketTypes().EndId(); ++id) {
|
||||
const std::string& name =
|
||||
@@ -67,7 +67,7 @@ namespace {
|
||||
continue;
|
||||
}
|
||||
input_side_packet_set->Get(id) = it->second;
|
||||
::mediapipe::Status status =
|
||||
mediapipe::Status status =
|
||||
node_type_info.InputSidePacketTypes().Get(id).Validate(
|
||||
input_side_packet_set->Get(id));
|
||||
if (!status.ok()) {
|
||||
@@ -82,15 +82,15 @@ namespace {
|
||||
return tool::CombinedStatus(
|
||||
absl::StrCat(generator_name, " had invalid configuration."), statuses);
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
// Generate the packets from a PacketGenerator, place them in
|
||||
// output_side_packet_set, and validate their types.
|
||||
::mediapipe::Status Generate(const ValidatedGraphConfig& validated_graph,
|
||||
int generator_index,
|
||||
const PacketSet& input_side_packet_set,
|
||||
PacketSet* output_side_packet_set) {
|
||||
mediapipe::Status Generate(const ValidatedGraphConfig& validated_graph,
|
||||
int generator_index,
|
||||
const PacketSet& input_side_packet_set,
|
||||
PacketSet* output_side_packet_set) {
|
||||
const NodeTypeInfo& node_type_info =
|
||||
validated_graph.GeneratorInfos()[generator_index];
|
||||
const PacketGeneratorConfig& generator_config =
|
||||
@@ -113,7 +113,7 @@ namespace {
|
||||
.SetPrepend()
|
||||
<< generator_name
|
||||
<< "::Generate() output packets were of incorrect type: ";
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
// GeneratorScheduler schedules the packet generators in a validated graph for
|
||||
@@ -126,7 +126,7 @@ class GeneratorScheduler {
|
||||
// PacketGenerators (those not run at initialize time due to missing
|
||||
// dependencies).
|
||||
GeneratorScheduler(const ValidatedGraphConfig* validated_graph,
|
||||
::mediapipe::Executor* executor,
|
||||
mediapipe::Executor* executor,
|
||||
const std::vector<int>& non_base_generators, bool initial);
|
||||
|
||||
// Run a PacketGenerator on a given executor on the provided input
|
||||
@@ -149,7 +149,7 @@ class GeneratorScheduler {
|
||||
// rather, not executed) in non_scheduled_generators. Returns the combined
|
||||
// error status if there were errors while running the packet generators.
|
||||
// NOTE: This method should only be called when there are no pending tasks.
|
||||
::mediapipe::Status GetNonScheduledGenerators(
|
||||
mediapipe::Status GetNonScheduledGenerators(
|
||||
std::vector<int>* non_scheduled_generators) const;
|
||||
|
||||
private:
|
||||
@@ -161,7 +161,7 @@ class GeneratorScheduler {
|
||||
void RunApplicationThreadTasks() ABSL_LOCKS_EXCLUDED(app_thread_mutex_);
|
||||
|
||||
const ValidatedGraphConfig* const validated_graph_;
|
||||
::mediapipe::Executor* executor_;
|
||||
mediapipe::Executor* executor_;
|
||||
|
||||
mutable absl::Mutex mutex_;
|
||||
// The number of pending tasks.
|
||||
@@ -169,7 +169,7 @@ class GeneratorScheduler {
|
||||
// This condition variable is signaled when num_tasks_ becomes 0.
|
||||
absl::CondVar idle_condvar_;
|
||||
// Accumulates the error statuses while running the packet generators.
|
||||
std::vector<::mediapipe::Status> statuses_ ABSL_GUARDED_BY(mutex_);
|
||||
std::vector<mediapipe::Status> statuses_ ABSL_GUARDED_BY(mutex_);
|
||||
// scheduled_generators_[i] is true if the packet generator with index i was
|
||||
// scheduled (or rather, executed).
|
||||
std::vector<bool> scheduled_generators_ ABSL_GUARDED_BY(mutex_);
|
||||
@@ -182,8 +182,7 @@ class GeneratorScheduler {
|
||||
};
|
||||
|
||||
GeneratorScheduler::GeneratorScheduler(
|
||||
const ValidatedGraphConfig* validated_graph,
|
||||
::mediapipe::Executor* executor,
|
||||
const ValidatedGraphConfig* validated_graph, mediapipe::Executor* executor,
|
||||
const std::vector<int>& non_base_generators, bool initial)
|
||||
: validated_graph_(validated_graph),
|
||||
executor_(executor),
|
||||
@@ -220,7 +219,7 @@ void GeneratorScheduler::GenerateAndScheduleNext(
|
||||
.OutputSidePacketTypes()
|
||||
.TagMap());
|
||||
VLOG(1) << "Running generator " << generator_index;
|
||||
::mediapipe::Status status =
|
||||
mediapipe::Status status =
|
||||
Generate(*validated_graph_, generator_index, *input_side_packet_set,
|
||||
&output_side_packet_set);
|
||||
|
||||
@@ -236,7 +235,7 @@ void GeneratorScheduler::GenerateAndScheduleNext(
|
||||
const auto& name = output_side_packet_set.TagMap()->Names()[id.value()];
|
||||
auto item = side_packets->emplace(name, output_side_packet_set.Get(id));
|
||||
if (!item.second) {
|
||||
statuses_.push_back(::mediapipe::AlreadyExistsError(
|
||||
statuses_.push_back(mediapipe::AlreadyExistsError(
|
||||
absl::StrCat("Side packet \"", name, "\" was defined twice.")));
|
||||
}
|
||||
}
|
||||
@@ -267,7 +266,7 @@ void GeneratorScheduler::ScheduleAllRunnableGenerators(
|
||||
.InputSidePacketTypes()
|
||||
.TagMap());
|
||||
|
||||
::mediapipe::Status status =
|
||||
mediapipe::Status status =
|
||||
CreateInputsForGenerator(*validated_graph_, index, *side_packets,
|
||||
input_side_packet_set.get(), &is_unrunnable);
|
||||
if (!status.ok()) {
|
||||
@@ -314,7 +313,7 @@ void GeneratorScheduler::WaitUntilIdle() {
|
||||
}
|
||||
}
|
||||
|
||||
::mediapipe::Status GeneratorScheduler::GetNonScheduledGenerators(
|
||||
mediapipe::Status GeneratorScheduler::GetNonScheduledGenerators(
|
||||
std::vector<int>* non_scheduled_generators) const {
|
||||
non_scheduled_generators->clear();
|
||||
|
||||
@@ -327,7 +326,7 @@ void GeneratorScheduler::WaitUntilIdle() {
|
||||
non_scheduled_generators->push_back(i);
|
||||
}
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
void GeneratorScheduler::AddApplicationThreadTask(std::function<void()> task) {
|
||||
@@ -357,9 +356,8 @@ void GeneratorScheduler::RunApplicationThreadTasks() {
|
||||
|
||||
PacketGeneratorGraph::~PacketGeneratorGraph() {}
|
||||
|
||||
::mediapipe::Status PacketGeneratorGraph::Initialize(
|
||||
const ValidatedGraphConfig* validated_graph,
|
||||
::mediapipe::Executor* executor,
|
||||
mediapipe::Status PacketGeneratorGraph::Initialize(
|
||||
const ValidatedGraphConfig* validated_graph, mediapipe::Executor* executor,
|
||||
const std::map<std::string, Packet>& input_side_packets) {
|
||||
validated_graph_ = validated_graph;
|
||||
executor_ = executor;
|
||||
@@ -370,14 +368,14 @@ PacketGeneratorGraph::~PacketGeneratorGraph() {}
|
||||
/*initial=*/true);
|
||||
}
|
||||
|
||||
::mediapipe::Status PacketGeneratorGraph::RunGraphSetup(
|
||||
mediapipe::Status PacketGeneratorGraph::RunGraphSetup(
|
||||
const std::map<std::string, Packet>& input_side_packets,
|
||||
std::map<std::string, Packet>* output_side_packets) const {
|
||||
*output_side_packets = base_packets_;
|
||||
for (const std::pair<const std::string, Packet>& item : input_side_packets) {
|
||||
auto iter = output_side_packets->find(item.first);
|
||||
if (iter != output_side_packets->end()) {
|
||||
return ::mediapipe::AlreadyExistsError(
|
||||
return mediapipe::AlreadyExistsError(
|
||||
absl::StrCat("Side packet \"", iter->first, "\" was defined twice."));
|
||||
}
|
||||
output_side_packets->insert(iter, item);
|
||||
@@ -396,10 +394,10 @@ PacketGeneratorGraph::~PacketGeneratorGraph() {}
|
||||
<< "Some Generators were unrunnable (validation should have failed).\n"
|
||||
"Generator indexes: "
|
||||
<< absl::StrJoin(non_scheduled_generators, ", ");
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status PacketGeneratorGraph::ExecuteGenerators(
|
||||
mediapipe::Status PacketGeneratorGraph::ExecuteGenerators(
|
||||
std::map<std::string, Packet>* output_side_packets,
|
||||
std::vector<int>* non_scheduled_generators, bool initial) const {
|
||||
VLOG(1) << "ExecuteGenerators initial == " << initial;
|
||||
|
||||
@@ -67,14 +67,14 @@ class PacketGeneratorGraph {
|
||||
// stage and will be common to all calls to CalculatorGraph::Run().
|
||||
// Any generators which are runnable at this stage (that only depend on
|
||||
// things in the graph or input_side_packets) will be run at this time.
|
||||
virtual ::mediapipe::Status Initialize(
|
||||
virtual mediapipe::Status Initialize(
|
||||
const ValidatedGraphConfig* validated_graph,
|
||||
::mediapipe::Executor* executor,
|
||||
mediapipe::Executor* executor,
|
||||
const std::map<std::string, Packet>& input_side_packets);
|
||||
|
||||
// Add the input_side_packets and run any remaining generators (which
|
||||
// must now be runnable) to produce output_side_packets.
|
||||
virtual ::mediapipe::Status RunGraphSetup(
|
||||
virtual mediapipe::Status RunGraphSetup(
|
||||
const std::map<std::string, Packet>& input_side_packets,
|
||||
std::map<std::string, Packet>* output_side_packets) const;
|
||||
|
||||
@@ -96,7 +96,7 @@ class PacketGeneratorGraph {
|
||||
// packets and unrunnable generators. "initial" must be set to true for
|
||||
// the first pass and false for subsequent passes. output_side_packets
|
||||
// must be set to include the input side packets before calling.
|
||||
::mediapipe::Status ExecuteGenerators(
|
||||
mediapipe::Status ExecuteGenerators(
|
||||
std::map<std::string, Packet>* output_side_packets,
|
||||
std::vector<int>* non_scheduled_generators, bool initial) const;
|
||||
|
||||
@@ -109,9 +109,9 @@ class PacketGeneratorGraph {
|
||||
|
||||
// The executor to use for running the generators. We do not own the
|
||||
// executor but it must outlive this object.
|
||||
::mediapipe::Executor* executor_ = nullptr;
|
||||
mediapipe::Executor* executor_ = nullptr;
|
||||
// An object to own the executor if it needs to be deleted.
|
||||
std::unique_ptr<::mediapipe::Executor> executor_owner_;
|
||||
std::unique_ptr<mediapipe::Executor> executor_owner_;
|
||||
|
||||
// The base level packets available after initialization.
|
||||
std::map<std::string, Packet> base_packets_;
|
||||
|
||||
@@ -27,7 +27,7 @@ namespace mediapipe {
|
||||
namespace {
|
||||
class DoNothingGenerator : public PacketGenerator {
|
||||
public:
|
||||
static ::mediapipe::Status FillExpectations(
|
||||
static mediapipe::Status FillExpectations(
|
||||
const PacketGeneratorOptions& extendable_options,
|
||||
PacketTypeSet* input_side_packets, PacketTypeSet* output_side_packets) {
|
||||
for (CollectionItemId id = input_side_packets->BeginId();
|
||||
@@ -38,17 +38,17 @@ class DoNothingGenerator : public PacketGenerator {
|
||||
id < output_side_packets->EndId(); ++id) {
|
||||
output_side_packets->Get(id).Set<bool>();
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
static ::mediapipe::Status Generate(
|
||||
static mediapipe::Status Generate(
|
||||
const PacketGeneratorOptions& extendable_options,
|
||||
const PacketSet& input_side_packets, PacketSet* output_side_packets) {
|
||||
for (CollectionItemId id = output_side_packets->BeginId();
|
||||
id < output_side_packets->EndId(); ++id) {
|
||||
output_side_packets->Get(id) = MakePacket<bool>(true);
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -28,20 +28,20 @@ namespace test_ns {
|
||||
|
||||
class TestSinkCalculator : public CalculatorBase {
|
||||
public:
|
||||
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
static mediapipe::Status GetContract(CalculatorContract* cc) {
|
||||
cc->Inputs().Tag("IN").Set<mediapipe::InputOnlyProto>();
|
||||
cc->Outputs().Tag("OUT").Set<int>();
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status Process(CalculatorContext* cc) override {
|
||||
mediapipe::Status Process(CalculatorContext* cc) override {
|
||||
int x = cc->Inputs().Tag("IN").Get<mediapipe::InputOnlyProto>().x();
|
||||
cc->Outputs().Tag("OUT").AddPacket(
|
||||
MakePacket<int>(x).At(cc->InputTimestamp()));
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
};
|
||||
REGISTER_CALCULATOR(::mediapipe::test_ns::TestSinkCalculator);
|
||||
REGISTER_CALCULATOR(TestSinkCalculator);
|
||||
|
||||
} // namespace test_ns
|
||||
|
||||
|
||||
@@ -145,7 +145,7 @@ struct UnregisteredPairStruct {
|
||||
std::string first;
|
||||
bool second;
|
||||
};
|
||||
MEDIAPIPE_REGISTER_TYPE(::mediapipe::RegisteredPairStruct,
|
||||
MEDIAPIPE_REGISTER_TYPE(mediapipe::RegisteredPairStruct,
|
||||
"::mediapipe::RegisteredPairStruct", nullptr, nullptr);
|
||||
MEDIAPIPE_REGISTER_TYPE(int, "int", nullptr, nullptr);
|
||||
MEDIAPIPE_REGISTER_TYPE(float, "float", nullptr, nullptr);
|
||||
@@ -210,8 +210,8 @@ TEST(PacketTest, ValidateAsProtoMessageLite) {
|
||||
Packet packet = Adopt(proto_ptr.release());
|
||||
MP_EXPECT_OK(packet.ValidateAsProtoMessageLite());
|
||||
Packet packet2 = MakePacket<int>(3);
|
||||
::mediapipe::Status status = packet2.ValidateAsProtoMessageLite();
|
||||
EXPECT_EQ(status.code(), ::mediapipe::StatusCode::kInvalidArgument);
|
||||
mediapipe::Status status = packet2.ValidateAsProtoMessageLite();
|
||||
EXPECT_EQ(status.code(), mediapipe::StatusCode::kInvalidArgument);
|
||||
}
|
||||
|
||||
TEST(PacketTest, SyncedPacket) {
|
||||
@@ -283,11 +283,11 @@ TEST(PacketTest, TestPacketMoveConstructor) {
|
||||
TEST(PacketTest, TestPacketConsume) {
|
||||
Packet packet1 = MakePacket<int>(33);
|
||||
Packet packet_copy = packet1;
|
||||
::mediapipe::StatusOr<std::unique_ptr<int>> result1 =
|
||||
mediapipe::StatusOr<std::unique_ptr<int>> result1 =
|
||||
packet_copy.Consume<int>();
|
||||
// Both packet1 and packet_copy own the data, Consume() should return error.
|
||||
::mediapipe::Status status1 = result1.status();
|
||||
EXPECT_EQ(status1.code(), ::mediapipe::StatusCode::kFailedPrecondition);
|
||||
mediapipe::Status status1 = result1.status();
|
||||
EXPECT_EQ(status1.code(), mediapipe::StatusCode::kFailedPrecondition);
|
||||
EXPECT_THAT(status1.message(),
|
||||
testing::HasSubstr("isn't the sole owner of the holder"));
|
||||
ASSERT_FALSE(packet1.IsEmpty());
|
||||
@@ -297,7 +297,7 @@ TEST(PacketTest, TestPacketConsume) {
|
||||
|
||||
Packet packet2 = MakePacket<int>(33);
|
||||
// Types don't match (int vs float).
|
||||
::mediapipe::StatusOr<std::unique_ptr<float>> result2 =
|
||||
mediapipe::StatusOr<std::unique_ptr<float>> result2 =
|
||||
packet2.Consume<float>();
|
||||
EXPECT_THAT(
|
||||
result2.status().message(),
|
||||
@@ -307,7 +307,7 @@ TEST(PacketTest, TestPacketConsume) {
|
||||
|
||||
// packet3 is the sole owner of the data.
|
||||
Packet packet3 = MakePacket<int>(42);
|
||||
::mediapipe::StatusOr<std::unique_ptr<int>> result3 = packet3.Consume<int>();
|
||||
mediapipe::StatusOr<std::unique_ptr<int>> result3 = packet3.Consume<int>();
|
||||
// After Consume(), packet3 should be empty and result3 owns the data.
|
||||
EXPECT_TRUE(result3.ok());
|
||||
ASSERT_NE(nullptr, result3.ValueOrDie());
|
||||
@@ -319,7 +319,7 @@ TEST(PacketTest, TestPacketConsumeOrCopy) {
|
||||
Packet packet1 = MakePacket<int>(33);
|
||||
Packet packet_copy = packet1;
|
||||
bool was_copied1 = false;
|
||||
::mediapipe::StatusOr<std::unique_ptr<int>> result1 =
|
||||
mediapipe::StatusOr<std::unique_ptr<int>> result1 =
|
||||
packet_copy.ConsumeOrCopy<int>(&was_copied1);
|
||||
// Both packet1 and packet_copy own the data, ConsumeOrCopy() returns a copy
|
||||
// of the data and sets packet_copy to empty.
|
||||
@@ -334,7 +334,7 @@ TEST(PacketTest, TestPacketConsumeOrCopy) {
|
||||
|
||||
Packet packet2 = MakePacket<int>(33);
|
||||
// Types don't match (int vs float).
|
||||
::mediapipe::StatusOr<std::unique_ptr<float>> result2 =
|
||||
mediapipe::StatusOr<std::unique_ptr<float>> result2 =
|
||||
packet2.ConsumeOrCopy<float>();
|
||||
EXPECT_THAT(
|
||||
result2.status().message(),
|
||||
@@ -346,7 +346,7 @@ TEST(PacketTest, TestPacketConsumeOrCopy) {
|
||||
bool was_copied3 = false;
|
||||
// packet3 is the sole owner of the data. ConsumeOrCopy() transfers the
|
||||
// ownership to result3 and makes packet3 empty.
|
||||
::mediapipe::StatusOr<std::unique_ptr<int>> result3 =
|
||||
mediapipe::StatusOr<std::unique_ptr<int>> result3 =
|
||||
packet3.ConsumeOrCopy<int>(&was_copied3);
|
||||
EXPECT_FALSE(was_copied3);
|
||||
EXPECT_TRUE(result3.ok());
|
||||
@@ -358,9 +358,9 @@ TEST(PacketTest, TestPacketConsumeOrCopy) {
|
||||
TEST(PacketTest, TestConsumeForeignHolder) {
|
||||
std::unique_ptr<int> data(new int(33));
|
||||
Packet packet = PointToForeign(data.get());
|
||||
::mediapipe::StatusOr<std::unique_ptr<int>> result = packet.Consume<int>();
|
||||
mediapipe::StatusOr<std::unique_ptr<int>> result = packet.Consume<int>();
|
||||
EXPECT_FALSE(result.ok());
|
||||
EXPECT_EQ(result.status().code(), ::mediapipe::StatusCode::kInternal);
|
||||
EXPECT_EQ(result.status().code(), mediapipe::StatusCode::kInternal);
|
||||
EXPECT_EQ(result.status().message(),
|
||||
"Foreign holder can't release data ptr without ownership.");
|
||||
ASSERT_FALSE(packet.IsEmpty());
|
||||
@@ -372,7 +372,7 @@ TEST(PacketTest, TestForeignHolderConsumeOrCopy) {
|
||||
Packet packet1 = PointToForeign(data1.get());
|
||||
Packet packet_copy = packet1;
|
||||
bool was_copied1 = false;
|
||||
::mediapipe::StatusOr<std::unique_ptr<int>> result1 =
|
||||
mediapipe::StatusOr<std::unique_ptr<int>> result1 =
|
||||
packet_copy.ConsumeOrCopy<int>(&was_copied1);
|
||||
// After ConsumeOrCopy(), result1 gets the copy of packet_copy's data and
|
||||
// packet_copy is set to empty.
|
||||
@@ -388,7 +388,7 @@ TEST(PacketTest, TestForeignHolderConsumeOrCopy) {
|
||||
std::unique_ptr<int> data2(new int(33));
|
||||
Packet packet2 = PointToForeign(data2.get());
|
||||
bool was_copied2 = false;
|
||||
::mediapipe::StatusOr<std::unique_ptr<int>> result2 =
|
||||
mediapipe::StatusOr<std::unique_ptr<int>> result2 =
|
||||
packet2.ConsumeOrCopy<int>(&was_copied2);
|
||||
// After ConsumeOrCopy(), result2 gets the copy of packet2's data and packet2
|
||||
// is set to empty.
|
||||
@@ -402,11 +402,11 @@ TEST(PacketTest, TestForeignHolderConsumeOrCopy) {
|
||||
TEST(PacketTest, TestConsumeBoundedArray) {
|
||||
Packet packet1 = MakePacket<int[3]>(10, 20, 30);
|
||||
Packet packet_copy = packet1;
|
||||
::mediapipe::StatusOr<std::unique_ptr<int[3]>> result1 =
|
||||
mediapipe::StatusOr<std::unique_ptr<int[3]>> result1 =
|
||||
packet_copy.Consume<int[3]>();
|
||||
// Both packet1 and packet_copy own the data, Consume() should return error.
|
||||
::mediapipe::Status status1 = result1.status();
|
||||
EXPECT_EQ(status1.code(), ::mediapipe::StatusCode::kFailedPrecondition);
|
||||
mediapipe::Status status1 = result1.status();
|
||||
EXPECT_EQ(status1.code(), mediapipe::StatusCode::kFailedPrecondition);
|
||||
EXPECT_THAT(status1.message(),
|
||||
testing::HasSubstr("isn't the sole owner of the holder"));
|
||||
ASSERT_FALSE(packet1.IsEmpty());
|
||||
@@ -422,7 +422,7 @@ TEST(PacketTest, TestConsumeBoundedArray) {
|
||||
|
||||
Packet packet2 = MakePacket<int[3]>(40, 50, 60);
|
||||
// After Consume(), packet2 should be empty and result2 owns the data.
|
||||
::mediapipe::StatusOr<std::unique_ptr<int[3]>> result2 =
|
||||
mediapipe::StatusOr<std::unique_ptr<int[3]>> result2 =
|
||||
packet2.Consume<int[3]>();
|
||||
ASSERT_NE(nullptr, result2.ValueOrDie());
|
||||
auto value3 = result2.ValueOrDie().get();
|
||||
@@ -436,7 +436,7 @@ TEST(PacketTest, TestConsumeOrCopyBoundedArray) {
|
||||
Packet packet1 = MakePacket<int[3]>(10, 20, 30);
|
||||
Packet packet_copy = packet1;
|
||||
bool was_copied1 = false;
|
||||
::mediapipe::StatusOr<std::unique_ptr<int[3]>> result1 =
|
||||
mediapipe::StatusOr<std::unique_ptr<int[3]>> result1 =
|
||||
packet_copy.ConsumeOrCopy<int[3]>(&was_copied1);
|
||||
// Both packet1 and packet_copy own the data, ConsumeOrCopy() returns a copy
|
||||
// of the data and sets packet_copy to empty.
|
||||
@@ -459,7 +459,7 @@ TEST(PacketTest, TestConsumeOrCopyBoundedArray) {
|
||||
bool was_copied2 = false;
|
||||
// packet2 is the sole owner of the data. ConsumeOrCopy() transfers the
|
||||
// ownership to result2 and makes packet2 empty.
|
||||
::mediapipe::StatusOr<std::unique_ptr<int[3]>> result2 =
|
||||
mediapipe::StatusOr<std::unique_ptr<int[3]>> result2 =
|
||||
packet2.ConsumeOrCopy<int[3]>(&was_copied2);
|
||||
EXPECT_TRUE(result2.ok());
|
||||
EXPECT_FALSE(was_copied2);
|
||||
|
||||
@@ -125,9 +125,9 @@ const std::string PacketType::DebugTypeName() const {
|
||||
return type_name_;
|
||||
}
|
||||
|
||||
::mediapipe::Status PacketType::Validate(const Packet& packet) const {
|
||||
mediapipe::Status PacketType::Validate(const Packet& packet) const {
|
||||
if (!initialized_) {
|
||||
return ::mediapipe::InvalidArgumentError(
|
||||
return mediapipe::InvalidArgumentError(
|
||||
"Uninitialized PacketType was used for validation.");
|
||||
}
|
||||
if (same_as_) {
|
||||
@@ -136,7 +136,7 @@ const std::string PacketType::DebugTypeName() const {
|
||||
return GetSameAs()->Validate(packet);
|
||||
}
|
||||
if (no_packets_allowed_) {
|
||||
return ::mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
|
||||
return mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "No packets are allowed for type: " << type_name_;
|
||||
}
|
||||
if (validate_method_ != nullptr) {
|
||||
@@ -144,10 +144,10 @@ const std::string PacketType::DebugTypeName() const {
|
||||
}
|
||||
// The PacketType is the Any Type.
|
||||
if (packet.IsEmpty()) {
|
||||
return ::mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
|
||||
return mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "Empty packets are not allowed for type: " << type_name_;
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
bool PacketType::IsConsistentWith(const PacketType& other) const {
|
||||
@@ -176,8 +176,7 @@ bool PacketType::IsConsistentWith(const PacketType& other) const {
|
||||
return type1->validate_method_ == type2->validate_method_;
|
||||
}
|
||||
|
||||
::mediapipe::Status ValidatePacketTypeSet(
|
||||
const PacketTypeSet& packet_type_set) {
|
||||
mediapipe::Status ValidatePacketTypeSet(const PacketTypeSet& packet_type_set) {
|
||||
std::vector<std::string> errors;
|
||||
if (packet_type_set.GetErrorHandler().HasError()) {
|
||||
errors = packet_type_set.GetErrorHandler().ErrorMessages();
|
||||
@@ -191,30 +190,30 @@ bool PacketType::IsConsistentWith(const PacketType& other) const {
|
||||
}
|
||||
}
|
||||
if (!errors.empty()) {
|
||||
return ::mediapipe::InvalidArgumentError(absl::StrCat(
|
||||
return mediapipe::InvalidArgumentError(absl::StrCat(
|
||||
"ValidatePacketTypeSet failed:\n", absl::StrJoin(errors, "\n")));
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
::mediapipe::Status ValidatePacketSet(const PacketTypeSet& packet_type_set,
|
||||
const PacketSet& packet_set) {
|
||||
std::vector<::mediapipe::Status> errors;
|
||||
mediapipe::Status ValidatePacketSet(const PacketTypeSet& packet_type_set,
|
||||
const PacketSet& packet_set) {
|
||||
std::vector<mediapipe::Status> errors;
|
||||
if (!packet_type_set.TagMap()->SameAs(*packet_set.TagMap())) {
|
||||
return ::mediapipe::InvalidArgumentError(absl::StrCat(
|
||||
return mediapipe::InvalidArgumentError(absl::StrCat(
|
||||
"TagMaps do not match. PacketTypeSet TagMap:\n",
|
||||
packet_type_set.TagMap()->DebugString(), "\n\nPacketSet TagMap:\n",
|
||||
packet_set.TagMap()->DebugString()));
|
||||
}
|
||||
for (CollectionItemId id = packet_type_set.BeginId();
|
||||
id < packet_type_set.EndId(); ++id) {
|
||||
::mediapipe::Status status =
|
||||
mediapipe::Status status =
|
||||
packet_type_set.Get(id).Validate(packet_set.Get(id));
|
||||
if (!status.ok()) {
|
||||
std::pair<std::string, int> tag_index =
|
||||
packet_type_set.TagAndIndexFromId(id);
|
||||
errors.push_back(
|
||||
::mediapipe::StatusBuilder(status, MEDIAPIPE_LOC).SetPrepend()
|
||||
mediapipe::StatusBuilder(status, MEDIAPIPE_LOC).SetPrepend()
|
||||
<< "Packet \"" << packet_type_set.TagMap()->Names()[id.value()]
|
||||
<< "\" with tag \"" << tag_index.first << "\" and index "
|
||||
<< tag_index.second << " failed validation. ");
|
||||
@@ -223,7 +222,7 @@ bool PacketType::IsConsistentWith(const PacketType& other) const {
|
||||
if (!errors.empty()) {
|
||||
return tool::CombinedStatus("ValidatePacketSet failed:", errors);
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
} // namespace mediapipe
|
||||
|
||||
@@ -85,7 +85,7 @@ class PacketType {
|
||||
bool IsConsistentWith(const PacketType& other) const;
|
||||
|
||||
// Returns OK if the packet contains an object of the appropriate type.
|
||||
::mediapipe::Status Validate(const Packet& packet) const;
|
||||
mediapipe::Status Validate(const Packet& packet) const;
|
||||
|
||||
// Returns a pointer to the Registered type name, or nullptr if the type
|
||||
// is not registered. Do not use this for validation, use Validate()
|
||||
@@ -98,7 +98,7 @@ class PacketType {
|
||||
private:
|
||||
// Typedef for the ValidateAsType() method in Packet that is used for
|
||||
// type validation and identification.
|
||||
typedef ::mediapipe::Status (Packet::*ValidateMethodType)() const;
|
||||
typedef mediapipe::Status (Packet::*ValidateMethodType)() const;
|
||||
|
||||
// Records whether the packet type was set in any way.
|
||||
bool initialized_;
|
||||
@@ -213,15 +213,15 @@ using PacketTypeSet =
|
||||
// Returns OK if the packets in the PacketSet are of the appropriate type.
|
||||
// packet_type_set must be valid before this is called (but packet_set
|
||||
// may be in any state).
|
||||
::mediapipe::Status ValidatePacketSet(const PacketTypeSet& packet_type_set,
|
||||
const PacketSet& packet_set);
|
||||
mediapipe::Status ValidatePacketSet(const PacketTypeSet& packet_type_set,
|
||||
const PacketSet& packet_set);
|
||||
|
||||
// Validates that the PacketTypeSet was initialized properly.
|
||||
// An error is returned if
|
||||
// 1) Tag() or Index() is called with an invalid argument (however,
|
||||
// a valid PacketType is still returned by the function).
|
||||
// 2) Any PacketType is not initialized.
|
||||
::mediapipe::Status ValidatePacketTypeSet(const PacketTypeSet& packet_type_set);
|
||||
mediapipe::Status ValidatePacketTypeSet(const PacketTypeSet& packet_type_set);
|
||||
|
||||
// Templated function definitions.
|
||||
|
||||
|
||||
@@ -81,16 +81,16 @@ class PlatformSpecificProfilingScope {
|
||||
} // namespace mediapipe
|
||||
|
||||
// General profiling macro.
|
||||
#define PLATFORM_SPECIFIC_PROFILER(name, id, packet_timestamp) \
|
||||
::mediapipe::PlatformSpecificProfilingScope platform_specific_scope( \
|
||||
#define PLATFORM_SPECIFIC_PROFILER(name, id, packet_timestamp) \
|
||||
mediapipe::PlatformSpecificProfilingScope platform_specific_scope( \
|
||||
name, id, packet_timestamp);
|
||||
|
||||
// Automated profiling macro.
|
||||
// Filters out all methods except Calculator::Process().
|
||||
#define PLATFORM_SPECIFIC_PROCESS_PROFILER(name, id, method_name, \
|
||||
packet_timestamp) \
|
||||
::mediapipe::PlatformSpecificProfilingScope platform_specific_scope( \
|
||||
name, id, packet_timestamp, ::mediapipe::TraceEvent::method_name);
|
||||
#define PLATFORM_SPECIFIC_PROCESS_PROFILER(name, id, method_name, \
|
||||
packet_timestamp) \
|
||||
mediapipe::PlatformSpecificProfilingScope platform_specific_scope( \
|
||||
name, id, packet_timestamp, mediapipe::TraceEvent::method_name);
|
||||
|
||||
#else
|
||||
#define PLATFORM_SPECIFIC_PROFILER(name, id, packet_timestamp)
|
||||
|
||||
@@ -53,7 +53,7 @@ TEST_F(CircularBufferTest, ParallelWriteAndRead) {
|
||||
std::atomic_int read_sum(0);
|
||||
std::atomic_int read_count(0);
|
||||
{
|
||||
::mediapipe::ThreadPool pool(12);
|
||||
mediapipe::ThreadPool pool(12);
|
||||
pool.StartWorkers();
|
||||
|
||||
// Start 6 writers.
|
||||
|
||||
@@ -199,7 +199,7 @@ void GraphProfiler::Reset() {
|
||||
}
|
||||
|
||||
// Begins profiling for a single graph run.
|
||||
::mediapipe::Status GraphProfiler::Start(::mediapipe::Executor* executor) {
|
||||
mediapipe::Status GraphProfiler::Start(mediapipe::Executor* executor) {
|
||||
// If specified, start periodic profile output while the graph runs.
|
||||
Resume();
|
||||
if (is_tracing_ && IsTraceIntervalEnabled(profiler_config_, tracer()) &&
|
||||
@@ -220,18 +220,18 @@ void GraphProfiler::Reset() {
|
||||
}
|
||||
});
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
// Ends profiling for a single graph run.
|
||||
::mediapipe::Status GraphProfiler::Stop() {
|
||||
mediapipe::Status GraphProfiler::Stop() {
|
||||
is_running_ = false;
|
||||
Pause();
|
||||
// If specified, write a final profile.
|
||||
if (IsTraceLogEnabled(profiler_config_)) {
|
||||
MP_RETURN_IF_ERROR(WriteProfile());
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
void GraphProfiler::LogEvent(const TraceEvent& event) {
|
||||
@@ -281,7 +281,7 @@ void GraphProfiler::AddPacketInfo(const TraceEvent& packet_info) {
|
||||
production_time_usec, production_time_usec);
|
||||
}
|
||||
|
||||
::mediapipe::Status GraphProfiler::GetCalculatorProfiles(
|
||||
mediapipe::Status GraphProfiler::GetCalculatorProfiles(
|
||||
std::vector<CalculatorProfile>* profiles) const {
|
||||
absl::ReaderMutexLock lock(&profiler_mutex_);
|
||||
RET_CHECK(is_initialized_)
|
||||
@@ -289,7 +289,7 @@ void GraphProfiler::AddPacketInfo(const TraceEvent& packet_info) {
|
||||
for (auto& entry : calculator_profiles_) {
|
||||
profiles->push_back(entry.second);
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
void GraphProfiler::InitializeTimeHistogram(int64 interval_size_usec,
|
||||
@@ -566,9 +566,9 @@ void AssignNodeNames(GraphProfile* profile) {
|
||||
}
|
||||
}
|
||||
|
||||
::mediapipe::StatusOr<std::string> GraphProfiler::GetTraceLogPath() {
|
||||
mediapipe::StatusOr<std::string> GraphProfiler::GetTraceLogPath() {
|
||||
if (!IsTraceLogEnabled(profiler_config_)) {
|
||||
return ::mediapipe::InternalError(
|
||||
return mediapipe::InternalError(
|
||||
"Trace log writing is disabled, unable to get trace_log_path.");
|
||||
}
|
||||
if (profiler_config_.trace_log_path().empty()) {
|
||||
@@ -581,10 +581,10 @@ void AssignNodeNames(GraphProfile* profile) {
|
||||
}
|
||||
}
|
||||
|
||||
::mediapipe::Status GraphProfiler::WriteProfile() {
|
||||
mediapipe::Status GraphProfiler::WriteProfile() {
|
||||
if (profiler_config_.trace_log_disabled()) {
|
||||
// Logging is disabled, so we can exit writing without error.
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
ASSIGN_OR_RETURN(std::string trace_log_path, GetTraceLogPath());
|
||||
int log_interval_count = GetLogIntervalCount(profiler_config_);
|
||||
@@ -606,7 +606,7 @@ void AssignNodeNames(GraphProfile* profile) {
|
||||
previous_log_end_time_ = end_time;
|
||||
// If there are no trace events, skip log writing.
|
||||
if (is_tracing_ && trace->calculator_trace().empty()) {
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
// Record the latest CalculatorProfiles.
|
||||
|
||||
@@ -140,9 +140,9 @@ class GraphProfiler : public std::enable_shared_from_this<ProfilingContext> {
|
||||
// Process() and does NOT affect information for Open() and Close() methods.
|
||||
void Reset() ABSL_LOCKS_EXCLUDED(profiler_mutex_);
|
||||
// Begins profiling for a single graph run.
|
||||
::mediapipe::Status Start(::mediapipe::Executor* executor);
|
||||
mediapipe::Status Start(mediapipe::Executor* executor);
|
||||
// Ends profiling for a single graph run.
|
||||
::mediapipe::Status Stop();
|
||||
mediapipe::Status Stop();
|
||||
|
||||
// Record a tracing event.
|
||||
void LogEvent(const TraceEvent& event);
|
||||
@@ -150,12 +150,12 @@ class GraphProfiler : public std::enable_shared_from_this<ProfilingContext> {
|
||||
// Collects the runtime profile for Open(), Process(), and Close() of each
|
||||
// calculator in the graph. May be called at any time after the graph has been
|
||||
// initialized.
|
||||
::mediapipe::Status GetCalculatorProfiles(std::vector<CalculatorProfile>*)
|
||||
const ABSL_LOCKS_EXCLUDED(profiler_mutex_);
|
||||
mediapipe::Status GetCalculatorProfiles(std::vector<CalculatorProfile>*) const
|
||||
ABSL_LOCKS_EXCLUDED(profiler_mutex_);
|
||||
|
||||
// Writes recent profiling and tracing data to a file specified in the
|
||||
// ProfilerConfig. Includes events since the previous call to WriteProfile.
|
||||
::mediapipe::Status WriteProfile();
|
||||
mediapipe::Status WriteProfile();
|
||||
|
||||
// Returns the trace event buffer.
|
||||
GraphTracer* tracer() { return packet_tracer_.get(); }
|
||||
@@ -294,7 +294,7 @@ class GraphProfiler : public std::enable_shared_from_this<ProfilingContext> {
|
||||
// Helper method to get trace_log_path. If the trace_log_path is empty and
|
||||
// tracing is enabled, this function returns a default platform dependent
|
||||
// trace_log_path.
|
||||
::mediapipe::StatusOr<std::string> GetTraceLogPath();
|
||||
mediapipe::StatusOr<std::string> GetTraceLogPath();
|
||||
|
||||
// Helper method to get the clock time in microsecond.
|
||||
int64 TimeNowUsec() { return ToUnixMicros(clock_->TimeNow()); }
|
||||
|
||||
@@ -81,17 +81,17 @@ class GraphProfilerStub {
|
||||
inline void Initialize(const ValidatedGraphConfig& validated_graph_config) {}
|
||||
inline void SetClock(const std::shared_ptr<mediapipe::Clock>& clock) {}
|
||||
inline void LogEvent(const TraceEvent& event) {}
|
||||
inline ::mediapipe::Status GetCalculatorProfiles(
|
||||
inline mediapipe::Status GetCalculatorProfiles(
|
||||
std::vector<CalculatorProfile>*) const {
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
inline void Pause() {}
|
||||
inline void Resume() {}
|
||||
inline void Reset() {}
|
||||
inline ::mediapipe::Status Start(::mediapipe::Executor* executor) {
|
||||
inline mediapipe::Status Start(mediapipe::Executor* executor) {
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
inline ::mediapipe::Status Stop() { return mediapipe::OkStatus(); }
|
||||
inline mediapipe::Status Stop() { return mediapipe::OkStatus(); }
|
||||
inline GraphTracer* tracer() { return nullptr; }
|
||||
inline std::unique_ptr<GlProfilingHelper> CreateGlProfilingHelper() {
|
||||
return nullptr;
|
||||
|
||||
@@ -1176,7 +1176,7 @@ TEST(GraphProfilerTest, ParallelReads) {
|
||||
MP_ASSERT_OK(graph.ObserveOutputStream("out_1", [&](const Packet& packet) {
|
||||
absl::MutexLock lock(&out_1_mutex);
|
||||
out_1_packets.push_back(packet);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}));
|
||||
MP_EXPECT_OK(graph.StartRun(
|
||||
{{"range_step", MakePacket<std::pair<uint32, uint32>>(1000, 1)}}));
|
||||
|
||||
@@ -121,7 +121,7 @@ TEST_F(GraphTracerTest, EmptyTrace) {
|
||||
|
||||
// Validate the GraphTrace data.
|
||||
EXPECT_THAT(GetTrace(),
|
||||
EqualsProto(::mediapipe::ParseTextProtoOrDie<GraphTrace>(R"(
|
||||
EqualsProto(mediapipe::ParseTextProtoOrDie<GraphTrace>(R"(
|
||||
base_time: 0
|
||||
base_timestamp: 0
|
||||
stream_name: ""
|
||||
@@ -144,7 +144,7 @@ TEST_F(GraphTracerTest, CalculatorTrace) {
|
||||
|
||||
// Validate the GraphTrace data.
|
||||
EXPECT_THAT(
|
||||
GetTrace(), EqualsProto(::mediapipe::ParseTextProtoOrDie<GraphTrace>(R"(
|
||||
GetTrace(), EqualsProto(mediapipe::ParseTextProtoOrDie<GraphTrace>(R"(
|
||||
base_time: 1608911100000000
|
||||
base_timestamp: 1608911100000000
|
||||
stream_name: ""
|
||||
@@ -225,7 +225,7 @@ TEST_F(GraphTracerTest, GraphTrace) {
|
||||
|
||||
// Validate the GraphTrace data.
|
||||
EXPECT_THAT(
|
||||
GetTrace(), EqualsProto(::mediapipe::ParseTextProtoOrDie<GraphTrace>(R"(
|
||||
GetTrace(), EqualsProto(mediapipe::ParseTextProtoOrDie<GraphTrace>(R"(
|
||||
base_time: 1608911100000000
|
||||
base_timestamp: 1608911100000000
|
||||
stream_name: ""
|
||||
@@ -425,7 +425,7 @@ class GraphTracerE2ETest : public ::testing::Test {
|
||||
MP_ASSERT_OK(graph_.SetExecutor("", executor));
|
||||
}
|
||||
|
||||
void SetUpRealClock() { clock_ = ::mediapipe::Clock::RealClock(); }
|
||||
void SetUpRealClock() { clock_ = mediapipe::Clock::RealClock(); }
|
||||
|
||||
static Packet PacketAt(int64 ts) {
|
||||
return Adopt(new int64(999)).At(Timestamp(ts));
|
||||
@@ -475,19 +475,19 @@ class GraphTracerE2ETest : public ::testing::Test {
|
||||
}
|
||||
|
||||
// A Calculator::Process callback function.
|
||||
typedef std::function<::mediapipe::Status(const InputStreamShardSet&,
|
||||
OutputStreamShardSet*)>
|
||||
typedef std::function<mediapipe::Status(const InputStreamShardSet&,
|
||||
OutputStreamShardSet*)>
|
||||
ProcessFunction;
|
||||
|
||||
// A testing callback function that passes through all packets.
|
||||
::mediapipe::Status PassThrough(const InputStreamShardSet& inputs,
|
||||
OutputStreamShardSet* outputs) {
|
||||
mediapipe::Status PassThrough(const InputStreamShardSet& inputs,
|
||||
OutputStreamShardSet* outputs) {
|
||||
for (int i = 0; i < inputs.NumEntries(); ++i) {
|
||||
if (!inputs.Index(i).Value().IsEmpty()) {
|
||||
outputs->Index(i).AddPacket(inputs.Index(i).Value());
|
||||
}
|
||||
}
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
|
||||
void RunPassThroughGraph() {
|
||||
@@ -511,7 +511,7 @@ class GraphTracerE2ETest : public ::testing::Test {
|
||||
MP_ASSERT_OK(
|
||||
graph_.ObserveOutputStream("output_0", [&](const Packet& packet) {
|
||||
out_packets.push_back(packet);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}));
|
||||
simulation_clock_->ThreadStart();
|
||||
MP_ASSERT_OK(graph_.StartRun({}));
|
||||
@@ -557,7 +557,7 @@ class GraphTracerE2ETest : public ::testing::Test {
|
||||
clock_->Sleep(absl::Microseconds(packets.front().first));
|
||||
outputs->Index(0).AddPacket(packets.front().second);
|
||||
packets.erase(packets.begin());
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}
|
||||
return tool::StatusStop();
|
||||
};
|
||||
@@ -580,7 +580,7 @@ class GraphTracerE2ETest : public ::testing::Test {
|
||||
MP_ASSERT_OK(graph_.ObserveOutputStream("output_packets_0",
|
||||
[&](const Packet& packet) {
|
||||
out_packets.push_back(packet);
|
||||
return ::mediapipe::OkStatus();
|
||||
return mediapipe::OkStatus();
|
||||
}));
|
||||
simulation_clock_->ThreadStart();
|
||||
MP_ASSERT_OK(graph_.StartRun({}));
|
||||
@@ -597,7 +597,7 @@ class GraphTracerE2ETest : public ::testing::Test {
|
||||
|
||||
CalculatorGraphConfig graph_config_;
|
||||
CalculatorGraph graph_;
|
||||
::mediapipe::Clock* clock_;
|
||||
mediapipe::Clock* clock_;
|
||||
std::shared_ptr<SimulationClock> simulation_clock_;
|
||||
};
|
||||
|
||||
@@ -628,7 +628,7 @@ TEST_F(GraphTracerE2ETest, PassThroughGraphProfile) {
|
||||
MP_EXPECT_OK(graph_.profiler()->GetCalculatorProfiles(&profiles));
|
||||
EXPECT_EQ(1, profiles.size());
|
||||
CalculatorProfile expected =
|
||||
::mediapipe::ParseTextProtoOrDie<CalculatorProfile>(R"(
|
||||
mediapipe::ParseTextProtoOrDie<CalculatorProfile>(R"(
|
||||
name: "LambdaCalculator"
|
||||
open_runtime: 0
|
||||
close_runtime: 0
|
||||
@@ -658,7 +658,7 @@ TEST_F(GraphTracerE2ETest, DemuxGraphLog) {
|
||||
absl::InfiniteFuture(), &trace);
|
||||
GraphTrace node_timestamps = NodeTimestamps(trace);
|
||||
EXPECT_THAT(node_timestamps,
|
||||
EqualsProto(::mediapipe::ParseTextProtoOrDie<GraphTrace>(R"(
|
||||
EqualsProto(mediapipe::ParseTextProtoOrDie<GraphTrace>(R"(
|
||||
calculator_trace { node_id: 1 input_timestamp: 10000 }
|
||||
calculator_trace { node_id: 2 input_timestamp: 10000 }
|
||||
calculator_trace { node_id: 3 input_timestamp: 10000 }
|
||||
@@ -801,7 +801,9 @@ TEST_F(GraphTracerE2ETest, DemuxGraphLog) {
|
||||
calculator_trace { node_id: 5 input_timestamp: 10000 }
|
||||
calculator_trace { node_id: 5 input_timestamp: 10000 }
|
||||
calculator_trace { node_id: 1 input_timestamp: 50001 }
|
||||
calculator_trace { node_id: 1 input_timestamp: 10000 })")));
|
||||
calculator_trace { node_id: 1 input_timestamp: 10000 }
|
||||
calculator_trace { node_id: 1 input_timestamp: 10000 }
|
||||
)")));
|
||||
|
||||
// Validate a one-timestamp slice of the event trace.
|
||||
GraphTrace trace_2;
|
||||
@@ -812,7 +814,7 @@ TEST_F(GraphTracerE2ETest, DemuxGraphLog) {
|
||||
StripDataIds(&trace_2);
|
||||
EXPECT_THAT(
|
||||
trace_2,
|
||||
EqualsProto(::mediapipe::ParseTextProtoOrDie<GraphTrace>(
|
||||
EqualsProto(mediapipe::ParseTextProtoOrDie<GraphTrace>(
|
||||
R"(
|
||||
base_time: 1544086800000000
|
||||
base_timestamp: 10000
|
||||
@@ -986,14 +988,14 @@ TEST_F(GraphTracerE2ETest, DemuxGraphLog) {
|
||||
}
|
||||
|
||||
// Read a GraphProfile from a file path.
|
||||
::mediapipe::Status ReadGraphProfile(const std::string& path,
|
||||
GraphProfile* profile) {
|
||||
mediapipe::Status ReadGraphProfile(const std::string& path,
|
||||
GraphProfile* profile) {
|
||||
std::ifstream ifs;
|
||||
ifs.open(path);
|
||||
proto_ns::io::IstreamInputStream in_stream(&ifs);
|
||||
profile->ParseFromZeroCopyStream(&in_stream);
|
||||
return ifs.is_open() ? ::mediapipe::OkStatus()
|
||||
: ::mediapipe::UnavailableError("Cannot open");
|
||||
return ifs.is_open() ? mediapipe::OkStatus()
|
||||
: mediapipe::UnavailableError("Cannot open");
|
||||
}
|
||||
|
||||
TEST_F(GraphTracerE2ETest, DemuxGraphLogFile) {
|
||||
@@ -1005,7 +1007,7 @@ TEST_F(GraphTracerE2ETest, DemuxGraphLogFile) {
|
||||
GraphProfile profile;
|
||||
MP_EXPECT_OK(
|
||||
ReadGraphProfile(absl::StrCat(log_path, 0, ".binarypb"), &profile));
|
||||
EXPECT_EQ(111, profile.graph_trace(0).calculator_trace().size());
|
||||
EXPECT_EQ(112, profile.graph_trace(0).calculator_trace().size());
|
||||
}
|
||||
|
||||
TEST_F(GraphTracerE2ETest, DemuxGraphLogFiles) {
|
||||
@@ -1034,7 +1036,7 @@ TEST_F(GraphTracerE2ETest, DemuxGraphLogFiles) {
|
||||
// The expected counts of calculator_trace records in each of the log files.
|
||||
// The processing spans three 12.5ms log files, because
|
||||
// RunDemuxInFlightGraph adds packets over 30ms.
|
||||
std::vector<int> expected = {49, 64, 11};
|
||||
std::vector<int> expected = {49, 64, 12};
|
||||
EXPECT_EQ(event_counts, expected);
|
||||
GraphProfile& profile_2 = graph_profiles[2];
|
||||
profile_2.clear_calculator_profiles();
|
||||
@@ -1044,7 +1046,7 @@ TEST_F(GraphTracerE2ETest, DemuxGraphLogFiles) {
|
||||
StripDataIds(&trace);
|
||||
}
|
||||
EXPECT_THAT(profile_2,
|
||||
EqualsProto(::mediapipe::ParseTextProtoOrDie<GraphProfile>(R"(
|
||||
EqualsProto(mediapipe::ParseTextProtoOrDie<GraphProfile>(R"(
|
||||
graph_trace {
|
||||
base_time: 1544086800000000
|
||||
base_timestamp: 0
|
||||
@@ -1145,6 +1147,11 @@ TEST_F(GraphTracerE2ETest, DemuxGraphLogFiles) {
|
||||
stream_id: 7
|
||||
}
|
||||
}
|
||||
calculator_trace {
|
||||
node_id: 1
|
||||
event_type: READY_FOR_PROCESS
|
||||
start_time: 70004
|
||||
}
|
||||
calculator_trace {
|
||||
node_id: 1
|
||||
event_type: READY_FOR_CLOSE
|
||||
@@ -1286,7 +1293,7 @@ TEST_F(GraphTracerE2ETest, GpuTaskTrace) {
|
||||
&trace_1);
|
||||
EXPECT_THAT(
|
||||
trace_1,
|
||||
EqualsProto(::mediapipe::ParseTextProtoOrDie<GraphTrace>(
|
||||
EqualsProto(mediapipe::ParseTextProtoOrDie<GraphTrace>(
|
||||
R"(
|
||||
base_time: 1100
|
||||
base_timestamp: 1000
|
||||
@@ -1323,7 +1330,7 @@ TEST_F(GraphTracerE2ETest, GpuTaskTrace) {
|
||||
&trace_2);
|
||||
EXPECT_THAT(
|
||||
trace_2,
|
||||
EqualsProto(::mediapipe::ParseTextProtoOrDie<GraphTrace>(
|
||||
EqualsProto(mediapipe::ParseTextProtoOrDie<GraphTrace>(
|
||||
R"(
|
||||
base_time: 1100
|
||||
base_timestamp: 1000
|
||||
|
||||
@@ -27,13 +27,13 @@ StatusOr<std::string> GetDefaultTraceLogDirectory() {
|
||||
StatusOr<std::string>* result = new StatusOr<std::string>();
|
||||
bool has_jvm = java::HasJavaVM();
|
||||
if (!has_jvm) {
|
||||
*result = ::mediapipe::InternalError("JavaVM not available.");
|
||||
*result = mediapipe::InternalError("JavaVM not available.");
|
||||
return result;
|
||||
}
|
||||
|
||||
JNIEnv* env = java::GetJNIEnv();
|
||||
if (!env) {
|
||||
*result = ::mediapipe::InternalError("JNIEnv not available.");
|
||||
*result = mediapipe::InternalError("JNIEnv not available.");
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user