diff --git a/.bazelrc b/.bazelrc index c2d8236b8..22fe5a191 100644 --- a/.bazelrc +++ b/.bazelrc @@ -69,6 +69,12 @@ build:android_arm64 --cpu=arm64-v8a build:android_arm64 --fat_apk_cpu=arm64-v8a # iOS configs. + +build:ios --apple_bitcode=embedded +build:ios --copt=-fembed-bitcode +build:ios --cxxopt=-std=c++17 # enables c++ 17 + + build:ios --apple_platform_type=ios build:ios --copt=-fno-aligned-allocation diff --git a/mediapipe/examples/ios/posetracking-lindera/PoseTrackingLindera.xcworkspace/xcuserdata/tj.xcuserdatad/UserInterfaceState.xcuserstate b/mediapipe/examples/ios/posetracking-lindera/PoseTrackingLindera.xcworkspace/xcuserdata/tj.xcuserdatad/UserInterfaceState.xcuserstate index 7d5593a7f..c30343617 100644 Binary files a/mediapipe/examples/ios/posetracking-lindera/PoseTrackingLindera.xcworkspace/xcuserdata/tj.xcuserdatad/UserInterfaceState.xcuserstate and b/mediapipe/examples/ios/posetracking-lindera/PoseTrackingLindera.xcworkspace/xcuserdata/tj.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/mediapipe/examples/ios/posetracking-lindera/PoseTrackingLindera/Info.plist b/mediapipe/examples/ios/posetracking-lindera/PoseTrackingLindera/Info.plist index 426e53640..50a35699c 100644 --- a/mediapipe/examples/ios/posetracking-lindera/PoseTrackingLindera/Info.plist +++ b/mediapipe/examples/ios/posetracking-lindera/PoseTrackingLindera/Info.plist @@ -2,10 +2,10 @@ + NSCameraUsageDescription + Processing Camera Feed UIApplicationSceneManifest - NSCameraUsageDescription - This app uses the camera to demonstrate live video processing. CFBundleDevelopmentRegion en CFBundleExecutable diff --git a/mediapipe/framework/deps/registration.h b/mediapipe/framework/deps/registration.h index b39a1e293..03d1d123e 100644 --- a/mediapipe/framework/deps/registration.h +++ b/mediapipe/framework/deps/registration.h @@ -383,7 +383,7 @@ class GlobalFactoryRegistry { #define REGISTER_FACTORY_FUNCTION_QUALIFIED(RegistryType, var_name, name, ...) \ static auto* REGISTRY_STATIC_VAR(var_name, __LINE__) = \ - new mediapipe::RegistrationToken( \ + new ::mediapipe::RegistrationToken( \ RegistryType::Register(#name, __VA_ARGS__)) } // namespace mediapipe diff --git a/mediapipe/framework/subgraph.h b/mediapipe/framework/subgraph.h index b3e7d958b..332a85eaf 100644 --- a/mediapipe/framework/subgraph.h +++ b/mediapipe/framework/subgraph.h @@ -130,7 +130,7 @@ class Subgraph { using SubgraphRegistry = GlobalFactoryRegistry>; #define REGISTER_MEDIAPIPE_GRAPH(name) \ - REGISTER_FACTORY_FUNCTION_QUALIFIED(mediapipe::SubgraphRegistry, \ + REGISTER_FACTORY_FUNCTION_QUALIFIED(::mediapipe::SubgraphRegistry, \ subgraph_registration, name, \ absl::make_unique) diff --git a/mediapipe/framework/tool/simple_subgraph_template.cc b/mediapipe/framework/tool/simple_subgraph_template.cc index 57cd36cd3..0f2e70f34 100644 --- a/mediapipe/framework/tool/simple_subgraph_template.cc +++ b/mediapipe/framework/tool/simple_subgraph_template.cc @@ -25,11 +25,11 @@ static const char binary_graph[] = #include "{{SUBGRAPH_INC_FILE_PATH}}" ; // NOLINT(whitespace/semicolon) -class {{SUBGRAPH_CLASS_NAME}} : public Subgraph { +class {{SUBGRAPH_CLASS_NAME}} : public ::mediapipe::Subgraph { public: - absl::StatusOr GetConfig( + absl::StatusOr<::mediapipe::CalculatorGraphConfig> GetConfig( const SubgraphOptions& /*options*/) { - CalculatorGraphConfig config; + ::mediapipe::CalculatorGraphConfig config; // Note: this is a binary protobuf serialization, and may include NUL // bytes. The trailing NUL added to the string literal should be excluded. if (config.ParseFromArray(binary_graph, sizeof(binary_graph) - 1)) { diff --git a/mediapipe/objc/solutions/posetracking_gpu/BUILD b/mediapipe/objc/solutions/posetracking_gpu/BUILD index 4533d7cf8..43708389b 100644 --- a/mediapipe/objc/solutions/posetracking_gpu/BUILD +++ b/mediapipe/objc/solutions/posetracking_gpu/BUILD @@ -1,4 +1,16 @@ -load("@build_bazel_rules_apple//apple:ios.bzl", "ios_application", "ios_framework", "ios_static_framework", "ios_unit_test") +load( + "@build_bazel_rules_apple//apple:ios.bzl", + "ios_application", + "ios_dynamic_framework", + "ios_framework", + "ios_static_framework", + "ios_unit_test", +) +load( + "//mediapipe/examples/ios:bundle_id.bzl", + "BUNDLE_ID_PREFIX", + "example_provisioning", +) MPP_HEADERS = [ "PoseTracking.h", @@ -49,6 +61,7 @@ ios_static_framework( # "--no-whole-archive", # "-all_load", # "-Wl", + "-force_load", ], minimum_os_version = "12.0", visibility = ["//visibility:public"], @@ -57,10 +70,52 @@ ios_static_framework( "//mediapipe/calculators/core:flow_limiter_calculator", # "//third_party:opencv", - # "@ios_opencv//:OpencvFramework", + "@ios_opencv//:OpencvFramework", ], ) +ios_framework( + name = "MPPoseTrackingDynamic", + hdrs = MPP_HEADERS + MP_GEN_IOS_HEADERS + ["MPPoseTracking.h"], + bundle_id = BUNDLE_ID_PREFIX + ".MPPPoseTracking", + bundle_name = "MPPoseTracking", + families = [ + "iphone", + "ipad", + ], + infoplists = ["Info.plist"], + linkopts = [ + # "--no-whole-archive", + # "-all_load", + # "-Wl", + # "-force_load", + ], + minimum_os_version = "10.0", + resources = ["modulemap/module.modulemap"], + visibility = ["//visibility:public"], + deps = [ + "//mediapipe/objc/solutions/posetracking_gpu:posetracking_gpu_solution", + # "//mediapipe/calculators/core:flow_limiter_calculator", + + # "//third_party:opencv", + "@ios_opencv//:OpencvFramework", + ], +) + +genrule( + name = "PatchedMPPosetrackingDynamic", + srcs = [":MPPoseTrackingDynamic"], + outs = [ + "MPPoseTracking.framework", + "MPPoseTracking.framework.dSYM", + ], + cmd = """ + bash $(location patch_ios_framework.sh) "$(SRCS)" "$(OUTS)" + """, + output_to_bindir = 1, + tools = ["patch_ios_framework.sh"], +) + # Custom Bazel Rule that patches headers of framework to flatten header imports genrule( name = "MPPoseTrackingHeaderPatched", @@ -97,27 +152,44 @@ objc_library( linkopts = [ # "--no-whole-archive", # "-all_load", + # "-force_load", # "-Wl", ], module_name = "MPPoseTracking", - sdk_frameworks = ["Accelerate"], + sdk_frameworks = [ + "Accelerate", + "AVFoundation", + "CoreGraphics", + "CoreMedia", + "UIKit", + ], visibility = ["//visibility:public"], deps = [ "//mediapipe/objc:mediapipe_framework_ios", "//mediapipe/objc:mediapipe_input_sources_ios", "//mediapipe/objc:mediapipe_layer_renderer", - "//mediapipe/calculators/core:flow_limiter_calculator", ] + select({ "//mediapipe:ios_i386": [], "//mediapipe:ios_x86_64": [], "//conditions:default": [ "//mediapipe/graphs/pose_tracking:pose_tracking_gpu_deps", "//mediapipe/framework/formats:landmark_cc_proto", + "calculator_registry", ], }), alwayslink = True, ) +cc_library( + name = "calculator_registry", + srcs = [ + "registry/calculator_registry.cpp", + "registry/calculator_registry.h", + ], + deps = ["//mediapipe/graphs/pose_tracking:pose_tracking_gpu_deps"], + alwayslink = True, +) + exports_files( MPP_HEADERS, visibility = ["//visibility:public"], diff --git a/mediapipe/objc/solutions/posetracking_gpu/Info.plist b/mediapipe/objc/solutions/posetracking_gpu/Info.plist new file mode 100644 index 000000000..0866eed17 --- /dev/null +++ b/mediapipe/objc/solutions/posetracking_gpu/Info.plist @@ -0,0 +1,27 @@ + + + + + NSCameraUsageDescription + This app uses the camera to demonstrate live video processing. + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + + + diff --git a/mediapipe/objc/solutions/posetracking_gpu/MPPoseTracking.h b/mediapipe/objc/solutions/posetracking_gpu/MPPoseTracking.h new file mode 100644 index 000000000..f2fa3334a --- /dev/null +++ b/mediapipe/objc/solutions/posetracking_gpu/MPPoseTracking.h @@ -0,0 +1,3 @@ +#import "PoseTracking.h" +#import "PoseTrackingOptions.h" +#import "PoseTrackingResults.h" \ No newline at end of file diff --git a/mediapipe/objc/solutions/posetracking_gpu/PoseTracking.mm b/mediapipe/objc/solutions/posetracking_gpu/PoseTracking.mm index 1be6f722c..43ef37afb 100644 --- a/mediapipe/objc/solutions/posetracking_gpu/PoseTracking.mm +++ b/mediapipe/objc/solutions/posetracking_gpu/PoseTracking.mm @@ -3,14 +3,21 @@ #import "mediapipe/objc/MPPGraph.h" #import "mediapipe/objc/MPPTimestampConverter.h" #include "mediapipe/framework/packet.h" -#include "mediapipe/calculators/core/flow_limiter_calculator.h" -#include "mediapipe/calculators/core/constant_side_packet_calculator.h" -#include "mediapipe/modules/pose_landmark/pose_landmark_gpu_linked.h" +#include "registry/calculator_registry.h" + +//#include "mediapipe/calculators/core/flow_limiter_calculator.h" +//#include "mediapipe/calculators/core/constant_side_packet_calculator.h" +//#include "mediapipe/modules/pose_landmark/pose_landmark_gpu_linked.h" +//#include "mediapipe/graphs/pose_tracking/subgraphs/pose_renderer_gpu_linked.h" +//#include "mediapipe/modules/pose_detection/pose_detection_gpu_linked.h" void registerCalculators(){ - typeid(::mediapipe::FlowLimiterCalculator); - typeid(::mediapipe::ConstantSidePacketCalculator); - typeid(::mediapipe::PoseLandmarkGpu); +// typeid(::mediapipe::FlowLimiterCalculator); +// typeid(::mediapipe::ConstantSidePacketCalculator); +// typeid(::mediapipe::PoseLandmarkGpu); +// typeid(::mediapipe::PoseRendererGpu); +// typeid(::mediapipe::PoseDetectionGpu); + } @@ -139,6 +146,7 @@ static const char* kLandmarksOutputStream = "pose_landmarks"; - (instancetype) initWithPoseTrackingOptions: (PoseTrackingOptions*) poseTrackingOptions{ registerCalculators(); + MPPCalculator(); self.renderer = [[MPPLayerRenderer alloc] init]; self.renderer.frameScaleMode = MPPFrameScaleModeFillAndCrop; diff --git a/mediapipe/objc/solutions/posetracking_gpu/modulemap/module.modulemap b/mediapipe/objc/solutions/posetracking_gpu/modulemap/module.modulemap new file mode 100644 index 000000000..276eba983 --- /dev/null +++ b/mediapipe/objc/solutions/posetracking_gpu/modulemap/module.modulemap @@ -0,0 +1,5 @@ +framework module MPPoseTracking { + umbrella header "MPPoseTracking.h" + export * + module * { export * } +} \ No newline at end of file diff --git a/mediapipe/objc/solutions/posetracking_gpu/patch_ios_framework.sh b/mediapipe/objc/solutions/posetracking_gpu/patch_ios_framework.sh new file mode 100644 index 000000000..5374d617b --- /dev/null +++ b/mediapipe/objc/solutions/posetracking_gpu/patch_ios_framework.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +# Copyright (c) 2022 Baracoda. All rights reserved +# +# Copying this file via any medium without the prior written consent of Baracoda is strictly +# prohibited +# +# Proprietary and confidential + +set -eu +set -o pipefail + +for outputPath in $2 +do + fileName=$(basename "$outputPath" .framework) + outputPath=$(dirname $outputPath) + + for inputPath in $1 + do + if [[ $inputPath == *"$fileName"*.zip ]]; then + fullPath=$(dirname "$inputPath") + + frameworkPath="$fullPath"/"$fileName".framework + + rm -rf "$fullPath"/"$fileName".framework + unzip "$inputPath" -d "$fullPath" + + if [ -d "$frameworkPath".dSYM ]; then + cp -R "$frameworkPath".dSYM "$outputPath"/"$fileName".framework.dSYM + fi + + if [ -f "$frameworkPath"/module.modulemap ]; then + mkdir "$frameworkPath"/Modules + mv "$frameworkPath"/module.modulemap "$frameworkPath"/Modules + fi + + cp -R "$frameworkPath" "$outputPath"/"$fileName".framework + fi + done; +done; \ No newline at end of file diff --git a/mediapipe/objc/solutions/posetracking_gpu/registry/calculator_registry.cpp b/mediapipe/objc/solutions/posetracking_gpu/registry/calculator_registry.cpp new file mode 100644 index 000000000..328d5e676 --- /dev/null +++ b/mediapipe/objc/solutions/posetracking_gpu/registry/calculator_registry.cpp @@ -0,0 +1,68 @@ +// +// Created by Mautisim Munir on 05/11/2022. +// + +#include "calculator_registry.h" +#include "mediapipe/calculators/core/flow_limiter_calculator.h" +#include "mediapipe/calculators/core/constant_side_packet_calculator.h" + +// We need namespaces for subgraphs because of the static variables inside the files +namespace PLG { + +#include "mediapipe/modules/pose_landmark/pose_landmark_gpu_linked.h" + +} + +namespace PDROI{ +#include "mediapipe/modules/pose_landmark/pose_detection_to_roi_linked.h" + +} + +namespace PRG { + +#include "mediapipe/graphs/pose_tracking/subgraphs/pose_renderer_gpu_linked.h" + +} +namespace PDG { +#include "mediapipe/modules/pose_detection/pose_detection_gpu_linked.h" +} + +namespace PLROIG{ +#include "mediapipe/modules/pose_landmark/pose_landmark_by_roi_gpu_linked.h" + +} +namespace PLF{ +#include "mediapipe/modules/pose_landmark/pose_landmark_filtering_linked.h" +} +namespace PLTOROI{ +#include "mediapipe/modules/pose_landmark/pose_landmarks_to_roi_linked.h" +} +namespace PSF{ +#include "mediapipe/modules/pose_landmark/pose_segmentation_filtering_linked.h" +} +namespace PLML{ +#include "mediapipe/modules/pose_landmark/pose_landmark_model_loader_linked.h" +} +namespace PLSIP{ +#include "mediapipe/modules/pose_landmark/pose_landmarks_and_segmentation_inverse_projection_linked.h" +} +namespace TPLS{ +#include "mediapipe/modules/pose_landmark/tensors_to_pose_landmarks_and_segmentation_linked.h" +} + +MPPCalculator::MPPCalculator() { + typeid(TPLS::mediapipe::TensorsToPoseLandmarksAndSegmentation); + typeid(::mediapipe::FlowLimiterCalculator); + typeid(::mediapipe::ConstantSidePacketCalculator); + typeid(PLG::mediapipe::PoseLandmarkGpu); + typeid(PRG::mediapipe::PoseRendererGpu); + typeid(PDG::mediapipe::PoseDetectionGpu); + typeid(PDROI::mediapipe::PoseDetectionToRoi); + typeid(PLROIG::mediapipe::PoseLandmarkByRoiGpu); + typeid(PLF::mediapipe::PoseLandmarkFiltering); + typeid(PLTOROI::mediapipe::PoseLandmarksToRoi); + typeid(PSF::mediapipe::PoseSegmentationFiltering); + typeid(PLML::mediapipe::PoseLandmarkModelLoader); + typeid(PLSIP::mediapipe::PoseLandmarksAndSegmentationInverseProjection); + +} diff --git a/mediapipe/objc/solutions/posetracking_gpu/registry/calculator_registry.h b/mediapipe/objc/solutions/posetracking_gpu/registry/calculator_registry.h new file mode 100644 index 000000000..c139e75da --- /dev/null +++ b/mediapipe/objc/solutions/posetracking_gpu/registry/calculator_registry.h @@ -0,0 +1,13 @@ +// +// Created by Mautisim Munir on 05/11/2022. +// + +#ifndef MEDIAPIPE_CALCULATOR_REGISTRY_H +#define MEDIAPIPE_CALCULATOR_REGISTRY_H + +class MPPCalculator{ +public: + MPPCalculator(); +}; + +#endif //MEDIAPIPE_CALCULATOR_REGISTRY_H diff --git a/mediapipe/swift/solutions/lindera/LinderaDetection.podspec b/mediapipe/swift/solutions/lindera/LinderaDetection.podspec index 0ebf50daf..d7389d204 100644 --- a/mediapipe/swift/solutions/lindera/LinderaDetection.podspec +++ b/mediapipe/swift/solutions/lindera/LinderaDetection.podspec @@ -128,7 +128,7 @@ Pod::Spec.new do |spec| # spec.requires_arc = true # spec.xcconfig = { "HEADER_SEARCH_PATHS" => "$(SDKROOT)/usr/include/libxml2" } -# spec.dependency "OpenCV", "~> 3.4" + spec.dependency "OpenCV", "3.2" spec.static_framework = true spec.ios.vendored_frameworks = 'frameworks/*.framework'