Project import generated by Copybara.

GitOrigin-RevId: d8caa66de45839696f5bd0786ad3bfbcb9cff632
This commit is contained in:
MediaPipe Team
2020-12-09 22:43:33 -05:00
committed by chuoling
parent f15da632de
commit 2b58cceec9
750 changed files with 22901 additions and 9478 deletions
@@ -92,11 +92,11 @@ class BoxDetectorCalculator : public CalculatorBase {
public:
~BoxDetectorCalculator() override = default;
static ::mediapipe::Status GetContract(CalculatorContract* cc);
static mediapipe::Status GetContract(CalculatorContract* cc);
::mediapipe::Status Open(CalculatorContext* cc) override;
::mediapipe::Status Process(CalculatorContext* cc) override;
::mediapipe::Status Close(CalculatorContext* cc) override;
mediapipe::Status Open(CalculatorContext* cc) override;
mediapipe::Status Process(CalculatorContext* cc) override;
mediapipe::Status Close(CalculatorContext* cc) override;
private:
BoxDetectorCalculatorOptions options_;
@@ -109,7 +109,7 @@ class BoxDetectorCalculator : public CalculatorBase {
REGISTER_CALCULATOR(BoxDetectorCalculator);
::mediapipe::Status BoxDetectorCalculator::GetContract(CalculatorContract* cc) {
mediapipe::Status BoxDetectorCalculator::GetContract(CalculatorContract* cc) {
if (cc->Inputs().HasTag("TRACKING")) {
cc->Inputs().Tag("TRACKING").Set<TrackingData>();
}
@@ -172,10 +172,10 @@ REGISTER_CALCULATOR(BoxDetectorCalculator);
cc->InputSidePackets().Tag("FRAME_ALIGNMENT").Set<int>();
}
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
::mediapipe::Status BoxDetectorCalculator::Open(CalculatorContext* cc) {
mediapipe::Status BoxDetectorCalculator::Open(CalculatorContext* cc) {
options_ = cc->Options<BoxDetectorCalculatorOptions>();
box_detector_ = BoxDetectorInterface::Create(options_.detector_options());
@@ -210,10 +210,10 @@ REGISTER_CALCULATOR(BoxDetectorCalculator);
frame_alignment_ = cc->InputSidePackets().Tag("FRAME_ALIGNMENT").Get<int>();
}
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
::mediapipe::Status BoxDetectorCalculator::Process(CalculatorContext* cc) {
mediapipe::Status BoxDetectorCalculator::Process(CalculatorContext* cc) {
const Timestamp timestamp = cc->InputTimestamp();
const int64 timestamp_msec = timestamp.Value() / 1000;
@@ -246,7 +246,7 @@ REGISTER_CALCULATOR(BoxDetectorCalculator);
}
if (!detector_switch_) {
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
InputStream* track_stream = cc->Inputs().HasTag("TRACKING")
@@ -274,7 +274,7 @@ REGISTER_CALCULATOR(BoxDetectorCalculator);
if (track_stream != nullptr) {
// Detect from tracking data
if (track_stream->IsEmpty()) {
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
const TrackingData& tracking_data = track_stream->Get<TrackingData>();
@@ -289,7 +289,7 @@ REGISTER_CALCULATOR(BoxDetectorCalculator);
} else if (video_stream != nullptr) {
// Detect from input frame
if (video_stream->IsEmpty()) {
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
TimedBoxProtoList tracked_boxes;
@@ -305,7 +305,7 @@ REGISTER_CALCULATOR(BoxDetectorCalculator);
detected_boxes.get());
} else {
if (feature_stream->IsEmpty() || descriptor_stream->IsEmpty()) {
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
const auto& image_size =
@@ -377,17 +377,17 @@ REGISTER_CALCULATOR(BoxDetectorCalculator);
cc->Outputs().Tag("BOXES").Add(detected_boxes.release(), timestamp);
}
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
::mediapipe::Status BoxDetectorCalculator::Close(CalculatorContext* cc) {
mediapipe::Status BoxDetectorCalculator::Close(CalculatorContext* cc) {
if (write_index_) {
BoxDetectorIndex index = box_detector_->ObtainBoxDetectorIndex();
MEDIAPIPE_CHECK_OK(mediapipe::file::SetContents(
cc->InputSidePackets().Tag("OUTPUT_INDEX_FILENAME").Get<std::string>(),
index.SerializeAsString()));
}
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
} // namespace mediapipe
@@ -123,10 +123,10 @@ class BoxTrackerCalculator : public CalculatorBase {
public:
~BoxTrackerCalculator() override = default;
static ::mediapipe::Status GetContract(CalculatorContract* cc);
static mediapipe::Status GetContract(CalculatorContract* cc);
::mediapipe::Status Open(CalculatorContext* cc) override;
::mediapipe::Status Process(CalculatorContext* cc) override;
mediapipe::Status Open(CalculatorContext* cc) override;
mediapipe::Status Process(CalculatorContext* cc) override;
protected:
void RenderStates(const std::vector<MotionBoxState>& states, cv::Mat* mat);
@@ -167,7 +167,7 @@ class BoxTrackerCalculator : public CalculatorBase {
};
// MotionBoxPath per unique id that we are tracking.
typedef std::unordered_map<int, MotionBoxPath> MotionBoxMap;
typedef absl::node_hash_map<int, MotionBoxPath> MotionBoxMap;
// Performs tracking of all MotionBoxes in box_map by one frame forward or
// backward to or from data_frame_num using passed TrackingData.
@@ -373,7 +373,7 @@ void AddStateToPath(const MotionBoxState& state, int64 time_msec,
} // namespace.
::mediapipe::Status BoxTrackerCalculator::GetContract(CalculatorContract* cc) {
mediapipe::Status BoxTrackerCalculator::GetContract(CalculatorContract* cc) {
if (cc->Inputs().HasTag("TRACKING")) {
cc->Inputs().Tag("TRACKING").Set<TrackingData>();
}
@@ -452,10 +452,10 @@ void AddStateToPath(const MotionBoxState& state, int64 time_msec,
cc->InputSidePackets().Tag(kOptionsTag).Set<CalculatorOptions>();
}
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
::mediapipe::Status BoxTrackerCalculator::Open(CalculatorContext* cc) {
mediapipe::Status BoxTrackerCalculator::Open(CalculatorContext* cc) {
options_ = tool::RetrieveOptions(cc->Options<BoxTrackerCalculatorOptions>(),
cc->InputSidePackets(), kOptionsTag);
@@ -515,10 +515,10 @@ void AddStateToPath(const MotionBoxState& state, int64 time_msec,
<< "Streaming mode not compatible with cache dir.";
}
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
::mediapipe::Status BoxTrackerCalculator::Process(CalculatorContext* cc) {
mediapipe::Status BoxTrackerCalculator::Process(CalculatorContext* cc) {
// Batch mode, issue tracking requests.
if (box_tracker_ && !tracking_issued_) {
for (const auto& pos : initial_pos_.box()) {
@@ -530,7 +530,7 @@ void AddStateToPath(const MotionBoxState& state, int64 time_msec,
const Timestamp& timestamp = cc->InputTimestamp();
if (timestamp == Timestamp::PreStream()) {
// Indicator packet.
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
InputStream* track_stream = cc->Inputs().HasTag("TRACKING")
@@ -892,7 +892,7 @@ void AddStateToPath(const MotionBoxState& state, int64 time_msec,
cc->Outputs().Tag("VIZ").Add(viz_frame.release(), timestamp);
}
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
void BoxTrackerCalculator::AddSmoothTransitionToOutputBox(
@@ -59,11 +59,11 @@ class FlowPackagerCalculator : public CalculatorBase {
public:
~FlowPackagerCalculator() override = default;
static ::mediapipe::Status GetContract(CalculatorContract* cc);
static mediapipe::Status GetContract(CalculatorContract* cc);
::mediapipe::Status Open(CalculatorContext* cc) override;
::mediapipe::Status Process(CalculatorContext* cc) override;
::mediapipe::Status Close(CalculatorContext* cc) override;
mediapipe::Status Open(CalculatorContext* cc) override;
mediapipe::Status Process(CalculatorContext* cc) override;
mediapipe::Status Close(CalculatorContext* cc) override;
// Writes passed chunk to disk.
void WriteChunk(const TrackingDataChunk& chunk) const;
@@ -90,8 +90,7 @@ class FlowPackagerCalculator : public CalculatorBase {
REGISTER_CALCULATOR(FlowPackagerCalculator);
::mediapipe::Status FlowPackagerCalculator::GetContract(
CalculatorContract* cc) {
mediapipe::Status FlowPackagerCalculator::GetContract(CalculatorContract* cc) {
if (!cc->Inputs().HasTag("FLOW")) {
return tool::StatusFail("No input flow was specified.");
}
@@ -115,10 +114,10 @@ REGISTER_CALCULATOR(FlowPackagerCalculator);
cc->InputSidePackets().Tag("CACHE_DIR").Set<std::string>();
}
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
::mediapipe::Status FlowPackagerCalculator::Open(CalculatorContext* cc) {
mediapipe::Status FlowPackagerCalculator::Open(CalculatorContext* cc) {
options_ = cc->Options<FlowPackagerCalculatorOptions>();
flow_packager_.reset(new FlowPackager(options_.flow_packager_options()));
@@ -129,10 +128,10 @@ REGISTER_CALCULATOR(FlowPackagerCalculator);
cache_dir_ = cc->InputSidePackets().Tag("CACHE_DIR").Get<std::string>();
}
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
::mediapipe::Status FlowPackagerCalculator::Process(CalculatorContext* cc) {
mediapipe::Status FlowPackagerCalculator::Process(CalculatorContext* cc) {
InputStream* flow_stream = &(cc->Inputs().Tag("FLOW"));
const RegionFlowFeatureList& flow = flow_stream->Get<RegionFlowFeatureList>();
@@ -194,10 +193,10 @@ REGISTER_CALCULATOR(FlowPackagerCalculator);
prev_timestamp_ = timestamp;
++frame_idx_;
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
::mediapipe::Status FlowPackagerCalculator::Close(CalculatorContext* cc) {
mediapipe::Status FlowPackagerCalculator::Close(CalculatorContext* cc) {
if (frame_idx_ > 0) {
tracking_chunk_.set_last_chunk(true);
if (cc->Outputs().HasTag("TRACKING_CHUNK")) {
@@ -216,7 +215,7 @@ REGISTER_CALCULATOR(FlowPackagerCalculator);
cc->Outputs().Tag("COMPLETE").Add(new bool(true), Timestamp::PreStream());
}
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
void FlowPackagerCalculator::WriteChunk(const TrackingDataChunk& chunk) const {
@@ -56,27 +56,27 @@ class FlowToImageCalculator : public CalculatorBase {
public:
FlowToImageCalculator() {}
~FlowToImageCalculator() override {}
static ::mediapipe::Status GetContract(CalculatorContract* cc);
::mediapipe::Status Open(CalculatorContext* cc) override;
::mediapipe::Status Process(CalculatorContext* cc) override;
static mediapipe::Status GetContract(CalculatorContract* cc);
mediapipe::Status Open(CalculatorContext* cc) override;
mediapipe::Status Process(CalculatorContext* cc) override;
private:
FlowQuantizerModel model_;
};
::mediapipe::Status FlowToImageCalculator::GetContract(CalculatorContract* cc) {
mediapipe::Status FlowToImageCalculator::GetContract(CalculatorContract* cc) {
cc->Inputs().Index(0).Set<OpticalFlowField>();
cc->Outputs().Index(0).Set<ImageFrame>();
// Model sanity check
const auto& options = cc->Options<FlowToImageCalculatorOptions>();
if (options.min_value() >= options.max_value()) {
return ::mediapipe::InvalidArgumentError("Invalid quantizer model.");
return mediapipe::InvalidArgumentError("Invalid quantizer model.");
}
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
::mediapipe::Status FlowToImageCalculator::Open(CalculatorContext* cc) {
mediapipe::Status FlowToImageCalculator::Open(CalculatorContext* cc) {
const auto& options = cc->Options<FlowToImageCalculatorOptions>();
// Fill the the model_data, ideally we want to train the model, but we omit
// the step for now, and takes the (min, max) range from protobuf.
@@ -86,10 +86,10 @@ class FlowToImageCalculator : public CalculatorBase {
options.min_value(), options.min_value(),
options.max_value(), options.max_value()));
model_.LoadFromProto(model_data);
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
::mediapipe::Status FlowToImageCalculator::Process(CalculatorContext* cc) {
mediapipe::Status FlowToImageCalculator::Process(CalculatorContext* cc) {
const auto& input = cc->Inputs().Index(0).Get<OpticalFlowField>();
// Input flow is 2-channel with x-dim flow and y-dim flow.
// Convert it to a ImageFrame in SRGB space, the 3rd channel is not used (0).
@@ -106,7 +106,7 @@ class FlowToImageCalculator : public CalculatorBase {
}
}
cc->Outputs().Index(0).Add(output.release(), cc->InputTimestamp());
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
REGISTER_CALCULATOR(FlowToImageCalculator);
@@ -95,11 +95,11 @@ class MotionAnalysisCalculator : public CalculatorBase {
public:
~MotionAnalysisCalculator() override = default;
static ::mediapipe::Status GetContract(CalculatorContract* cc);
static mediapipe::Status GetContract(CalculatorContract* cc);
::mediapipe::Status Open(CalculatorContext* cc) override;
::mediapipe::Status Process(CalculatorContext* cc) override;
::mediapipe::Status Close(CalculatorContext* cc) override;
mediapipe::Status Open(CalculatorContext* cc) override;
mediapipe::Status Process(CalculatorContext* cc) override;
mediapipe::Status Close(CalculatorContext* cc) override;
private:
// Outputs results to Outputs() if MotionAnalysis buffered sufficient results.
@@ -107,8 +107,8 @@ class MotionAnalysisCalculator : public CalculatorBase {
void OutputMotionAnalyzedFrames(bool flush, CalculatorContext* cc);
// Lazy init function to be called on Process.
::mediapipe::Status InitOnProcess(InputStream* video_stream,
InputStream* selection_stream);
mediapipe::Status InitOnProcess(InputStream* video_stream,
InputStream* selection_stream);
// Parses CSV file contents to homographies.
bool ParseModelCSV(const std::string& contents,
@@ -189,7 +189,7 @@ class MotionAnalysisCalculator : public CalculatorBase {
REGISTER_CALCULATOR(MotionAnalysisCalculator);
::mediapipe::Status MotionAnalysisCalculator::GetContract(
mediapipe::Status MotionAnalysisCalculator::GetContract(
CalculatorContract* cc) {
if (cc->Inputs().HasTag("VIDEO")) {
cc->Inputs().Tag("VIDEO").Set<ImageFrame>();
@@ -246,10 +246,10 @@ REGISTER_CALCULATOR(MotionAnalysisCalculator);
cc->InputSidePackets().Tag(kOptionsTag).Set<CalculatorOptions>();
}
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
::mediapipe::Status MotionAnalysisCalculator::Open(CalculatorContext* cc) {
mediapipe::Status MotionAnalysisCalculator::Open(CalculatorContext* cc) {
options_ =
tool::RetrieveOptions(cc->Options<MotionAnalysisCalculatorOptions>(),
cc->InputSidePackets(), kOptionsTag);
@@ -364,7 +364,7 @@ REGISTER_CALCULATOR(MotionAnalysisCalculator);
// If no video header is provided, just return and initialize on the first
// Process() call.
if (video_header == nullptr) {
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
////////////// EARLY RETURN; ONLY HEADER OUTPUT SHOULD GO HERE ///////////////
@@ -397,12 +397,12 @@ REGISTER_CALCULATOR(MotionAnalysisCalculator);
.SetHeader(Adopt(new VideoHeader(*video_header)));
}
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
::mediapipe::Status MotionAnalysisCalculator::Process(CalculatorContext* cc) {
mediapipe::Status MotionAnalysisCalculator::Process(CalculatorContext* cc) {
if (options_.bypass_mode()) {
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
InputStream* video_stream =
@@ -441,7 +441,7 @@ REGISTER_CALCULATOR(MotionAnalysisCalculator);
}
++frame_idx_;
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
if (motion_analysis_ == nullptr) {
@@ -491,7 +491,7 @@ REGISTER_CALCULATOR(MotionAnalysisCalculator);
cc->Outputs().Tag("VIDEO_OUT").AddPacket(video_stream->Value());
}
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
if (use_frame) {
@@ -520,7 +520,7 @@ REGISTER_CALCULATOR(MotionAnalysisCalculator);
selected_motions_.push_back(frame_selection_result->camera_motion());
switch (options_.selection_analysis()) {
case MotionAnalysisCalculatorOptions::NO_ANALYSIS_USE_SELECTION:
return ::mediapipe::UnknownErrorBuilder(MEDIAPIPE_LOC)
return mediapipe::UnknownErrorBuilder(MEDIAPIPE_LOC)
<< "Should not reach this point!";
case MotionAnalysisCalculatorOptions::ANALYSIS_FROM_FEATURES:
@@ -574,10 +574,10 @@ REGISTER_CALCULATOR(MotionAnalysisCalculator);
OutputMotionAnalyzedFrames(false, cc);
}
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
::mediapipe::Status MotionAnalysisCalculator::Close(CalculatorContext* cc) {
mediapipe::Status MotionAnalysisCalculator::Close(CalculatorContext* cc) {
// Guard against empty videos.
if (motion_analysis_) {
OutputMotionAnalyzedFrames(true, cc);
@@ -588,7 +588,7 @@ REGISTER_CALCULATOR(MotionAnalysisCalculator);
<< meta_motions_.size();
}
}
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
void MotionAnalysisCalculator::OutputMotionAnalyzedFrames(
@@ -688,7 +688,7 @@ void MotionAnalysisCalculator::OutputMotionAnalyzedFrames(
}
}
::mediapipe::Status MotionAnalysisCalculator::InitOnProcess(
mediapipe::Status MotionAnalysisCalculator::InitOnProcess(
InputStream* video_stream, InputStream* selection_stream) {
if (video_stream) {
frame_width_ = video_stream->Get<ImageFrame>().Width();
@@ -761,7 +761,7 @@ void MotionAnalysisCalculator::OutputMotionAnalyzedFrames(
motion_options->set_filter_initialized_irls_weights(true);
}
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
bool MotionAnalysisCalculator::ParseModelCSV(
@@ -86,7 +86,7 @@ ImageFormat::Format GetImageFormat(int num_channels) {
//
class OpenCvVideoDecoderCalculator : public CalculatorBase {
public:
static ::mediapipe::Status GetContract(CalculatorContract* cc) {
static mediapipe::Status GetContract(CalculatorContract* cc) {
cc->InputSidePackets().Tag("INPUT_FILE_PATH").Set<std::string>();
cc->Outputs().Tag("VIDEO").Set<ImageFrame>();
if (cc->Outputs().HasTag("VIDEO_PRESTREAM")) {
@@ -95,15 +95,15 @@ class OpenCvVideoDecoderCalculator : public CalculatorBase {
if (cc->OutputSidePackets().HasTag("SAVED_AUDIO_PATH")) {
cc->OutputSidePackets().Tag("SAVED_AUDIO_PATH").Set<std::string>();
}
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
::mediapipe::Status Open(CalculatorContext* cc) override {
mediapipe::Status Open(CalculatorContext* cc) override {
const std::string& input_file_path =
cc->InputSidePackets().Tag("INPUT_FILE_PATH").Get<std::string>();
cap_ = absl::make_unique<cv::VideoCapture>(input_file_path);
if (!cap_->isOpened()) {
return ::mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
return mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
<< "Fail to open video file at " << input_file_path;
}
width_ = static_cast<int>(cap_->get(cv::CAP_PROP_FRAME_WIDTH));
@@ -116,19 +116,19 @@ class OpenCvVideoDecoderCalculator : public CalculatorBase {
cv::Mat frame;
cap_->read(frame);
if (frame.empty()) {
return ::mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
return mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
<< "Fail to read any frames from the video file at "
<< input_file_path;
}
format_ = GetImageFormat(frame.channels());
if (format_ == ImageFormat::UNKNOWN) {
return ::mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
return mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
<< "Unsupported video format of the video file at "
<< input_file_path;
}
if (fps <= 0 || frame_count_ <= 0 || width_ <= 0 || height_ <= 0) {
return ::mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
return mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
<< "Fail to make video header due to the incorrect metadata from "
"the video file at "
<< input_file_path;
@@ -170,17 +170,17 @@ class OpenCvVideoDecoderCalculator : public CalculatorBase {
.Set(MakePacket<std::string>(std::string()));
}
#else
return ::mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
return mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
<< "OpenCVVideoDecoderCalculator can't save the audio file "
"because FFmpeg is not installed. Please remove "
"output_side_packet: \"SAVED_AUDIO_PATH\" from the node "
"config.";
#endif
}
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
::mediapipe::Status Process(CalculatorContext* cc) override {
mediapipe::Status Process(CalculatorContext* cc) override {
auto image_frame = absl::make_unique<ImageFrame>(format_, width_, height_,
/*alignment_boundary=*/1);
// Use microsecond as the unit of time.
@@ -213,10 +213,10 @@ class OpenCvVideoDecoderCalculator : public CalculatorBase {
decoded_frames_++;
}
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
::mediapipe::Status Close(CalculatorContext* cc) override {
mediapipe::Status Close(CalculatorContext* cc) override {
if (cap_ && cap_->isOpened()) {
cap_->release();
}
@@ -225,7 +225,7 @@ class OpenCvVideoDecoderCalculator : public CalculatorBase {
<< frame_count_ << " vs decoded frames: " << decoded_frames_
<< ").";
}
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
private:
@@ -76,20 +76,20 @@ namespace mediapipe {
//
class OpenCvVideoEncoderCalculator : public CalculatorBase {
public:
static ::mediapipe::Status GetContract(CalculatorContract* cc);
::mediapipe::Status Open(CalculatorContext* cc) override;
::mediapipe::Status Process(CalculatorContext* cc) override;
::mediapipe::Status Close(CalculatorContext* cc) override;
static mediapipe::Status GetContract(CalculatorContract* cc);
mediapipe::Status Open(CalculatorContext* cc) override;
mediapipe::Status Process(CalculatorContext* cc) override;
mediapipe::Status Close(CalculatorContext* cc) override;
private:
::mediapipe::Status SetUpVideoWriter(float frame_rate, int width, int height);
mediapipe::Status SetUpVideoWriter(float frame_rate, int width, int height);
std::string output_file_path_;
int four_cc_;
std::unique_ptr<cv::VideoWriter> writer_;
};
::mediapipe::Status OpenCvVideoEncoderCalculator::GetContract(
mediapipe::Status OpenCvVideoEncoderCalculator::GetContract(
CalculatorContract* cc) {
RET_CHECK(cc->Inputs().HasTag("VIDEO"));
cc->Inputs().Tag("VIDEO").Set<ImageFrame>();
@@ -101,10 +101,10 @@ class OpenCvVideoEncoderCalculator : public CalculatorBase {
if (cc->InputSidePackets().HasTag("AUDIO_FILE_PATH")) {
cc->InputSidePackets().Tag("AUDIO_FILE_PATH").Set<std::string>();
}
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
::mediapipe::Status OpenCvVideoEncoderCalculator::Open(CalculatorContext* cc) {
mediapipe::Status OpenCvVideoEncoderCalculator::Open(CalculatorContext* cc) {
OpenCvVideoEncoderCalculatorOptions options =
cc->Options<OpenCvVideoEncoderCalculatorOptions>();
RET_CHECK(options.has_codec() && options.codec().length() == 4)
@@ -128,13 +128,12 @@ class OpenCvVideoEncoderCalculator : public CalculatorBase {
// from the video header directly. The calculator will receive the video
// header packet at timestamp prestream.
if (cc->Inputs().HasTag("VIDEO_PRESTREAM")) {
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
return SetUpVideoWriter(options.fps(), options.width(), options.height());
}
::mediapipe::Status OpenCvVideoEncoderCalculator::Process(
CalculatorContext* cc) {
mediapipe::Status OpenCvVideoEncoderCalculator::Process(CalculatorContext* cc) {
if (cc->InputTimestamp() == Timestamp::PreStream()) {
const VideoHeader& video_header =
cc->Inputs().Tag("VIDEO_PRESTREAM").Get<VideoHeader>();
@@ -149,7 +148,7 @@ class OpenCvVideoEncoderCalculator : public CalculatorBase {
if (format == ImageFormat::GRAY8) {
frame = formats::MatView(&image_frame);
if (frame.empty()) {
return ::mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
return mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
<< "Receive empty frame at timestamp "
<< cc->Inputs().Tag("VIDEO").Value().Timestamp()
<< " in OpenCvVideoEncoderCalculator::Process()";
@@ -157,7 +156,7 @@ class OpenCvVideoEncoderCalculator : public CalculatorBase {
} else {
cv::Mat tmp_frame = formats::MatView(&image_frame);
if (tmp_frame.empty()) {
return ::mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
return mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
<< "Receive empty frame at timestamp "
<< cc->Inputs().Tag("VIDEO").Value().Timestamp()
<< " in OpenCvVideoEncoderCalculator::Process()";
@@ -167,15 +166,15 @@ class OpenCvVideoEncoderCalculator : public CalculatorBase {
} else if (format == ImageFormat::SRGBA) {
cv::cvtColor(tmp_frame, frame, cv::COLOR_RGBA2BGR);
} else {
return ::mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
return mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
<< "Unsupported image format: " << format;
}
}
writer_->write(frame);
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
::mediapipe::Status OpenCvVideoEncoderCalculator::Close(CalculatorContext* cc) {
mediapipe::Status OpenCvVideoEncoderCalculator::Close(CalculatorContext* cc) {
if (writer_ && writer_->isOpened()) {
writer_->release();
}
@@ -199,17 +198,17 @@ class OpenCvVideoEncoderCalculator : public CalculatorBase {
}
#else
return ::mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
return mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
<< "OpenCVVideoEncoderCalculator can't attach the audio tracks to "
"the video because FFmpeg is not installed. Please remove "
"input_side_packet: \"AUDIO_FILE_PATH\" from the node "
"config.";
#endif
}
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
::mediapipe::Status OpenCvVideoEncoderCalculator::SetUpVideoWriter(
mediapipe::Status OpenCvVideoEncoderCalculator::SetUpVideoWriter(
float frame_rate, int width, int height) {
RET_CHECK(frame_rate > 0 && width > 0 && height > 0)
<< "Invalid video metadata: frame_rate=" << frame_rate
@@ -217,10 +216,10 @@ class OpenCvVideoEncoderCalculator : public CalculatorBase {
writer_ = absl::make_unique<cv::VideoWriter>(
output_file_path_, four_cc_, frame_rate, cv::Size(width, height));
if (!writer_->isOpened()) {
return ::mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
return mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
<< "Fail to open file at " << output_file_path_;
}
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
REGISTER_CALCULATOR(OpenCvVideoEncoderCalculator);
@@ -139,10 +139,10 @@ Detection GetAxisAlignedDetectionFromTrackedDetection(
// }
class TrackedDetectionManagerCalculator : public CalculatorBase {
public:
static ::mediapipe::Status GetContract(CalculatorContract* cc);
::mediapipe::Status Open(CalculatorContext* cc) override;
static mediapipe::Status GetContract(CalculatorContract* cc);
mediapipe::Status Open(CalculatorContext* cc) override;
::mediapipe::Status Process(CalculatorContext* cc) override;
mediapipe::Status Process(CalculatorContext* cc) override;
private:
// Adds new list of detections to |waiting_for_update_detections_|.
@@ -161,7 +161,7 @@ class TrackedDetectionManagerCalculator : public CalculatorBase {
};
REGISTER_CALCULATOR(TrackedDetectionManagerCalculator);
::mediapipe::Status TrackedDetectionManagerCalculator::GetContract(
mediapipe::Status TrackedDetectionManagerCalculator::GetContract(
CalculatorContract* cc) {
if (cc->Inputs().HasTag(kDetectionsTag)) {
cc->Inputs().Tag(kDetectionsTag).Set<std::vector<Detection>>();
@@ -183,19 +183,19 @@ REGISTER_CALCULATOR(TrackedDetectionManagerCalculator);
cc->Outputs().Tag(kDetectionBoxesTag).Set<std::vector<NormalizedRect>>();
}
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
::mediapipe::Status TrackedDetectionManagerCalculator::Open(
mediapipe::Status TrackedDetectionManagerCalculator::Open(
CalculatorContext* cc) {
mediapipe::TrackedDetectionManagerCalculatorOptions options =
cc->Options<mediapipe::TrackedDetectionManagerCalculatorOptions>();
tracked_detection_manager_.SetConfig(
options.tracked_detection_manager_options());
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
::mediapipe::Status TrackedDetectionManagerCalculator::Process(
mediapipe::Status TrackedDetectionManagerCalculator::Process(
CalculatorContext* cc) {
if (cc->Inputs().HasTag(kTrackingBoxesTag) &&
!cc->Inputs().Tag(kTrackingBoxesTag).IsEmpty()) {
@@ -296,7 +296,7 @@ REGISTER_CALCULATOR(TrackedDetectionManagerCalculator);
AddDetectionList(detection_list, cc);
}
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
void TrackedDetectionManagerCalculator::AddDetectionList(
@@ -52,14 +52,14 @@ std::string GetTestDir() {
CFURLGetFileSystemRepresentation(
bundle_url, true, reinterpret_cast<UInt8*>(path), sizeof(path));
CFRelease(bundle_url);
return ::mediapipe::file::JoinPath(path, "testdata");
return mediapipe::file::JoinPath(path, "testdata");
#elif defined(__ANDROID__)
char path[1024];
getcwd(path, sizeof(path));
return ::mediapipe::file::JoinPath(path,
"mediapipe/calculators/video/testdata");
return mediapipe::file::JoinPath(path,
"mediapipe/calculators/video/testdata");
#else
return ::mediapipe::file::JoinPath(
return mediapipe::file::JoinPath(
"./",
// This should match the path of the output files
// of the genrule() that generates test model files.
@@ -74,14 +74,14 @@ cv::Mat ConvertToGrayscale(const cv::Mat& image) {
// num_threads: 10
class Tvl1OpticalFlowCalculator : public CalculatorBase {
public:
static ::mediapipe::Status GetContract(CalculatorContract* cc);
::mediapipe::Status Open(CalculatorContext* cc) override;
::mediapipe::Status Process(CalculatorContext* cc) override;
static mediapipe::Status GetContract(CalculatorContract* cc);
mediapipe::Status Open(CalculatorContext* cc) override;
mediapipe::Status Process(CalculatorContext* cc) override;
private:
::mediapipe::Status CalculateOpticalFlow(const ImageFrame& current_frame,
const ImageFrame& next_frame,
OpticalFlowField* flow);
mediapipe::Status CalculateOpticalFlow(const ImageFrame& current_frame,
const ImageFrame& next_frame,
OpticalFlowField* flow);
bool forward_requested_ = false;
bool backward_requested_ = false;
// Stores the idle DenseOpticalFlow objects.
@@ -93,11 +93,11 @@ class Tvl1OpticalFlowCalculator : public CalculatorBase {
absl::Mutex mutex_;
};
::mediapipe::Status Tvl1OpticalFlowCalculator::GetContract(
mediapipe::Status Tvl1OpticalFlowCalculator::GetContract(
CalculatorContract* cc) {
if (!cc->Inputs().HasTag("FIRST_FRAME") ||
!cc->Inputs().HasTag("SECOND_FRAME")) {
return ::mediapipe::InvalidArgumentError(
return mediapipe::InvalidArgumentError(
"Missing required input streams. Both FIRST_FRAME and SECOND_FRAME "
"must be specified.");
}
@@ -109,10 +109,10 @@ class Tvl1OpticalFlowCalculator : public CalculatorBase {
if (cc->Outputs().HasTag("BACKWARD_FLOW")) {
cc->Outputs().Tag("BACKWARD_FLOW").Set<OpticalFlowField>();
}
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
::mediapipe::Status Tvl1OpticalFlowCalculator::Open(CalculatorContext* cc) {
mediapipe::Status Tvl1OpticalFlowCalculator::Open(CalculatorContext* cc) {
{
absl::MutexLock lock(&mutex_);
tvl1_computers_.emplace_back(cv::createOptFlow_DualTVL1());
@@ -124,10 +124,10 @@ class Tvl1OpticalFlowCalculator : public CalculatorBase {
backward_requested_ = true;
}
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
::mediapipe::Status Tvl1OpticalFlowCalculator::Process(CalculatorContext* cc) {
mediapipe::Status Tvl1OpticalFlowCalculator::Process(CalculatorContext* cc) {
const ImageFrame& first_frame =
cc->Inputs().Tag("FIRST_FRAME").Value().Get<ImageFrame>();
const ImageFrame& second_frame =
@@ -148,10 +148,10 @@ class Tvl1OpticalFlowCalculator : public CalculatorBase {
.Tag("BACKWARD_FLOW")
.Add(backward_optical_flow_field.release(), cc->InputTimestamp());
}
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
::mediapipe::Status Tvl1OpticalFlowCalculator::CalculateOpticalFlow(
mediapipe::Status Tvl1OpticalFlowCalculator::CalculateOpticalFlow(
const ImageFrame& current_frame, const ImageFrame& next_frame,
OpticalFlowField* flow) {
CHECK(flow);
@@ -184,7 +184,7 @@ class Tvl1OpticalFlowCalculator : public CalculatorBase {
absl::MutexLock lock(&mutex_);
tvl1_computers_.push_back(tvl1_computer);
}
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
REGISTER_CALCULATOR(Tvl1OpticalFlowCalculator);
@@ -45,13 +45,13 @@ namespace mediapipe {
// }
class VideoPreStreamCalculator : public CalculatorBase {
public:
static ::mediapipe::Status GetContract(CalculatorContract* cc);
::mediapipe::Status Open(CalculatorContext* cc) override;
::mediapipe::Status Process(CalculatorContext* cc) override;
static mediapipe::Status GetContract(CalculatorContract* cc);
mediapipe::Status Open(CalculatorContext* cc) override;
mediapipe::Status Process(CalculatorContext* cc) override;
private:
::mediapipe::Status ProcessWithFrameRateInPreStream(CalculatorContext* cc);
::mediapipe::Status ProcessWithFrameRateInOptions(CalculatorContext* cc);
mediapipe::Status ProcessWithFrameRateInPreStream(CalculatorContext* cc);
mediapipe::Status ProcessWithFrameRateInOptions(CalculatorContext* cc);
std::unique_ptr<VideoHeader> header_;
bool frame_rate_in_prestream_ = false;
@@ -60,7 +60,7 @@ class VideoPreStreamCalculator : public CalculatorBase {
REGISTER_CALCULATOR(VideoPreStreamCalculator);
::mediapipe::Status VideoPreStreamCalculator::GetContract(
mediapipe::Status VideoPreStreamCalculator::GetContract(
CalculatorContract* cc) {
if (!cc->Inputs().UsesTags()) {
cc->Inputs().Index(0).Set<ImageFrame>();
@@ -69,17 +69,17 @@ REGISTER_CALCULATOR(VideoPreStreamCalculator);
cc->Inputs().Tag("VIDEO_PRESTREAM").Set<VideoHeader>();
}
cc->Outputs().Index(0).Set<VideoHeader>();
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
::mediapipe::Status VideoPreStreamCalculator::Open(CalculatorContext* cc) {
mediapipe::Status VideoPreStreamCalculator::Open(CalculatorContext* cc) {
frame_rate_in_prestream_ = cc->Inputs().UsesTags() &&
cc->Inputs().HasTag("FRAME") &&
cc->Inputs().HasTag("VIDEO_PRESTREAM");
header_ = absl::make_unique<VideoHeader>();
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
::mediapipe::Status VideoPreStreamCalculator::ProcessWithFrameRateInPreStream(
mediapipe::Status VideoPreStreamCalculator::ProcessWithFrameRateInPreStream(
CalculatorContext* cc) {
cc->GetCounter("ProcessWithFrameRateInPreStream")->Increment();
if (cc->InputTimestamp() == Timestamp::PreStream()) {
@@ -99,13 +99,13 @@ REGISTER_CALCULATOR(VideoPreStreamCalculator);
cc->Outputs().Index(0).Add(header_.release(), Timestamp::PreStream());
emitted_ = true;
}
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
::mediapipe::Status VideoPreStreamCalculator::Process(CalculatorContext* cc) {
mediapipe::Status VideoPreStreamCalculator::Process(CalculatorContext* cc) {
cc->GetCounter("Process")->Increment();
if (emitted_) {
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
if (frame_rate_in_prestream_) {
return ProcessWithFrameRateInPreStream(cc);
@@ -114,7 +114,7 @@ REGISTER_CALCULATOR(VideoPreStreamCalculator);
}
}
::mediapipe::Status VideoPreStreamCalculator::ProcessWithFrameRateInOptions(
mediapipe::Status VideoPreStreamCalculator::ProcessWithFrameRateInOptions(
CalculatorContext* cc) {
cc->GetCounter("ProcessWithFrameRateInOptions")->Increment();
RET_CHECK_NE(cc->InputTimestamp(), Timestamp::PreStream());
@@ -136,7 +136,7 @@ REGISTER_CALCULATOR(VideoPreStreamCalculator);
RET_CHECK_NE(header_->frame_rate, 0.0) << "frame rate should be non-zero";
cc->Outputs().Index(0).Add(header_.release(), Timestamp::PreStream());
emitted_ = true;
return ::mediapipe::OkStatus();
return mediapipe::OkStatus();
}
} // namespace mediapipe
@@ -118,7 +118,7 @@ TEST(VideoPreStreamCalculatorTest, FailsWithoutFrameRateInOptions) {
"frame",
Adopt(new ImageFrame(ImageFormat::SRGB, 1, 2)).At(Timestamp(0))));
MP_ASSERT_OK(graph.CloseInputStream("frame"));
::mediapipe::Status status = graph.WaitUntilDone();
mediapipe::Status status = graph.WaitUntilDone();
EXPECT_FALSE(status.ok());
EXPECT_THAT(status.ToString(),
testing::HasSubstr("frame rate should be non-zero"));
@@ -144,7 +144,7 @@ TEST(VideoPreStreamCalculatorTest, FailsWithoutFrameRateInPreStream1) {
Adopt(new ImageFrame(ImageFormat::SRGB, 1, 2)).At(Timestamp(0))));
MP_ASSERT_OK(graph.CloseInputStream("frame"));
MP_ASSERT_OK(graph.CloseInputStream("input_header"));
::mediapipe::Status status = graph.WaitUntilDone();
mediapipe::Status status = graph.WaitUntilDone();
EXPECT_FALSE(status.ok());
EXPECT_THAT(status.ToString(),
testing::HasSubstr("frame rate should be non-zero"));
@@ -177,7 +177,7 @@ TEST(VideoPreStreamCalculatorTest, FailsWithoutFrameRateInPreStream2) {
"frame",
Adopt(new ImageFrame(ImageFormat::SRGB, 1, 2)).At(Timestamp(0))));
MP_ASSERT_OK(graph.CloseInputStream("frame"));
::mediapipe::Status status = graph.WaitUntilDone();
mediapipe::Status status = graph.WaitUntilDone();
EXPECT_FALSE(status.ok());
}
}