diff --git a/mediapipe/examples/ios/posetrackingsolutiongpu/BUILD b/mediapipe/examples/ios/posetrackingsolutiongpu/BUILD
new file mode 100644
index 000000000..bb33bf9a5
--- /dev/null
+++ b/mediapipe/examples/ios/posetrackingsolutiongpu/BUILD
@@ -0,0 +1,79 @@
+# Copyright 2020 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.
+
+load(
+ "@build_bazel_rules_apple//apple:ios.bzl",
+ "ios_application",
+)
+load(
+ "//mediapipe/examples/ios:bundle_id.bzl",
+ "BUNDLE_ID_PREFIX",
+ "example_provisioning",
+)
+
+licenses(["notice"])
+
+MIN_IOS_VERSION = "11.0"
+
+alias(
+ name = "posetrackingsolutiongpu",
+ actual = "PoseTrackingSolutionGpuApp",
+)
+
+ios_application(
+ name = "PoseTrackingSolutionGpuApp",
+ app_icons = ["//mediapipe/examples/ios/common:AppIcon"],
+ bundle_id = BUNDLE_ID_PREFIX + ".PoseTrackingGpu",
+ families = [
+ "iphone",
+ "ipad",
+ ],
+ infoplists = [
+ "//mediapipe/examples/ios/common:Info.plist",
+ "Info.plist",
+ ],
+ minimum_os_version = MIN_IOS_VERSION,
+ provisioning_profile = example_provisioning(),
+ deps = [
+ ":PoseTrackingGpuAppLibrary",
+ "@ios_opencv//:OpencvFramework",
+ ],
+)
+
+objc_library(
+ name = "PoseTrackingGpuAppLibrary",
+ srcs = [
+ "PoseTrackingViewController.mm",
+ ],
+ hdrs = [
+ "PoseTrackingViewController.h",
+ ],
+ copts = ["-std=c++17"],
+ data = [
+ "//mediapipe/graphs/pose_tracking:pose_tracking_gpu.binarypb",
+ "//mediapipe/modules/pose_detection:pose_detection.tflite",
+ "//mediapipe/modules/pose_landmark:pose_landmark_full.tflite",
+ ],
+ deps = [
+ "//mediapipe/examples/ios/common:CommonMediaPipeAppLibrary",
+ "//mediapipe/objc/solutions/posetracking_gpu:posetracking_gpu_solution",
+ ] + select({
+ "//mediapipe:ios_i386": [],
+ "//mediapipe:ios_x86_64": [],
+ "//conditions:default": [
+ "//mediapipe/graphs/pose_tracking:pose_tracking_gpu_deps",
+ "//mediapipe/framework/formats:landmark_cc_proto",
+ ],
+ }),
+)
diff --git a/mediapipe/examples/ios/posetrackingsolutiongpu/Info.plist b/mediapipe/examples/ios/posetrackingsolutiongpu/Info.plist
new file mode 100644
index 000000000..71e2e429e
--- /dev/null
+++ b/mediapipe/examples/ios/posetrackingsolutiongpu/Info.plist
@@ -0,0 +1,16 @@
+
+
+
+
+ CameraPosition
+ back
+ MainViewController
+ PoseTrackingViewController
+ GraphOutputStream
+ output_video
+ GraphInputStream
+ input_video
+ GraphName
+ pose_tracking_gpu
+
+
diff --git a/mediapipe/examples/ios/posetrackingsolutiongpu/PoseTrackingViewController.h b/mediapipe/examples/ios/posetrackingsolutiongpu/PoseTrackingViewController.h
new file mode 100644
index 000000000..f5dc4674a
--- /dev/null
+++ b/mediapipe/examples/ios/posetrackingsolutiongpu/PoseTrackingViewController.h
@@ -0,0 +1,21 @@
+// Copyright 2020 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
+
+#import "mediapipe/examples/ios/common/CommonViewController.h"
+
+@interface PoseTrackingViewController : CommonViewController
+
+@end
diff --git a/mediapipe/examples/ios/posetrackingsolutiongpu/PoseTrackingViewController.mm b/mediapipe/examples/ios/posetrackingsolutiongpu/PoseTrackingViewController.mm
new file mode 100644
index 000000000..0f082031c
--- /dev/null
+++ b/mediapipe/examples/ios/posetrackingsolutiongpu/PoseTrackingViewController.mm
@@ -0,0 +1,53 @@
+// Copyright 2020 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 "PoseTrackingViewController.h"
+
+#include "mediapipe/framework/formats/landmark.pb.h"
+
+static const char* kLandmarksOutputStream = "pose_landmarks";
+
+@implementation PoseTrackingViewController
+
+#pragma mark - UIViewController methods
+
+- (void)viewDidLoad {
+ [super viewDidLoad];
+
+ [self.mediapipeGraph addFrameOutputStream:kLandmarksOutputStream
+ outputPacketType:MPPPacketTypeRaw];
+}
+
+#pragma mark - MPPGraphDelegate methods
+
+// Receives a raw packet from the MediaPipe graph. Invoked on a MediaPipe worker thread.
+- (void)mediapipeGraph:(MPPGraph*)graph
+ didOutputPacket:(const ::mediapipe::Packet&)packet
+ fromStream:(const std::string&)streamName {
+ if (streamName == kLandmarksOutputStream) {
+ if (packet.IsEmpty()) {
+ NSLog(@"[TS:%lld] No pose landmarks", packet.Timestamp().Value());
+ return;
+ }
+ const auto& landmarks = packet.Get<::mediapipe::NormalizedLandmarkList>();
+ NSLog(@"[TS:%lld] Number of pose landmarks: %d", packet.Timestamp().Value(),
+ landmarks.landmark_size());
+ for (int i = 0; i < landmarks.landmark_size(); ++i) {
+ NSLog(@"\tLandmark[%d]: (%f, %f, %f)", i, landmarks.landmark(i).x(),
+ landmarks.landmark(i).y(), landmarks.landmark(i).z());
+ }
+ }
+}
+
+@end