Added task info
This commit is contained in:
		
							parent
							
								
									c56ef735d7
								
							
						
					
					
						commit
						6d02108bf5
					
				
							
								
								
									
										69
									
								
								mediapipe/tasks/ios/core/sources/MPPTaskInfo.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								mediapipe/tasks/ios/core/sources/MPPTaskInfo.h
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,69 @@
 | 
				
			||||||
 | 
					// Copyright 2022 The MediaPipe Authors.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					// you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					// You may obtain a copy of the License at
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//      http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					// distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					// See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					// limitations under the License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#import <Foundation/Foundation.h>
 | 
				
			||||||
 | 
					#include "mediapipe/framework/calculator.pb.h"
 | 
				
			||||||
 | 
					#import "mediapipe/tasks/ios/core/sources/MPPTaskOptions.h"
 | 
				
			||||||
 | 
					#import "mediapipe/tasks/ios/core/sources/MPPTaskOptionsProtocol.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					NS_ASSUME_NONNULL_BEGIN
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Holds all needed informaton to initialize a MediaPipe Task.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@interface MPPTaskInfo : NSObject <NSCopying>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@property(nonatomic, copy, nonnull) NSString *taskGraphName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * A task-specific options that is derived from MPPTaskOptions and confirms to
 | 
				
			||||||
 | 
					 * MPPTaskOptionsProtocol.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@property(nonatomic, copy) id<MPPTaskOptionsProtocol> taskOptions;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * List of task graph input stream info strings in the form TAG:name.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@property(nonatomic, copy) NSArray *inputStreams;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * List of task graph output stream info in the form TAG:name.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@property(nonatomic, copy) NSArray *outputStreams;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * If the task requires a flow limiter.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@property(nonatomic) BOOL enableFlowLimiting;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					+ (instancetype)new NS_UNAVAILABLE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- (instancetype)initWithTaskGraphName:(NSString *)taskGraphName
 | 
				
			||||||
 | 
					                         inputStreams:(NSArray<NSString *> *)inputStreams
 | 
				
			||||||
 | 
					                        outputStreams:(NSArray<NSString *> *)outputStreams
 | 
				
			||||||
 | 
					                          taskOptions:(id<MPPTaskOptionsProtocol>)taskOptions
 | 
				
			||||||
 | 
					                   enableFlowLimiting:(BOOL)enableFlowLimiting
 | 
				
			||||||
 | 
					                                error:(NSError **)error;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Creates a MediaPipe Task  protobuf message from the MPPTaskInfo instance.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					- (mediapipe::CalculatorGraphConfig)generateGraphConfig;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- (instancetype)init NS_UNAVAILABLE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					NS_ASSUME_NONNULL_END
 | 
				
			||||||
							
								
								
									
										136
									
								
								mediapipe/tasks/ios/core/sources/MPPTaskInfo.mm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										136
									
								
								mediapipe/tasks/ios/core/sources/MPPTaskInfo.mm
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,136 @@
 | 
				
			||||||
 | 
					// Copyright 2022 The MediaPipe Authors.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					// you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					// You may obtain a copy of the License at
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//      http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					// distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					// See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					// limitations under the License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#import "mediapipe/tasks/ios/core/sources/MPPTaskInfo.h"
 | 
				
			||||||
 | 
					#import "mediapipe/tasks/ios/common/sources/MPPCommon.h"
 | 
				
			||||||
 | 
					#import "mediapipe/tasks/ios/common/utils/sources/MPPCommonUtils.h"
 | 
				
			||||||
 | 
					#import "mediapipe/tasks/ios/common/utils/sources/NSString+Helpers.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "mediapipe/calculators/core/flow_limiter_calculator.pb.h"
 | 
				
			||||||
 | 
					#include "mediapipe/framework/calculator.pb.h"
 | 
				
			||||||
 | 
					#include "mediapipe/framework/calculator_options.pb.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace {
 | 
				
			||||||
 | 
					using CalculatorGraphConfig = ::mediapipe::CalculatorGraphConfig;
 | 
				
			||||||
 | 
					using Node = ::mediapipe::CalculatorGraphConfig::Node;
 | 
				
			||||||
 | 
					using ::mediapipe::InputStreamInfo;
 | 
				
			||||||
 | 
					using ::mediapipe::CalculatorOptions;
 | 
				
			||||||
 | 
					using ::mediapipe::FlowLimiterCalculatorOptions;
 | 
				
			||||||
 | 
					}  // namespace
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@implementation MPPTaskInfo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- (instancetype)initWithTaskGraphName:(NSString *)taskGraphName
 | 
				
			||||||
 | 
					                         inputStreams:(NSArray<NSString *> *)inputStreams
 | 
				
			||||||
 | 
					                        outputStreams:(NSArray<NSString *> *)outputStreams
 | 
				
			||||||
 | 
					                          taskOptions:(id<MPPTaskOptionsProtocol>)taskOptions
 | 
				
			||||||
 | 
					                   enableFlowLimiting:(BOOL)enableFlowLimiting
 | 
				
			||||||
 | 
					                                error:(NSError **)error {
 | 
				
			||||||
 | 
					  if (!taskGraphName || !inputStreams.count || !outputStreams.count) {
 | 
				
			||||||
 | 
					    [MPPCommonUtils
 | 
				
			||||||
 | 
					        createCustomError:error
 | 
				
			||||||
 | 
					                 withCode:MPPTasksErrorCodeInvalidArgumentError
 | 
				
			||||||
 | 
					              description:
 | 
				
			||||||
 | 
					                  @"Task graph's name, input streams, and output streams should be non-empty."];
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  self = [super init];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (self) {
 | 
				
			||||||
 | 
					    _taskGraphName = taskGraphName;
 | 
				
			||||||
 | 
					    _inputStreams = inputStreams;
 | 
				
			||||||
 | 
					    _outputStreams = outputStreams;
 | 
				
			||||||
 | 
					    _taskOptions = taskOptions;
 | 
				
			||||||
 | 
					    _enableFlowLimiting = enableFlowLimiting;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return self;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- (id)copyWithZone:(NSZone *)zone {
 | 
				
			||||||
 | 
					  MPPTaskInfo *taskInfo = [[MPPTaskInfo alloc] init];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  taskInfo.taskGraphName = self.taskGraphName;
 | 
				
			||||||
 | 
					  taskInfo.inputStreams = self.inputStreams;
 | 
				
			||||||
 | 
					  taskInfo.outputStreams = self.outputStreams;
 | 
				
			||||||
 | 
					  taskInfo.taskOptions = self.taskOptions;
 | 
				
			||||||
 | 
					  taskInfo.enableFlowLimiting = self.enableFlowLimiting;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return taskInfo;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- (CalculatorGraphConfig)generateGraphConfig {
 | 
				
			||||||
 | 
					  CalculatorGraphConfig graph_config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Node *task_subgraph_node = graph_config.add_node();
 | 
				
			||||||
 | 
					  task_subgraph_node->set_calculator(self.taskGraphName.cppString);
 | 
				
			||||||
 | 
					  [self.taskOptions copyToProto:task_subgraph_node->mutable_options()];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for (NSString *outputStream in self.outputStreams) {
 | 
				
			||||||
 | 
					    auto cpp_output_stream = std::string(outputStream.cppString);
 | 
				
			||||||
 | 
					    task_subgraph_node->add_output_stream(cpp_output_stream);
 | 
				
			||||||
 | 
					    graph_config.add_output_stream(cpp_output_stream);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (self.enableFlowLimiting) {
 | 
				
			||||||
 | 
					    Node *flow_limit_calculator_node = graph_config.add_node();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    flow_limit_calculator_node->set_calculator("FlowLimiterCalculator");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    InputStreamInfo *input_stream_info = flow_limit_calculator_node->add_input_stream_info();
 | 
				
			||||||
 | 
					    input_stream_info->set_tag_index("FINISHED");
 | 
				
			||||||
 | 
					    input_stream_info->set_back_edge(true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    FlowLimiterCalculatorOptions *flow_limit_calculator_options =
 | 
				
			||||||
 | 
					        flow_limit_calculator_node->mutable_options()->MutableExtension(
 | 
				
			||||||
 | 
					            FlowLimiterCalculatorOptions::ext);
 | 
				
			||||||
 | 
					    flow_limit_calculator_options->set_max_in_flight(1);
 | 
				
			||||||
 | 
					    flow_limit_calculator_options->set_max_in_queue(1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (NSString *inputStream in self.inputStreams) {
 | 
				
			||||||
 | 
					      graph_config.add_input_stream(inputStream.cppString);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      NSString *strippedInputStream = [MPPTaskInfo stripTagIndex:inputStream];
 | 
				
			||||||
 | 
					      flow_limit_calculator_node->add_input_stream(strippedInputStream.cppString);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      NSString *taskInputStream = [MPPTaskInfo addStreamNamePrefix:inputStream];
 | 
				
			||||||
 | 
					      task_subgraph_node->add_input_stream(taskInputStream.cppString);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      NSString *strippedTaskInputStream = [MPPTaskInfo stripTagIndex:taskInputStream];
 | 
				
			||||||
 | 
					      flow_limit_calculator_node->add_output_stream(strippedTaskInputStream.cppString);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    NSString *firstOutputStream = self.outputStreams[0];
 | 
				
			||||||
 | 
					    auto finished_output_stream = "FINISHED:" + firstOutputStream.cppString;
 | 
				
			||||||
 | 
					    flow_limit_calculator_node->add_input_stream(finished_output_stream);
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    for (NSString *inputStream in self.inputStreams) {
 | 
				
			||||||
 | 
					      auto cpp_input_stream = inputStream.cppString;
 | 
				
			||||||
 | 
					      task_subgraph_node->add_input_stream(cpp_input_stream);
 | 
				
			||||||
 | 
					      graph_config.add_input_stream(cpp_input_stream);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return graph_config;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					+ (NSString *)stripTagIndex:(NSString *)tagIndexName {
 | 
				
			||||||
 | 
					  return [tagIndexName componentsSeparatedByString:@":"][1];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					+ (NSString *)addStreamNamePrefix:(NSString *)tagIndexName {
 | 
				
			||||||
 | 
					  NSArray *splits = [tagIndexName componentsSeparatedByString:@":"];
 | 
				
			||||||
 | 
					  return [NSString stringWithFormat:@"%@:throttled_%@", splits[0], splits[1]];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@end
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user