Merge pull request #3937 from priankakariatyml:ios-task-files
PiperOrigin-RevId: 499296662
This commit is contained in:
commit
a7bb0aba8f
40
mediapipe/tasks/ios/common/utils/BUILD
Normal file
40
mediapipe/tasks/ios/common/utils/BUILD
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
# Copyright 2022 The MediaPipe Authors. All Rights Reserved.
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
package(default_visibility = ["//mediapipe/tasks:internal"])
|
||||||
|
|
||||||
|
licenses(["notice"])
|
||||||
|
|
||||||
|
objc_library(
|
||||||
|
name = "MPPCommonUtils",
|
||||||
|
srcs = ["sources/MPPCommonUtils.mm"],
|
||||||
|
hdrs = ["sources/MPPCommonUtils.h"],
|
||||||
|
deps = [
|
||||||
|
"//mediapipe/tasks/cc:common",
|
||||||
|
"//mediapipe/tasks/ios/common:MPPCommon",
|
||||||
|
"@com_google_absl//absl/status",
|
||||||
|
"@com_google_absl//absl/strings",
|
||||||
|
"@com_google_absl//absl/strings:cord",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
objc_library(
|
||||||
|
name = "NSStringHelpers",
|
||||||
|
srcs = ["sources/NSString+Helpers.mm"],
|
||||||
|
hdrs = ["sources/NSString+Helpers.h"],
|
||||||
|
copts = [
|
||||||
|
"-ObjC++",
|
||||||
|
"-std=c++17",
|
||||||
|
],
|
||||||
|
)
|
80
mediapipe/tasks/ios/common/utils/sources/MPPCommonUtils.h
Normal file
80
mediapipe/tasks/ios/common/utils/sources/MPPCommonUtils.h
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
// Copyright 2022 The MediaPipe Authors. All Rights Reserved.
|
||||||
|
//
|
||||||
|
// 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/tasks/cc/common.h"
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
|
/** Error domain of Mediapipe Task related errors. */
|
||||||
|
extern NSString *const MPPTasksErrorDomain;
|
||||||
|
|
||||||
|
/** Helper utility for the all tasks which encapsulates common functionality. */
|
||||||
|
@interface MPPCommonUtils : NSObject
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates and saves an NSError in the MediPipe task library domain, with the given code and
|
||||||
|
* description.
|
||||||
|
*
|
||||||
|
* @param code Error code.
|
||||||
|
* @param description Error description.
|
||||||
|
* @param error Pointer to the memory location where the created error should be saved. If `nil`,
|
||||||
|
* no error will be saved.
|
||||||
|
*/
|
||||||
|
+ (void)createCustomError:(NSError **)error
|
||||||
|
withCode:(NSUInteger)code
|
||||||
|
description:(NSString *)description;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates and saves an NSError with the given domain, code and description.
|
||||||
|
*
|
||||||
|
* @param error Pointer to the memory location where the created error should be saved. If `nil`,
|
||||||
|
* no error will be saved.
|
||||||
|
* @param domain Error domain.
|
||||||
|
* @param code Error code.
|
||||||
|
* @param description Error description.
|
||||||
|
*/
|
||||||
|
+ (void)createCustomError:(NSError **)error
|
||||||
|
withDomain:(NSString *)domain
|
||||||
|
code:(NSUInteger)code
|
||||||
|
description:(NSString *)description;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts an absl::Status to an NSError.
|
||||||
|
*
|
||||||
|
* @param status absl::Status.
|
||||||
|
* @param error Pointer to the memory location where the created error should be saved. If `nil`,
|
||||||
|
* no error will be saved.
|
||||||
|
* @return YES when there is no error, NO otherwise.
|
||||||
|
*/
|
||||||
|
+ (BOOL)checkCppError:(const absl::Status &)status toError:(NSError **)error;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocates a block of memory with the specified size and returns a pointer to it. If memory
|
||||||
|
* cannot be allocated because of an invalid `memSize`, it saves an error. In other cases, it
|
||||||
|
* terminates program execution.
|
||||||
|
*
|
||||||
|
* @param memSize size of memory to be allocated
|
||||||
|
* @param error Pointer to the memory location where errors if any should be saved. If `nil`, no
|
||||||
|
* error will be saved.
|
||||||
|
*
|
||||||
|
* @return Pointer to the allocated block of memory on successfull allocation. `nil` in case as
|
||||||
|
* error is encountered because of invalid `memSize`. If failure is due to any other reason, method
|
||||||
|
* terminates program execution.
|
||||||
|
*/
|
||||||
|
+ (void *)mallocWithSize:(size_t)memSize error:(NSError **)error;
|
||||||
|
@end
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_END
|
136
mediapipe/tasks/ios/common/utils/sources/MPPCommonUtils.mm
Normal file
136
mediapipe/tasks/ios/common/utils/sources/MPPCommonUtils.mm
Normal file
|
@ -0,0 +1,136 @@
|
||||||
|
// Copyright 2022 The TensorFlow Authors. All Rights Reserved.
|
||||||
|
//
|
||||||
|
// 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/common/utils/sources/MPPCommonUtils.h"
|
||||||
|
|
||||||
|
#import "mediapipe/tasks/ios/common/sources/MPPCommon.h"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "absl/status/status.h" // from @com_google_absl
|
||||||
|
#include "absl/strings/cord.h" // from @com_google_absl
|
||||||
|
#include "mediapipe/tasks/cc/common.h"
|
||||||
|
|
||||||
|
/** Error domain of MediaPipe task library errors. */
|
||||||
|
NSString *const MPPTasksErrorDomain = @"com.google.mediapipe.tasks";
|
||||||
|
|
||||||
|
@implementation MPPCommonUtils
|
||||||
|
|
||||||
|
+ (void)createCustomError:(NSError **)error
|
||||||
|
withCode:(NSUInteger)code
|
||||||
|
description:(NSString *)description {
|
||||||
|
[MPPCommonUtils createCustomError:error
|
||||||
|
withDomain:MPPTasksErrorDomain
|
||||||
|
code:code
|
||||||
|
description:description];
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (void)createCustomError:(NSError **)error
|
||||||
|
withDomain:(NSString *)domain
|
||||||
|
code:(NSUInteger)code
|
||||||
|
description:(NSString *)description {
|
||||||
|
if (error) {
|
||||||
|
*error = [NSError errorWithDomain:domain
|
||||||
|
code:code
|
||||||
|
userInfo:@{NSLocalizedDescriptionKey : description}];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (void *)mallocWithSize:(size_t)memSize error:(NSError **)error {
|
||||||
|
if (!memSize) {
|
||||||
|
[MPPCommonUtils createCustomError:error
|
||||||
|
withCode:MPPTasksErrorCodeInvalidArgumentError
|
||||||
|
description:@"memSize cannot be zero."];
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *allocedMemory = malloc(memSize);
|
||||||
|
if (!allocedMemory) {
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return allocedMemory;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (BOOL)checkCppError:(const absl::Status &)status toError:(NSError *_Nullable *)error {
|
||||||
|
if (status.ok()) {
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
// Payload of absl::Status created by the MediaPipe task library stores an appropriate value of
|
||||||
|
// the enum MediaPipeTasksStatus. The integer value corresponding to the MediaPipeTasksStatus enum
|
||||||
|
// stored in the payload is extracted here to later map to the appropriate error code to be
|
||||||
|
// returned. In cases where the enum is not stored in (payload is NULL or the payload string
|
||||||
|
// cannot be converted to an integer), we set the error code value to be 1
|
||||||
|
// (MPPTasksErrorCodeError of MPPTasksErrorCode used in the iOS library to signify
|
||||||
|
// any errors not falling into other categories.) Since payload is of type absl::Cord that can be
|
||||||
|
// type cast into an absl::optional<std::string>, we use the std::stoi function to convert it into
|
||||||
|
// an integer code if possible.
|
||||||
|
NSUInteger genericErrorCode = MPPTasksErrorCodeError;
|
||||||
|
NSUInteger errorCode;
|
||||||
|
try {
|
||||||
|
// Try converting payload to integer if payload is not empty. Otherwise convert a string
|
||||||
|
// signifying generic error code MPPTasksErrorCodeError to integer.
|
||||||
|
errorCode =
|
||||||
|
(NSUInteger)std::stoi(static_cast<absl::optional<std::string>>(
|
||||||
|
status.GetPayload(mediapipe::tasks::kMediaPipeTasksPayload))
|
||||||
|
.value_or(std::to_string(genericErrorCode)));
|
||||||
|
} catch (std::invalid_argument &e) {
|
||||||
|
// If non empty payload string cannot be converted to an integer. Set error code to 1(kError).
|
||||||
|
errorCode = MPPTasksErrorCodeError;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If errorCode is outside the range of enum values possible or is
|
||||||
|
// MPPTasksErrorCodeError, we try to map the absl::Status::code() to assign
|
||||||
|
// appropriate MPPTasksErrorCode in default cases. Note:
|
||||||
|
// The mapping to absl::Status::code() is done to generate a more specific error code than
|
||||||
|
// MPPTasksErrorCodeError in cases when the payload can't be mapped to
|
||||||
|
// MPPTasksErrorCode. This can happen when absl::Status returned by TFLite library are in turn
|
||||||
|
// returned without modification by Mediapipe cc library methods.
|
||||||
|
if (errorCode > MPPTasksErrorCodeLast || errorCode <= MPPTasksErrorCodeFirst) {
|
||||||
|
switch (status.code()) {
|
||||||
|
case absl::StatusCode::kInternal:
|
||||||
|
errorCode = MPPTasksErrorCodeError;
|
||||||
|
break;
|
||||||
|
case absl::StatusCode::kInvalidArgument:
|
||||||
|
errorCode = MPPTasksErrorCodeInvalidArgumentError;
|
||||||
|
break;
|
||||||
|
case absl::StatusCode::kNotFound:
|
||||||
|
errorCode = MPPTasksErrorCodeError;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
errorCode = MPPTasksErrorCodeError;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Creates the NSEror with the appropriate error
|
||||||
|
// MPPTasksErrorCode and message. MPPTasksErrorCode has a one to one
|
||||||
|
// mapping with MediaPipeTasksStatus starting from the value 1(MPPTasksErrorCodeError)
|
||||||
|
// and hence will be correctly initialized if directly cast from the integer code derived from
|
||||||
|
// MediaPipeTasksStatus stored in its payload. MPPTasksErrorCode omits kOk = 0 of
|
||||||
|
// MediaPipeTasksStatusx.
|
||||||
|
//
|
||||||
|
// Stores a string including absl status code and message(if non empty) as the
|
||||||
|
// error message See
|
||||||
|
// https://github.com/abseil/abseil-cpp/blob/master/absl/status/status.h#L514
|
||||||
|
// for explanation. absl::Status::message() can also be used but not always
|
||||||
|
// guaranteed to be non empty.
|
||||||
|
NSString *description = [NSString
|
||||||
|
stringWithCString:status.ToString(absl::StatusToStringMode::kWithNoExtraData).c_str()
|
||||||
|
encoding:NSUTF8StringEncoding];
|
||||||
|
[MPPCommonUtils createCustomError:error withCode:errorCode description:description];
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
29
mediapipe/tasks/ios/common/utils/sources/NSString+Helpers.h
Normal file
29
mediapipe/tasks/ios/common/utils/sources/NSString+Helpers.h
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
// Copyright 2022 The MediaPipe Authors. All Rights Reserved.
|
||||||
|
//
|
||||||
|
// 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 <string>
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
|
@interface NSString (Helpers)
|
||||||
|
|
||||||
|
@property(readonly, nonatomic) std::string cppString;
|
||||||
|
|
||||||
|
+ (NSString *)stringWithCppString:(std::string)text;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_END
|
27
mediapipe/tasks/ios/common/utils/sources/NSString+Helpers.mm
Normal file
27
mediapipe/tasks/ios/common/utils/sources/NSString+Helpers.mm
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
// Copyright 2022 The MediaPipe Authors. All Rights Reserved.
|
||||||
|
//
|
||||||
|
// 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/common/utils/sources/NSString+Helpers.h"
|
||||||
|
|
||||||
|
@implementation NSString (Helpers)
|
||||||
|
|
||||||
|
- (std::string)cppString {
|
||||||
|
return std::string(self.UTF8String, [self lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (NSString *)stringWithCppString:(std::string)text {
|
||||||
|
return [NSString stringWithCString:text.c_str() encoding:[NSString defaultCStringEncoding]];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
23
mediapipe/tasks/ios/components/processors/BUILD
Normal file
23
mediapipe/tasks/ios/components/processors/BUILD
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
# Copyright 2022 The MediaPipe Authors. All Rights Reserved.
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
package(default_visibility = ["//mediapipe/tasks:internal"])
|
||||||
|
|
||||||
|
licenses(["notice"])
|
||||||
|
|
||||||
|
objc_library(
|
||||||
|
name = "MPPClassifierOptions",
|
||||||
|
srcs = ["sources/MPPClassifierOptions.m"],
|
||||||
|
hdrs = ["sources/MPPClassifierOptions.h"],
|
||||||
|
)
|
|
@ -0,0 +1,60 @@
|
||||||
|
// 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>
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Holds settings for any single iOS MediaPipe classification task.
|
||||||
|
*/
|
||||||
|
NS_SWIFT_NAME(ClassifierOptions)
|
||||||
|
@interface MPPClassifierOptions : NSObject <NSCopying>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The locale to use for display names specified through the TFLite Model
|
||||||
|
* Metadata, if any. Defaults to English.
|
||||||
|
*/
|
||||||
|
@property(nonatomic, copy) NSString *displayNamesLocale;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The maximum number of top-scored classification results to return. If < 0,
|
||||||
|
* all available results will be returned. If 0, an invalid argument error is
|
||||||
|
* returned.
|
||||||
|
*/
|
||||||
|
@property(nonatomic) NSInteger maxResults;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Score threshold to override the one provided in the model metadata (if any).
|
||||||
|
* Results below this value are rejected.
|
||||||
|
*/
|
||||||
|
@property(nonatomic) float scoreThreshold;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The allowlist of category names. If non-empty, detection results whose
|
||||||
|
* category name is not in this set will be filtered out. Duplicate or unknown
|
||||||
|
* category names are ignored. Mutually exclusive with categoryDenylist.
|
||||||
|
*/
|
||||||
|
@property(nonatomic, copy) NSArray<NSString *> *categoryAllowlist;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The denylist of category names. If non-empty, detection results whose
|
||||||
|
* category name is in this set will be filtered out. Duplicate or unknown
|
||||||
|
* category names are ignored. Mutually exclusive with categoryAllowlist.
|
||||||
|
*/
|
||||||
|
@property(nonatomic, copy) NSArray<NSString *> *categoryDenylist;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_END
|
|
@ -0,0 +1,40 @@
|
||||||
|
// 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/components/processors/sources/MPPClassifierOptions.h"
|
||||||
|
|
||||||
|
@implementation MPPClassifierOptions
|
||||||
|
|
||||||
|
- (instancetype)init {
|
||||||
|
self = [super init];
|
||||||
|
if (self) {
|
||||||
|
_maxResults = -1;
|
||||||
|
_scoreThreshold = 0;
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (id)copyWithZone:(NSZone *)zone {
|
||||||
|
MPPClassifierOptions *classifierOptions = [[MPPClassifierOptions alloc] init];
|
||||||
|
|
||||||
|
classifierOptions.scoreThreshold = self.scoreThreshold;
|
||||||
|
classifierOptions.maxResults = self.maxResults;
|
||||||
|
classifierOptions.categoryDenylist = self.categoryDenylist;
|
||||||
|
classifierOptions.categoryAllowlist = self.categoryAllowlist;
|
||||||
|
classifierOptions.displayNamesLocale = self.displayNamesLocale;
|
||||||
|
|
||||||
|
return classifierOptions;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
28
mediapipe/tasks/ios/components/processors/utils/BUILD
Normal file
28
mediapipe/tasks/ios/components/processors/utils/BUILD
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
# Copyright 2022 The MediaPipe Authors. All Rights Reserved.
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
package(default_visibility = ["//mediapipe/tasks:internal"])
|
||||||
|
|
||||||
|
licenses(["notice"])
|
||||||
|
|
||||||
|
objc_library(
|
||||||
|
name = "MPPClassifierOptionsHelpers",
|
||||||
|
srcs = ["sources/MPPClassifierOptions+Helpers.mm"],
|
||||||
|
hdrs = ["sources/MPPClassifierOptions+Helpers.h"],
|
||||||
|
deps = [
|
||||||
|
"//mediapipe/tasks/cc/components/processors/proto:classifier_options_cc_proto",
|
||||||
|
"//mediapipe/tasks/ios/common/utils:NSStringHelpers",
|
||||||
|
"//mediapipe/tasks/ios/components/processors:MPPClassifierOptions",
|
||||||
|
],
|
||||||
|
)
|
|
@ -0,0 +1,26 @@
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
#include "mediapipe/tasks/cc/components/processors/proto/classifier_options.pb.h"
|
||||||
|
|
||||||
|
#import "mediapipe/tasks/ios/components/processors/sources/MPPClassifierOptions.h"
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
|
@interface MPPClassifierOptions (Helpers)
|
||||||
|
- (void)copyToProto:
|
||||||
|
(mediapipe::tasks::components::processors::proto::ClassifierOptions *)classifierOptionsProto;
|
||||||
|
@end
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_END
|
|
@ -0,0 +1,43 @@
|
||||||
|
// 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/common/utils/sources/NSString+Helpers.h"
|
||||||
|
#import "mediapipe/tasks/ios/components/processors/utils/sources/MPPClassifierOptions+Helpers.h"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
using ClassifierOptionsProto = ::mediapipe::tasks::components::processors::proto::ClassifierOptions;
|
||||||
|
}
|
||||||
|
|
||||||
|
@implementation MPPClassifierOptions (Helpers)
|
||||||
|
|
||||||
|
- (void)copyToProto:(ClassifierOptionsProto *)classifierOptionsProto {
|
||||||
|
classifierOptionsProto->Clear();
|
||||||
|
|
||||||
|
if (self.displayNamesLocale) {
|
||||||
|
classifierOptionsProto->set_display_names_locale(self.displayNamesLocale.cppString);
|
||||||
|
}
|
||||||
|
|
||||||
|
classifierOptionsProto->set_max_results((int)self.maxResults);
|
||||||
|
classifierOptionsProto->set_score_threshold(self.scoreThreshold);
|
||||||
|
|
||||||
|
for (NSString *category in self.categoryAllowlist) {
|
||||||
|
classifierOptionsProto->add_category_allowlist(category.cppString);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (NSString *category in self.categoryDenylist) {
|
||||||
|
classifierOptionsProto->add_category_denylist(category.cppString);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
|
@ -36,3 +36,60 @@ objc_library(
|
||||||
srcs = ["sources/MPPTaskResult.m"],
|
srcs = ["sources/MPPTaskResult.m"],
|
||||||
hdrs = ["sources/MPPTaskResult.h"],
|
hdrs = ["sources/MPPTaskResult.h"],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
objc_library(
|
||||||
|
name = "MPPTaskOptionsProtocol",
|
||||||
|
hdrs = ["sources/MPPTaskOptionsProtocol.h"],
|
||||||
|
deps = [
|
||||||
|
"//mediapipe/framework:calculator_options_cc_proto",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
objc_library(
|
||||||
|
name = "MPPTaskInfo",
|
||||||
|
srcs = ["sources/MPPTaskInfo.mm"],
|
||||||
|
hdrs = ["sources/MPPTaskInfo.h"],
|
||||||
|
copts = [
|
||||||
|
"-ObjC++",
|
||||||
|
"-std=c++17",
|
||||||
|
],
|
||||||
|
deps = [
|
||||||
|
":MPPTaskOptions",
|
||||||
|
":MPPTaskOptionsProtocol",
|
||||||
|
"//mediapipe/calculators/core:flow_limiter_calculator_cc_proto",
|
||||||
|
"//mediapipe/framework:calculator_cc_proto",
|
||||||
|
"//mediapipe/framework:calculator_options_cc_proto",
|
||||||
|
"//mediapipe/tasks/ios/common:MPPCommon",
|
||||||
|
"//mediapipe/tasks/ios/common/utils:MPPCommonUtils",
|
||||||
|
"//mediapipe/tasks/ios/common/utils:NSStringHelpers",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
objc_library(
|
||||||
|
name = "MPPTextPacketCreator",
|
||||||
|
srcs = ["sources/MPPTextPacketCreator.mm"],
|
||||||
|
hdrs = ["sources/MPPTextPacketCreator.h"],
|
||||||
|
copts = [
|
||||||
|
"-ObjC++",
|
||||||
|
"-std=c++17",
|
||||||
|
],
|
||||||
|
deps = [
|
||||||
|
"//mediapipe/framework:packet",
|
||||||
|
"//mediapipe/tasks/ios/common/utils:NSStringHelpers",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
objc_library(
|
||||||
|
name = "MPPTaskRunner",
|
||||||
|
srcs = ["sources/MPPTaskRunner.mm"],
|
||||||
|
hdrs = ["sources/MPPTaskRunner.h"],
|
||||||
|
copts = [
|
||||||
|
"-ObjC++",
|
||||||
|
"-std=c++17",
|
||||||
|
],
|
||||||
|
deps = [
|
||||||
|
"//mediapipe/framework:calculator_cc_proto",
|
||||||
|
"//mediapipe/tasks/cc/core:task_runner",
|
||||||
|
"//mediapipe/tasks/ios/common/utils:MPPCommonUtils",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
70
mediapipe/tasks/ios/core/sources/MPPTaskInfo.h
Normal file
70
mediapipe/tasks/ios/core/sources/MPPTaskInfo.h
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
// 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 NS_DESIGNATED_INITIALIZER;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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::FlowLimiterCalculatorOptions;
|
||||||
|
using ::mediapipe::InputStreamInfo;
|
||||||
|
} // 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) {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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
|
33
mediapipe/tasks/ios/core/sources/MPPTaskOptionsProtocol.h
Normal file
33
mediapipe/tasks/ios/core/sources/MPPTaskOptionsProtocol.h
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
// Copyright 2022 The MediaPipe Authors. All Rights Reserved.
|
||||||
|
//
|
||||||
|
// 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_options.pb.h"
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Any MediaPipe task options should confirm to this protocol.
|
||||||
|
*/
|
||||||
|
@protocol MPPTaskOptionsProtocol
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copies the iOS MediaPipe task options to an object of mediapipe::CalculatorOptions proto.
|
||||||
|
*/
|
||||||
|
- (void)copyToProto:(::mediapipe::CalculatorOptions *)optionsProto;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_END
|
48
mediapipe/tasks/ios/core/sources/MPPTaskRunner.h
Normal file
48
mediapipe/tasks/ios/core/sources/MPPTaskRunner.h
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
// 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"
|
||||||
|
#include "mediapipe/tasks/cc/core/task_runner.h"
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class is used to create and call appropriate methods on the C++ Task Runner.
|
||||||
|
*/
|
||||||
|
@interface MPPTaskRunner : NSObject
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes a new `MPPTaskRunner` with the mediapipe task graph config proto.
|
||||||
|
*
|
||||||
|
* @param graphConfig A mediapipe task graph config proto.
|
||||||
|
*
|
||||||
|
* @return An instance of `MPPTaskRunner` initialized to the given graph config proto.
|
||||||
|
*/
|
||||||
|
- (instancetype)initWithCalculatorGraphConfig:(mediapipe::CalculatorGraphConfig)graphConfig
|
||||||
|
error:(NSError **)error NS_DESIGNATED_INITIALIZER;
|
||||||
|
|
||||||
|
- (absl::StatusOr<mediapipe::tasks::core::PacketMap>)process:
|
||||||
|
(const mediapipe::tasks::core::PacketMap &)packetMap;
|
||||||
|
|
||||||
|
- (absl::Status)close;
|
||||||
|
|
||||||
|
- (instancetype)init NS_UNAVAILABLE;
|
||||||
|
|
||||||
|
+ (instancetype)new NS_UNAVAILABLE;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_END
|
55
mediapipe/tasks/ios/core/sources/MPPTaskRunner.mm
Normal file
55
mediapipe/tasks/ios/core/sources/MPPTaskRunner.mm
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
// 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/MPPTaskRunner.h"
|
||||||
|
#import "mediapipe/tasks/ios/common/utils/sources/MPPCommonUtils.h"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
using ::mediapipe::CalculatorGraphConfig;
|
||||||
|
using ::mediapipe::tasks::core::PacketMap;
|
||||||
|
using TaskRunnerCpp = ::mediapipe::tasks::core::TaskRunner;
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
@interface MPPTaskRunner () {
|
||||||
|
// Cpp Task Runner
|
||||||
|
std::unique_ptr<TaskRunnerCpp> _cppTaskRunner;
|
||||||
|
}
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation MPPTaskRunner
|
||||||
|
|
||||||
|
- (instancetype)initWithCalculatorGraphConfig:(CalculatorGraphConfig)graphConfig
|
||||||
|
error:(NSError **)error {
|
||||||
|
self = [super init];
|
||||||
|
if (self) {
|
||||||
|
auto taskRunnerResult = TaskRunnerCpp::Create(std::move(graphConfig));
|
||||||
|
|
||||||
|
if (![MPPCommonUtils checkCppError:taskRunnerResult.status() toError:error]) {
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
_cppTaskRunner = std::move(taskRunnerResult.value());
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (absl::StatusOr<PacketMap>)process:(const PacketMap &)packetMap {
|
||||||
|
return _cppTaskRunner->Process(packetMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (absl::Status)close {
|
||||||
|
return _cppTaskRunner->Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
26
mediapipe/tasks/ios/core/sources/MPPTextPacketCreator.h
Normal file
26
mediapipe/tasks/ios/core/sources/MPPTextPacketCreator.h
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
// 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/packet.h"
|
||||||
|
|
||||||
|
/* This class is an Objective-C wrapper around a MediaPipe graph object, and
|
||||||
|
* helps interface it with iOS technologies such as AVFoundation.
|
||||||
|
*/
|
||||||
|
@interface MPPTextPacketCreator : NSObject
|
||||||
|
|
||||||
|
+ (mediapipe::Packet)createWithText:(NSString *)text;
|
||||||
|
|
||||||
|
@end
|
29
mediapipe/tasks/ios/core/sources/MPPTextPacketCreator.mm
Normal file
29
mediapipe/tasks/ios/core/sources/MPPTextPacketCreator.mm
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
// Copyright 2019 The MediaPipe Authors.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
#import "mediapipe/tasks/ios/core/sources/MPPTextPacketCreator.h"
|
||||||
|
#import "mediapipe/tasks/ios/common/utils/sources/NSString+Helpers.h"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
using ::mediapipe::MakePacket;
|
||||||
|
using ::mediapipe::Packet;
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
@implementation MPPTextPacketCreator
|
||||||
|
|
||||||
|
+ (Packet)createWithText:(NSString *)text {
|
||||||
|
return MakePacket<std::string>(text.cppString);
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
Loading…
Reference in New Issue
Block a user