From 493b6c109eea982b47703d977a73a9d1eca32b03 Mon Sep 17 00:00:00 2001 From: "Wang.Renzhu" Date: Wed, 13 Jul 2022 15:09:01 +0800 Subject: [PATCH] =?UTF-8?q?framework=20=E7=BC=96=E8=AF=91work?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mediapipe/render/core/FilterGroup.cpp | 5 - mediapipe/render/core/FilterGroup.hpp | 6 - mediapipe/render/core/GLThreadDispatch.cpp | 32 + mediapipe/render/core/SourceCamera.cpp | 6 - mediapipe/render/core/SourceImage.cpp | 7 +- mediapipe/render/core/TargetView.cpp | 7 - mediapipe/render/core/TargetView.hpp | 4 - mediapipe/render/ios/BUILD | 26 +- mediapipe/render/ios/Camera/BUILD | 51 +- mediapipe/render/ios/Camera/Info.plist | 2 +- ...amework.metal => OlaCameraFramework.metal} | 0 mediapipe/render/ios/Camera/OlaCameraRender.h | 12 +- mediapipe/render/ios/Camera/OlaCameraRender.m | 14 +- ...MTLCameraRender.h => OlaMTLCameraRender.h} | 16 +- ...LCameraRender.mm => OlaMTLCameraRender.mm} | 24 +- ...aRenderView.h => OlaMTLCameraRenderView.h} | 33 +- ...enderView.mm => OlaMTLCameraRenderView.mm} | 48 +- ...rameraShareTexture.h => OlaShareTexture.h} | 8 +- ...rameraShareTexture.m => OlaShareTexture.m} | 26 +- mediapipe/render/ios/OlaRender.h | 12 - .../ios/{OlaRender.mm => OlaRenderDevelop.h} | 9 +- .../Configs/develop.tulsigen | 59 + .../project.tulsiconf | 17 + .../wangrenzhu.tulsiconf-user | 10 + .../.tulsi/Configs/OlaVideo.tulsigen | 20 + .../.tulsi/Configs/wangrenzhu.tulsigen-user | 5 + .../.tulsi/Resources/StubInfoPlist.plist | 13 + .../StubWatchOS2AppExInfoPlist.plist | 17 + .../Resources/StubWatchOS2InfoPlist.plist | 15 + .../Resources/iOSXCTRunner.entitlements | 16 + .../Resources/macOSXCTRunner.entitlements | 33 + .../.tulsi/Scripts/apfs_clone_copy.py | 115 + .../.tulsi/Scripts/bazel_build.py | 1863 +++++++++++++++++ .../.tulsi/Scripts/bazel_build_events.py | 136 ++ .../.tulsi/Scripts/bazel_build_settings.py | 274 +++ .../.tulsi/Scripts/bazel_clean.sh | 54 + .../.tulsi/Scripts/bazel_options.py | 42 + .../.tulsi/Scripts/bootstrap_lldbinit.py | 187 ++ .../.tulsi/Scripts/clang_stub.sh | 37 + .../.tulsi/Scripts/install_genfiles.py | 103 + .../.tulsi/Scripts/ld_stub.sh | 33 + .../.tulsi/Scripts/swiftc_stub.py | 76 + .../.tulsi/Scripts/symbol_cache_schema.py | 119 ++ .../.tulsi/Scripts/tulsi_logging.py | 77 + .../.tulsi/Scripts/update_symbol_cache.py | 54 + .../.tulsi/Scripts/user_build.py | 111 + .../OlaVideo.xcodeproj/.tulsi/Utils/lldbinit | 6 + .../.tulsi/tulsi-execution-root | 1 + .../.tulsi/tulsi-output-base | 1 + .../OlaVideo.xcodeproj/.tulsi/tulsi-workspace | 1 + .../ios/OlaVideo.xcodeproj/project.pbxproj | 1240 +++++++++++ .../contents.xcworkspacedata | 4 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 14 + .../UserInterfaceState.xcuserstate | Bin 0 -> 15388 bytes .../WorkspaceSettings.xcsettings | 10 + .../OlaRenderDevelopFramework.xcscheme | 29 + .../xcschemes/_idx_Scheme.xcscheme | 52 + ...apipe-render-ios-OlaRenderDevelop.xcscheme | 29 + .../xcschemes/xcschememanagement.plist | 26 + mediapipe/render/module/beauty/BUILD | 0 61 files changed, 5090 insertions(+), 165 deletions(-) create mode 100644 mediapipe/render/core/GLThreadDispatch.cpp rename mediapipe/render/ios/Camera/{QuarameraFramework.metal => OlaCameraFramework.metal} (100%) rename mediapipe/render/ios/Camera/{QuarameraMTLCameraRender.h => OlaMTLCameraRender.h} (81%) rename mediapipe/render/ios/Camera/{QuarameraMTLCameraRender.mm => OlaMTLCameraRender.mm} (96%) rename mediapipe/render/ios/Camera/{QuarameraMTLCameraRenderView.h => OlaMTLCameraRenderView.h} (59%) rename mediapipe/render/ios/Camera/{QuarameraMTLCameraRenderView.mm => OlaMTLCameraRenderView.mm} (87%) rename mediapipe/render/ios/Camera/{QuarameraShareTexture.h => OlaShareTexture.h} (88%) rename mediapipe/render/ios/Camera/{QuarameraShareTexture.m => OlaShareTexture.m} (95%) delete mode 100644 mediapipe/render/ios/OlaRender.h rename mediapipe/render/ios/{OlaRender.mm => OlaRenderDevelop.h} (68%) create mode 100644 mediapipe/render/ios/OlaRenderDevelopFramework.tulsiproj/Configs/develop.tulsigen create mode 100644 mediapipe/render/ios/OlaRenderDevelopFramework.tulsiproj/project.tulsiconf create mode 100644 mediapipe/render/ios/OlaRenderDevelopFramework.tulsiproj/wangrenzhu.tulsiconf-user create mode 100644 mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Configs/OlaVideo.tulsigen create mode 100644 mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Configs/wangrenzhu.tulsigen-user create mode 100644 mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Resources/StubInfoPlist.plist create mode 100644 mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Resources/StubWatchOS2AppExInfoPlist.plist create mode 100644 mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Resources/StubWatchOS2InfoPlist.plist create mode 100644 mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Resources/iOSXCTRunner.entitlements create mode 100644 mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Resources/macOSXCTRunner.entitlements create mode 100644 mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/apfs_clone_copy.py create mode 100755 mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/bazel_build.py create mode 100755 mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/bazel_build_events.py create mode 100644 mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/bazel_build_settings.py create mode 100755 mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/bazel_clean.sh create mode 100755 mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/bazel_options.py create mode 100755 mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/bootstrap_lldbinit.py create mode 100755 mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/clang_stub.sh create mode 100755 mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/install_genfiles.py create mode 100755 mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/ld_stub.sh create mode 100755 mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/swiftc_stub.py create mode 100755 mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/symbol_cache_schema.py create mode 100755 mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/tulsi_logging.py create mode 100644 mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/update_symbol_cache.py create mode 100755 mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/user_build.py create mode 100644 mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Utils/lldbinit create mode 120000 mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/tulsi-execution-root create mode 120000 mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/tulsi-output-base create mode 120000 mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/tulsi-workspace create mode 100644 mediapipe/render/ios/OlaVideo.xcodeproj/project.pbxproj create mode 100644 mediapipe/render/ios/OlaVideo.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 mediapipe/render/ios/OlaVideo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 mediapipe/render/ios/OlaVideo.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 mediapipe/render/ios/OlaVideo.xcodeproj/project.xcworkspace/xcuserdata/wangrenzhu.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 mediapipe/render/ios/OlaVideo.xcodeproj/project.xcworkspace/xcuserdata/wangrenzhu.xcuserdatad/WorkspaceSettings.xcsettings create mode 100644 mediapipe/render/ios/OlaVideo.xcodeproj/xcshareddata/xcschemes/OlaRenderDevelopFramework.xcscheme create mode 100644 mediapipe/render/ios/OlaVideo.xcodeproj/xcshareddata/xcschemes/_idx_Scheme.xcscheme create mode 100644 mediapipe/render/ios/OlaVideo.xcodeproj/xcshareddata/xcschemes/mediapipe-render-ios-OlaRenderDevelop.xcscheme create mode 100644 mediapipe/render/ios/OlaVideo.xcodeproj/xcuserdata/wangrenzhu.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 mediapipe/render/module/beauty/BUILD diff --git a/mediapipe/render/core/FilterGroup.cpp b/mediapipe/render/core/FilterGroup.cpp index ebc9a9870..4c6446edc 100755 --- a/mediapipe/render/core/FilterGroup.cpp +++ b/mediapipe/render/core/FilterGroup.cpp @@ -18,13 +18,8 @@ #include #include -#if defined(__APPLE__) #include "FilterGroup.hpp" #include "Context.hpp" -#else -#include "../include/GPUImage-x/filter/FilterGroup.hpp" -#include "../include/GPUImage-x/Context.hpp" -#endif NS_GI_BEGIN diff --git a/mediapipe/render/core/FilterGroup.hpp b/mediapipe/render/core/FilterGroup.hpp index 66262545a..0a836b99c 100755 --- a/mediapipe/render/core/FilterGroup.hpp +++ b/mediapipe/render/core/FilterGroup.hpp @@ -19,15 +19,9 @@ #ifndef FilterGroup_hpp #define FilterGroup_hpp -#if defined(__APPLE__) #include "GPUImageMacros.h" #include "Source.hpp" #include "Target.hpp" -#else -#include "GPUImage-x/GPUImageMacros.h" -#include "GPUImage-x/source//Source.hpp" -#include "GPUImage-x/target/Target.hpp" -#endif #include #include "Filter.hpp" diff --git a/mediapipe/render/core/GLThreadDispatch.cpp b/mediapipe/render/core/GLThreadDispatch.cpp new file mode 100644 index 000000000..b861f315d --- /dev/null +++ b/mediapipe/render/core/GLThreadDispatch.cpp @@ -0,0 +1,32 @@ +// +// Created by jormin on 2021/6/23. +// + +#if defined(__APPLE__) +#include "GLThreadDispatch.h" +#else +#include "QStream/Dispatcher/GLThreadDispatch.h" +#endif +#include + + +using namespace QStream; + + +GLThreadDispatch::GLThreadDispatch(std::thread::id glThreadId, DispatchAsyncFunction dispatchAsyncFunction) : _glThreadId(glThreadId), _dispatchAsync(dispatchAsyncFunction) { +} + +void GLThreadDispatch::runSync(void *host, std::function func) { + if (std::this_thread::get_id() == _glThreadId) { + func(); + } else { + assert("not support run sync in gl thread now"); + } +} + +void GLThreadDispatch::runAsync(void *host, std::function func) { + if (_dispatchAsync) { + _dispatchAsync(host, func); + } +} + diff --git a/mediapipe/render/core/SourceCamera.cpp b/mediapipe/render/core/SourceCamera.cpp index 9e864957b..31507d592 100755 --- a/mediapipe/render/core/SourceCamera.cpp +++ b/mediapipe/render/core/SourceCamera.cpp @@ -17,15 +17,9 @@ */ #include -#if defined(__APPLE__) #include "SourceCamera.hpp" #include "Context.hpp" #include "GPUImageUtil.h" -#else -#include "GPUImage-x/source/SourceCamera.hpp" -#include "GPUImage-x/Context.hpp" -#include "GPUImage-x/util.h" -#endif #if defined(__APPLE__) #include "CVFramebuffer.hpp" #endif diff --git a/mediapipe/render/core/SourceImage.cpp b/mediapipe/render/core/SourceImage.cpp index 3fecc5619..dc6ba7b14 100755 --- a/mediapipe/render/core/SourceImage.cpp +++ b/mediapipe/render/core/SourceImage.cpp @@ -16,15 +16,10 @@ * limitations under the License. */ -#if defined(__APPLE__) #include "SourceImage.hpp" #include "Context.hpp" #include "GPUImageUtil.h" -#else -#include "GPUImage-x/source/SourceImage.hpp" -#include "GPUImage-x/Context.hpp" -#include "GPUImage-x/util.h" -#endif + #if defined(__APPLE__) #include "CVFramebuffer.hpp" #endif diff --git a/mediapipe/render/core/TargetView.cpp b/mediapipe/render/core/TargetView.cpp index 8daa7dc00..66ca4e1b6 100755 --- a/mediapipe/render/core/TargetView.cpp +++ b/mediapipe/render/core/TargetView.cpp @@ -16,17 +16,10 @@ * limitations under the License. */ -#if defined(__APPLE__) #include "TargetView.hpp" #include "Context.hpp" #include "GPUImageUtil.h" #include "Filter.hpp" -#else -#include "GPUImage-x/target/TargetView.hpp" -#include "GPUImage-x/Context.hpp" -#include "GPUImage-x/util.h" -#include "GPUImage-x/filter/Filter.hpp" -#endif USING_NS_GI diff --git a/mediapipe/render/core/TargetView.hpp b/mediapipe/render/core/TargetView.hpp index 2077205f9..ae4c6b0ee 100755 --- a/mediapipe/render/core/TargetView.hpp +++ b/mediapipe/render/core/TargetView.hpp @@ -20,11 +20,7 @@ #define GPUIMAGE_X_TARGETVIEW_H #include "Target.hpp" -#if defined(__APPLE__) #include "GLProgram.hpp" -#else -#include "GPUImage-x/GLProgram.hpp" -#endif NS_GI_BEGIN class Context; diff --git a/mediapipe/render/ios/BUILD b/mediapipe/render/ios/BUILD index cb50919c4..a081ab7c9 100644 --- a/mediapipe/render/ios/BUILD +++ b/mediapipe/render/ios/BUILD @@ -4,41 +4,30 @@ load( "//mediapipe/framework/tool:mediapipe_graph.bzl", "mediapipe_binary_graph", ) - - -load("@bazel_skylib//lib:selects.bzl", "selects") -load("@build_bazel_rules_apple//apple:ios.bzl", "ios_unit_test") load("@build_bazel_rules_apple//apple:ios.bzl", "ios_framework") ios_framework( - name = "OlaRenderFramework", + name = "OlaRenderDevelopFramework", hdrs = [ - "OlaRender.h", + "OlaRenderDevelop.h", ], infoplists = ["Info.plist"], - bundle_id = "com.noppelab.MyFramework", + bundle_id = "com.ola.olarender.develop", families = ["iphone", "ipad"], - minimum_os_version = "10.0", + minimum_os_version = "11.0", deps = [ - ":OlaRender", - "@ios_opencv//:OpencvFramework", + ":OlaRenderDevelop", ], ) objc_library( - name = "OlaRender", - srcs = [ - "OlaRender.mm", - ], + name = "OlaRenderDevelop", hdrs = [ - "OlaRender.h", + "OlaRenderDevelop.h", ], visibility = ["//visibility:public"], deps = [ "//mediapipe/render/core:core", - "//mediapipe/objc:mediapipe_framework_ios", - "//mediapipe/objc:mediapipe_input_sources_ios", - "//mediapipe/objc:mediapipe_layer_renderer", ], copts = select({ "//mediapipe:apple": [ @@ -53,6 +42,5 @@ objc_library( "CoreMedia", "UIKit", "OpenGLES", - "AssetsLibrary", ], ) diff --git a/mediapipe/render/ios/Camera/BUILD b/mediapipe/render/ios/Camera/BUILD index d6caa6d20..d69e2691f 100644 --- a/mediapipe/render/ios/Camera/BUILD +++ b/mediapipe/render/ios/Camera/BUILD @@ -1 +1,50 @@ -load("//mediapipe/gpu:metal.bzl", "metal_library") \ No newline at end of file +load("//mediapipe/gpu:metal.bzl", "metal_library") +load("@build_bazel_rules_apple//apple:ios.bzl", "ios_framework") + + +ios_framework( + name = "OlaCameraFramework", + hdrs = glob(["*.h"]), + infoplists = ["Info.plist"], + bundle_id = "com.ola.cameraframework", + families = ["iphone", "ipad"], + minimum_os_version = "11.0", + deps = [ + ":OlaCamera", + ], +) + +objc_library( + name = "OlaCamera", + srcs = glob(["*.m","*.mm"]), + hdrs = glob(["*.h"]), + visibility = ["//visibility:public"], + deps = [ + ":OlaCameraMetalLibrary", + ], + copts = select({ + "//mediapipe:apple": [ + "-x objective-c++", + "-fobjc-arc", # enable reference-counting + ], + "//conditions:default": [], + }), + sdk_frameworks = [ + "AVFoundation", + "CoreGraphics", + "CoreMedia", + "UIKit", + "OpenGLES", + "MetalKit", + "GLKit", + "Metal", + "CoreVideo", + "IOSurface", + "Foundation", + ], +) + +metal_library( + name = "OlaCameraMetalLibrary", + srcs = ["OlaCameraFramework.metal"], +) \ No newline at end of file diff --git a/mediapipe/render/ios/Camera/Info.plist b/mediapipe/render/ios/Camera/Info.plist index 9bcb24442..8208eaf0f 100644 --- a/mediapipe/render/ios/Camera/Info.plist +++ b/mediapipe/render/ios/Camera/Info.plist @@ -17,6 +17,6 @@ CFBundleShortVersionString 1.0 CFBundleVersion - $(CURRENT_PROJECT_VERSION) + 1.0 diff --git a/mediapipe/render/ios/Camera/QuarameraFramework.metal b/mediapipe/render/ios/Camera/OlaCameraFramework.metal similarity index 100% rename from mediapipe/render/ios/Camera/QuarameraFramework.metal rename to mediapipe/render/ios/Camera/OlaCameraFramework.metal diff --git a/mediapipe/render/ios/Camera/OlaCameraRender.h b/mediapipe/render/ios/Camera/OlaCameraRender.h index 8245f8ea5..b39e4f444 100644 --- a/mediapipe/render/ios/Camera/OlaCameraRender.h +++ b/mediapipe/render/ios/Camera/OlaCameraRender.h @@ -1,13 +1,13 @@ // -// QuarameraCameraRender.h -// QuarameraFramework +// OlaCameraRender.h +// OlaFramework // // Created by wangrenzhu on 2021/1/25. // #import #import -#import "QuarameraShareTexture.h" +#import "OlaShareTexture.h" @interface OlaCameraRender : NSObject @property (nonatomic, readonly) CGSize renderSize; @@ -15,10 +15,10 @@ - (instancetype)initWithRenderSize:(CGSize)renderSize device:(id)device - cameraTexture:(QuarameraShareTexture *)cameraTexture + cameraTexture:(OlaShareTexture *)cameraTexture contentScaleFactor:(CGFloat)factor; -- (void)setupWithDevice:(id)device shareTexture:(QuarameraShareTexture *)shareTexture useRenderMode:(BOOL)useRenderMode; +- (void)setupWithDevice:(id)device shareTexture:(OlaShareTexture *)shareTexture useRenderMode:(BOOL)useRenderMode; /// 重置画布大小 /// @param renderSize 画布大小 @@ -33,7 +33,7 @@ /// @param frameTime 帧时间 - (void)render:(NSTimeInterval)frameTime; -- (void)updateCameraTexture:(QuarameraShareTexture *)cameraTexture; +- (void)updateCameraTexture:(OlaShareTexture *)cameraTexture; @end diff --git a/mediapipe/render/ios/Camera/OlaCameraRender.m b/mediapipe/render/ios/Camera/OlaCameraRender.m index d36f27992..ad0dd25fa 100644 --- a/mediapipe/render/ios/Camera/OlaCameraRender.m +++ b/mediapipe/render/ios/Camera/OlaCameraRender.m @@ -1,18 +1,18 @@ // -// QuarameraCameraRender.m -// QuarameraFramework +// OlaCameraRender.m +// OlaFramework // // Created by wangrenzhu on 2021/1/25. // -#import "QuarameraCameraRender.h" +#import "OlaCameraRender.h" -@implementation QuarameraCameraRender +@implementation OlaCameraRender @synthesize renderSize = _renderSize; - (instancetype)initWithRenderSize:(CGSize)renderSize device:(id)device - cameraTexture:(QuarameraShareTexture *)cameraTexture + cameraTexture:(OlaShareTexture *)cameraTexture contentScaleFactor:(CGFloat)factor { NSAssert(NO, @"subclass must implement this method"); @@ -20,7 +20,7 @@ } -- (void)setupWithDevice:(id)device shareTexture:(QuarameraShareTexture *)shareTexture useRenderMode:(BOOL)useRenderMode; +- (void)setupWithDevice:(id)device shareTexture:(OlaShareTexture *)shareTexture useRenderMode:(BOOL)useRenderMode; { } @@ -40,7 +40,7 @@ } -- (void)updateCameraTexture:(QuarameraShareTexture *)cameraTexture +- (void)updateCameraTexture:(OlaShareTexture *)cameraTexture { } diff --git a/mediapipe/render/ios/Camera/QuarameraMTLCameraRender.h b/mediapipe/render/ios/Camera/OlaMTLCameraRender.h similarity index 81% rename from mediapipe/render/ios/Camera/QuarameraMTLCameraRender.h rename to mediapipe/render/ios/Camera/OlaMTLCameraRender.h index 22ffe0c8b..5c03851c4 100644 --- a/mediapipe/render/ios/Camera/QuarameraMTLCameraRender.h +++ b/mediapipe/render/ios/Camera/OlaMTLCameraRender.h @@ -1,6 +1,6 @@ // -// QuarameraMTLRender.h -// QuameraDemo +// OlaMTLRender.h +// // // Created by wangrenzhu on 2021/1/22. // Copyright © 2021 alibaba. All rights reserved. @@ -10,10 +10,10 @@ #import #import #import -#import "QuarameraShareTexture.h" -#import "QuarameraCameraRender.h" +#import "OlaShareTexture.h" +#import "OlaCameraRender.h" -@protocol QuarameraMTLCameraRenderDelegate +@protocol OlaMTLCameraRenderDelegate /// 闪电拍照准备完毕 - (void)lightningModelPrepared; @@ -25,7 +25,7 @@ -@interface QuarameraMTLCameraRender : QuarameraCameraRender +@interface OlaMTLCameraRender : OlaCameraRender /// 输出CameraTexture @property (nonatomic) id outputTexture; @@ -40,8 +40,8 @@ @property (nonatomic, readonly) CVPixelBufferRef renderTarget; -@property (nonatomic, weak) id renderDelegate; -@property (nonatomic, strong) QuarameraShareTexture *offscreenCameraTexture; +@property (nonatomic, weak) id renderDelegate; +@property (nonatomic, strong) OlaShareTexture *offscreenCameraTexture; /// 渲染到纹理指令 /// @param displayTexture displayTexture description diff --git a/mediapipe/render/ios/Camera/QuarameraMTLCameraRender.mm b/mediapipe/render/ios/Camera/OlaMTLCameraRender.mm similarity index 96% rename from mediapipe/render/ios/Camera/QuarameraMTLCameraRender.mm rename to mediapipe/render/ios/Camera/OlaMTLCameraRender.mm index ecbfc9e39..43729b979 100644 --- a/mediapipe/render/ios/Camera/QuarameraMTLCameraRender.mm +++ b/mediapipe/render/ios/Camera/OlaMTLCameraRender.mm @@ -1,13 +1,13 @@ // -// QuarameraMTLRender.m -// QuameraDemo +// OlaMTLRender.m +// // // Created by wangrenzhu on 2021/1/22. // Copyright © 2021 alibaba. All rights reserved. // #import #import -#import "QuarameraMTLCameraRender.h" +#import "OlaMTLCameraRender.h" typedef struct @@ -45,7 +45,7 @@ struct TextureScale { simd_float3 scaleFlip; }; -@interface QuarameraMTLCameraRender() +@interface OlaMTLCameraRender() @property (nonatomic) id colorConvertPipelineState; @@ -79,12 +79,12 @@ struct TextureScale { @property (nonatomic) size_t cameraOutputWidth; @property (nonatomic) size_t cameraOutputHeight; -@property (nonatomic, strong) QuarameraShareTexture *shareTexture; +@property (nonatomic, strong) OlaShareTexture *shareTexture; @end -@implementation QuarameraMTLCameraRender +@implementation OlaMTLCameraRender @synthesize renderSize = _renderSize; - (void)dealloc @@ -112,7 +112,7 @@ struct TextureScale { - (instancetype)initWithRenderSize:(CGSize)renderSize device:(id)device - cameraTexture:(QuarameraShareTexture *)cameraTexture + cameraTexture:(OlaShareTexture *)cameraTexture contentScaleFactor:(CGFloat)factor { self = [super init]; @@ -123,13 +123,13 @@ struct TextureScale { __unused NSError *error; _offscreenCameraTexture = cameraTexture; NSBundle *bundle = [NSBundle mainBundle]; - NSURL *shaderURL = [bundle URLForResource:@"QuarameraFramework" withExtension:@"metallib"]; + NSURL *shaderURL = [bundle URLForResource:@"OlaFramework" withExtension:@"metallib"]; if (@available(iOS 11.0, *)) { if (shaderURL) { self.library = [self.device newLibraryWithURL:shaderURL error:&error]; } } else { - NSString *lib = [[NSBundle mainBundle] pathForResource:@"QuarameraFramework" ofType:@"metallib"]; + NSString *lib = [[NSBundle mainBundle] pathForResource:@"OlaFramework" ofType:@"metallib"]; if (lib) { _library = [_device newLibraryWithFile:lib error:nil]; } @@ -346,13 +346,13 @@ struct TextureScale { [colorConversionEncoder drawPrimitives:MTLPrimitiveTypeTriangleStrip vertexStart:0 vertexCount:4]; [colorConversionEncoder endEncoding]; - __weak QuarameraMTLCameraRender *weakSelf = self; + __weak OlaMTLCameraRender *weakSelf = self; [commandBuffer addCompletedHandler:^(id commandBuffer) { if (weakSelf == nil) { return; } - __strong QuarameraMTLCameraRender *strongSelf = weakSelf; + __strong OlaMTLCameraRender *strongSelf = weakSelf; if (!strongSelf.firstFrameRender) { NSLog(@"相机首帧渲染完毕"); //这里埋点时机和Android统一,收到相机帧时发送,但实际上还是渲染完后发送比较合适 @@ -445,7 +445,7 @@ struct TextureScale { self.cameraOutputHeight = self.renderSize.height; } -- (void)updateCameraTexture:(QuarameraShareTexture *)cameraTexture +- (void)updateCameraTexture:(OlaShareTexture *)cameraTexture { _offscreenCameraTexture = nil; _offscreenCameraTexture = cameraTexture; diff --git a/mediapipe/render/ios/Camera/QuarameraMTLCameraRenderView.h b/mediapipe/render/ios/Camera/OlaMTLCameraRenderView.h similarity index 59% rename from mediapipe/render/ios/Camera/QuarameraMTLCameraRenderView.h rename to mediapipe/render/ios/Camera/OlaMTLCameraRenderView.h index 3a69656a7..576085a6a 100644 --- a/mediapipe/render/ios/Camera/QuarameraMTLCameraRenderView.h +++ b/mediapipe/render/ios/Camera/OlaMTLCameraRenderView.h @@ -1,18 +1,17 @@ // // WANativeMTLCameraPreviewView.h -// WebAR-iOS -// 基于Metal的相机预览视图,闪电拍照定制优化,具备相机预览的基础功能 +// // Created by wangrenzhu on 2020/11/16. // Copyright © 2020 Taobao lnc. All rights reserved. // #import #import -#import -#import -#import +#import "OlaCameraRender.h" +#import "OlaMTLCameraRender.h" +#import "OlaShareTexture.h" -@protocol QuarameraMTLCameraRenderViewDelegate +@protocol OlaMTLCameraRenderViewDelegate - (void)draw:(NSTimeInterval)frameTime; @@ -21,8 +20,8 @@ /// @param texture texture description /// @param onScreenTexture 上屏纹理 /// @param frameTime 帧时间 -- (IOSurfaceID)bgraCameraTextureReady:(QuarameraShareTexture *)texture - onScreenTexture:(QuarameraShareTexture *)onScreenTexture +- (IOSurfaceID)bgraCameraTextureReady:(OlaShareTexture *)texture + onScreenTexture:(OlaShareTexture *)onScreenTexture frameTime:(NSTimeInterval)frameTime; @optional @@ -32,29 +31,29 @@ /// @param targetTexture targetTexture description /// @param buffer MTL的CommandBuffer - (void)externalRender:(NSTimeInterval)frameTime - targetTexture:(QuarameraShareTexture *)targetTexture + targetTexture:(OlaShareTexture *)targetTexture commandBuffer:(id)buffer; /// YUV 相机纹理 /// @param yTexture y纹理 /// @param uvTexture yv纹理 -- (void)yuvTextureReady:(QuarameraShareTexture *)yTexture uvTexture:(QuarameraShareTexture *)uvTexture; +- (void)yuvTextureReady:(OlaShareTexture *)yTexture uvTexture:(OlaShareTexture *)uvTexture; @end -@interface QuarameraMTLCameraRenderView : MTKView +@interface OlaMTLCameraRenderView : MTKView /// MetalRender -@property (nonatomic, strong, readonly) QuarameraMTLCameraRender *mtlRender; +@property (nonatomic, strong, readonly) OlaMTLCameraRender *mtlRender; -@property (nonatomic, weak) id cameraDelegate; +@property (nonatomic, weak) id cameraDelegate; @property (nonatomic) dispatch_queue_t displayRenderQueue; /// 原始相机纹理 可以快速读取 -@property (nonatomic, readonly, strong) QuarameraShareTexture *cameraTexture; -@property (nonatomic, readonly, strong) QuarameraShareTexture *shareTexture; +@property (nonatomic, readonly, strong) OlaShareTexture *cameraTexture; +@property (nonatomic, readonly, strong) OlaShareTexture *shareTexture; /// 不带后处理的相机渲染的原始纹理 @property (nonatomic, readonly) CVPixelBufferRef renderTarget; @@ -72,10 +71,10 @@ /// @param sampleBuffer 相机采集流 - (void)cameraSampleBufferArrive:(CMSampleBufferRef)sampleBuffer; -- (void)addRender:(QuarameraCameraRender *)render; +- (void)addRender:(OlaCameraRender *)render; -/// 是否开启Quaramera +/// 是否开启Ola /// @param frame frame description - (instancetype)initWithFrame:(CGRect)frame; diff --git a/mediapipe/render/ios/Camera/QuarameraMTLCameraRenderView.mm b/mediapipe/render/ios/Camera/OlaMTLCameraRenderView.mm similarity index 87% rename from mediapipe/render/ios/Camera/QuarameraMTLCameraRenderView.mm rename to mediapipe/render/ios/Camera/OlaMTLCameraRenderView.mm index c01b684cf..a34988bc9 100644 --- a/mediapipe/render/ios/Camera/QuarameraMTLCameraRenderView.mm +++ b/mediapipe/render/ios/Camera/OlaMTLCameraRenderView.mm @@ -1,35 +1,35 @@ // // WANativeMTLRenderView.m -// WebAR-iOS +// // // Created by wangrenzhu on 2020/11/16. // Copyright © 2020 Taobao lnc. All rights reserved. // -#import "QuarameraMTLCameraRenderView.h" -#import "QuarameraShareTexture.h" -#import "QuarameraMTLCameraRender.h" +#import "OlaMTLCameraRenderView.h" +#import "OlaShareTexture.h" +#import "OlaMTLCameraRender.h" #import #import static const NSUInteger MaxFramesInFlight = 3; -static size_t const kQuarameraDynamicTextureByteAlignment = 16; +static size_t const kOlaDynamicTextureByteAlignment = 16; NS_INLINE size_t QAAlignSize(size_t size) { - return ceil(size / (double)kQuarameraDynamicTextureByteAlignment) * kQuarameraDynamicTextureByteAlignment; + return ceil(size / (double)kOlaDynamicTextureByteAlignment) * kOlaDynamicTextureByteAlignment; } -@interface QuarameraMTLCameraRenderView() +@interface OlaMTLCameraRenderView() { } -@property (nonatomic, strong) QuarameraMTLCameraRender *mtlRender; +@property (nonatomic, strong) OlaMTLCameraRender *mtlRender; @property (nonatomic) NSTimeInterval frameTime; -@property (nonatomic, strong) QuarameraShareTexture *shareTexture; -@property (nonatomic, strong) QuarameraShareTexture *cameraTexture; +@property (nonatomic, strong) OlaShareTexture *shareTexture; +@property (nonatomic, strong) OlaShareTexture *cameraTexture; @property (nonatomic) id ioSurfaceTexture; @property (nonatomic) IOSurfaceID lastIOSurfaceID; @property (nonatomic, strong) EAGLContext *openGLContext; @@ -39,11 +39,11 @@ NS_INLINE size_t QAAlignSize(size_t size) @property (nonatomic, assign) BOOL useRenderMode; -@property (nonatomic, strong) NSMutableArray *renders; +@property (nonatomic, strong) NSMutableArray *renders; @property (nonatomic) CGSize lastFrameSize; @end -@implementation QuarameraMTLCameraRenderView +@implementation OlaMTLCameraRenderView - (void)dealloc { @@ -94,17 +94,17 @@ NS_INLINE size_t QAAlignSize(size_t size) frame.size.height * self.contentScaleFactor); - _shareTexture = [[QuarameraShareTexture alloc] initWithMetalDevice:self.device + _shareTexture = [[OlaShareTexture alloc] initWithMetalDevice:self.device openGLContext:self.openGLContext metalPixelFormat:self.colorPixelFormat size:textureSize]; - _cameraTexture = [[QuarameraShareTexture alloc] initWithMetalDevice:self.device + _cameraTexture = [[OlaShareTexture alloc] initWithMetalDevice:self.device openGLContext:self.openGLContext metalPixelFormat:self.colorPixelFormat size:textureSize]; - _mtlRender = [[QuarameraMTLCameraRender alloc] initWithRenderSize:textureSize + _mtlRender = [[OlaMTLCameraRender alloc] initWithRenderSize:textureSize device:self.device cameraTexture:self.cameraTexture contentScaleFactor:self.contentScaleFactor]; @@ -116,7 +116,7 @@ NS_INLINE size_t QAAlignSize(size_t size) dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, QOS_CLASS_USER_INTERACTIVE, 0); self.displayFrameRenderingSemaphore = dispatch_semaphore_create(MaxFramesInFlight); - self.displayRenderQueue = dispatch_queue_create("quaramera.ios.displayRenderQueue", + self.displayRenderQueue = dispatch_queue_create("Ola.ios.displayRenderQueue", interactive); self.cameraFrameRenderingSemaphore = dispatch_semaphore_create(1); @@ -144,7 +144,7 @@ NS_INLINE size_t QAAlignSize(size_t size) [self.mtlRender resize:textureSize]; - [self.renders enumerateObjectsUsingBlock:^(QuarameraCameraRender * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + [self.renders enumerateObjectsUsingBlock:^(OlaCameraRender * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { [obj resize:textureSize]; }]; self.paused = NO; @@ -177,7 +177,7 @@ NS_INLINE size_t QAAlignSize(size_t size) id drawable = [((CAMetalLayer *)self.layer) nextDrawable]; - __weak QuarameraMTLCameraRenderView *weakSelf = self; + __weak OlaMTLCameraRenderView *weakSelf = self; // dispatch_semaphore_t block_camera_sema = self.cameraFrameRenderingSemaphore; dispatch_semaphore_t block_display_sema = self.displayFrameRenderingSemaphore; @@ -188,14 +188,14 @@ NS_INLINE size_t QAAlignSize(size_t size) dispatch_semaphore_signal(block_display_sema); }; - NSMutableArray *renders = [self.renders copy]; + NSMutableArray *renders = [self.renders copy]; dispatch_async(self.displayRenderQueue, ^{ if (weakSelf == nil) { return; } - __strong QuarameraMTLCameraRenderView *strongSelf = weakSelf; + __strong OlaMTLCameraRenderView *strongSelf = weakSelf; strongSelf.frameTime += (1.0 / strongSelf.preferredFramesPerSecond) * 1000.0; if (dispatch_semaphore_wait(block_display_sema, DISPATCH_TIME_NOW) != 0) @@ -218,7 +218,7 @@ NS_INLINE size_t QAAlignSize(size_t size) //quarkitRendre把相机渲染到shareTexture上 glFlush(); - [renders enumerateObjectsUsingBlock:^(QuarameraCameraRender * _Nonnull obj, + [renders enumerateObjectsUsingBlock:^(OlaCameraRender * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { if (obj.enable) { [obj render:weakSelf.frameTime]; @@ -311,7 +311,7 @@ NS_INLINE size_t QAAlignSize(size_t size) } dispatch_semaphore_t block_camera_sema = self.cameraFrameRenderingSemaphore; - __strong QuarameraMTLCameraRenderView *weakSelf = self; + __strong OlaMTLCameraRenderView *weakSelf = self; void (^renderCompleted)(id buffer) = ^(id buffer) { dispatch_semaphore_signal(block_camera_sema); @@ -323,7 +323,7 @@ NS_INLINE size_t QAAlignSize(size_t size) CFRelease(sampleBuffer); return; } - __strong QuarameraMTLCameraRenderView *strongSelf = weakSelf; + __strong OlaMTLCameraRenderView *strongSelf = weakSelf; CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); [strongSelf.mtlRender renderToCameraTextureWithPixelBuffer:pixelBuffer completedHandler:renderCompleted]; @@ -336,7 +336,7 @@ NS_INLINE size_t QAAlignSize(size_t size) return self.cameraTexture.renderTarget; } -- (void)addRender:(QuarameraCameraRender *)render +- (void)addRender:(OlaCameraRender *)render { NSAssert([NSThread isMainThread], @"call on main Thread"); diff --git a/mediapipe/render/ios/Camera/QuarameraShareTexture.h b/mediapipe/render/ios/Camera/OlaShareTexture.h similarity index 88% rename from mediapipe/render/ios/Camera/QuarameraShareTexture.h rename to mediapipe/render/ios/Camera/OlaShareTexture.h index 47b51dd3b..fde5f2b80 100644 --- a/mediapipe/render/ios/Camera/QuarameraShareTexture.h +++ b/mediapipe/render/ios/Camera/OlaShareTexture.h @@ -1,5 +1,5 @@ // -// QuarameraShareTexture.h +// OlaShareTexture.h // QuameraDemo // // Created by wangrenzhu on 2021/1/21. @@ -17,9 +17,9 @@ typedef struct { GLuint glInternalFormat; GLuint glFormat; GLuint glType; -} QuarameraTextureFormatInfo; +} OlaTextureFormatInfo; -@interface QuarameraShareTexture : NSObject +@interface OlaShareTexture : NSObject - (nonnull instancetype)initWithMetalDevice:(nonnull id)mtlDevice openGLContext:(nonnull EAGLContext*)glContext @@ -40,7 +40,7 @@ typedef struct { @property (readonly, nonatomic) CGSize size; @property (strong, nullable, nonatomic) NSString *name; -@property (readonly, nonnull, nonatomic) QuarameraTextureFormatInfo *formatInfo; +@property (readonly, nonnull, nonatomic) OlaTextureFormatInfo *formatInfo; @property (readonly, nonatomic) IOSurfaceID surfaceID; @end diff --git a/mediapipe/render/ios/Camera/QuarameraShareTexture.m b/mediapipe/render/ios/Camera/OlaShareTexture.m similarity index 95% rename from mediapipe/render/ios/Camera/QuarameraShareTexture.m rename to mediapipe/render/ios/Camera/OlaShareTexture.m index 4fdf0a23a..061b6006f 100644 --- a/mediapipe/render/ios/Camera/QuarameraShareTexture.m +++ b/mediapipe/render/ios/Camera/OlaShareTexture.m @@ -1,12 +1,12 @@ // -// QuarameraShareTexture.m -// QuameraDemo +// OlaShareTexture.m +// OlaCameraFramework // // Created by wangrenzhu on 2021/1/21. // Copyright © 2021 alibaba. All rights reserved. // -#import "QuarameraShareTexture.h" +#import "OlaShareTexture.h" #import #import #import @@ -18,7 +18,7 @@ #define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 -__unused static QuarameraTextureFormatInfo formatTable[] = +__unused static OlaTextureFormatInfo formatTable[] = { // Core Video Pixel Format, Metal Pixel Format, GL internalformat, GL format, GL type { kCVPixelFormatType_32BGRA, MTLPixelFormatBGRA8Unorm, GL_RGBA, GL_BGRA_EXT, GL_UNSIGNED_INT_8_8_8_8_REV }, @@ -38,9 +38,9 @@ static const float standardImageVertices[] = { 1.0, -1.0 }; -static const NSUInteger interopFormats = sizeof(formatTable) / sizeof(QuarameraTextureFormatInfo); +static const NSUInteger interopFormats = sizeof(formatTable) / sizeof(OlaTextureFormatInfo); -QuarameraTextureFormatInfo* textureFormatInfoFromMetalPixelFormat(MTLPixelFormat pixelFormat) +OlaTextureFormatInfo* textureFormatInfoFromMetalPixelFormat(MTLPixelFormat pixelFormat) { for(int i = 0; i < interopFormats; i++) { if(pixelFormat == formatTable[i].mtlFormat) { @@ -50,7 +50,7 @@ QuarameraTextureFormatInfo* textureFormatInfoFromMetalPixelFormat(MTLPixelFormat return NULL; } -@interface QuarameraShareTexture() { +@interface OlaShareTexture() { } @@ -61,9 +61,9 @@ QuarameraTextureFormatInfo* textureFormatInfoFromMetalPixelFormat(MTLPixelFormat @end -@implementation QuarameraShareTexture +@implementation OlaShareTexture { - QuarameraTextureFormatInfo *_formatInfo; + OlaTextureFormatInfo *_formatInfo; CVPixelBufferRef _pixelBuffer; CVMetalTextureRef _mtlTexture; @@ -290,9 +290,9 @@ QuarameraTextureFormatInfo* textureFormatInfoFromMetalPixelFormat(MTLPixelFormat return _pixelBuffer; } -- (QuarameraTextureFormatInfo *)formatInfo +- (OlaTextureFormatInfo *)formatInfo { - return (QuarameraTextureFormatInfo *)_formatInfo; + return (OlaTextureFormatInfo *)_formatInfo; } - (id)loadTextureFromImage:(UIImage *)image @@ -319,13 +319,13 @@ QuarameraTextureFormatInfo* textureFormatInfoFromMetalPixelFormat(MTLPixelFormat NSError *error; NSBundle *bundle = [NSBundle mainBundle]; - NSURL *shaderURL = [bundle URLForResource:@"QuarameraFramework" withExtension:@"metallib"]; + NSURL *shaderURL = [bundle URLForResource:@"OlaFramework" withExtension:@"metallib"]; if (@available(iOS 11.0, *)) { if (shaderURL) { self.library = [self.metalDevice newLibraryWithURL:shaderURL error:&error]; } } else { - NSString *lib = [[NSBundle mainBundle] pathForResource:@"QuarameraFramework" ofType:@"metallib"]; + NSString *lib = [[NSBundle mainBundle] pathForResource:@"OlaFramework" ofType:@"metallib"]; if (lib) { _library = [_metalDevice newLibraryWithFile:lib error:nil]; } diff --git a/mediapipe/render/ios/OlaRender.h b/mediapipe/render/ios/OlaRender.h deleted file mode 100644 index 96c9d032d..000000000 --- a/mediapipe/render/ios/OlaRender.h +++ /dev/null @@ -1,12 +0,0 @@ -// -// OlaRender.h -// OlaRender -// Created by Renzhu wang on 2022/7/12. -// Copyright © 2022 Ola. All rights reserved. -// - -#import - -@interface OlaRender : NSObject - -@end \ No newline at end of file diff --git a/mediapipe/render/ios/OlaRender.mm b/mediapipe/render/ios/OlaRenderDevelop.h similarity index 68% rename from mediapipe/render/ios/OlaRender.mm rename to mediapipe/render/ios/OlaRenderDevelop.h index 4c95c18d1..2592cfe21 100644 --- a/mediapipe/render/ios/OlaRender.mm +++ b/mediapipe/render/ios/OlaRenderDevelop.h @@ -5,10 +5,5 @@ // Copyright © 2022 Ola. All rights reserved. // -#import "OlaRender.h" - - -@implementation OlaRender - - -@end \ No newline at end of file +#include "GPUImage-x.h" +#include "Framebuffer.hpp" diff --git a/mediapipe/render/ios/OlaRenderDevelopFramework.tulsiproj/Configs/develop.tulsigen b/mediapipe/render/ios/OlaRenderDevelopFramework.tulsiproj/Configs/develop.tulsigen new file mode 100644 index 000000000..80207e24c --- /dev/null +++ b/mediapipe/render/ios/OlaRenderDevelopFramework.tulsiproj/Configs/develop.tulsigen @@ -0,0 +1,59 @@ +{ + "additionalFilePaths" : [ + "mediapipe/render/ios/BUILD" + ], + "buildTargets" : [ + "//mediapipe/render/ios:OlaRenderDevelop", + "//mediapipe/render/ios:OlaRenderDevelopFramework" + ], + "optionSet" : { + "BazelBuildOptionsDebug" : { + "p" : "$(inherited)" + }, + "BazelBuildOptionsRelease" : { + "p" : "$(inherited)" + }, + "BazelBuildStartupOptionsDebug" : { + "p" : "$(inherited)" + }, + "BazelBuildStartupOptionsRelease" : { + "p" : "$(inherited)" + }, + "BuildActionPostActionScript" : { + "p" : "$(inherited)" + }, + "BuildActionPreActionScript" : { + "p" : "$(inherited)" + }, + "CommandlineArguments" : { + "p" : "$(inherited)" + }, + "EnvironmentVariables" : { + "p" : "$(inherited)" + }, + "LaunchActionPostActionScript" : { + "p" : "$(inherited)" + }, + "LaunchActionPreActionScript" : { + "p" : "$(inherited)" + }, + "ProjectGenerationBazelStartupOptions" : { + "p" : "$(inherited)" + }, + "ProjectGenerationPlatformConfiguration" : { + "p" : "ios_arm64" + }, + "TestActionPostActionScript" : { + "p" : "$(inherited)" + }, + "TestActionPreActionScript" : { + "p" : "$(inherited)" + } + }, + "projectName" : "OlaVideo", + "sourceFilters" : [ + "mediapipe/render/core", + "mediapipe/render/core/math", + "mediapipe/render/ios" + ] +} diff --git a/mediapipe/render/ios/OlaRenderDevelopFramework.tulsiproj/project.tulsiconf b/mediapipe/render/ios/OlaRenderDevelopFramework.tulsiproj/project.tulsiconf new file mode 100644 index 000000000..c533b0516 --- /dev/null +++ b/mediapipe/render/ios/OlaRenderDevelopFramework.tulsiproj/project.tulsiconf @@ -0,0 +1,17 @@ +{ + "configDefaults" : { + "optionSet" : { + "CLANG_CXX_LANGUAGE_STANDARD" : { + "p" : "c++17" + }, + "ProjectGenerationPlatformConfiguration" : { + "p" : "ios_arm64" + } + } + }, + "packages" : [ + "mediapipe/render/ios" + ], + "projectName" : "OlaVideo", + "workspaceRoot" : "../../../.." +} diff --git a/mediapipe/render/ios/OlaRenderDevelopFramework.tulsiproj/wangrenzhu.tulsiconf-user b/mediapipe/render/ios/OlaRenderDevelopFramework.tulsiproj/wangrenzhu.tulsiconf-user new file mode 100644 index 000000000..1577dedb7 --- /dev/null +++ b/mediapipe/render/ios/OlaRenderDevelopFramework.tulsiproj/wangrenzhu.tulsiconf-user @@ -0,0 +1,10 @@ +{ + "optionSet" : { + "BazelPath" : { + "p" : "/opt/homebrew/Cellar/bazelisk/1.12.0/bin/bazelisk" + }, + "WorkspaceRootPath" : { + "p" : "/Users/wangrenzhu/Documents/github/mediapipe-render" + } + } +} diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Configs/OlaVideo.tulsigen b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Configs/OlaVideo.tulsigen new file mode 100644 index 000000000..7868e7adc --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Configs/OlaVideo.tulsigen @@ -0,0 +1,20 @@ +{ + "additionalFilePaths" : [ + "mediapipe/render/ios/BUILD" + ], + "buildTargets" : [ + "//mediapipe/render/ios:OlaRenderDevelop", + "//mediapipe/render/ios:OlaRenderDevelopFramework" + ], + "optionSet" : { + "ProjectGenerationPlatformConfiguration" : { + "p" : "ios_arm64" + } + }, + "projectName" : "OlaVideo", + "sourceFilters" : [ + "mediapipe/render/core", + "mediapipe/render/core/math", + "mediapipe/render/ios" + ] +} diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Configs/wangrenzhu.tulsigen-user b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Configs/wangrenzhu.tulsigen-user new file mode 100644 index 000000000..63be1332d --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Configs/wangrenzhu.tulsigen-user @@ -0,0 +1,5 @@ +{ + "optionSet" : { + + } +} diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Resources/StubInfoPlist.plist b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Resources/StubInfoPlist.plist new file mode 100644 index 000000000..41851922a --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Resources/StubInfoPlist.plist @@ -0,0 +1,13 @@ + + + + + CFBundleDisplayName + Stub Info.plist (do not edit) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + + + diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Resources/StubWatchOS2AppExInfoPlist.plist b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Resources/StubWatchOS2AppExInfoPlist.plist new file mode 100644 index 000000000..df0ca450e --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Resources/StubWatchOS2AppExInfoPlist.plist @@ -0,0 +1,17 @@ + + + + + CFBundleDisplayName + Stub Info.plist for a watchOS app extension (do not edit) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + NSExtension + + NSExtensionPointIdentifier + com.apple.watchkit + + + diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Resources/StubWatchOS2InfoPlist.plist b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Resources/StubWatchOS2InfoPlist.plist new file mode 100644 index 000000000..8b114b087 --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Resources/StubWatchOS2InfoPlist.plist @@ -0,0 +1,15 @@ + + + + + CFBundleDisplayName + Stub Info.plist for a watchOS app (do not edit) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + WKWatchKitApp + + + + diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Resources/iOSXCTRunner.entitlements b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Resources/iOSXCTRunner.entitlements new file mode 100644 index 000000000..aa120ae1a --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Resources/iOSXCTRunner.entitlements @@ -0,0 +1,16 @@ + + + + + application-identifier + $(TeamIdentifier).$(BundleIdentifier) + com.apple.developer.team-identifier + $(TeamIdentifier) + get-task-allow + + keychain-access-groups + + $(TeamIdentifier).$(BundleIdentifier) + + + diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Resources/macOSXCTRunner.entitlements b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Resources/macOSXCTRunner.entitlements new file mode 100644 index 000000000..226c940ab --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Resources/macOSXCTRunner.entitlements @@ -0,0 +1,33 @@ + + + + + com.apple.application-identifier + $(BundleIdentifier) + com.apple.security.app-sandbox + + com.apple.security.network.client + + com.apple.security.temporary-exception.files.absolute-path.read-only + + / + / + + com.apple.security.temporary-exception.mach-lookup.global-name + + com.apple.coresymbolicationd + com.apple.testmanagerd + + com.apple.security.temporary-exception.mach-lookup.local-name + + com.apple.axserver + + com.apple.security.temporary-exception.sbpl + + (allow network-outbound (subpath "/private/tmp")) + (allow hid-control) + (allow signal) + (allow network-outbound (subpath "/private/tmp")) + + + diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/apfs_clone_copy.py b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/apfs_clone_copy.py new file mode 100644 index 000000000..ef9e3657c --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/apfs_clone_copy.py @@ -0,0 +1,115 @@ +#!/usr/bin/python3 +# Copyright 2018 The Tulsi 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. + +"""Copy on write with similar behavior to shutil.copy2, when available.""" + +import errno +import os +import re +import shutil +import subprocess + + +def _APFSCheck(volume_path): + """Reports if the given path belongs to an APFS volume. + + Args: + volume_path: Absolute path to the volume we want to test. + + Returns: + True if the volume has been formatted as APFS. + False if not. + """ + output = subprocess.check_output(['diskutil', 'info', volume_path], + encoding='utf-8') + # Match the output's "Type (Bundle): ..." entry to determine if apfs. + target_fs = re.search(r'(?:Type \(Bundle\):) +([^ ]+)', output) + if not target_fs: + return False + filesystem = target_fs.group(1) + if 'apfs' not in filesystem: + return False + return True + + +def _IsOnDevice(path, st_dev): + """Checks if a given path belongs to a FS on a given device. + + Args: + path: a filesystem path, possibly to a non-existent file or directory. + st_dev: the ID of a device with a filesystem, as in os.stat(...).st_dev. + + Returns: + True if the path or (if the path does not exist) its closest existing + ancestor exists on the device. + False if not. + """ + if not os.path.isabs(path): + path = os.path.abspath(path) + try: + return os.stat(path).st_dev == st_dev + except OSError as err: + if err.errno == errno.ENOENT: + dirname = os.path.dirname(path) + if len(dirname) < len(path): + return _IsOnDevice(dirname, st_dev) + return False + +# At launch, determine if the root filesystem is APFS. +IS_ROOT_APFS = _APFSCheck('/') + +# At launch, determine the root filesystem device ID. +ROOT_ST_DEV = os.stat('/').st_dev + + +def CopyOnWrite(source, dest, tree=False): + """Invokes cp -c to perform a CoW copy2 of all files, like clonefile(2). + + Args: + source: Source path to copy. + dest: Destination for copying. + tree: "True" to copy all child files and folders, like shutil.copytree(). + """ + # Note that this is based on cp, so permissions are copied, unlike shutil's + # copyfile method. + # + # Identical to shutil's copy2 method, used by shutil's move and copytree. + cmd = ['cp'] + if IS_ROOT_APFS and _IsOnDevice(source, ROOT_ST_DEV) and _IsOnDevice( + dest, ROOT_ST_DEV): + # Copy on write (clone) is possible if both source and destination reside in + # the same APFS volume. For simplicity, and since checking FS type can be + # expensive, allow CoW only for the root volume. + cmd.append('-c') + if tree: + # Copy recursively if indicated. + cmd.append('-R') + # Follow symlinks, emulating shutil.copytree defaults. + cmd.append('-L') + # Preserve all possible file attributes and permissions (copystat/copy2). + cmd.extend(['-p', source, dest]) + try: + # Attempt the copy action with cp. + subprocess.check_output(cmd) + except subprocess.CalledProcessError: + # If -c is not supported, use shutil's copy2-based methods directly. + if tree: + # A partial tree might be left over composed of dirs but no files. + # Remove them with rmtree so that they don't interfere with copytree. + if os.path.exists(dest): + shutil.rmtree(dest) + shutil.copytree(source, dest) + else: + shutil.copy2(source, dest) diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/bazel_build.py b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/bazel_build.py new file mode 100755 index 000000000..00d1a01f7 --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/bazel_build.py @@ -0,0 +1,1863 @@ +#!/usr/bin/python3 +# -*- coding: utf-8 -*- +# Copyright 2016 The Tulsi 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. + +"""Bridge between Xcode and Bazel for the "build" action.""" + +import atexit +import errno +import fcntl +import hashlib +import inspect +import io +import json +import os +import pipes +import plistlib +import re +import shutil +import signal +import subprocess +import sys +import textwrap +import threading +import time +import zipfile + +from apfs_clone_copy import CopyOnWrite +import bazel_build_events +import bazel_build_settings +import bazel_options +from bootstrap_lldbinit import BootstrapLLDBInit +from bootstrap_lldbinit import TULSI_LLDBINIT_FILE +import tulsi_logging +from update_symbol_cache import UpdateSymbolCache + + +# List of frameworks that Xcode injects into test host targets that should be +# re-signed when running the tests on devices. +XCODE_INJECTED_FRAMEWORKS = [ + 'libXCTestBundleInject.dylib', + 'libXCTestSwiftSupport.dylib', + 'IDEBundleInjection.framework', + 'XCTAutomationSupport.framework', + 'XCTest.framework', + 'XCTestCore.framework', + 'XCUnit.framework', + 'XCUIAutomation.framework', +] + +_logger = None + + +def _PrintUnbuffered(msg): + sys.stdout.write('%s\n' % msg) + sys.stdout.flush() + + +def _PrintXcodeWarning(msg): + sys.stdout.write(':: warning: %s\n' % msg) + sys.stdout.flush() + + +def _PrintXcodeError(msg): + sys.stderr.write(':: error: %s\n' % msg) + sys.stderr.flush() + + +def _Fatal(msg, fatal_frame=None): + """Print a fatal error pointing to the failure line inside the script.""" + if not fatal_frame: + fatal_frame = inspect.currentframe().f_back + filename, line_number, _, _, _ = inspect.getframeinfo(fatal_frame) + _PrintUnbuffered('%s:%d: error: %s' % (os.path.abspath(filename), + line_number, msg)) + + +CLEANUP_BEP_FILE_AT_EXIT = False + + +# Function to be called atexit to clean up the BEP file if one is present. +# This is especially useful in cases of abnormal termination (such as what +# happens when Xcode is killed). +def _BEPFileExitCleanup(bep_file_path): + if not CLEANUP_BEP_FILE_AT_EXIT: + return + try: + os.remove(bep_file_path) + except OSError as e: + _PrintXcodeWarning('Failed to remove BEP file from %s. Error: %s' % + (bep_file_path, e.strerror)) + + +def _InterruptHandler(signum, frame): + """Gracefully exit on SIGINT.""" + del signum, frame # Unused. + _PrintUnbuffered('Caught interrupt signal. Exiting...') + sys.exit(0) + + +def _FindDefaultLldbInit(): + """Returns the path to the primary lldbinit file that Xcode would load or None when no file exists.""" + for lldbinit_shortpath in ['~/.lldbinit-Xcode', '~/.lldbinit']: + lldbinit_path = os.path.expanduser(lldbinit_shortpath) + if os.path.isfile(lldbinit_path): + return lldbinit_path + + return None + + +class Timer(object): + """Simple profiler.""" + + def __init__(self, action_name, action_id): + """Creates a new Timer object. + + Args: + action_name: A human-readable action name, shown in the build log. + action_id: A machine-readable action identifier, can be used for metrics. + + Returns: + A Timer instance. + + Raises: + RuntimeError: if Timer is created without initializing _logger. + """ + if _logger is None: + raise RuntimeError('Attempted to create Timer without a logger.') + self.action_name = action_name + self.action_id = action_id + self._start = None + + def Start(self): + self._start = time.time() + return self + + def End(self, log_absolute_times=False): + end = time.time() + seconds = end - self._start + if log_absolute_times: + _logger.log_action(self.action_name, self.action_id, seconds, + self._start, end) + else: + _logger.log_action(self.action_name, self.action_id, seconds) + + +def _LockFileCreate(): + # This relies on this script running at the root of the bazel workspace. + cwd = os.environ['PWD'] + cwd_hash = hashlib.sha256(cwd.encode()).hexdigest() + return '/tmp/tulsi_bazel_build_{}.lock'.format(cwd_hash) + + +# Function to be called atexit to release the file lock on script termination. +def _LockFileExitCleanup(lock_file_handle): + lock_file_handle.close() + + +def _LockFileAcquire(lock_path): + """Force script to wait on file lock to serialize build target actions. + + Args: + lock_path: Path to the lock file. + """ + _PrintUnbuffered('Queuing Tulsi build...') + lockfile = open(lock_path, 'w') + # Register "fclose(...)" as early as possible, before acquiring lock. + atexit.register(_LockFileExitCleanup, lockfile) + while True: + try: + fcntl.lockf(lockfile, fcntl.LOCK_EX | fcntl.LOCK_NB) + break + except IOError as err: + if err.errno != errno.EAGAIN: + raise + else: + time.sleep(0.1) + + +class CodesignBundleAttributes(object): + """Wrapper class for codesigning attributes of a signed bundle.""" + + # List of codesigning attributes that this script requires. + _ATTRIBUTES = ['Authority', 'Identifier', 'TeamIdentifier'] + + def __init__(self, codesign_output): + self.attributes = {} + + pending_attributes = list(self._ATTRIBUTES) + for line in codesign_output.split('\n'): + if not pending_attributes: + break + + for attribute in pending_attributes: + if line.startswith(attribute): + value = line[len(attribute) + 1:] + self.attributes[attribute] = value + pending_attributes.remove(attribute) + break + + for attribute in self._ATTRIBUTES: + if attribute not in self.attributes: + _PrintXcodeError( + 'Failed to extract %s from %s.\n' % (attribute, codesign_output)) + + def Get(self, attribute): + """Returns the value for the given attribute, or None if it wasn't found.""" + value = self.attributes.get(attribute) + if attribute not in self._ATTRIBUTES: + _PrintXcodeError( + 'Attribute %s not declared to be parsed. ' % attribute + + 'Available attributes are %s.\n' % self._ATTRIBUTES) + return value + + +class _OptionsParser(object): + """Handles parsing script options.""" + + # List of all supported Xcode configurations. + KNOWN_CONFIGS = ['Debug', 'Release'] + + def __init__(self, build_settings, sdk_version, platform_name, arch): + self.targets = [] + self.build_settings = build_settings + self.common_build_options = [ + '--verbose_failures', + '--bes_outerr_buffer_size=0', # Don't buffer Bazel output. + ] + + self.sdk_version = sdk_version + self.platform_name = platform_name + + if self.platform_name.startswith('watch'): + config_platform = 'watchos' + elif self.platform_name.startswith('iphone'): + config_platform = 'ios' + elif self.platform_name.startswith('macos'): + config_platform = 'macos' + elif self.platform_name.startswith('appletv'): + config_platform = 'tvos' + else: + self._WarnUnknownPlatform() + config_platform = 'ios' + self.bazel_build_config = '{}_{}'.format(config_platform, arch) + if self.bazel_build_config not in build_settings.platformConfigFlags: + _PrintXcodeError('Unknown active compilation target of "{}". ' + 'Please report a Tulsi bug.' + .format(self.bazel_build_config)) + sys.exit(1) + + self.verbose = 0 + self.bazel_bin_path = 'bazel-bin' + self.bazel_executable = None + + @staticmethod + def _UsageMessage(): + """Returns a usage message string.""" + usage = textwrap.dedent("""\ + Usage: %s [ ...] --bazel [options] + + Where options are: + --verbose [-v] + Increments the verbosity of the script by one level. This argument + may be provided multiple times to enable additional output levels. + + --bazel_bin_path + Path at which Bazel-generated artifacts may be retrieved. + """ % sys.argv[0]) + + return usage + + def ParseOptions(self, args): + """Parses arguments, returning (message, exit_code).""" + + bazel_executable_index = args.index('--bazel') + + self.targets = args[:bazel_executable_index] + if not self.targets or len(args) < bazel_executable_index + 2: + return (self._UsageMessage(), 10) + self.bazel_executable = args[bazel_executable_index + 1] + + return self._ParseVariableOptions(args[bazel_executable_index + 2:]) + + def GetBaseFlagsForTargets(self, config): + is_debug = config == 'Debug' + return self.build_settings.flags_for_target( + self.targets[0], + is_debug, + self.bazel_build_config) + + def GetEnabledFeatures(self): + """Returns a list of enabled Bazel features for the active target.""" + return self.build_settings.features_for_target(self.targets[0]) + + def GetBazelOptions(self, config): + """Returns the full set of build options for the given config.""" + bazel, start_up, build = self.GetBaseFlagsForTargets(config) + all_build = [] + all_build.extend(self.common_build_options) + all_build.extend(build) + + xcode_version_flag = self._ComputeXcodeVersionFlag() + if xcode_version_flag: + all_build.append('--xcode_version=%s' % xcode_version_flag) + + return bazel, start_up, all_build + + def _WarnUnknownPlatform(self): + _PrintUnbuffered('Warning: unknown platform "%s" will be treated as ' + 'iOS' % self.platform_name) + + def _ParseVariableOptions(self, args): + """Parses flag-based args, returning (message, exit_code).""" + + verbose_re = re.compile('-(v+)$') + + while args: + arg = args[0] + args = args[1:] + + if arg == '--bazel_bin_path': + if not args: + return ('Missing required parameter for %s' % arg, 2) + self.bazel_bin_path = args[0] + args = args[1:] + + elif arg == '--verbose': + self.verbose += 1 + + else: + match = verbose_re.match(arg) + if match: + self.verbose += len(match.group(1)) + else: + return ('Unknown option "%s"\n%s' % (arg, self._UsageMessage()), 1) + + return (None, 0) + + @staticmethod + def _GetXcodeBuildVersionString(): + """Returns Xcode build version from the environment as a string.""" + return os.environ['XCODE_PRODUCT_BUILD_VERSION'] + + @staticmethod + def _GetXcodeVersionString(): + """Returns Xcode version info from the Xcode's version.plist. + + Just reading XCODE_VERSION_ACTUAL from the environment seems like + a more reasonable implementation, but has shown to be unreliable, + at least when using Xcode 11.3.1 and opening the project within an + Xcode workspace. + """ + developer_dir = os.environ['DEVELOPER_DIR'] + app_dir = developer_dir.split('.app')[0] + '.app' + version_plist_path = os.path.join(app_dir, 'Contents', 'version.plist') + try: + with open(version_plist_path, 'rb') as f: + plist = plistlib.load(f) + except IOError: + _PrintXcodeWarning('Tulsi cannot determine Xcode version, error ' + 'reading from {}'.format(version_plist_path)) + return None + try: + # Example: "11.3.1", "11.3", "11.0" + key = 'CFBundleShortVersionString' + version_string = plist[key] + except KeyError: + _PrintXcodeWarning('Tulsi cannot determine Xcode version from {}, no ' + '"{}" key'.format(version_plist_path, key)) + return None + + # But we need to normalize to major.minor.patch, e.g. 11.3.0 or + # 11.0.0, so add one or two ".0" if needed (two just in case + # there is ever just a single version number like "12") + dots_count = version_string.count('.') + dot_zeroes_to_add = 2 - dots_count + version_string += '.0' * dot_zeroes_to_add + return version_string + + @staticmethod + def _ComputeXcodeVersionFlag(): + """Returns a string for the --xcode_version build flag, if any. + + The flag should be used if the active Xcode version was not the same one + used during project generation. + + Note this a best-attempt only; this may not be accurate as Bazel itself + caches the active DEVELOPER_DIR path and the user may have changed their + installed Xcode version. + """ + xcode_version = _OptionsParser._GetXcodeVersionString() + build_version = _OptionsParser._GetXcodeBuildVersionString() + + if not xcode_version or not build_version: + return None + + # Of the form Major.Minor.Fix.Build (new Bazel form) or Major.Min.Fix (old). + full_bazel_version = os.environ.get('TULSI_XCODE_VERSION') + if not full_bazel_version: # Unexpected: Tulsi gen didn't set the flag. + return xcode_version + + # Newer Bazel versions specify the version as Major.Minor.Fix.Build. + if full_bazel_version.count('.') == 3: + components = full_bazel_version.rsplit('.', 1) + bazel_xcode_version = components[0] + bazel_build_version = components[1] + + if (xcode_version != bazel_xcode_version + or build_version != bazel_build_version): + return '{}.{}'.format(xcode_version, build_version) + else: + return None + else: # Old version of Bazel. We need to use form Major.Minor.Fix. + return xcode_version if xcode_version != full_bazel_version else None + + +class BazelBuildBridge(object): + """Handles invoking Bazel and unpacking generated binaries.""" + + BUILD_EVENTS_FILE = 'build_events.json' + + XCODE_MODULE_CACHE_DIRECTORY = os.path.expanduser( + '~/Library/Developer/Xcode/DerivedData/ModuleCache.noindex') + MODULE_CACHE_PRUNER_EXECUTABLE = os.path.expanduser( + '~/Library/Application Support/Tulsi/Scripts/module_cache_pruner') + + def __init__(self, build_settings): + self.build_settings = build_settings + self.verbose = 0 + self.bazel_bin_path = None + self.codesign_attributes = {} + + self.codesigning_folder_path = os.environ['CODESIGNING_FOLDER_PATH'] + + self.xcode_action = os.environ['ACTION'] # The Xcode build action. + # When invoked as an external build system script, Xcode will set ACTION to + # an empty string. + if not self.xcode_action: + self.xcode_action = 'build' + + if int(os.environ['XCODE_VERSION_MAJOR']) < 900: + xcode_build_version = os.environ['XCODE_PRODUCT_BUILD_VERSION'] + _PrintXcodeWarning('Tulsi officially supports Xcode 9+. You are using an ' + 'earlier Xcode, build %s.' % xcode_build_version) + + self.tulsi_version = os.environ.get('TULSI_VERSION', 'UNKNOWN') + + self.custom_lldbinit = os.environ.get('TULSI_LLDBINIT_FILE') + + # TODO(b/69857078): Remove this when wrapped_clang is updated. + self.direct_debug_prefix_map = False + self.normalized_prefix_map = False + + self.update_symbol_cache = None + if os.environ.get('TULSI_USE_BAZEL_CACHE_READER') is not None: + self.update_symbol_cache = UpdateSymbolCache() + + # Path into which generated artifacts should be copied. + self.built_products_dir = os.environ['BUILT_PRODUCTS_DIR'] + # Path where Xcode expects generated sources to be placed. + self.derived_sources_folder_path = os.environ.get('DERIVED_SOURCES_DIR') + # Full name of the target artifact (e.g., "MyApp.app" or "Test.xctest"). + self.full_product_name = os.environ['FULL_PRODUCT_NAME'] + # Whether to generate runfiles for this target. + self.gen_runfiles = os.environ.get('GENERATE_RUNFILES') + # Target SDK version. + self.sdk_version = os.environ.get('SDK_VERSION') + # TEST_HOST for unit tests. + self.test_host_binary = os.environ.get('TEST_HOST') + # Whether this target is a test or not. + self.is_test = os.environ.get('WRAPPER_EXTENSION') == 'xctest' + # Target platform. + self.platform_name = os.environ['PLATFORM_NAME'] + # Type of the target artifact. + self.product_type = os.environ['PRODUCT_TYPE'] + # Path to the parent of the xcodeproj bundle. + self.project_dir = os.environ['PROJECT_DIR'] + # Path to the xcodeproj bundle. + self.project_file_path = os.environ['PROJECT_FILE_PATH'] + # Path to the directory containing the WORKSPACE file. + self.workspace_root = os.path.abspath(os.environ['TULSI_WR']) + # Set to the name of the generated bundle for bundle-type targets, None for + # single file targets (like static libraries). + self.wrapper_name = os.environ.get('WRAPPER_NAME') + self.wrapper_suffix = os.environ.get('WRAPPER_SUFFIX', '') + + # Path where Xcode expects the artifacts to be written to. This is not the + # codesigning_path as device vs simulator builds have different signing + # requirements, so Xcode expects different paths to be signed. This is + # mostly apparent on XCUITests where simulator builds set the codesigning + # path to be the .xctest bundle, but for device builds it is actually the + # UI runner app (since it needs to be codesigned to run on the device.) The + # FULL_PRODUCT_NAME variable is a stable path on where to put the expected + # artifacts. For static libraries (objc_library, swift_library), + # FULL_PRODUCT_NAME corresponds to the .a file name, which coincides with + # the expected location for a single artifact output. + # TODO(b/35811023): Check these paths are still valid. + self.artifact_output_path = os.path.join( + os.environ['TARGET_BUILD_DIR'], + os.environ['FULL_PRODUCT_NAME']) + + # Path to where Xcode expects the binary to be placed. + self.binary_path = os.path.join( + os.environ['TARGET_BUILD_DIR'], os.environ['EXECUTABLE_PATH']) + + self.is_simulator = self.platform_name.endswith('simulator') + self.codesigning_allowed = not self.is_simulator + + # Target architecture. Must be defined for correct setting of + # the --cpu flag. Note that Xcode will set multiple values in + # ARCHS when building for a Generic Device. + archs = os.environ.get('ARCHS') + if not archs: + _PrintXcodeError('Tulsi requires env variable ARCHS to be ' + 'set. Please file a bug against Tulsi.') + sys.exit(1) + arch = archs.split()[-1] + if self.is_simulator and arch == "arm64": + self.arch = "sim_" + arch + else: + self.arch = arch + + if self.codesigning_allowed: + platform_prefix = 'iOS' + if self.platform_name.startswith('macos'): + platform_prefix = 'macOS' + entitlements_filename = '%sXCTRunner.entitlements' % platform_prefix + self.runner_entitlements_template = os.path.join(self.project_file_path, + '.tulsi', + 'Resources', + entitlements_filename) + + self.bazel_executable = None + + def Run(self, args): + """Executes a Bazel build based on the environment and given arguments.""" + if self.xcode_action != 'build': + sys.stderr.write('Xcode action is %s, ignoring.' % self.xcode_action) + return 0 + + parser = _OptionsParser(self.build_settings, + self.sdk_version, + self.platform_name, + self.arch) + timer = Timer('Parsing options', 'parsing_options').Start() + message, exit_code = parser.ParseOptions(args[1:]) + timer.End() + if exit_code: + _PrintXcodeError('Option parsing failed: %s' % message) + return exit_code + + self.verbose = parser.verbose + self.bazel_bin_path = os.path.abspath(parser.bazel_bin_path) + self.bazel_executable = parser.bazel_executable + self.bazel_exec_root = self.build_settings.bazelExecRoot + self.bazel_output_base = self.build_settings.bazelOutputBase + + # Update feature flags. + features = parser.GetEnabledFeatures() + self.direct_debug_prefix_map = 'DirectDebugPrefixMap' in features + self.normalized_prefix_map = 'DebugPathNormalization' in features + + # Path to the Build Events JSON file uses pid and is removed if the + # build is successful. + filename = '%d_%s' % (os.getpid(), BazelBuildBridge.BUILD_EVENTS_FILE) + self.build_events_file_path = os.path.join( + self.project_file_path, + '.tulsi', + filename) + + (command, retval) = self._BuildBazelCommand(parser) + if retval: + return retval + + timer = Timer('Running Bazel', 'running_bazel').Start() + exit_code, outputs = self._RunBazelAndPatchOutput(command) + timer.End() + if exit_code: + _Fatal('Bazel build failed with exit code %d. Please check the build ' + 'log in Report Navigator (⌘9) for more information.' + % exit_code) + return exit_code + + post_bazel_timer = Timer('Total Tulsi Post-Bazel time', 'total_post_bazel') + post_bazel_timer.Start() + + + # This needs to run after `bazel build`, since it depends on the Bazel + # output directories + + if not os.path.exists(self.bazel_exec_root): + _Fatal('No Bazel execution root was found at %r. Debugging experience ' + 'will be compromised. Please report a Tulsi bug.' + % self.bazel_exec_root) + return 404 + if not os.path.exists(self.bazel_output_base): + _Fatal('No Bazel output base was found at %r. Editing experience ' + 'will be compromised for external workspaces. Please report a' + ' Tulsi bug.' + % self.bazel_output_base) + return 404 + + exit_code = self._LinkTulsiToBazel('tulsi-execution-root', self.bazel_exec_root) + if exit_code: + return exit_code + # Old versions of Tulsi mis-referred to the execution root as the workspace. + # We preserve the old symlink name for backwards compatibility. + exit_code = self._LinkTulsiToBazel('tulsi-workspace', self.bazel_exec_root) + if exit_code: + return exit_code + exit_code = self._LinkTulsiToBazel( + 'tulsi-output-base', self.bazel_output_base) + if exit_code: + return exit_code + + + exit_code, outputs_data = self._ExtractAspectOutputsData(outputs) + if exit_code: + return exit_code + + # Generated headers are installed on a thread since we are launching + # a separate process to do so. This gives us clean timings. + install_thread = threading.Thread( + target=self._InstallGeneratedHeaders, args=(outputs,)) + install_thread.start() + timer = Timer('Installing artifacts', 'installing_artifacts').Start() + exit_code = self._InstallArtifact(outputs_data) + timer.End() + install_thread.join() + if exit_code: + return exit_code + + exit_code, dsym_paths = self._InstallDSYMBundles( + self.built_products_dir, outputs_data) + if exit_code: + return exit_code + + if not dsym_paths: + # Clean any bundles from a previous build that can interfere with + # debugging in LLDB. + self._CleanExistingDSYMs() + else: + for path in dsym_paths: + # Starting with Xcode 9.x, a plist based remapping exists for dSYM + # bundles that works with Swift as well as (Obj-)C(++). + # + # This solution also works for Xcode 8.x for (Obj-)C(++) but not + # for Swift. + timer = Timer('Adding remappings as plists to dSYM', + 'plist_dsym').Start() + exit_code = self._PlistdSYMPaths(path) + timer.End() + if exit_code: + _PrintXcodeError('Remapping dSYMs process returned %i, please ' + 'report a Tulsi bug and attach a full Xcode ' + 'build log.' % exit_code) + return exit_code + + # Starting with Xcode 7.3, XCTests inject several supporting frameworks + # into the test host that need to be signed with the same identity as + # the host itself. + if (self.is_test and not self.platform_name.startswith('macos') and + self.codesigning_allowed): + exit_code = self._ResignTestArtifacts() + if exit_code: + return exit_code + + self._PruneLLDBModuleCache(outputs) + + # Starting with Xcode 8, .lldbinit files are honored during Xcode debugging + # sessions. This allows use of the target.source-map field to remap the + # debug symbol paths encoded in the binary to the paths expected by Xcode. + # + # This will not work with dSYM bundles, or a direct -fdebug-prefix-map from + # the Bazel-built locations to Xcode-visible sources. + timer = Timer('Updating .lldbinit', 'updating_lldbinit').Start() + clear_source_map = dsym_paths or self.direct_debug_prefix_map + exit_code = self._UpdateLLDBInit(clear_source_map) + timer.End() + if exit_code: + _PrintXcodeWarning('Updating .lldbinit action failed with code %d' % + exit_code) + + post_bazel_timer.End(log_absolute_times=True) + + return 0 + + def _BuildBazelCommand(self, options): + """Builds up a commandline string suitable for running Bazel.""" + configuration = os.environ['CONFIGURATION'] + # Treat the special testrunner build config as a Debug compile. + test_runner_config_prefix = '__TulsiTestRunner_' + if configuration.startswith(test_runner_config_prefix): + configuration = configuration[len(test_runner_config_prefix):] + elif os.environ.get('TULSI_TEST_RUNNER_ONLY') == 'YES': + _PrintXcodeError('Building test targets with configuration "%s" is not ' + 'allowed. Please use the "Test" action or "Build for" > ' + '"Testing" instead.' % configuration) + return (None, 1) + + if configuration not in _OptionsParser.KNOWN_CONFIGS: + _PrintXcodeError('Unknown build configuration "%s"' % configuration) + return (None, 1) + + bazel, start_up, build = options.GetBazelOptions(configuration) + bazel_command = [bazel] + bazel_command.extend(start_up) + bazel_command.append('build') + bazel_command.extend(build) + + bazel_command.extend([ + # The following flags are used by Tulsi to identify itself and read + # build information from Bazel. They shold not affect Bazel anaylsis + # caching. + '--tool_tag=tulsi:bazel_build', + '--build_event_json_file=%s' % self.build_events_file_path, + '--noexperimental_build_event_json_file_path_conversion', + '--aspects', '@tulsi//:tulsi/tulsi_aspects.bzl%tulsi_outputs_aspect']) + + bazel_command.append('--output_groups=+tulsi_outputs') + bazel_command.extend(options.targets) + + extra_options = bazel_options.BazelOptions(os.environ) + bazel_command.extend(extra_options.bazel_feature_flags()) + + return (bazel_command, 0) + + def _RunBazelAndPatchOutput(self, command): + """Runs subprocess command, patching output as it's received.""" + self._PrintVerbose('Running "%s", patching output for workspace root at ' + '"%s" with project path at "%s".' % + (' '.join([pipes.quote(x) for x in command]), + self.workspace_root, + self.project_dir)) + # Clean up bazel output to make it look better in Xcode. + bazel_line_regex = re.compile( + r'(INFO|DEBUG|WARNING|ERROR|FAILED): ([^:]+:\d+:(?:\d+:)?)\s+(.+)') + + bazel_generic_regex = re.compile(r'(INFO|DEBUG|WARNING|ERROR|FAILED): (.*)') + + def PatchBazelDiagnosticStatements(output_line): + """Make Bazel output more Xcode friendly.""" + + def BazelLabelToXcodeLabel(bazel_label): + """Map Bazel labels to xcode labels for build output.""" + xcode_labels = { + 'INFO': 'note', + 'DEBUG': 'note', + 'WARNING': 'warning', + 'ERROR': 'error', + 'FAILED': 'error' + } + return xcode_labels.get(bazel_label, bazel_label) + + match = bazel_line_regex.match(output_line) + if match: + xcode_label = BazelLabelToXcodeLabel(match.group(1)) + output_line = '%s %s: %s' % (match.group(2), xcode_label, + match.group(3)) + else: + match = bazel_generic_regex.match(output_line) + if match: + xcode_label = BazelLabelToXcodeLabel(match.group(1)) + output_line = '%s: %s' % (xcode_label, match.group(2)) + return output_line + + if self.workspace_root != self.project_dir: + # Match (likely) filename:line_number: lines. + xcode_parsable_line_regex = re.compile(r'([^/][^:]+):\d+:') + + def PatchOutputLine(output_line): + output_line = PatchBazelDiagnosticStatements(output_line) + if xcode_parsable_line_regex.match(output_line): + output_line = '%s/%s' % (self.workspace_root, output_line) + return output_line + patch_xcode_parsable_line = PatchOutputLine + else: + patch_xcode_parsable_line = PatchBazelDiagnosticStatements + + def HandleOutput(output): + for line in output.splitlines(): + _logger.log_bazel_message(patch_xcode_parsable_line(line)) + + def WatcherUpdate(watcher): + """Processes any new events in the given watcher. + + Args: + watcher: a BazelBuildEventsWatcher object. + + Returns: + A list of new tulsiout file names seen. + """ + new_events = watcher.check_for_new_events() + new_outputs = [] + for build_event in new_events: + if build_event.stderr: + HandleOutput(build_event.stderr) + if build_event.stdout: + HandleOutput(build_event.stdout) + if build_event.files: + outputs = [x for x in build_event.files if x.endswith('.tulsiouts')] + new_outputs.extend(outputs) + return new_outputs + + def ReaderThread(file_handle, out_buffer): + out_buffer.append(file_handle.read()) + file_handle.close() + + # Make sure the BEP JSON file exists and is empty. We do this to prevent + # any sort of race between the watcher, bazel, and the old file contents. + open(self.build_events_file_path, 'w').close() + + # Capture the stderr and stdout from Bazel. We only display it if it we're + # unable to read any BEP events. + process = subprocess.Popen( + command, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + universal_newlines=True, + bufsize=1) + + # Register atexit function to clean up BEP file. + atexit.register(_BEPFileExitCleanup, self.build_events_file_path) + global CLEANUP_BEP_FILE_AT_EXIT + CLEANUP_BEP_FILE_AT_EXIT = True + + # Start capturing output from Bazel. + reader_buffer = [] + reader_thread = threading.Thread(target=ReaderThread, + args=(process.stdout, reader_buffer)) + reader_thread.daemon = True + reader_thread.start() + + with io.open(self.build_events_file_path, 'r', -1, 'utf-8', 'ignore' + ) as bep_file: + watcher = bazel_build_events.BazelBuildEventsWatcher(bep_file, + _PrintXcodeWarning) + output_locations = [] + while process.returncode is None: + output_locations.extend(WatcherUpdate(watcher)) + time.sleep(0.1) + process.poll() + + output_locations.extend(WatcherUpdate(watcher)) + + # If BEP JSON parsing failed, we should display the raw stdout and + # stderr from Bazel. + reader_thread.join() + if not watcher.has_read_events(): + HandleOutput(reader_buffer[0]) + + if process.returncode == 0 and not output_locations: + CLEANUP_BEP_FILE_AT_EXIT = False + _PrintXcodeError('Unable to find location of the .tulsiouts file.' + 'Please report this as a Tulsi bug, including the' + 'contents of %s.' % self.build_events_file_path) + return 1, output_locations + return process.returncode, output_locations + + def _ExtractAspectOutputsData(self, output_files): + """Converts aspect output from paths to json to a list of dictionaries. + + Args: + output_files: A list of strings to files representing Bazel aspect output + in UTF-8 JSON format. + + Returns: + return_code, [dict]: A tuple with a return code as its first argument and + for its second argument, a list of dictionaries for + each output_file that could be interpreted as valid + JSON, representing the returned Bazel aspect + information. + return_code, None: If an error occurred while converting the list of + files into JSON. + """ + outputs_data = [] + for output_file in output_files: + try: + with io.open(output_file, 'rb') as f: + output_data = json.load(f) + except (ValueError, IOError) as e: + _PrintXcodeError('Failed to load output map ""%s". ' + '%s' % (output_file, e)) + return 600, None + outputs_data.append(output_data) + return 0, outputs_data + + def _InstallArtifact(self, outputs_data): + """Installs Bazel-generated artifacts into the Xcode output directory.""" + xcode_artifact_path = self.artifact_output_path + + if not outputs_data: + _PrintXcodeError('Failed to load top level output file.') + return 600 + + primary_output_data = outputs_data[0] + + if 'artifact' not in primary_output_data: + _PrintXcodeError( + 'Failed to find an output artifact for target %s in output map %r' % + (xcode_artifact_path, primary_output_data)) + return 601 + + primary_artifact = primary_output_data['artifact'] + artifact_archive_root = primary_output_data.get('archive_root') + bundle_name = primary_output_data.get('bundle_name') + + # The PRODUCT_NAME used by the Xcode project is not trustable as it may be + # modified by the user and, more importantly, may have been modified by + # Tulsi to disambiguate multiple targets with the same name. + self.bazel_product_name = bundle_name + + # We need to handle IPAs (from {ios, tvos}_application) differently from + # ZIPs (from the other bundled rules) because they output slightly different + # directory structures. + is_ipa = primary_artifact.endswith('.ipa') + is_zip = primary_artifact.endswith('.zip') + + if is_ipa or is_zip: + expected_bundle_name = bundle_name + self.wrapper_suffix + + # The directory structure within the IPA is then determined based on + # Bazel's package and/or product type. + if is_ipa: + bundle_subpath = os.path.join('Payload', expected_bundle_name) + else: + # If the artifact is a ZIP, assume that the bundle is the top-level + # directory (this is the way in which Skylark rules package artifacts + # that are not standalone IPAs). + bundle_subpath = expected_bundle_name + + # Prefer to copy over files from the archive root instead of unzipping the + # ipa/zip in order to help preserve timestamps. Note that the archive root + # is only present for local builds; for remote builds we must extract from + # the zip file. + if self._IsValidArtifactArchiveRoot(artifact_archive_root, bundle_name): + source_location = os.path.join(artifact_archive_root, bundle_subpath) + exit_code = self._RsyncBundle(os.path.basename(primary_artifact), + source_location, + xcode_artifact_path) + else: + exit_code = self._UnpackTarget(primary_artifact, + xcode_artifact_path, + bundle_subpath) + if exit_code: + return exit_code + + elif os.path.isfile(primary_artifact): + # Remove the old artifact before copying. + if os.path.isfile(xcode_artifact_path): + try: + os.remove(xcode_artifact_path) + except OSError as e: + _PrintXcodeError('Failed to remove stale output file ""%s". ' + '%s' % (xcode_artifact_path, e)) + return 600 + exit_code = self._CopyFile(os.path.basename(primary_artifact), + primary_artifact, + xcode_artifact_path) + if exit_code: + return exit_code + else: + self._RsyncBundle(os.path.basename(primary_artifact), + primary_artifact, + xcode_artifact_path) + + # When the rules output a tree artifact, Tulsi will copy the bundle as is + # into the expected Xcode output location. But because they're copied as + # is from the bazel output, they come with bazel's permissions, which are + # read only. Here we set them to write as well, so Xcode can modify the + # bundle too (for example, for codesigning). + chmod_timer = Timer('Modifying permissions of output bundle', + 'bundle_chmod').Start() + + self._PrintVerbose('Spawning subprocess to add write permissions to ' + 'copied bundle...') + process = subprocess.Popen(['chmod', '-R', 'uga+w', xcode_artifact_path]) + process.wait() + chmod_timer.End() + + # No return code check as this is not an essential operation. + self._InstallEmbeddedBundlesIfNecessary(primary_output_data) + + return 0 + + def _IsValidArtifactArchiveRoot(self, archive_root, bundle_name): + """Returns true if the archive root is valid for use.""" + if not archive_root or not os.path.isdir(archive_root): + return False + + # The archive root will not be updated for any remote builds, but will be + # valid for local builds. We detect this by using an implementation detail + # of the rules_apple bundler: archives will always be transformed from + # .unprocessed.zip (locally or remotely) to .archive-root. + # + # Thus if the mod time on the archive root is not greater than the mod + # time on the on the zip, the archive root is not valid. Remote builds + # will end up copying the .unprocessed.zip but not the + # .archive-root, making this a valid temporary solution. + # + # In the future, it would be better to have this handled by the rules; + # until then this should suffice as a work around to improve build times. + unprocessed_zip = os.path.join(os.path.dirname(archive_root), + '%s.unprocessed.zip' % bundle_name) + if not os.path.isfile(unprocessed_zip): + return False + return os.path.getmtime(archive_root) > os.path.getmtime(unprocessed_zip) + + def _InstallEmbeddedBundlesIfNecessary(self, output_data): + """Install embedded bundles next to the current target's output.""" + + # In order to find and load symbols for the binary installed on device, + # Instruments needs to "see" it in Spotlight index somewhere on the local + # filesystem. This is only needed for on-device instrumentation. + # + # Unfortunatelly, it does not seem to be possible to detect when a build is + # being made for profiling, thus we can't exclude this step for on-device + # non-profiling builds. + + if self.is_simulator or ('embedded_bundles' not in output_data): + return + + timer = Timer('Installing embedded bundles', + 'installing_embedded_bundles').Start() + + for bundle_info in output_data['embedded_bundles']: + bundle_name = bundle_info['bundle_name'] + bundle_extension = bundle_info['bundle_extension'] + full_name = bundle_name + bundle_extension + output_path = os.path.join(self.built_products_dir, full_name) + # TODO(b/68936732): See if copying just the binary (not the whole bundle) + # is enough to make Instruments work. + if self._IsValidArtifactArchiveRoot(bundle_info['archive_root'], + bundle_name): + source_path = os.path.join(bundle_info['archive_root'], full_name) + self._RsyncBundle(full_name, source_path, output_path) + else: + # Try to find the embedded bundle within the installed main bundle. + bundle_path = self._FindEmbeddedBundleInMain(bundle_name, + bundle_extension) + if bundle_path: + self._RsyncBundle(full_name, bundle_path, output_path) + else: + _PrintXcodeWarning('Could not find bundle %s in main bundle. ' % + (full_name) + + 'Device-level Instruments debugging will be ' + 'disabled for this bundle. Please report a ' + 'Tulsi bug and attach a full Xcode build log.') + + timer.End() + + # Maps extensions to anticipated subfolders. + _EMBEDDED_BUNDLE_PATHS = { + '.appex': 'PlugIns', + '.framework': 'Frameworks' + } + + def _FindEmbeddedBundleInMain(self, bundle_name, bundle_extension): + """Retrieves the first embedded bundle found within our main bundle.""" + main_bundle = os.environ.get('EXECUTABLE_FOLDER_PATH') + + if not main_bundle: + return None + + main_bundle_path = os.path.join(self.built_products_dir, + main_bundle) + + return self._FindEmbeddedBundle(bundle_name, + bundle_extension, + main_bundle_path) + + def _FindEmbeddedBundle(self, bundle_name, bundle_extension, bundle_path): + """Retrieves the first embedded bundle found within this bundle path.""" + embedded_subfolder = self._EMBEDDED_BUNDLE_PATHS.get(bundle_extension) + + if not embedded_subfolder: + return None + + projected_bundle_path = os.path.join(bundle_path, + embedded_subfolder, + bundle_name + bundle_extension) + + if os.path.isdir(projected_bundle_path): + return projected_bundle_path + + # For frameworks not in the main app bundle, and possibly other executable + # bundle content in the future, we recurse through every .appex in PlugIns + # to find those frameworks. + # + # This won't support frameworks that could potentially have the same name + # but are different between the app and extensions, but we intentionally + # choose not to handle that case. Xcode build system only supports + # uniquely named frameworks, and we shouldn't confuse the dynamic loader + # with frameworks that have the same image names but different content. + appex_root_path = os.path.join(bundle_path, 'PlugIns') + if not os.path.isdir(appex_root_path): + return None + + # Find each directory within appex_root_path and attempt to find a bundle. + # If one can't be found, return None. + appex_dirs = os.listdir(appex_root_path) + for appex_dir in appex_dirs: + appex_path = os.path.join(appex_root_path, appex_dir) + path = self._FindEmbeddedBundle(bundle_name, + bundle_extension, + appex_path) + if path: + return path + return None + + def _InstallGeneratedHeaders(self, outputs): + """Invokes install_genfiles.py to install generated Bazel files.""" + genfiles_timer = Timer('Installing generated headers', + 'installing_generated_headers').Start() + # Resolve the path to the install_genfiles.py script. + # It should be in the same directory as this script. + path = os.path.join(os.path.dirname(os.path.realpath(__file__)), + 'install_genfiles.py') + + args = [path, self.bazel_exec_root] + args.extend(outputs) + + self._PrintVerbose('Spawning subprocess install_genfiles.py to copy ' + 'generated files in the background...') + process = subprocess.Popen(args) + process.wait() + genfiles_timer.End() + + def _InstallBundle(self, source_path, output_path): + """Copies the bundle at source_path to output_path.""" + if not os.path.isdir(source_path): + return 0, None + + if os.path.isdir(output_path): + try: + shutil.rmtree(output_path) + except OSError as e: + _PrintXcodeError('Failed to remove stale bundle ""%s". ' + '%s' % (output_path, e)) + return 700, None + + exit_code = self._CopyBundle(os.path.basename(source_path), + source_path, + output_path) + return exit_code, output_path + + def _RsyncBundle(self, source_path, full_source_path, output_path): + """Rsyncs the given bundle to the given expected output path.""" + self._PrintVerbose('Rsyncing %s to %s' % (source_path, output_path)) + + # rsync behavior changes based on presence of a trailing slash. + if not full_source_path.endswith('/'): + full_source_path += '/' + + try: + # Use -c to check differences by checksum, -v for verbose, + # and --delete to delete stale files. + # The rest of the flags are the same as -a but without preserving + # timestamps, which is done intentionally so the timestamp will + # only change when the file is changed. + subprocess.check_output(['rsync', + '-vcrlpgoD', + '--delete', + full_source_path, + output_path], + stderr=subprocess.STDOUT) + except subprocess.CalledProcessError as e: + _PrintXcodeError('Rsync failed. %s' % e) + return 650 + return 0 + + def _CopyBundle(self, source_path, full_source_path, output_path): + """Copies the given bundle to the given expected output path.""" + self._PrintVerbose('Copying %s to %s' % (source_path, output_path)) + try: + CopyOnWrite(full_source_path, output_path, tree=True) + except OSError as e: + _PrintXcodeError('Copy failed. %s' % e) + return 650 + return 0 + + def _CopyFile(self, source_path, full_source_path, output_path): + """Copies the given file to the given expected output path.""" + self._PrintVerbose('Copying %s to %s' % (source_path, output_path)) + output_path_dir = os.path.dirname(output_path) + if not os.path.exists(output_path_dir): + try: + os.makedirs(output_path_dir) + except OSError as e: + _PrintXcodeError('Failed to create output directory "%s". ' + '%s' % (output_path_dir, e)) + return 650 + try: + CopyOnWrite(full_source_path, output_path) + except OSError as e: + _PrintXcodeError('Copy failed. %s' % e) + return 650 + return 0 + + def _UnpackTarget(self, bundle_path, output_path, bundle_subpath): + """Unpacks generated bundle into the given expected output path.""" + self._PrintVerbose('Unpacking %s to %s' % (bundle_path, output_path)) + + if not os.path.isfile(bundle_path): + _PrintXcodeError('Generated bundle not found at "%s"' % bundle_path) + return 670 + + if os.path.isdir(output_path): + try: + shutil.rmtree(output_path) + except OSError as e: + _PrintXcodeError('Failed to remove stale output directory ""%s". ' + '%s' % (output_path, e)) + return 600 + + # We need to handle IPAs (from {ios, tvos}_application) differently from + # ZIPs (from the other bundled rules) because they output slightly different + # directory structures. + is_ipa = bundle_path.endswith('.ipa') + + with zipfile.ZipFile(bundle_path, 'r') as zf: + for item in zf.infolist(): + filename = item.filename + + # Support directories do not seem to be needed by the debugger and are + # skipped. + basedir = filename.split(os.sep)[0] + if basedir.endswith('Support') or basedir.endswith('Support2'): + continue + + if len(filename) < len(bundle_subpath): + continue + + attributes = (item.external_attr >> 16) & 0o777 + self._PrintVerbose('Extracting %s (%o)' % (filename, attributes), + level=1) + + if not filename.startswith(bundle_subpath): + _PrintXcodeWarning('Mismatched extraction path. Bundle content ' + 'at "%s" expected to have subpath of "%s"' % + (filename, bundle_subpath)) + + dir_components = self._SplitPathComponents(filename) + + # Get the file's path, ignoring the payload components if the archive + # is an IPA. + if is_ipa: + subpath = os.path.join(*dir_components[2:]) + else: + subpath = os.path.join(*dir_components[1:]) + target_path = os.path.join(output_path, subpath) + + # Ensure the target directory exists. + try: + target_dir = os.path.dirname(target_path) + if not os.path.isdir(target_dir): + os.makedirs(target_dir) + except OSError as e: + _PrintXcodeError( + 'Failed to create target path "%s" during extraction. %s' % ( + target_path, e)) + return 671 + + # If the archive item looks like a file, extract it. + if not filename.endswith(os.sep): + with zf.open(item) as src, open(target_path, 'wb') as dst: + shutil.copyfileobj(src, dst) + + # Patch up the extracted file's attributes to match the zip content. + if attributes: + os.chmod(target_path, attributes) + + return 0 + + def _InstallDSYMBundles(self, output_dir, outputs_data): + """Copies any generated dSYM bundles to the given directory.""" + + dsym_to_process = set() + primary_output_data = outputs_data[0] + if primary_output_data['has_dsym']: + # Declares the Xcode-generated name of our main target's dSYM. + # This environment variable is always set, for any possible Xcode output + # that could generate a dSYM bundle. + # + # Note that this may differ from the Bazel name as Tulsi may modify the + # Xcode `BUNDLE_NAME`, so we need to make sure we use Bazel as the source + # of truth for Bazel's dSYM name, but copy it over to where Xcode expects. + xcode_target_dsym = os.environ.get('DWARF_DSYM_FILE_NAME') + + if xcode_target_dsym: + dsym_path = primary_output_data.get('dsym_path') + if dsym_path: + dsym_to_process.add((dsym_path, xcode_target_dsym)) + else: + _PrintXcodeWarning('Unable to resolve dSYM paths for main bundle %s' % + primary_output_data) + + # Collect additional dSYM bundles generated by the dependencies of this + # build such as extensions or frameworks. Note that a main target may not + # have dSYMs while subtargets (like an xctest) still can have them. + child_dsyms = set() + for data in outputs_data: + for bundle_info in data.get('embedded_bundles', []): + if not bundle_info['has_dsym']: + continue + dsym_path = bundle_info.get('dsym_path') + if dsym_path: + child_dsyms.add((dsym_path, os.path.basename(dsym_path))) + else: + _PrintXcodeWarning( + 'Unable to resolve dSYM paths for embedded bundle %s' + % bundle_info) + dsym_to_process.update(child_dsyms) + + if not dsym_to_process: + return 0, None + + # Start the timer now that we know we have dSYM bundles to install. + timer = Timer('Installing dSYM bundles', 'installing_dsym').Start() + + dsyms_found = [] + for input_dsym_full_path, xcode_dsym_name in dsym_to_process: + output_full_path = os.path.join(output_dir, xcode_dsym_name) + exit_code, path = self._InstallBundle(input_dsym_full_path, + output_full_path) + if exit_code: + _PrintXcodeWarning('Failed to install dSYM to "%s" (%s)' + % (input_dsym_full_path, exit_code)) + elif path is None: + _PrintXcodeWarning('Did not find a dSYM bundle at %s' + % input_dsym_full_path) + else: + dsyms_found.append(path) + + timer.End() + return 0, dsyms_found + + def _ResignBundle(self, bundle_path, signing_identity, entitlements=None): + """Re-signs the bundle with the given signing identity and entitlements.""" + if not self.codesigning_allowed: + return 0 + + timer = Timer('\tSigning ' + bundle_path, 'signing_bundle').Start() + command = [ + 'xcrun', + 'codesign', + '-f', + '--timestamp=none', + '-s', + signing_identity, + ] + + if entitlements: + command.extend(['--entitlements', entitlements]) + else: + command.append('--preserve-metadata=entitlements') + + command.append(bundle_path) + + returncode, output = self._RunSubprocess(command) + timer.End() + if returncode: + _PrintXcodeError('Re-sign command %r failed. %s' % (command, output)) + return 800 + returncode + return 0 + + def _ResignTestArtifacts(self): + """Resign test related artifacts that Xcode injected into the outputs.""" + if not self.is_test: + return 0 + # Extract the signing identity from the bundle at the expected output path + # since that's where the signed bundle from bazel was placed. + signing_identity = self._ExtractSigningIdentity(self.artifact_output_path) + if not signing_identity: + return 800 + + exit_code = 0 + timer = Timer('Re-signing injected test host artifacts', + 'resigning_test_host').Start() + + if self.test_host_binary: + # For Unit tests, we need to resign the frameworks that Xcode injected + # into the test host bundle. + test_host_bundle = os.path.dirname(self.test_host_binary) + exit_code = self._ResignXcodeTestFrameworks( + test_host_bundle, signing_identity) + else: + # For UI tests, we need to resign the UI test runner app and the + # frameworks that Xcode injected into the runner app. The UI Runner app + # also needs to be signed with entitlements. + exit_code = self._ResignXcodeTestFrameworks( + self.codesigning_folder_path, signing_identity) + if exit_code == 0: + entitlements_path = self._InstantiateUIRunnerEntitlements() + if entitlements_path: + exit_code = self._ResignBundle( + self.codesigning_folder_path, + signing_identity, + entitlements_path) + else: + _PrintXcodeError('Could not instantiate UI runner entitlements.') + exit_code = 800 + + timer.End() + return exit_code + + def _ResignXcodeTestFrameworks(self, bundle, signing_identity): + """Re-signs the support frameworks injected by Xcode in the given bundle.""" + if not self.codesigning_allowed: + return 0 + + for framework in XCODE_INJECTED_FRAMEWORKS: + framework_path = os.path.join( + bundle, 'Frameworks', framework) + if os.path.isdir(framework_path) or os.path.isfile(framework_path): + exit_code = self._ResignBundle(framework_path, signing_identity) + if exit_code != 0: + return exit_code + return 0 + + def _InstantiateUIRunnerEntitlements(self): + """Substitute team and bundle identifiers into UI runner entitlements. + + This method throws an IOError exception if the template wasn't found in + its expected location, or an OSError if the expected output folder could + not be created. + + Returns: + The path to where the entitlements file was generated. + """ + if not self.codesigning_allowed: + return None + if not os.path.exists(self.derived_sources_folder_path): + os.makedirs(self.derived_sources_folder_path) + + output_file = os.path.join( + self.derived_sources_folder_path, + self.bazel_product_name + '_UIRunner.entitlements') + if os.path.exists(output_file): + os.remove(output_file) + + with io.open( + self.runner_entitlements_template, 'r', encoding='utf-8') as template: + contents = template.read() + contents = contents.replace( + '$(TeamIdentifier)', + self._ExtractSigningTeamIdentifier(self.artifact_output_path)) + contents = contents.replace( + '$(BundleIdentifier)', + self._ExtractSigningBundleIdentifier(self.artifact_output_path)) + with open(output_file, 'w') as output: + output.write(contents) + return output_file + + def _ExtractSigningIdentity(self, signed_bundle): + """Returns the identity used to sign the given bundle path.""" + return self._ExtractSigningAttribute(signed_bundle, 'Authority') + + def _ExtractSigningTeamIdentifier(self, signed_bundle): + """Returns the team identifier used to sign the given bundle path.""" + return self._ExtractSigningAttribute(signed_bundle, 'TeamIdentifier') + + def _ExtractSigningBundleIdentifier(self, signed_bundle): + """Returns the bundle identifier used to sign the given bundle path.""" + return self._ExtractSigningAttribute(signed_bundle, 'Identifier') + + def _ExtractSigningAttribute(self, signed_bundle, attribute): + """Returns the attribute used to sign the given bundle path.""" + if not self.codesigning_allowed: + return '' + + cached = self.codesign_attributes.get(signed_bundle) + if cached: + return cached.Get(attribute) + + timer = Timer('\tExtracting signature for ' + signed_bundle, + 'extracting_signature').Start() + output = subprocess.check_output( + ['xcrun', 'codesign', '-dvv', signed_bundle], + stderr=subprocess.STDOUT, + encoding='utf-8') + timer.End() + + bundle_attributes = CodesignBundleAttributes(output) + self.codesign_attributes[signed_bundle] = bundle_attributes + return bundle_attributes.Get(attribute) + + def _PruneLLDBModuleCache(self, output_files): + """Run the module cache pruner tool as a subprocess.""" + if not os.path.exists(BazelBuildBridge.MODULE_CACHE_PRUNER_EXECUTABLE): + _PrintXcodeWarning( + 'Could find module cache pruner executable at %s. ' + 'You may need to manually remove %s if lldb-rpc-server crashes.' % + (BazelBuildBridge.MODULE_CACHE_PRUNER_EXECUTABLE, + BazelBuildBridge.XCODE_MODULE_CACHE_DIRECTORY)) + return + + timer = Timer('Pruning module cache', 'prune_module_cache').Start() + for output_file in output_files: + self._RunSubprocess([ + BazelBuildBridge.MODULE_CACHE_PRUNER_EXECUTABLE, + BazelBuildBridge.XCODE_MODULE_CACHE_DIRECTORY, output_file + ]) + timer.End() + + def _UpdateLLDBInit(self, clear_source_map=False): + """Updates lldbinit to enable debugging of Bazel binaries.""" + + # An additional lldbinit file that we should load in the lldbinit file + # we are about to write. + additional_lldbinit = None + + if self.custom_lldbinit is None: + # Write our settings to the global ~/.lldbinit-tulsiproj file when no + # custom lldbinit is provided. + lldbinit_file = TULSI_LLDBINIT_FILE + # Make sure a reference to ~/.lldbinit-tulsiproj exists in ~/.lldbinit or + # ~/.lldbinit-Xcode. Priority is given to ~/.lldbinit-Xcode if it exists, + # otherwise the bootstrapping will be written to ~/.lldbinit. + BootstrapLLDBInit(True) + else: + # Remove any reference to ~/.lldbinit-tulsiproj if the global lldbinit was + # previously bootstrapped. This prevents the global lldbinit from having + # side effects on the custom lldbinit file. + BootstrapLLDBInit(False) + # When using a custom lldbinit, Xcode will directly load our custom file + # so write our settings to this custom file. Retain standard Xcode + # behavior by loading the default file in our custom file. + lldbinit_file = self.custom_lldbinit + additional_lldbinit = _FindDefaultLldbInit() + + project_basename = os.path.basename(self.project_file_path) + workspace_root = self._NormalizePath(self.workspace_root) + + with open(lldbinit_file, 'w') as out: + out.write('# This file is autogenerated by Tulsi and should not be ' + 'edited.\n') + + if additional_lldbinit is not None: + out.write('# This loads the default lldbinit file to retain standard ' + 'Xcode behavior.\n') + out.write('command source "%s"\n' % additional_lldbinit) + + out.write('# This sets lldb\'s working directory to the Bazel workspace ' + 'root used by %r.\n' % project_basename) + out.write('platform settings -w "%s"\n' % workspace_root) + + out.write('# This enables implicitly loading Clang modules which can be ' + 'disabled when a Swift module was built with explicit modules ' + 'enabled.\n') + out.write( + 'settings set -- target.swift-extra-clang-flags "-fimplicit-module-maps"\n' + ) + + if clear_source_map: + out.write('settings clear target.source-map\n') + return 0 + + if self.normalized_prefix_map: + source_map = ('./', workspace_root) + out.write('# This maps the normalized root to that used by ' + '%r.\n' % project_basename) + else: + # NOTE: settings target.source-map is different from + # DBGSourcePathRemapping; the former is an LLDB target-level + # remapping API that rewrites breakpoints, the latter is an LLDB + # module-level remapping API that changes DWARF debug info in memory. + # + # If we had multiple remappings, it would not make sense for the + # two APIs to share the same mappings. They have very different + # side-effects in how they individually handle debug information. + source_map = self._ExtractTargetSourceMap() + out.write('# This maps Bazel\'s execution root to that used by ' + '%r.\n' % project_basename) + + out.write('settings set target.source-map "%s" "%s"\n' % source_map) + + return 0 + + def _DWARFdSYMBinaries(self, dsym_bundle_path): + """Returns an array of abs paths to DWARF binaries in the dSYM bundle. + + Args: + dsym_bundle_path: absolute path to the dSYM bundle. + + Returns: + str[]: a list of strings representing the absolute paths to each binary + found within the dSYM bundle. + """ + dwarf_dir = os.path.join(dsym_bundle_path, + 'Contents', + 'Resources', + 'DWARF') + + dsym_binaries = [] + + for f in os.listdir(dwarf_dir): + # Ignore hidden files, such as .DS_Store files. + if not f.startswith('.'): + # Append full path info. + dsym_binary = os.path.join(dwarf_dir, f) + dsym_binaries.append(dsym_binary) + + return dsym_binaries + + def _UUIDInfoForBinary(self, source_binary_path): + """Returns exit code of dwarfdump along with every UUID + arch found. + + Args: + source_binary_path: absolute path to the binary file. + + Returns: + (Int, str[(str, str)]): a tuple containing the return code of dwarfdump + as its first element, and a list of strings + representing each UUID found for each given + binary slice found within the binary with its + given architecture, if no error has occcured. + """ + + returncode, output = self._RunSubprocess( + ['xcrun', 'dwarfdump', '--uuid', source_binary_path]) + if returncode: + _PrintXcodeWarning('dwarfdump returned %d while finding the UUID for %s' + % (returncode, source_binary_path)) + return (returncode, []) + + # All UUIDs for binary slices will be returned as the second from left, + # from output; "UUID: D4DE5AA2-79EE-36FE-980C-755AED318308 (x86_64) + # /Applications/Calendar.app/Contents/MacOS/Calendar" + + uuids_found = [] + for dwarfdump_output in output.split('\n'): + if not dwarfdump_output: + continue + found_output = re.match(r'^(?:UUID: )([^ ]+) \(([^)]+)', dwarfdump_output) + if not found_output: + continue + found_uuid = found_output.group(1) + if not found_uuid: + continue + found_arch = found_output.group(2) + if not found_arch: + continue + uuids_found.append((found_uuid, found_arch)) + + return (0, uuids_found) + + def _CreateUUIDPlist(self, dsym_bundle_path, uuid, arch, source_maps): + """Creates a UUID.plist in a dSYM bundle to redirect sources. + + Args: + dsym_bundle_path: absolute path to the dSYM bundle. + uuid: string representing the UUID of the binary slice with paths to + remap in the dSYM bundle. + arch: the architecture of the binary slice. + source_maps: list of tuples representing all absolute paths to source + files compiled by Bazel as strings ($0) associated with the + paths to Xcode-visible sources used for the purposes of + Tulsi debugging as strings ($1). + + Returns: + Bool: True if no error was found, or False, representing a failure to + write when creating the plist. + """ + + # Create a UUID plist at (dsym_bundle_path)/Contents/Resources/. + remap_plist = os.path.join(dsym_bundle_path, + 'Contents', + 'Resources', + '%s.plist' % uuid) + + # Via an XML plist, add the mappings from _ExtractTargetSourceMap(). + try: + with open(remap_plist, 'w') as out: + out.write('\n' + '\n' + '\n' + '\n' + 'DBGSourcePathRemapping\n' + '\n') + for source_map in source_maps: + # Add the mapping as a DBGSourcePathRemapping to the UUID plist here. + out.write('%s\n%s\n' % source_map) + + # Make sure that we also set DBGVersion to 3. + out.write('\n' + 'DBGVersion\n' + '3\n' + '\n' + '\n') + except OSError as e: + _PrintXcodeError('Failed to write %s, received error %s' % + (remap_plist, e)) + return False + + # Update the dSYM symbol cache with a reference to this dSYM bundle. + if self.update_symbol_cache is not None: + err_msg = self.update_symbol_cache.UpdateUUID(uuid, + dsym_bundle_path, + arch) + if err_msg: + _PrintXcodeWarning('Attempted to save (uuid, dsym_bundle_path, arch) ' + 'to DBGShellCommands\' dSYM cache, but got error ' + '\"%s\".' % err_msg) + + return True + + def _CleanExistingDSYMs(self): + """Clean dSYM bundles that were left over from a previous build.""" + + output_dir = self.built_products_dir + output_dir_list = os.listdir(output_dir) + for item in output_dir_list: + if item.endswith('.dSYM'): + shutil.rmtree(os.path.join(output_dir, item)) + + def _PlistdSYMPaths(self, dsym_bundle_path): + """Adds Plists to a given dSYM bundle to redirect DWARF data.""" + + # Retrieve the paths that we are expected to remap. + + # Always include a direct path from the execroot to Xcode-visible sources. + source_maps = [self._ExtractTargetSourceMap()] + + # Remap relative paths from the workspace root. + if self.normalized_prefix_map: + # Take the normalized path and map that to Xcode-visible sources. + source_maps.append(('./', self._NormalizePath(self.workspace_root))) + + # Find the binaries within the dSYM bundle. UUIDs will match that of the + # binary it was based on. + dsym_binaries = self._DWARFdSYMBinaries(dsym_bundle_path) + + if not dsym_binaries: + _PrintXcodeWarning('Could not find the binaries that the dSYM %s was ' + 'based on to determine DWARF binary slices to patch. ' + 'Debugging will probably fail.' % (dsym_bundle_path)) + return 404 + + # Find the binary slice UUIDs with dwarfdump from each binary. + for source_binary_path in dsym_binaries: + + returncode, uuid_info_found = self._UUIDInfoForBinary(source_binary_path) + if returncode: + return returncode + + # Create a plist per UUID, each indicating a binary slice to remap paths. + for uuid, arch in uuid_info_found: + plist_created = self._CreateUUIDPlist(dsym_bundle_path, + uuid, + arch, + source_maps) + if not plist_created: + return 405 + + return 0 + + def _NormalizePath(self, path): + """Returns paths with a common form, normalized with a trailing slash. + + Args: + path: a file system path given in the form of a string. + + Returns: + str: a normalized string with a trailing slash, based on |path|. + """ + return os.path.normpath(path) + os.sep + + def _ExtractTargetSourceMap(self, normalize=True): + """Extracts the source path as a tuple associated with the WORKSPACE path. + + Args: + normalize: Defines if all paths should be normalized. Preferred for APIs + like DBGSourcePathRemapping and target.source-map but won't + work for the purposes of -fdebug-prefix-map. + + Returns: + None: if an error occurred. + (str, str): a single tuple representing all absolute paths to source + files compiled by Bazel as strings ($0) associated with + the paths to Xcode-visible sources used for the purposes + of Tulsi debugging as strings ($1). + """ + # All paths route to the "workspace root" for sources visible from Xcode. + sm_destpath = self.workspace_root + if normalize: + sm_destpath = self._NormalizePath(sm_destpath) + + # Add a redirection for the Bazel execution root, the path where sources + # are referenced by Bazel. + sm_execroot = self.bazel_exec_root + if normalize: + sm_execroot = self._NormalizePath(sm_execroot) + return (sm_execroot, sm_destpath) + + def _LinkTulsiToBazel(self, symlink_name, destination): + """Links symlink_name (in project/.tulsi) to the specified destination.""" + symlink_path = os.path.join(self.project_file_path, + '.tulsi', + symlink_name) + if os.path.islink(symlink_path): + os.unlink(symlink_path) + os.symlink(destination, symlink_path) + if not os.path.exists(symlink_path): + _PrintXcodeError( + 'Linking %s to %s failed.' % (symlink_path, destination)) + return -1 + + @staticmethod + def _SplitPathComponents(path): + """Splits the given path into an array of all of its components.""" + components = path.split(os.sep) + # Patch up the first component if path started with an os.sep + if not components[0]: + components[0] = os.sep + return components + + def _RunSubprocess(self, cmd): + """Runs the given command as a subprocess, returning (exit_code, output).""" + self._PrintVerbose('%r' % cmd, 1) + process = subprocess.Popen( + cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, encoding='utf-8') + output, _ = process.communicate() + return (process.returncode, output) + + def _PrintVerbose(self, msg, level=0): + if self.verbose > level: + _PrintUnbuffered(msg) + + +def main(argv): + build_settings = bazel_build_settings.BUILD_SETTINGS + if build_settings is None: + _Fatal('Unable to resolve build settings. Please report a Tulsi bug.') + return 1 + return BazelBuildBridge(build_settings).Run(argv) + + +if __name__ == '__main__': + # Register the interrupt handler immediately in case we receive SIGINT while + # trying to acquire the lock. + signal.signal(signal.SIGINT, _InterruptHandler) + _LockFileAcquire(_LockFileCreate()) + _logger = tulsi_logging.Logger() + logger_warning = tulsi_logging.validity_check() + if logger_warning: + _PrintXcodeWarning(logger_warning) + _timer = Timer('Everything', 'complete_build').Start() + _exit_code = main(sys.argv) + _timer.End() + sys.exit(_exit_code) diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/bazel_build_events.py b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/bazel_build_events.py new file mode 100755 index 000000000..cc6e3c543 --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/bazel_build_events.py @@ -0,0 +1,136 @@ +# Copyright 2017 The Tulsi 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. + +"""Parses a stream of JSON build event protocol messages from a file.""" + +import json + + +class _FileLineReader(object): + """Reads lines from a streaming file. + + This will repeatedly check the file for an entire line to read. It will + buffer partial lines until they are completed. + This is meant for files that are being modified by an long-living external + program. + """ + + def __init__(self, file_obj): + """Creates a new FileLineReader object. + + Args: + file_obj: The file object to watch. + + Returns: + A FileLineReader instance. + """ + self._file_obj = file_obj + self._buffer = [] + + def check_for_changes(self): + """Checks the file for any changes, returning the line read if any.""" + line = self._file_obj.readline() + self._buffer.append(line) + + # Only parse complete lines. + if not line.endswith('\n'): + return None + full_line = ''.join(self._buffer) + del self._buffer[:] + return full_line + + +class BazelBuildEvent(object): + """Represents a Bazel Build Event. + + Public Properties: + event_dict: the source dictionary for this event. + stdout: stdout string, if any. + stderr: stderr string, if any. + files: list of file URIs. + """ + + def __init__(self, event_dict): + """Creates a new BazelBuildEvent object. + + Args: + event_dict: Dictionary representing a build event + + Returns: + A BazelBuildEvent instance. + """ + self.event_dict = event_dict + self.stdout = None + self.stderr = None + self.files = [] + if 'progress' in event_dict: + self._update_fields_for_progress(event_dict['progress']) + if 'namedSetOfFiles' in event_dict: + self._update_fields_for_named_set_of_files(event_dict['namedSetOfFiles']) + + def _update_fields_for_progress(self, progress_dict): + self.stdout = progress_dict.get('stdout') + self.stderr = progress_dict.get('stderr') + + def _update_fields_for_named_set_of_files(self, named_set): + files = named_set.get('files', []) + for file_obj in files: + uri = file_obj.get('uri', '') + if uri.startswith('file://'): + self.files.append(uri[7:]) + + +class BazelBuildEventsWatcher(object): + """Watches a build events JSON file.""" + + def __init__(self, json_file, warning_handler=None): + """Creates a new BazelBuildEventsWatcher object. + + Args: + json_file: The JSON file object to watch. + warning_handler: Handler function for warnings accepting a single string. + + Returns: + A BazelBuildEventsWatcher instance. + """ + self.file_reader = _FileLineReader(json_file) + self.warning_handler = warning_handler + self._read_any_events = False + + def has_read_events(self): + return self._read_any_events + + def check_for_new_events(self): + """Checks the file for new BazelBuildEvents. + + Returns: + A list of all new BazelBuildEvents. + """ + new_events = [] + while True: + line = self.file_reader.check_for_changes() + if not line: + break + try: + build_event_dict = json.loads(line) + except (UnicodeDecodeError, ValueError) as e: + handler = self.warning_handler + if handler: + handler('Could not decode BEP event "%s"\n' % line) + handler('Received error of %s, "%s"\n' % (type(e), e)) + break + self._read_any_events = True + build_event = BazelBuildEvent(build_event_dict) + new_events.append(build_event) + return new_events diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/bazel_build_settings.py b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/bazel_build_settings.py new file mode 100644 index 000000000..dc3951fab --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/bazel_build_settings.py @@ -0,0 +1,274 @@ +# Copyright 2018 The Tulsi 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. +# +# +# Generated by Tulsi to resolve flags during builds. + + +import sys + + +def _StandardizeTargetLabel(label): + """Convert labels of form //dir/target to //dir/target:target.""" + if label is None: + return label + if not label.startswith('//') and not label.startswith('@'): + sys.stderr.write('[WARNING] Target label "{0}" is not fully qualified. ' + 'Labels should start with "@" or "//".\n\n'.format(label)) + sys.stderr.flush() + tokens = label.rsplit('/', 1) + if len(tokens) <= 1: + return label + + target_base = tokens[0] + target = tokens[1] + + if '...' in target or ':' in target: + return label + return label + ':' + target + + +class BazelFlags(object): + """Represents Bazel flags.""" + + def __init__(self, startup = [], build = []): + self.startup = startup + self.build = build + + +class BazelFlagsSet(object): + """Represents a set of Bazel flags which can vary by compilation mode.""" + + def __init__(self, debug = None, release = None, flags = None): + if debug is None: + debug = flags or BazelFlags() + if release is None: + release = flags or BazelFlags() + + self.debug = debug + self.release = release + + def flags(self, is_debug): + """Returns the proper flags (either debug or release).""" + return self.debug if is_debug else self.release + + +class BazelBuildSettings(object): + """Represents a Tulsi project's Bazel settings.""" + + def __init__(self, bazel, bazelExecRoot, bazelOutputBase, + defaultPlatformConfigId, platformConfigFlags, + swiftTargets, + cacheAffecting, cacheSafe, + swiftOnly, nonSwiftOnly, + swiftFeatures, nonSwiftFeatures, + projDefault, projTargetMap): + self.bazel = bazel + self.bazelExecRoot = bazelExecRoot + self.bazelOutputBase = bazelOutputBase + self.defaultPlatformConfigId = defaultPlatformConfigId + self.platformConfigFlags = platformConfigFlags + self.swiftTargets = swiftTargets + self.cacheAffecting = cacheAffecting + self.cacheSafe = cacheSafe + self.swiftOnly = swiftOnly + self.nonSwiftOnly = nonSwiftOnly + self.swiftFeatures = swiftFeatures + self.nonSwiftFeatures = nonSwiftFeatures + self.projDefault = projDefault + self.projTargetMap = projTargetMap + + def features_for_target(self, target, is_swift_override=None): + """Returns an array of enabled features for the given target.""" + + target = _StandardizeTargetLabel(target) + is_swift = target in self.swiftTargets + if is_swift_override is not None: + is_swift = is_swift_override + + return self.swiftFeatures if is_swift else self.nonSwiftFeatures + + def flags_for_target(self, target, is_debug, + config, is_swift_override=None): + """Returns (bazel, startup flags, build flags) for the given target.""" + + target = _StandardizeTargetLabel(target) + target_flag_set = self.projTargetMap.get(target) + if not target_flag_set: + target_flag_set = self.projDefault + + is_swift = target in self.swiftTargets + if is_swift_override is not None: + is_swift = is_swift_override + lang = self.swiftOnly if is_swift else self.nonSwiftOnly + + config_flags = self.platformConfigFlags[config] + cache_affecting = self.cacheAffecting.flags(is_debug) + cache_safe = self.cacheSafe.flags(is_debug) + target = target_flag_set.flags(is_debug) + lang = lang.flags(is_debug) + + startupFlags = [] + startupFlags.extend(target.startup) + startupFlags.extend(cache_safe.startup) + startupFlags.extend(cache_affecting.startup) + startupFlags.extend(lang.startup) + + buildFlags = [] + buildFlags.extend(target.build) + buildFlags.extend(config_flags) + buildFlags.extend(cache_safe.build) + buildFlags.extend(cache_affecting.build) + buildFlags.extend(lang.build) + + return (self.bazel, startupFlags, buildFlags) + +# Default value in case the template does not behave as expected. +BUILD_SETTINGS = None + +# Generated by Tulsi. DO NOT EDIT. +BUILD_SETTINGS = BazelBuildSettings( + '/opt/homebrew/Cellar/bazelisk/1.12.0/bin/bazelisk', + '/private/var/tmp/_bazel_wangrenzhu/b244be861f40c753b454f38ce4e943dc/execroot/mediapipe', + '/private/var/tmp/_bazel_wangrenzhu/b244be861f40c753b454f38ce4e943dc', + 'ios_arm64', + { + 'ios_sim_arm64': [ + '--apple_platform_type=ios', + '--cpu=ios_sim_arm64', + '--watchos_cpus=armv7k', + ], + 'watchos_armv7k': [ + '--apple_platform_type=watchos', + '--watchos_cpus=armv7k,arm64_32', + ], + 'ios_armv7': [ + '--apple_platform_type=ios', + '--cpu=ios_armv7', + '--watchos_cpus=armv7k', + ], + 'ios_arm64': [ + '--apple_platform_type=ios', + '--cpu=ios_arm64', + '--watchos_cpus=armv7k,arm64_32', + ], + 'macos_arm64e': [ + '--apple_platform_type=macos', + '--cpu=darwin_arm64e', + ], + 'ios_i386': [ + '--apple_platform_type=ios', + '--cpu=ios_i386', + '--watchos_cpus=i386', + ], + 'watchos_x86_64': [ + '--apple_platform_type=watchos', + '--watchos_cpus=i386', + ], + 'ios_arm64e': [ + '--apple_platform_type=ios', + '--cpu=ios_arm64e', + '--watchos_cpus=armv7k,arm64_32', + ], + 'tvos_x86_64': [ + '--apple_platform_type=tvos', + '--tvos_cpus=x86_64', + ], + 'tvos_arm64': [ + '--apple_platform_type=tvos', + '--tvos_cpus=arm64', + ], + 'watchos_i386': [ + '--apple_platform_type=watchos', + '--watchos_cpus=i386', + ], + 'watchos_arm64_32': [ + '--apple_platform_type=watchos', + '--watchos_cpus=armv7k,arm64_32', + ], + 'ios_x86_64': [ + '--apple_platform_type=ios', + '--cpu=ios_x86_64', + '--watchos_cpus=i386', + ], + 'macos_x86_64': [ + '--apple_platform_type=macos', + '--cpu=darwin_x86_64', + ], + 'macos_arm64': [ + '--apple_platform_type=macos', + '--cpu=darwin_arm64', + ], + }, + set(), + BazelFlagsSet( + debug = BazelFlags( + startup = [], + build = [ + '--override_repository=tulsi=/Users/wangrenzhu/Library/Application Support/Tulsi/0.20220209.88/Bazel', + '--compilation_mode=dbg', + '--define=apple.add_debugger_entitlement=1', + '--define=apple.propagate_embedded_extra_outputs=1', + ], + ), + release = BazelFlags( + startup = [], + build = [ + '--override_repository=tulsi=/Users/wangrenzhu/Library/Application Support/Tulsi/0.20220209.88/Bazel', + '--compilation_mode=opt', + '--strip=always', + '--apple_generate_dsym', + '--define=apple.add_debugger_entitlement=1', + '--define=apple.propagate_embedded_extra_outputs=1', + ], + ), + ), + BazelFlagsSet( + flags = BazelFlags( + startup = [], + build = [ + '--announce_rc', + ], + ), + ), + BazelFlagsSet( + flags = BazelFlags( + startup = [], + build = [ + '--define=apple.experimental.tree_artifact_outputs=1', + '--features=debug_prefix_map_pwd_is_dot', + ], + ), + ), + BazelFlagsSet( + flags = BazelFlags( + startup = [], + build = [ + '--define=apple.experimental.tree_artifact_outputs=1', + '--features=debug_prefix_map_pwd_is_dot', + ], + ), + ), + [ + 'TreeArtifactOutputs', + 'DebugPathNormalization', + ], + [ + 'TreeArtifactOutputs', + 'DebugPathNormalization', + ], + BazelFlagsSet(), + {}, +) + diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/bazel_clean.sh b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/bazel_clean.sh new file mode 100755 index 000000000..7bd3291e2 --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/bazel_clean.sh @@ -0,0 +1,54 @@ +#!/bin/bash +# Copyright 2016 The Tulsi 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. +# +# +# Bridge between Xcode and Bazel for the "clean" action. +# +# Usage: bazel_clean.sh +# Note that the ACTION environment variable is expected to be set to "clean". + +set -eu + +readonly bazel_executable="$1"; shift +readonly bazel_bin_dir="$1"; shift + +if [ -z $# ]; then + readonly arguments=(clean) +else + readonly arguments=("$@" clean) +fi + +if [[ "${ACTION}" != "clean" ]]; then + exit 0 +fi + +# Removes a directory if it exists and is not a symlink. +function remove_dir() { + directory="$1" + + if [[ -d "${directory}" && ! -L "${directory}" ]]; then + rm -r "${directory}" + fi +} + +# Xcode may have generated a bazel-bin directory after a previous clean. +# Remove it to prevent a useless warning. +remove_dir "${bazel_bin_dir}" + +( + set -x + "${bazel_executable}" "${arguments[@]}" +) + diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/bazel_options.py b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/bazel_options.py new file mode 100755 index 000000000..dc05b0554 --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/bazel_options.py @@ -0,0 +1,42 @@ +# Copyright 2017 The Tulsi 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. + +"""Logic to translate Xcode options to Bazel options.""" + + +class BazelOptions(object): + """Converts Xcode features into Bazel command line flags.""" + + def __init__(self, xcode_env): + """Creates a new BazelOptions object. + + Args: + xcode_env: A dictionary of Xcode environment variables. + + Returns: + A BazelOptions instance. + """ + self.xcode_env = xcode_env + + def bazel_feature_flags(self): + """Returns a list of bazel flags for the current Xcode env configuration.""" + flags = [] + if self.xcode_env.get('ENABLE_ADDRESS_SANITIZER') == 'YES': + flags.append('--features=asan') + if self.xcode_env.get('ENABLE_THREAD_SANITIZER') == 'YES': + flags.append('--features=tsan') + if self.xcode_env.get('ENABLE_UNDEFINED_BEHAVIOR_SANITIZER') == 'YES': + flags.append('--features=ubsan') + + return flags diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/bootstrap_lldbinit.py b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/bootstrap_lldbinit.py new file mode 100755 index 000000000..e474cd6b4 --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/bootstrap_lldbinit.py @@ -0,0 +1,187 @@ +#!/usr/bin/python3 +# Copyright 2018 The Tulsi 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. + +"""Bootstraps the presence and setup of ~/.lldbinit-tulsiproj.""" + +import io +import os +import shutil +import sys + + +TULSI_LLDBINIT_FILE = os.path.expanduser('~/.lldbinit-tulsiproj') + +CHANGE_NEEDED = 0 +NO_CHANGE = 1 +NOT_FOUND = 2 + + +class BootstrapLLDBInit(object): + """Bootstrap Xcode's preferred lldbinit for Bazel debugging.""" + + def _ExtractLLDBInitContent(self, lldbinit_path, source_string, + add_source_string): + """Extracts non-Tulsi content in a given lldbinit if needed. + + Args: + lldbinit_path: Absolute path to the lldbinit we are writing to. + source_string: String that we wish to write or remove from the lldbinit. + add_source_string: Boolean indicating whether we intend to write or remove + the source string. + + Returns: + (int, [string]): A tuple featuring the status code along with the list + of strings representing content to write to lldbinit + that does not account for the Tulsi-generated strings. + Status code will be 0 if Tulsi-generated strings are + not all there. Status code will be 1 if we intend to + write Tulsi strings and all strings were accounted for. + Alternatively, if we intend to remove the Tulsi strings, + the status code will be 1 if none of the strings were + found. Status code will be 2 if the lldbinit file could + not be found. + """ + if not os.path.isfile(lldbinit_path): + return (NOT_FOUND, []) + content = [] + with open(lldbinit_path) as f: + ignoring = False + + # Split on the newline. This works as long as the last string isn't + # suffixed with \n. + source_lines = source_string.split('\n') + + source_idx = 0 + + # If the last line was suffixed with \n, last elements would be length + # minus 2, accounting for the extra \n. + source_last = len(source_lines) - 1 + + for line in f: + + # For each line found matching source_string, increment the iterator + # and do not append that line to the list. + if source_idx <= source_last and source_lines[source_idx] in line: + + # If we intend to write the source string and all lines were found, + # return an error code with empty content. + if add_source_string and source_idx == source_last: + return (NO_CHANGE, []) + + # Increment for each matching line found. + source_idx += 1 + ignoring = True + + if ignoring: + + # If the last line was found... + if source_lines[source_last] in line: + # Stop ignoring lines and continue appending to content. + ignoring = False + continue + + # If the line could not be found within source_string, append to the + # content array. + content.append(line) + + # If we intend to remove the source string and none of the lines to remove + # were found, return an error code with empty content. + if not add_source_string and source_idx == 0: + return (NO_CHANGE, []) + + return (CHANGE_NEEDED, content) + + def _LinkTulsiLLDBInit(self, add_source_string): + """Adds or removes a reference to ~/.lldbinit-tulsiproj to the primary lldbinit file. + + Xcode 8+ executes the contents of the first available lldbinit on startup. + To help work around this, an external reference to ~/.lldbinit-tulsiproj is + added to that lldbinit. This causes Xcode's lldb-rpc-server to load the + possibly modified contents between Debug runs of any given app. Note that + this only happens after a Debug session terminates; the cache is only fully + invalidated after Xcode is relaunched. + + Args: + add_source_string: Boolean indicating whether we intend to write or remove + the source string. + """ + + # ~/.lldbinit-Xcode is the only lldbinit file that Xcode will read if it is + # present, therefore it has priority. + lldbinit_path = os.path.expanduser('~/.lldbinit-Xcode') + if not os.path.isfile(lldbinit_path): + # If ~/.lldbinit-Xcode does not exist, write the reference to + # ~/.lldbinit-tulsiproj to ~/.lldbinit, the second lldbinit file that + # Xcode will attempt to read if ~/.lldbinit-Xcode isn't present. + lldbinit_path = os.path.expanduser('~/.lldbinit') + + # String that we plan to inject or remove from this lldbinit. + source_string = ('# LLDB bridge [:\n' + '# This was autogenerated by Tulsi in order to modify ' + 'LLDB source-maps at build time.\n' + 'command source %s\n' % TULSI_LLDBINIT_FILE + + '# ]: LLDB bridge') + + # Retrieve the contents of lldbinit if applicable along with a return code. + return_code, content = self._ExtractLLDBInitContent(lldbinit_path, + source_string, + add_source_string) + + out = io.StringIO() + + if add_source_string: + if return_code == CHANGE_NEEDED: + # Print the existing contents of this ~/.lldbinit without any malformed + # tulsi lldbinit block, and add the correct tulsi lldbinit block to the + # end of it. + for line in content: + out.write(line) + elif return_code == NO_CHANGE: + # If we should ignore the contents of this lldbinit, and it has the + # association with ~/.lldbinit-tulsiproj that we want, do not modify it. + return + + # Add a newline after the source_string for protection from other elements + # within the lldbinit file. + out.write(source_string + '\n') + else: + if return_code != CHANGE_NEEDED: + # The source string was not found in the lldbinit so do not modify it. + return + + # Print the existing contents of this ~/.lldbinit without the tulsi + # lldbinit block. + for line in content: + out.write(line) + + out.seek(0, os.SEEK_END) + if out.tell() == 0: + # The file did not contain any content other than the source string so + # remove the file altogether. + os.remove(lldbinit_path) + return + + with open(lldbinit_path, 'w') as outfile: + out.seek(0) + # Negative length to make copyfileobj write the whole file at once. + shutil.copyfileobj(out, outfile, -1) + + def __init__(self, do_inject_link=True): + self._LinkTulsiLLDBInit(do_inject_link) + + +if __name__ == '__main__': + BootstrapLLDBInit() + sys.exit(0) diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/clang_stub.sh b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/clang_stub.sh new file mode 100755 index 000000000..ca7548d25 --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/clang_stub.sh @@ -0,0 +1,37 @@ +#!/bin/bash +# Copyright 2022 The Tulsi 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. +# +# Stub for Xcode's clang invocations to avoid compilation but still create the +# expected compiler outputs. + +set -eu + +while test $# -gt 0 +do + case $1 in + -MF|--serialize-diagnostics) + # TODO: See if we can create a valid diagnostics file (it appear to be + # LLVM bitcode), currently we get warnings like: + # file.dia:1:1: Could not read serialized diagnostics file: error("Invalid diagnostics signature") + shift + touch $1 + ;; + *.o) + break + ;; + esac + + shift +done diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/install_genfiles.py b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/install_genfiles.py new file mode 100755 index 000000000..2bf32c9c0 --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/install_genfiles.py @@ -0,0 +1,103 @@ +#!/usr/bin/python3 +# Copyright 2018 The Tulsi 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. + +"""Symlinks files generated by Bazel into bazel-tulsi-includes for indexing.""" + + +import json +import os +import shutil +import sys + + +class Installer(object): + """Symlinks generated files into bazel-tulsi-includes.""" + + def __init__(self, bazel_exec_root, preserve_tulsi_includes=True, + output_root=None): + """Initializes the installer with the proper Bazel paths.""" + + self.bazel_exec_root = bazel_exec_root + self.preserve_tulsi_includes = preserve_tulsi_includes + # The folder must begin with an underscore as otherwise Bazel will delete + # it whenever it builds. See tulsi_aspects.bzl for futher explanation. + if not output_root: + output_root = bazel_exec_root + self.tulsi_root = os.path.join(output_root, 'bazel-tulsi-includes') + + def PrepareTulsiIncludes(self): + """Creates tulsi includes, possibly removing the old folder.""" + + tulsi_root = self.tulsi_root + if not self.preserve_tulsi_includes and os.path.exists(tulsi_root): + shutil.rmtree(tulsi_root) + if not os.path.exists(tulsi_root): + os.mkdir(tulsi_root) + + def InstallForTulsiouts(self, tulsiouts): + """Creates tulsi includes and symlinks generated sources.""" + self.PrepareTulsiIncludes() + + for file_path in tulsiouts: + try: + output_data = json.load(open(file_path)) + self.InstallForData(output_data) + except (ValueError, IOError) as e: + print('Failed to load output data file "%s". %s' % (file_path, e)) + + def InstallForData(self, output_data): + """Symlinks generated sources present in the output_data.""" + bazel_exec_root = self.bazel_exec_root + tulsi_root = self.tulsi_root + + for gs in output_data['generated_sources']: + real_path, link_path = gs + src = os.path.join(bazel_exec_root, real_path) + + # Bazel outputs are not guaranteed to be created if nothing references + # them. This check skips the processing if an output was declared + # but not created. + if not os.path.exists(src): + continue + + # The /x/x/ part is here to match the number of directory components + # between tulsi root and bazel root. See tulsi_aspects.bzl for futher + # explanation. + dst = os.path.join(tulsi_root, 'x/x/', link_path) + + dst_dir = os.path.dirname(dst) + if not os.path.exists(dst_dir): + os.makedirs(dst_dir) + + # It's important to use lexists() here in case dst is a broken symlink + # (in which case exists() would return False). + if os.path.lexists(dst): + # Don't need to do anything if the link hasn't changed. + if os.readlink(dst) == src: + continue + + # Link changed; must remove it otherwise os.symlink will fail. + os.unlink(dst) + + os.symlink(src, dst) + + +if __name__ == '__main__': + if len(sys.argv) < 3: + sys.stderr.write('usage: %s ' + '<.tulsiouts JSON files>\n' % sys.argv[0]) + exit(1) + + Installer(sys.argv[1]).InstallForTulsiouts(sys.argv[2:]) diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/ld_stub.sh b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/ld_stub.sh new file mode 100755 index 000000000..1fd6bc6be --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/ld_stub.sh @@ -0,0 +1,33 @@ +#!/bin/bash +# Copyright 2022 The Tulsi 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. +# +# Stub for Xcode's ld invocations to avoid linking but still create the expected +# linker outputs. + +set -eu + +while test $# -gt 0 +do + case $1 in + *.dat) + # Create an empty .dat file containing just a simple header. + echo -n -e '\x00lld\0' > $1 + ;; + *) + ;; + esac + + shift +done diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/swiftc_stub.py b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/swiftc_stub.py new file mode 100755 index 000000000..2988460c2 --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/swiftc_stub.py @@ -0,0 +1,76 @@ +#!/usr/bin/python3 +# Copyright 2022 The Tulsi 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. + +"""Stub to avoid swiftc but create the expected swiftc outputs.""" + +import json +import os +import pathlib +import subprocess +import sys + + +def _TouchFile(filepath): + """Touch the given file: create if necessary and update its mtime.""" + pathlib.Path(filepath).touch() + + +def _HandleOutputMapFile(filepath): + # Touch all output files referenced in the map. See the documentation here: + # https://github.com/apple/swift/blob/main/docs/Driver.md#output-file-maps + with open(filepath, 'rb') as file: + output_map = json.load(file) + for single_file_outputs in output_map.values(): + for output in single_file_outputs.values(): + _TouchFile(output) + + +def _CreateModuleFiles(module_path): + _TouchFile(module_path) + filename_no_ext = os.path.splitext(module_path)[0] + _TouchFile(filename_no_ext + '.swiftdoc') + _TouchFile(filename_no_ext + '.swiftsourceinfo') + + +def main(args): + # Xcode may call `swiftc -v` which we need to pass through. + if args == ['-v'] or args == ['--version']: + return subprocess.call(['swiftc', '-v']) + + index = 0 + num_args = len(args) + # Compare against length - 1 since we only care about arguments which come in + # pairs. + while index < num_args - 1: + cur_arg = args[index] + + if cur_arg == '-output-file-map': + index += 1 + output_file_map = args[index] + _HandleOutputMapFile(output_file_map) + elif cur_arg == '-emit-module-path': + index += 1 + module_path = args[index] + _CreateModuleFiles(module_path) + elif cur_arg == '-emit-objc-header-path': + index += 1 + header_path = args[index] + _TouchFile(header_path) + index += 1 + return 0 + + +if __name__ == '__main__': + sys.exit(main(sys.argv[1:])) diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/symbol_cache_schema.py b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/symbol_cache_schema.py new file mode 100755 index 000000000..48101d75e --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/symbol_cache_schema.py @@ -0,0 +1,119 @@ +#!/usr/bin/python3 +# Copyright 2018 The Tulsi 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. + +"""Manages our dSYM SQLite database schema.""" + +import errno +import os +import sqlite3 + + +SQLITE_SYMBOL_CACHE_PATH = os.path.expanduser('~/Library/Application Support/' + 'Tulsi/Scripts/symbol_cache.db') + + +class SymbolCacheSchema(object): + """Defines and updates the SQLite database used for DBGShellCommands.""" + + current_version = 1 + + def UpdateSchemaV1(self, connection): + """Updates the database to the v1 schema. + + Args: + connection: Connection to the database that needs to be updated. + + Returns: + True if the database reported that it was updated to v1. + False if not. + """ + # Create the table (schema version 1). + cursor = connection.cursor() + cursor.execute('CREATE TABLE symbol_cache(' + 'uuid TEXT PRIMARY KEY, ' + 'dsym_path TEXT, ' + 'architecture TEXT' + ');') + # NOTE: symbol_cache (uuid) already has an index, as the PRIMARY KEY. + # Create a unique index to keep dSYM paths and architectures unique. + cursor.execute('CREATE UNIQUE INDEX idx_dsym_arch ' + 'ON ' + 'symbol_cache(' + 'dsym_path, ' + 'architecture' + ');') + cursor.execute('PRAGMA user_version = 1;') + + # Verify the updated user_version, as confirmation of the update. + cursor.execute('PRAGMA user_version;') + return cursor.fetchone()[0] == 1 + + def VerifySchema(self, connection): + """Updates the database to the latest schema. + + Args: + connection: Connection to the database that needs to be updated. + + Returns: + True if the database reported that it was updated to the latest schema. + False if not. + """ + cursor = connection.cursor() + cursor.execute('PRAGMA user_version;') # Default is 0 + db_version = cursor.fetchone()[0] + + # Update to the latest schema in the given database, if necessary. + if db_version < self.current_version: + # Future schema updates will build on this. + if self.UpdateSchemaV1(connection): + db_version = 1 + + # Return if the database has been updated to the latest schema. + return db_version == self.current_version + + def InitDB(self, db_path): + """Initializes a new connection to a SQLite database. + + Args: + db_path: String representing a reference to the SQLite database. + + Returns: + A sqlite3.connection object representing an active connection to + the database referenced by db_path. + """ + # If this is not an in-memory SQLite database... + if ':memory:' not in db_path: + # Create all subdirs before we create a new db or connect to existing. + if not os.path.isfile(db_path): + try: + os.makedirs(os.path.dirname(db_path)) + except OSError as e: + if e.errno != errno.EEXIST: + raise + + connection = sqlite3.connect(db_path) + + # Update to the latest schema and return the db connection. + if self.VerifySchema(connection): + return connection + else: + return None + + def __init__(self, db_path=SQLITE_SYMBOL_CACHE_PATH): + self.connection = self.InitDB(db_path) + + def __del__(self): + if self.connection: + self.connection.close() diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/tulsi_logging.py b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/tulsi_logging.py new file mode 100755 index 000000000..9b72cb299 --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/tulsi_logging.py @@ -0,0 +1,77 @@ +# Copyright 2017 The Tulsi 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. + +"""Logging routines used by Tulsi scripts.""" + +import logging +import logging.handlers +import os +import sys + + +def validity_check(): + """Returns a warning message from logger initialization, if applicable.""" + return None + + +class Logger(object): + """Tulsi specific logging.""" + + def __init__(self): + logging_dir = os.path.expanduser('~/Library/Application Support/Tulsi') + if not os.path.exists(logging_dir): + os.mkdir(logging_dir) + + logfile = os.path.join(logging_dir, 'build_log.txt') + + # Currently only creates a single logger called 'tulsi_logging'. If + # additional loggers are needed, consider adding a name attribute to the + # Logger. + self._logger = logging.getLogger('tulsi_logging') + self._logger.setLevel(logging.INFO) + + try: + file_handler = logging.handlers.RotatingFileHandler(logfile, + backupCount=20) + file_handler.setLevel(logging.INFO) + # Create a new log file for each build. + file_handler.doRollover() + self._logger.addHandler(file_handler) + except (IOError, OSError) as err: + filename = 'none' + if hasattr(err, 'filename'): + filename = err.filename + sys.stderr.write('Failed to set up logging to file: %s (%s).\n' % + (os.strerror(err.errno), filename)) + sys.stderr.flush() + + console = logging.StreamHandler() + console.setLevel(logging.INFO) + self._logger.addHandler(console) + + def log_bazel_message(self, message): + self._logger.info(message) + + def log_action(self, action_name, action_id, seconds, start=None, end=None): + """Logs the start, duration, and end of an action.""" + del action_id # Unused by this logger. + if start: + self._logger.info('<**> %s start: %f', action_name, start) + + # Log to file and print to stdout for display in the Xcode log. + self._logger.info('<*> %s completed in %0.3f ms', + action_name, seconds * 1000) + + if end: + self._logger.info('<**> %s end: %f', action_name, end) diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/update_symbol_cache.py b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/update_symbol_cache.py new file mode 100644 index 000000000..b1acd779c --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/update_symbol_cache.py @@ -0,0 +1,54 @@ +#!/usr/bin/python3 +# Copyright 2018 The Tulsi 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. + +"""Update the Tulsi dSYM symbol cache.""" + +import sqlite3 +from symbol_cache_schema import SQLITE_SYMBOL_CACHE_PATH +from symbol_cache_schema import SymbolCacheSchema + + +class UpdateSymbolCache(object): + """Provides a common interface to update a UUID referencing a dSYM.""" + + def UpdateUUID(self, uuid, dsym_path, arch): + """Updates a given UUID entry in the database. + + Args: + uuid: A UUID representing a binary slice in the dSYM bundle. + dsym_path: An absolute path to the dSYM bundle. + arch: The binary slice's architecture. + + Returns: + None: If no error occurred in inserting the new set of values. + String: If a sqlite3.error was raised upon attempting to store new + values into the dSYM cache. + """ + con = self.cache_schema.connection + cur = con.cursor() + # Relies on the UNIQUE constraint between dsym_path + architecture to + # update the UUID if dsym_path and arch match an existing pair, or + # create a new row if this combination of dsym_path and arch is unique. + try: + cur.execute('INSERT OR REPLACE INTO symbol_cache ' + '(uuid, dsym_path, architecture) ' + 'VALUES("%s", "%s", "%s");' % (uuid, dsym_path, arch)) + con.commit() + except sqlite3.Error as e: + return e.message + return None + + def __init__(self, db_path=SQLITE_SYMBOL_CACHE_PATH): + self.cache_schema = SymbolCacheSchema(db_path) diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/user_build.py b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/user_build.py new file mode 100755 index 000000000..6e4fba0d6 --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Scripts/user_build.py @@ -0,0 +1,111 @@ +#!/usr/bin/python3 +# Copyright 2018 The Tulsi 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. + +"""Invokes Bazel builds for the given target using Tulsi specific flags.""" + + +import argparse +import pipes +import subprocess +import sys +from bazel_build_settings import BUILD_SETTINGS + + +def _FatalError(msg, exit_code=1): + """Prints a fatal error message to stderr and exits.""" + sys.stderr.write(msg) + sys.exit(exit_code) + + +def _BuildSettingsTargetForTargets(targets): + """Returns the singular target to use when fetching build settings.""" + return targets[0] if len(targets) == 1 else None + + +def _CreateCommand(targets, build_settings, test, release, + config, xcode_version, force_swift): + """Creates a Bazel command for targets with the specified settings.""" + target = _BuildSettingsTargetForTargets(targets) + bazel, startup, flags = build_settings.flags_for_target( + target, not release, config, is_swift_override=force_swift) + bazel_action = 'test' if test else 'build' + + command = [bazel] + command.extend(startup) + command.append(bazel_action) + command.extend(flags) + if xcode_version: + command.append('--xcode_version=%s' % xcode_version) + command.append('--tool_tag=tulsi:user_build') + command.extend(targets) + + return command + + +def _QuoteCommandForShell(cmd): + cmd = [pipes.quote(x) for x in cmd] + return ' '.join(cmd) + + +def _InterruptSafeCall(cmd): + p = subprocess.Popen(cmd) + try: + return p.wait() + except KeyboardInterrupt: + return p.wait() + + +def main(): + if not BUILD_SETTINGS: + _FatalError('Unable to fetch build settings. Please report a Tulsi bug.') + + default_config = BUILD_SETTINGS.defaultPlatformConfigId + config_options = BUILD_SETTINGS.platformConfigFlags + config_help = ( + 'Bazel apple config (used for flags). Default: {}').format(default_config) + + parser = argparse.ArgumentParser(description='Invoke a Bazel build or test ' + 'with the same flags as Tulsi.') + parser.add_argument('--test', dest='test', action='store_true', default=False) + parser.add_argument('--release', dest='release', action='store_true', + default=False) + parser.add_argument('--noprint_cmd', dest='print_cmd', action='store_false', + default=True) + parser.add_argument('--norun', dest='run', action='store_false', default=True) + parser.add_argument('--config', help=config_help, default=default_config, + choices=config_options) + parser.add_argument('--xcode_version', help='Bazel --xcode_version flag.') + parser.add_argument('--force_swift', dest='swift', action='store_true', + default=None, help='Forcibly treat the given targets ' + 'as containing Swift.') + parser.add_argument('--force_noswift', dest='swift', action='store_false', + default=None, help='Forcibly treat the given targets ' + 'as not containing Swift.') + parser.add_argument('targets', nargs='+') + + args = parser.parse_args() + command = _CreateCommand(args.targets, BUILD_SETTINGS, args.test, + args.release, args.config, args.xcode_version, + args.swift) + if args.print_cmd: + print(_QuoteCommandForShell(command)) + + if args.run: + return _InterruptSafeCall(command) + return 0 + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Utils/lldbinit b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Utils/lldbinit new file mode 100644 index 000000000..a763d8191 --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/Utils/lldbinit @@ -0,0 +1,6 @@ +# This file is autogenerated by Tulsi and should not be edited. +# This sets lldb's working directory to the Bazel workspace root used by 'OlaVideo.xcodeproj'. +platform settings -w "/Users/wangrenzhu/Documents/github/mediapipe-render/" +# This enables implicitly loading Clang modules which can be disabled when a Swift module was built with explicit modules enabled. +settings set -- target.swift-extra-clang-flags "-fimplicit-module-maps" +settings clear target.source-map diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/tulsi-execution-root b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/tulsi-execution-root new file mode 120000 index 000000000..7d0bceaaa --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/tulsi-execution-root @@ -0,0 +1 @@ +/private/var/tmp/_bazel_wangrenzhu/b244be861f40c753b454f38ce4e943dc/execroot/mediapipe \ No newline at end of file diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/tulsi-output-base b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/tulsi-output-base new file mode 120000 index 000000000..5da447eee --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/tulsi-output-base @@ -0,0 +1 @@ +/private/var/tmp/_bazel_wangrenzhu/b244be861f40c753b454f38ce4e943dc \ No newline at end of file diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/tulsi-workspace b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/tulsi-workspace new file mode 120000 index 000000000..7d0bceaaa --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/.tulsi/tulsi-workspace @@ -0,0 +1 @@ +/private/var/tmp/_bazel_wangrenzhu/b244be861f40c753b454f38ce4e943dc/execroot/mediapipe \ No newline at end of file diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/project.pbxproj b/mediapipe/render/ios/OlaVideo.xcodeproj/project.pbxproj new file mode 100644 index 000000000..fbd0a7daa --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/project.pbxproj @@ -0,0 +1,1240 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 77C791EB09E0EF9900000000 /* vec4.cpp in math */ = {isa = PBXBuildFile; fileRef = BE83F26009E0EF9900000000 /* vec4.cpp */; }; + 77C791EB09E0EF9900000001 /* vec4.cpp in math */ = {isa = PBXBuildFile; fileRef = BE83F26009E0EF9900000000 /* vec4.cpp */; }; + 77C791EB0EBACD2000000000 /* Filter.cpp in core */ = {isa = PBXBuildFile; fileRef = BE83F2600EBACD2000000000 /* Filter.cpp */; }; + 77C791EB0EBACD2000000001 /* Filter.cpp in core */ = {isa = PBXBuildFile; fileRef = BE83F2600EBACD2000000000 /* Filter.cpp */; }; + 77C791EB22880F3900000000 /* Target.cpp in core */ = {isa = PBXBuildFile; fileRef = BE83F26022880F3900000000 /* Target.cpp */; }; + 77C791EB22880F3900000001 /* Target.cpp in core */ = {isa = PBXBuildFile; fileRef = BE83F26022880F3900000000 /* Target.cpp */; }; + 77C791EB2414E52E00000000 /* mat4.cpp in math */ = {isa = PBXBuildFile; fileRef = BE83F2602414E52E00000000 /* mat4.cpp */; }; + 77C791EB2414E52E00000001 /* mat4.cpp in math */ = {isa = PBXBuildFile; fileRef = BE83F2602414E52E00000000 /* mat4.cpp */; }; + 77C791EB4625777700000000 /* Ref.cpp in core */ = {isa = PBXBuildFile; fileRef = BE83F2604625777700000000 /* Ref.cpp */; }; + 77C791EB4625777700000001 /* Ref.cpp in core */ = {isa = PBXBuildFile; fileRef = BE83F2604625777700000000 /* Ref.cpp */; }; + 77C791EB46414E3200000000 /* FilterGroup.cpp in core */ = {isa = PBXBuildFile; fileRef = BE83F26046414E3200000000 /* FilterGroup.cpp */; }; + 77C791EB46414E3200000001 /* FilterGroup.cpp in core */ = {isa = PBXBuildFile; fileRef = BE83F26046414E3200000000 /* FilterGroup.cpp */; }; + 77C791EB565883CD00000000 /* SourceCamera.cpp in core */ = {isa = PBXBuildFile; fileRef = BE83F260565883CD00000000 /* SourceCamera.cpp */; }; + 77C791EB565883CD00000001 /* SourceCamera.cpp in core */ = {isa = PBXBuildFile; fileRef = BE83F260565883CD00000000 /* SourceCamera.cpp */; }; + 77C791EB5B873D5000000000 /* math.cpp in core */ = {isa = PBXBuildFile; fileRef = BE83F2605B873D5000000000 /* math.cpp */; }; + 77C791EB5B873D5000000001 /* math.cpp in core */ = {isa = PBXBuildFile; fileRef = BE83F2605B873D5000000000 /* math.cpp */; }; + 77C791EB61D3917E00000000 /* FramebufferCache.cpp in core */ = {isa = PBXBuildFile; fileRef = BE83F26061D3917E00000000 /* FramebufferCache.cpp */; }; + 77C791EB61D3917E00000001 /* FramebufferCache.cpp in core */ = {isa = PBXBuildFile; fileRef = BE83F26061D3917E00000000 /* FramebufferCache.cpp */; }; + 77C791EB75F4B57700000000 /* SourceImage.cpp in core */ = {isa = PBXBuildFile; fileRef = BE83F26075F4B57700000000 /* SourceImage.cpp */; }; + 77C791EB75F4B57700000001 /* SourceImage.cpp in core */ = {isa = PBXBuildFile; fileRef = BE83F26075F4B57700000000 /* SourceImage.cpp */; }; + 77C791EB78D3B78100000000 /* GPUImageUtil.cpp in core */ = {isa = PBXBuildFile; fileRef = BE83F26078D3B78100000000 /* GPUImageUtil.cpp */; }; + 77C791EB78D3B78100000001 /* GPUImageUtil.cpp in core */ = {isa = PBXBuildFile; fileRef = BE83F26078D3B78100000000 /* GPUImageUtil.cpp */; }; + 77C791EB7F32F9BA00000000 /* math_utils.cpp in math */ = {isa = PBXBuildFile; fileRef = BE83F2607F32F9BA00000000 /* math_utils.cpp */; }; + 77C791EB7F32F9BA00000001 /* math_utils.cpp in math */ = {isa = PBXBuildFile; fileRef = BE83F2607F32F9BA00000000 /* math_utils.cpp */; }; + 77C791EBA47EBDE800000000 /* Framebuffer.cpp in core */ = {isa = PBXBuildFile; fileRef = BE83F260A47EBDE800000000 /* Framebuffer.cpp */; }; + 77C791EBA47EBDE800000001 /* Framebuffer.cpp in core */ = {isa = PBXBuildFile; fileRef = BE83F260A47EBDE800000000 /* Framebuffer.cpp */; }; + 77C791EBA565F13900000000 /* IOSTarget.cpp in core */ = {isa = PBXBuildFile; fileRef = BE83F260A565F13900000000 /* IOSTarget.cpp */; }; + 77C791EBA565F13900000001 /* IOSTarget.cpp in core */ = {isa = PBXBuildFile; fileRef = BE83F260A565F13900000000 /* IOSTarget.cpp */; }; + 77C791EBA7FA713900000000 /* vec2.cpp in math */ = {isa = PBXBuildFile; fileRef = BE83F260A7FA713900000000 /* vec2.cpp */; }; + 77C791EBA7FA713900000001 /* vec2.cpp in math */ = {isa = PBXBuildFile; fileRef = BE83F260A7FA713900000000 /* vec2.cpp */; }; + 77C791EBA89FC39300000000 /* GLProgram.cpp in core */ = {isa = PBXBuildFile; fileRef = BE83F260A89FC39300000000 /* GLProgram.cpp */; }; + 77C791EBA89FC39300000001 /* GLProgram.cpp in core */ = {isa = PBXBuildFile; fileRef = BE83F260A89FC39300000000 /* GLProgram.cpp */; }; + 77C791EBD09E347800000000 /* TargetView.cpp in core */ = {isa = PBXBuildFile; fileRef = BE83F260D09E347800000000 /* TargetView.cpp */; }; + 77C791EBD09E347800000001 /* TargetView.cpp in core */ = {isa = PBXBuildFile; fileRef = BE83F260D09E347800000000 /* TargetView.cpp */; }; + 77C791EBD0BDD41A00000000 /* Source.cpp in core */ = {isa = PBXBuildFile; fileRef = BE83F260D0BDD41A00000000 /* Source.cpp */; }; + 77C791EBD0BDD41A00000001 /* Source.cpp in core */ = {isa = PBXBuildFile; fileRef = BE83F260D0BDD41A00000000 /* Source.cpp */; }; + 77C791EBEBB084D800000000 /* Context.cpp in core */ = {isa = PBXBuildFile; fileRef = BE83F260EBB084D800000000 /* Context.cpp */; }; + 77C791EBEBB084D800000001 /* Context.cpp in core */ = {isa = PBXBuildFile; fileRef = BE83F260EBB084D800000000 /* Context.cpp */; }; + 77C791EBFF778F3400000000 /* vec3.cpp in math */ = {isa = PBXBuildFile; fileRef = BE83F260FF778F3400000000 /* vec3.cpp */; }; + 77C791EBFF778F3400000001 /* vec3.cpp in math */ = {isa = PBXBuildFile; fileRef = BE83F260FF778F3400000000 /* vec3.cpp */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 0EEB35C156E721E500000000 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 82C5998AA8C9888400000000 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 6097400656E721E400000000; + }; + 0EEB35C15CF3050B00000000 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 82C5998AA8C9888400000000 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 609740065CF3050A00000000; + }; + 0EEB35C161E7E71B00000000 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 82C5998AA8C9888400000000 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 005FF21761E7E71A00000000; + }; + 0EEB35C1A1CF146B00000000 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 82C5998AA8C9888400000000 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 60974006A1CF146A00000000; + }; + 0EEB35C1EE42527100000000 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 82C5998AA8C9888400000000 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 60974006EE42527000000000; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + BE83F26009E0EF9900000000 /* vec4.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = vec4.cpp; path = mediapipe/render/core/math/vec4.cpp; sourceTree = ""; }; + BE83F2600AEFDE0400000000 /* lib_idx_math_702C098E_ios_min15.5.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; name = lib_idx_math_702C098E_ios_min15.5.a; path = lib_idx_math_702C098E_ios_min15.5.a; sourceTree = BUILT_PRODUCTS_DIR; }; + BE83F2600EBACD2000000000 /* Filter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Filter.cpp; path = mediapipe/render/core/Filter.cpp; sourceTree = ""; }; + BE83F26010037B7D00000000 /* BUILD */ = {isa = PBXFileReference; lastKnownFileType = text; name = BUILD; path = mediapipe/render/core/BUILD; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.python; }; + BE83F260129E264700000000 /* Framebuffer.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = Framebuffer.hpp; path = mediapipe/render/core/Framebuffer.hpp; sourceTree = ""; }; + BE83F26014BF740C00000000 /* lib_idx_ref_gpuimagemath_gpuimageutil_8DCE756C_ios_min11.0.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; name = lib_idx_ref_gpuimagemath_gpuimageutil_8DCE756C_ios_min11.0.a; path = lib_idx_ref_gpuimagemath_gpuimageutil_8DCE756C_ios_min11.0.a; sourceTree = BUILT_PRODUCTS_DIR; }; + BE83F2601CC6405C00000000 /* vec2.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = vec2.hpp; path = mediapipe/render/core/math/vec2.hpp; sourceTree = ""; }; + BE83F2601F5DBCAE00000000 /* vec3.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = vec3.hpp; path = mediapipe/render/core/math/vec3.hpp; sourceTree = ""; }; + BE83F26022880F3900000000 /* Target.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Target.cpp; path = mediapipe/render/core/Target.cpp; sourceTree = ""; }; + BE83F2602414E52E00000000 /* mat4.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = mat4.cpp; path = mediapipe/render/core/math/mat4.cpp; sourceTree = ""; }; + BE83F26025E591E800000000 /* mat4.inl */ = {isa = PBXFileReference; lastKnownFileType = "public.c-plus-plus-inline-header"; name = mat4.inl; path = mediapipe/render/core/math/mat4.inl; sourceTree = ""; }; + BE83F2602FB9B54500000000 /* TargetView.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = TargetView.hpp; path = mediapipe/render/core/TargetView.hpp; sourceTree = ""; }; + BE83F2603233472600000000 /* GPUImageTarget.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GPUImageTarget.h; path = mediapipe/render/core/GPUImageTarget.h; sourceTree = ""; }; + BE83F260327B953400000000 /* Info.plist */ = {isa = PBXFileReference; explicitFileType = text.plist; name = Info.plist; path = "OlaVideo.xcodeproj/.tulsi/tulsi-execution-root/bazel-tulsi-includes/x/x/mediapipe/render/ios/OlaRenderDevelopFramework-intermediates/Info.plist"; sourceTree = SOURCE_ROOT; }; + BE83F2603740DDC500000000 /* GPUImage-x.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "GPUImage-x.h"; path = "mediapipe/render/core/GPUImage-x.h"; sourceTree = ""; }; + BE83F2603D01E23E00000000 /* lib_idx_math_702C098E_ios_min11.0.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; name = lib_idx_math_702C098E_ios_min11.0.a; path = lib_idx_math_702C098E_ios_min11.0.a; sourceTree = BUILT_PRODUCTS_DIR; }; + BE83F2604625777700000000 /* Ref.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Ref.cpp; path = mediapipe/render/core/Ref.cpp; sourceTree = ""; }; + BE83F26046414E3200000000 /* FilterGroup.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = FilterGroup.cpp; path = mediapipe/render/core/FilterGroup.cpp; sourceTree = ""; }; + BE83F26046A498EB00000000 /* vec3.inl */ = {isa = PBXFileReference; lastKnownFileType = "public.c-plus-plus-inline-header"; name = vec3.inl; path = mediapipe/render/core/math/vec3.inl; sourceTree = ""; }; + BE83F26049A3E76000000000 /* mat4.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = mat4.hpp; path = mediapipe/render/core/math/mat4.hpp; sourceTree = ""; }; + BE83F2605074AFB000000000 /* FilterGroup.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = FilterGroup.hpp; path = mediapipe/render/core/FilterGroup.hpp; sourceTree = ""; }; + BE83F260565883CD00000000 /* SourceCamera.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SourceCamera.cpp; path = mediapipe/render/core/SourceCamera.cpp; sourceTree = ""; }; + BE83F2605714B08E00000000 /* lib_idx_core_F3E5C6E5_ios_min15.5.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; name = lib_idx_core_F3E5C6E5_ios_min15.5.a; path = lib_idx_core_F3E5C6E5_ios_min15.5.a; sourceTree = BUILT_PRODUCTS_DIR; }; + BE83F26057F9666A00000000 /* vec4.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = vec4.hpp; path = mediapipe/render/core/math/vec4.hpp; sourceTree = ""; }; + BE83F2605B873D5000000000 /* math.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = math.cpp; path = mediapipe/render/core/math.cpp; sourceTree = ""; }; + BE83F26061D3917E00000000 /* FramebufferCache.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = FramebufferCache.cpp; path = mediapipe/render/core/FramebufferCache.cpp; sourceTree = ""; }; + BE83F26064220C3000000000 /* SourceImage.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = SourceImage.hpp; path = mediapipe/render/core/SourceImage.hpp; sourceTree = ""; }; + BE83F26067DBE6C000000000 /* SourceCamera.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = SourceCamera.hpp; path = mediapipe/render/core/SourceCamera.hpp; sourceTree = ""; }; + BE83F26070F0323A00000000 /* math_utils.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = math_utils.hpp; path = mediapipe/render/core/math/math_utils.hpp; sourceTree = ""; }; + BE83F260736CAA4600000000 /* lib_idx_ref_gpuimagemath_gpuimageutil_8DCE756C_ios_min15.5.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; name = lib_idx_ref_gpuimagemath_gpuimageutil_8DCE756C_ios_min15.5.a; path = lib_idx_ref_gpuimagemath_gpuimageutil_8DCE756C_ios_min15.5.a; sourceTree = BUILT_PRODUCTS_DIR; }; + BE83F26075F4B57700000000 /* SourceImage.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SourceImage.cpp; path = mediapipe/render/core/SourceImage.cpp; sourceTree = ""; }; + BE83F26076C339A100000000 /* Context.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = Context.hpp; path = mediapipe/render/core/Context.hpp; sourceTree = ""; }; + BE83F26078D3B78100000000 /* GPUImageUtil.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = GPUImageUtil.cpp; path = mediapipe/render/core/GPUImageUtil.cpp; sourceTree = ""; }; + BE83F2607B3D0E0E00000000 /* IOSTarget.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = IOSTarget.hpp; path = mediapipe/render/core/IOSTarget.hpp; sourceTree = ""; }; + BE83F2607ECF732C00000000 /* OlaRenderDevelopFramework.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; name = OlaRenderDevelopFramework.framework; path = OlaRenderDevelopFramework.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + BE83F2607F32F9BA00000000 /* math_utils.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = math_utils.cpp; path = mediapipe/render/core/math/math_utils.cpp; sourceTree = ""; }; + BE83F2609165562200000000 /* GLProgram.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = GLProgram.hpp; path = mediapipe/render/core/GLProgram.hpp; sourceTree = ""; }; + BE83F260982EF2CE00000000 /* FramebufferCache.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = FramebufferCache.hpp; path = mediapipe/render/core/FramebufferCache.hpp; sourceTree = ""; }; + BE83F2609E99204100000000 /* GPUImageMacros.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GPUImageMacros.h; path = mediapipe/render/core/GPUImageMacros.h; sourceTree = ""; }; + BE83F2609EE3A0DF00000000 /* math.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = math.hpp; path = mediapipe/render/core/math.hpp; sourceTree = ""; }; + BE83F260A2EF683C00000000 /* Target.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = Target.hpp; path = mediapipe/render/core/Target.hpp; sourceTree = ""; }; + BE83F260A47EBDE800000000 /* Framebuffer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Framebuffer.cpp; path = mediapipe/render/core/Framebuffer.cpp; sourceTree = ""; }; + BE83F260A565F13900000000 /* IOSTarget.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = IOSTarget.cpp; path = mediapipe/render/core/IOSTarget.cpp; sourceTree = ""; }; + BE83F260A7FA713900000000 /* vec2.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = vec2.cpp; path = mediapipe/render/core/math/vec2.cpp; sourceTree = ""; }; + BE83F260A89FC39300000000 /* GLProgram.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = GLProgram.cpp; path = mediapipe/render/core/GLProgram.cpp; sourceTree = ""; }; + BE83F260AB34087600000000 /* BUILD */ = {isa = PBXFileReference; lastKnownFileType = text; name = BUILD; path = mediapipe/render/ios/BUILD; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.python; }; + BE83F260C321836600000000 /* vec4.inl */ = {isa = PBXFileReference; lastKnownFileType = "public.c-plus-plus-inline-header"; name = vec4.inl; path = mediapipe/render/core/math/vec4.inl; sourceTree = ""; }; + BE83F260CA6C912600000000 /* Filter.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = Filter.hpp; path = mediapipe/render/core/Filter.hpp; sourceTree = ""; }; + BE83F260CB8D4EA000000000 /* libmediapipe-render-ios-OlaRenderDevelop.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; name = "libmediapipe-render-ios-OlaRenderDevelop.a"; path = "libmediapipe-render-ios-OlaRenderDevelop.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + BE83F260D076320400000000 /* lib_idx_core_F3E5C6E5_ios_min11.0.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; name = lib_idx_core_F3E5C6E5_ios_min11.0.a; path = lib_idx_core_F3E5C6E5_ios_min11.0.a; sourceTree = BUILT_PRODUCTS_DIR; }; + BE83F260D09E347800000000 /* TargetView.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = TargetView.cpp; path = mediapipe/render/core/TargetView.cpp; sourceTree = ""; }; + BE83F260D0BDD41A00000000 /* Source.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Source.cpp; path = mediapipe/render/core/Source.cpp; sourceTree = ""; }; + BE83F260D665EA5D00000000 /* BUILD */ = {isa = PBXFileReference; lastKnownFileType = text; name = BUILD; path = mediapipe/render/core/math/BUILD; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.python; }; + BE83F260DA67837000000000 /* OlaRenderDevelop.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = OlaRenderDevelop.h; path = mediapipe/render/ios/OlaRenderDevelop.h; sourceTree = ""; }; + BE83F260E0A815AA00000000 /* vec2.inl */ = {isa = PBXFileReference; lastKnownFileType = "public.c-plus-plus-inline-header"; name = vec2.inl; path = mediapipe/render/core/math/vec2.inl; sourceTree = ""; }; + BE83F260E139586700000000 /* GPUImageUtil.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GPUImageUtil.h; path = mediapipe/render/core/GPUImageUtil.h; sourceTree = ""; }; + BE83F260E418640200000000 /* Source.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = Source.hpp; path = mediapipe/render/core/Source.hpp; sourceTree = ""; }; + BE83F260E83F673B00000000 /* CVFramebuffer.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = CVFramebuffer.hpp; path = mediapipe/render/core/CVFramebuffer.hpp; sourceTree = ""; }; + BE83F260EBB084D800000000 /* Context.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Context.cpp; path = mediapipe/render/core/Context.cpp; sourceTree = ""; }; + BE83F260EC702CCC00000000 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; name = Info.plist; path = mediapipe/render/ios/Info.plist; sourceTree = ""; }; + BE83F260F4675D9E00000000 /* Ref.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = Ref.hpp; path = mediapipe/render/core/Ref.hpp; sourceTree = ""; }; + BE83F260FF778F3400000000 /* vec3.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = vec3.cpp; path = mediapipe/render/core/math/vec3.cpp; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXGroup section */ + C84737C11F09D48F00000000 /* x */ = { + isa = PBXGroup; + children = ( + C84737C11F09D48F00000001 /* x */, + ); + name = x; + sourceTree = ""; + }; + C84737C11F09D48F00000001 /* x */ = { + isa = PBXGroup; + children = ( + C84737C1D37978B300000000 /* mediapipe */, + ); + name = x; + sourceTree = ""; + }; + C84737C123178F1D00000000 /* render */ = { + isa = PBXGroup; + children = ( + C84737C164C84C8D00000000 /* ios */, + ); + name = render; + sourceTree = ""; + }; + C84737C123178F1D00000001 /* render */ = { + isa = PBXGroup; + children = ( + C84737C1648F1D6E00000000 /* core */, + C84737C164C84C8D00000001 /* ios */, + ); + name = render; + sourceTree = ""; + }; + C84737C1648F1D6E00000000 /* core */ = { + isa = PBXGroup; + children = ( + BE83F26010037B7D00000000 /* BUILD */, + BE83F260E83F673B00000000 /* CVFramebuffer.hpp */, + BE83F260EBB084D800000000 /* Context.cpp */, + BE83F26076C339A100000000 /* Context.hpp */, + BE83F2600EBACD2000000000 /* Filter.cpp */, + BE83F260CA6C912600000000 /* Filter.hpp */, + BE83F26046414E3200000000 /* FilterGroup.cpp */, + BE83F2605074AFB000000000 /* FilterGroup.hpp */, + BE83F260A47EBDE800000000 /* Framebuffer.cpp */, + BE83F260129E264700000000 /* Framebuffer.hpp */, + BE83F26061D3917E00000000 /* FramebufferCache.cpp */, + BE83F260982EF2CE00000000 /* FramebufferCache.hpp */, + BE83F260A89FC39300000000 /* GLProgram.cpp */, + BE83F2609165562200000000 /* GLProgram.hpp */, + BE83F2603740DDC500000000 /* GPUImage-x.h */, + BE83F2609E99204100000000 /* GPUImageMacros.h */, + BE83F2603233472600000000 /* GPUImageTarget.h */, + BE83F26078D3B78100000000 /* GPUImageUtil.cpp */, + BE83F260E139586700000000 /* GPUImageUtil.h */, + BE83F260A565F13900000000 /* IOSTarget.cpp */, + BE83F2607B3D0E0E00000000 /* IOSTarget.hpp */, + BE83F2604625777700000000 /* Ref.cpp */, + BE83F260F4675D9E00000000 /* Ref.hpp */, + BE83F260D0BDD41A00000000 /* Source.cpp */, + BE83F260E418640200000000 /* Source.hpp */, + BE83F260565883CD00000000 /* SourceCamera.cpp */, + BE83F26067DBE6C000000000 /* SourceCamera.hpp */, + BE83F26075F4B57700000000 /* SourceImage.cpp */, + BE83F26064220C3000000000 /* SourceImage.hpp */, + BE83F26022880F3900000000 /* Target.cpp */, + BE83F260A2EF683C00000000 /* Target.hpp */, + BE83F260D09E347800000000 /* TargetView.cpp */, + BE83F2602FB9B54500000000 /* TargetView.hpp */, + C84737C1C47DE28B00000000 /* math */, + BE83F2605B873D5000000000 /* math.cpp */, + BE83F2609EE3A0DF00000000 /* math.hpp */, + ); + name = core; + sourceTree = ""; + }; + C84737C164C84C8D00000000 /* ios */ = { + isa = PBXGroup; + children = ( + C84737C17207F09000000000 /* OlaRenderDevelopFramework-intermediates */, + ); + name = ios; + sourceTree = ""; + }; + C84737C164C84C8D00000001 /* ios */ = { + isa = PBXGroup; + children = ( + BE83F260AB34087600000000 /* BUILD */, + BE83F260EC702CCC00000000 /* Info.plist */, + BE83F260DA67837000000000 /* OlaRenderDevelop.h */, + ); + name = ios; + sourceTree = ""; + }; + C84737C17207F09000000000 /* OlaRenderDevelopFramework-intermediates */ = { + isa = PBXGroup; + children = ( + BE83F260327B953400000000 /* Info.plist */, + ); + name = "OlaRenderDevelopFramework-intermediates"; + sourceTree = ""; + }; + C84737C175BCB0A500000000 /* mainGroup */ = { + isa = PBXGroup; + children = ( + C84737C1AF5BE98B00000000 /* Products */, + C84737C1D37978B300000001 /* mediapipe */, + ); + name = mainGroup; + path = ../../..; + sourceTree = SOURCE_ROOT; + }; + C84737C1A0D3B00600000000 /* bazel-tulsi-includes */ = { + isa = PBXGroup; + children = ( + C84737C11F09D48F00000000 /* x */, + ); + name = "bazel-tulsi-includes"; + sourceTree = ""; + }; + C84737C1AF5BE98B00000000 /* Products */ = { + isa = PBXGroup; + children = ( + C84737C1E5314F1C00000000 /* Indexer */, + BE83F2607ECF732C00000000 /* OlaRenderDevelopFramework.framework */, + C84737C1A0D3B00600000000 /* bazel-tulsi-includes */, + BE83F260CB8D4EA000000000 /* libmediapipe-render-ios-OlaRenderDevelop.a */, + ); + name = Products; + sourceTree = ""; + }; + C84737C1C47DE28B00000000 /* math */ = { + isa = PBXGroup; + children = ( + BE83F260D665EA5D00000000 /* BUILD */, + BE83F2602414E52E00000000 /* mat4.cpp */, + BE83F26049A3E76000000000 /* mat4.hpp */, + BE83F26025E591E800000000 /* mat4.inl */, + BE83F2607F32F9BA00000000 /* math_utils.cpp */, + BE83F26070F0323A00000000 /* math_utils.hpp */, + BE83F260A7FA713900000000 /* vec2.cpp */, + BE83F2601CC6405C00000000 /* vec2.hpp */, + BE83F260E0A815AA00000000 /* vec2.inl */, + BE83F260FF778F3400000000 /* vec3.cpp */, + BE83F2601F5DBCAE00000000 /* vec3.hpp */, + BE83F26046A498EB00000000 /* vec3.inl */, + BE83F26009E0EF9900000000 /* vec4.cpp */, + BE83F26057F9666A00000000 /* vec4.hpp */, + BE83F260C321836600000000 /* vec4.inl */, + ); + name = math; + sourceTree = ""; + }; + C84737C1D37978B300000000 /* mediapipe */ = { + isa = PBXGroup; + children = ( + C84737C123178F1D00000000 /* render */, + ); + name = mediapipe; + sourceTree = ""; + }; + C84737C1D37978B300000001 /* mediapipe */ = { + isa = PBXGroup; + children = ( + C84737C123178F1D00000001 /* render */, + ); + name = mediapipe; + sourceTree = ""; + }; + C84737C1E5314F1C00000000 /* Indexer */ = { + isa = PBXGroup; + children = ( + BE83F260D076320400000000 /* lib_idx_core_F3E5C6E5_ios_min11.0.a */, + BE83F2605714B08E00000000 /* lib_idx_core_F3E5C6E5_ios_min15.5.a */, + BE83F2603D01E23E00000000 /* lib_idx_math_702C098E_ios_min11.0.a */, + BE83F2600AEFDE0400000000 /* lib_idx_math_702C098E_ios_min15.5.a */, + BE83F26014BF740C00000000 /* lib_idx_ref_gpuimagemath_gpuimageutil_8DCE756C_ios_min11.0.a */, + BE83F260736CAA4600000000 /* lib_idx_ref_gpuimagemath_gpuimageutil_8DCE756C_ios_min15.5.a */, + ); + name = Indexer; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXLegacyTarget section */ + 005FF21761E7E71A00000000 /* _bazel_clean_ */ = { + isa = PBXLegacyTarget; + buildArgumentsString = "\"/opt/homebrew/Cellar/bazelisk/1.12.0/bin/bazelisk\" \"bazel-bin\""; + buildConfigurationList = BA35A3F6A0C2EAAF00000000 /* Build configuration list for PBXLegacyTarget "_bazel_clean_" */; + buildPhases = ( + ); + buildToolPath = "${PROJECT_FILE_PATH}/.tulsi/Scripts/bazel_clean.sh"; + buildWorkingDirectory = "${SRCROOT}/../../.."; + dependencies = ( + ); + name = _bazel_clean_; + passBuildSettingsInEnvironment = 1; + productName = _bazel_clean_; + }; +/* End PBXLegacyTarget section */ + +/* Begin PBXNativeTarget section */ + 6097400654A872A400000000 /* mediapipe-render-ios-OlaRenderDevelop */ = { + isa = PBXNativeTarget; + buildConfigurationList = BA35A3F630A77E2E00000000 /* Build configuration list for PBXNativeTarget "mediapipe-render-ios-OlaRenderDevelop" */; + buildPhases = ( + 73F0E8C73E33318400000000 /* build //mediapipe/render/ios:OlaRenderDevelop */, + ); + buildRules = ( + ); + dependencies = ( + 2557965D61E7E71B00000000 /* PBXTargetDependency */, + ); + name = "mediapipe-render-ios-OlaRenderDevelop"; + productName = "mediapipe-render-ios-OlaRenderDevelop"; + productReference = BE83F260CB8D4EA000000000 /* libmediapipe-render-ios-OlaRenderDevelop.a */; + productType = "com.apple.product-type.library.static"; + }; + 6097400656E721E400000000 /* _idx_ref_gpuimagemath_gpuimageutil_8DCE756C_ios_min11.0 */ = { + isa = PBXNativeTarget; + buildConfigurationList = BA35A3F6EB0434D400000000 /* Build configuration list for PBXNativeTarget "_idx_ref_gpuimagemath_gpuimageutil_8DCE756C_ios_min11.0" */; + buildPhases = ( + FF659C6C0000000000000001 /* Sources */, + ); + buildRules = ( + ); + dependencies = ( + 2557965D61E7E71B00000000 /* PBXTargetDependency */, + ); + name = _idx_ref_gpuimagemath_gpuimageutil_8DCE756C_ios_min11.0; + productName = _idx_ref_gpuimagemath_gpuimageutil_8DCE756C_ios_min11.0; + productReference = BE83F26014BF740C00000000 /* lib_idx_ref_gpuimagemath_gpuimageutil_8DCE756C_ios_min11.0.a */; + productType = "com.apple.product-type.library.static"; + }; + 609740065CF3050A00000000 /* _idx_math_702C098E_ios_min15.5 */ = { + isa = PBXNativeTarget; + buildConfigurationList = BA35A3F6AA12506300000000 /* Build configuration list for PBXNativeTarget "_idx_math_702C098E_ios_min15.5" */; + buildPhases = ( + FF659C6C0000000000000004 /* Sources */, + ); + buildRules = ( + ); + dependencies = ( + 2557965D61E7E71B00000000 /* PBXTargetDependency */, + ); + name = _idx_math_702C098E_ios_min15.5; + productName = _idx_math_702C098E_ios_min15.5; + productReference = BE83F2600AEFDE0400000000 /* lib_idx_math_702C098E_ios_min15.5.a */; + productType = "com.apple.product-type.library.static"; + }; + 609740068115297A00000000 /* _idx_core_F3E5C6E5_ios_min15.5 */ = { + isa = PBXNativeTarget; + buildConfigurationList = BA35A3F69A9D9AED00000000 /* Build configuration list for PBXNativeTarget "_idx_core_F3E5C6E5_ios_min15.5" */; + buildPhases = ( + FF659C6C0000000000000003 /* Sources */, + ); + buildRules = ( + ); + dependencies = ( + 2557965D61E7E71B00000000 /* PBXTargetDependency */, + 2557965D5CF3050B00000000 /* PBXTargetDependency */, + 2557965DA1CF146B00000000 /* PBXTargetDependency */, + 2557965DA1CF146B00000000 /* PBXTargetDependency */, + 2557965DA1CF146B00000000 /* PBXTargetDependency */, + ); + name = _idx_core_F3E5C6E5_ios_min15.5; + productName = _idx_core_F3E5C6E5_ios_min15.5; + productReference = BE83F2605714B08E00000000 /* lib_idx_core_F3E5C6E5_ios_min15.5.a */; + productType = "com.apple.product-type.library.static"; + }; + 60974006872FED6400000000 /* _idx_core_F3E5C6E5_ios_min11.0 */ = { + isa = PBXNativeTarget; + buildConfigurationList = BA35A3F679C39EDD00000000 /* Build configuration list for PBXNativeTarget "_idx_core_F3E5C6E5_ios_min11.0" */; + buildPhases = ( + FF659C6C0000000000000000 /* Sources */, + ); + buildRules = ( + ); + dependencies = ( + 2557965D61E7E71B00000000 /* PBXTargetDependency */, + 2557965D56E721E500000000 /* PBXTargetDependency */, + 2557965DEE42527100000000 /* PBXTargetDependency */, + 2557965D56E721E500000000 /* PBXTargetDependency */, + 2557965D56E721E500000000 /* PBXTargetDependency */, + ); + name = _idx_core_F3E5C6E5_ios_min11.0; + productName = _idx_core_F3E5C6E5_ios_min11.0; + productReference = BE83F260D076320400000000 /* lib_idx_core_F3E5C6E5_ios_min11.0.a */; + productType = "com.apple.product-type.library.static"; + }; + 60974006A1CF146A00000000 /* _idx_ref_gpuimagemath_gpuimageutil_8DCE756C_ios_min15.5 */ = { + isa = PBXNativeTarget; + buildConfigurationList = BA35A3F6C741168500000000 /* Build configuration list for PBXNativeTarget "_idx_ref_gpuimagemath_gpuimageutil_8DCE756C_ios_min15.5" */; + buildPhases = ( + FF659C6C0000000000000005 /* Sources */, + ); + buildRules = ( + ); + dependencies = ( + 2557965D61E7E71B00000000 /* PBXTargetDependency */, + ); + name = _idx_ref_gpuimagemath_gpuimageutil_8DCE756C_ios_min15.5; + productName = _idx_ref_gpuimagemath_gpuimageutil_8DCE756C_ios_min15.5; + productReference = BE83F260736CAA4600000000 /* lib_idx_ref_gpuimagemath_gpuimageutil_8DCE756C_ios_min15.5.a */; + productType = "com.apple.product-type.library.static"; + }; + 60974006CD5CD7AC00000000 /* OlaRenderDevelopFramework */ = { + isa = PBXNativeTarget; + buildConfigurationList = BA35A3F6A53D5D0F00000000 /* Build configuration list for PBXNativeTarget "OlaRenderDevelopFramework" */; + buildPhases = ( + 73F0E8C7E97BD3B800000000 /* build //mediapipe/render/ios:OlaRenderDevelopFramework */, + ); + buildRules = ( + ); + dependencies = ( + 2557965D61E7E71B00000000 /* PBXTargetDependency */, + ); + name = OlaRenderDevelopFramework; + productName = OlaRenderDevelopFramework; + productReference = BE83F2607ECF732C00000000 /* OlaRenderDevelopFramework.framework */; + productType = "com.apple.product-type.framework"; + }; + 60974006EE42527000000000 /* _idx_math_702C098E_ios_min11.0 */ = { + isa = PBXNativeTarget; + buildConfigurationList = BA35A3F6759537C100000000 /* Build configuration list for PBXNativeTarget "_idx_math_702C098E_ios_min11.0" */; + buildPhases = ( + FF659C6C0000000000000002 /* Sources */, + ); + buildRules = ( + ); + dependencies = ( + 2557965D61E7E71B00000000 /* PBXTargetDependency */, + ); + name = _idx_math_702C098E_ios_min11.0; + productName = _idx_math_702C098E_ios_min11.0; + productReference = BE83F2603D01E23E00000000 /* lib_idx_math_702C098E_ios_min11.0.a */; + productType = "com.apple.product-type.library.static"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 82C5998AA8C9888400000000 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0710; + LastUpgradeCheck = 1000; + }; + buildConfigurationList = BA35A3F678E35B6B00000000 /* Build configuration list for PBXProject "OlaVideo" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = C84737C175BCB0A500000000 /* mainGroup */; + targets = ( + 60974006CD5CD7AC00000000 /* OlaRenderDevelopFramework */, + 005FF21761E7E71A00000000 /* _bazel_clean_ */, + 60974006872FED6400000000 /* _idx_core_F3E5C6E5_ios_min11.0 */, + 609740068115297A00000000 /* _idx_core_F3E5C6E5_ios_min15.5 */, + 60974006EE42527000000000 /* _idx_math_702C098E_ios_min11.0 */, + 609740065CF3050A00000000 /* _idx_math_702C098E_ios_min15.5 */, + 6097400656E721E400000000 /* _idx_ref_gpuimagemath_gpuimageutil_8DCE756C_ios_min11.0 */, + 60974006A1CF146A00000000 /* _idx_ref_gpuimagemath_gpuimageutil_8DCE756C_ios_min15.5 */, + 6097400654A872A400000000 /* mediapipe-render-ios-OlaRenderDevelop */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXShellScriptBuildPhase section */ + 73F0E8C73E33318400000000 /* build //mediapipe/render/ios:OlaRenderDevelop */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 0; + files = ( + ); + inputPaths = ( + "$(TARGET_BUILD_DIR)/$(INFOPLIST_PATH)", + ); + name = "build //mediapipe/render/ios:OlaRenderDevelop"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/bash; + shellScript = "set -e\ncd \"${SRCROOT}/../../..\"\nexec \"${PROJECT_FILE_PATH}/.tulsi/Scripts/bazel_build.py\" //mediapipe/render/ios:OlaRenderDevelop --bazel \"/opt/homebrew/Cellar/bazelisk/1.12.0/bin/bazelisk\" --bazel_bin_path \"bazel-bin\" --verbose "; + showEnvVarsInLog = 1; + }; + 73F0E8C7E97BD3B800000000 /* build //mediapipe/render/ios:OlaRenderDevelopFramework */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 0; + files = ( + ); + inputPaths = ( + "$(TARGET_BUILD_DIR)/$(INFOPLIST_PATH)", + ); + name = "build //mediapipe/render/ios:OlaRenderDevelopFramework"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/bash; + shellScript = "set -e\ncd \"${SRCROOT}/../../..\"\nexec \"${PROJECT_FILE_PATH}/.tulsi/Scripts/bazel_build.py\" //mediapipe/render/ios:OlaRenderDevelopFramework --bazel \"/opt/homebrew/Cellar/bazelisk/1.12.0/bin/bazelisk\" --bazel_bin_path \"bazel-bin\" --verbose "; + showEnvVarsInLog = 1; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + FF659C6C0000000000000000 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 0; + files = ( + 77C791EB61D3917E00000000 /* FramebufferCache.cpp in core */, + 77C791EBA47EBDE800000000 /* Framebuffer.cpp in core */, + 77C791EB22880F3900000000 /* Target.cpp in core */, + 77C791EBEBB084D800000000 /* Context.cpp in core */, + 77C791EB0EBACD2000000000 /* Filter.cpp in core */, + 77C791EBA89FC39300000000 /* GLProgram.cpp in core */, + 77C791EBD0BDD41A00000000 /* Source.cpp in core */, + 77C791EB75F4B57700000000 /* SourceImage.cpp in core */, + 77C791EBA565F13900000000 /* IOSTarget.cpp in core */, + 77C791EB565883CD00000000 /* SourceCamera.cpp in core */, + 77C791EBD09E347800000000 /* TargetView.cpp in core */, + 77C791EB46414E3200000000 /* FilterGroup.cpp in core */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + FF659C6C0000000000000001 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 0; + files = ( + 77C791EB4625777700000000 /* Ref.cpp in core */, + 77C791EB5B873D5000000000 /* math.cpp in core */, + 77C791EB78D3B78100000000 /* GPUImageUtil.cpp in core */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + FF659C6C0000000000000002 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 0; + files = ( + 77C791EB2414E52E00000000 /* mat4.cpp in math */, + 77C791EB7F32F9BA00000000 /* math_utils.cpp in math */, + 77C791EBA7FA713900000000 /* vec2.cpp in math */, + 77C791EBFF778F3400000000 /* vec3.cpp in math */, + 77C791EB09E0EF9900000000 /* vec4.cpp in math */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + FF659C6C0000000000000003 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 0; + files = ( + 77C791EB61D3917E00000001 /* FramebufferCache.cpp in core */, + 77C791EBA47EBDE800000001 /* Framebuffer.cpp in core */, + 77C791EB22880F3900000001 /* Target.cpp in core */, + 77C791EBEBB084D800000001 /* Context.cpp in core */, + 77C791EB0EBACD2000000001 /* Filter.cpp in core */, + 77C791EBA89FC39300000001 /* GLProgram.cpp in core */, + 77C791EBD0BDD41A00000001 /* Source.cpp in core */, + 77C791EB75F4B57700000001 /* SourceImage.cpp in core */, + 77C791EBA565F13900000001 /* IOSTarget.cpp in core */, + 77C791EB565883CD00000001 /* SourceCamera.cpp in core */, + 77C791EBD09E347800000001 /* TargetView.cpp in core */, + 77C791EB46414E3200000001 /* FilterGroup.cpp in core */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + FF659C6C0000000000000004 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 0; + files = ( + 77C791EB2414E52E00000001 /* mat4.cpp in math */, + 77C791EB7F32F9BA00000001 /* math_utils.cpp in math */, + 77C791EBA7FA713900000001 /* vec2.cpp in math */, + 77C791EBFF778F3400000001 /* vec3.cpp in math */, + 77C791EB09E0EF9900000001 /* vec4.cpp in math */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + FF659C6C0000000000000005 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 0; + files = ( + 77C791EB4625777700000001 /* Ref.cpp in core */, + 77C791EB5B873D5000000001 /* math.cpp in core */, + 77C791EB78D3B78100000001 /* GPUImageUtil.cpp in core */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 2557965D56E721E500000000 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + targetProxy = 0EEB35C156E721E500000000 /* PBXContainerItemProxy */; + }; + 2557965D5CF3050B00000000 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + targetProxy = 0EEB35C15CF3050B00000000 /* PBXContainerItemProxy */; + }; + 2557965D61E7E71B00000000 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + targetProxy = 0EEB35C161E7E71B00000000 /* PBXContainerItemProxy */; + }; + 2557965DA1CF146B00000000 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + targetProxy = 0EEB35C1A1CF146B00000000 /* PBXContainerItemProxy */; + }; + 2557965DEE42527100000000 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + targetProxy = 0EEB35C1EE42527100000000 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 7E41376205236FF600000000 /* __TulsiTestRunner_Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGNING_REQUIRED = NO; + CODE_SIGN_IDENTITY = ""; + DONT_RUN_SWIFT_STDLIB_TOOL = YES; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ""; + GCC_PREPROCESSOR_DEFINITIONS = "NDEBUG=1"; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ""; + ONLY_ACTIVE_ARCH = YES; + OTHER_CFLAGS = "--version"; + OTHER_LDFLAGS = "--version"; + OTHER_SWIFT_FLAGS = "--version"; + PYTHONIOENCODING = utf8; + SDKROOT = iphoneos; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_OBJC_INTERFACE_HEADER_NAME = "$(PRODUCT_NAME).h"; + TULSI_BWRS = "$(PROJECT_FILE_PATH)/.tulsi/tulsi-execution-root"; + TULSI_EXECUTION_ROOT = "$(PROJECT_FILE_PATH)/.tulsi/tulsi-execution-root"; + TULSI_LLDBINIT_FILE = "$(PROJECT_FILE_PATH)/.tulsi/Utils/lldbinit"; + TULSI_OUTPUT_BASE = "$(PROJECT_FILE_PATH)/.tulsi/tulsi-output-base"; + TULSI_PROJECT = OlaVideo; + TULSI_VERSION = 0.20220209.88; + TULSI_WR = "${SRCROOT}/../../.."; + }; + name = __TulsiTestRunner_Release; + }; + 7E41376205236FF600000001 /* __TulsiTestRunner_Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = "Stub Launch Image"; + BAZEL_TARGET = "//mediapipe/render/ios:OlaRenderDevelopFramework"; + DEBUG_INFORMATION_FORMAT = dwarf; + FRAMEWORK_SEARCH_PATHS = ""; + GCC_PREPROCESSOR_DEFINITIONS = "NDEBUG=1"; + HEADER_SEARCH_PATHS = ""; + INFOPLIST_FILE = "${PROJECT_FILE_PATH}/.tulsi/Resources/StubInfoPlist.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + ONLY_ACTIVE_ARCH = YES; + OTHER_CFLAGS = "--version"; + OTHER_LDFLAGS = "--version"; + OTHER_SWIFT_FLAGS = "--version"; + PRODUCT_BUNDLE_IDENTIFIER = com.ola.olarender.develop; + PRODUCT_NAME = OlaRenderDevelopFramework; + SDKROOT = iphoneos; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_OBJC_INTERFACE_HEADER_NAME = "$(PRODUCT_NAME).h"; + TULSI_BUILD_PATH = mediapipe/render/ios; + TULSI_XCODE_VERSION = 13.4.1.13F100; + }; + name = __TulsiTestRunner_Release; + }; + 7E41376205236FF600000002 /* __TulsiTestRunner_Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = "Stub Launch Image"; + BAZEL_TARGET = "//mediapipe/render/ios:OlaRenderDevelop"; + DEBUG_INFORMATION_FORMAT = dwarf; + FRAMEWORK_SEARCH_PATHS = ""; + GCC_PREPROCESSOR_DEFINITIONS = "NDEBUG=1"; + HEADER_SEARCH_PATHS = ""; + INFOPLIST_FILE = "${PROJECT_FILE_PATH}/.tulsi/Resources/StubInfoPlist.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.5; + ONLY_ACTIVE_ARCH = YES; + OTHER_CFLAGS = "--version"; + OTHER_LDFLAGS = "--version"; + OTHER_SWIFT_FLAGS = "--version"; + PRODUCT_NAME = "mediapipe-render-ios-OlaRenderDevelop"; + SDKROOT = iphoneos; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_OBJC_INTERFACE_HEADER_NAME = "$(PRODUCT_NAME).h"; + TULSI_BUILD_PATH = mediapipe/render/ios; + TULSI_XCODE_VERSION = 13.4.1.13F100; + }; + name = __TulsiTestRunner_Release; + }; + 7E4137623277CBB400000000 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGNING_REQUIRED = NO; + CODE_SIGN_IDENTITY = ""; + DONT_RUN_SWIFT_STDLIB_TOOL = YES; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = "$(PLATFORM_DIR)/Developer/Library/Frameworks"; + GCC_PREPROCESSOR_DEFINITIONS = "DEBUG=1"; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = "$(TULSI_EXECUTION_ROOT) $(TULSI_WR)/bazel-bin $(TULSI_WR)/bazel-genfiles $(TULSI_EXECUTION_ROOT)/bazel-tulsi-includes/x/x"; + ONLY_ACTIVE_ARCH = YES; + PYTHONIOENCODING = utf8; + SDKROOT = iphoneos; + TULSI_BWRS = "$(PROJECT_FILE_PATH)/.tulsi/tulsi-execution-root"; + TULSI_EXECUTION_ROOT = "$(PROJECT_FILE_PATH)/.tulsi/tulsi-execution-root"; + TULSI_LLDBINIT_FILE = "$(PROJECT_FILE_PATH)/.tulsi/Utils/lldbinit"; + TULSI_OUTPUT_BASE = "$(PROJECT_FILE_PATH)/.tulsi/tulsi-output-base"; + TULSI_PROJECT = OlaVideo; + TULSI_VERSION = 0.20220209.88; + TULSI_WR = "${SRCROOT}/../../.."; + }; + name = Debug; + }; + 7E4137623277CBB400000001 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = "Stub Launch Image"; + BAZEL_TARGET = "//mediapipe/render/ios:OlaRenderDevelopFramework"; + DEBUG_INFORMATION_FORMAT = dwarf; + GCC_PREPROCESSOR_DEFINITIONS = "DEBUG=1"; + INFOPLIST_FILE = "${PROJECT_FILE_PATH}/.tulsi/Resources/StubInfoPlist.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + PRODUCT_BUNDLE_IDENTIFIER = com.ola.olarender.develop; + PRODUCT_NAME = OlaRenderDevelopFramework; + SDKROOT = iphoneos; + TULSI_BUILD_PATH = mediapipe/render/ios; + TULSI_XCODE_VERSION = 13.4.1.13F100; + }; + name = Debug; + }; + 7E4137623277CBB400000002 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS = "DEBUG=1"; + HEADER_SEARCH_PATHS = "$(inherited) $(TULSI_WR)/. $(TULSI_EXECUTION_ROOT)/bazel-tulsi-includes/x/x/ $(TULSI_WR)/mediapipe/render/core/math $(TULSI_EXECUTION_ROOT)/bazel-tulsi-includes/x/x/mediapipe/render/core/math "; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + OTHER_CFLAGS = "-x objective-c++ -fobjc-arc -D_FORTIFY_SOURCE=1 -D__DATE__=\"redacted\" -D__TIMESTAMP__=\"redacted\" -D__TIME__=\"redacted\""; + PRODUCT_NAME = _idx_core_F3E5C6E5_ios_min11.0; + SDKROOT = iphoneos; + USER_HEADER_SEARCH_PATHS = "$(TULSI_WR)"; + }; + name = Debug; + }; + 7E4137623277CBB400000003 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS = "DEBUG=1"; + HEADER_SEARCH_PATHS = "$(inherited) $(TULSI_WR)/. $(TULSI_EXECUTION_ROOT)/bazel-tulsi-includes/x/x/ "; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + OTHER_CFLAGS = "-D_FORTIFY_SOURCE=1 -D__DATE__=\"redacted\" -D__TIMESTAMP__=\"redacted\" -D__TIME__=\"redacted\""; + PRODUCT_NAME = _idx_ref_gpuimagemath_gpuimageutil_8DCE756C_ios_min11.0; + SDKROOT = iphoneos; + USER_HEADER_SEARCH_PATHS = "$(TULSI_WR)"; + }; + name = Debug; + }; + 7E4137623277CBB400000004 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS = "DEBUG=1"; + HEADER_SEARCH_PATHS = "$(inherited) $(TULSI_WR)/. $(TULSI_EXECUTION_ROOT)/bazel-tulsi-includes/x/x/ $(TULSI_WR)/mediapipe/render/core/math $(TULSI_EXECUTION_ROOT)/bazel-tulsi-includes/x/x/mediapipe/render/core/math "; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + OTHER_CFLAGS = "-D_FORTIFY_SOURCE=1 -D__DATE__=\"redacted\" -D__TIMESTAMP__=\"redacted\" -D__TIME__=\"redacted\""; + PRODUCT_NAME = _idx_math_702C098E_ios_min11.0; + SDKROOT = iphoneos; + USER_HEADER_SEARCH_PATHS = "$(TULSI_WR)"; + }; + name = Debug; + }; + 7E4137623277CBB400000005 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS = "DEBUG=1"; + HEADER_SEARCH_PATHS = "$(inherited) $(TULSI_WR)/. $(TULSI_EXECUTION_ROOT)/bazel-tulsi-includes/x/x/ $(TULSI_WR)/mediapipe/render/core/math $(TULSI_EXECUTION_ROOT)/bazel-tulsi-includes/x/x/mediapipe/render/core/math "; + IPHONEOS_DEPLOYMENT_TARGET = 15.5; + OTHER_CFLAGS = "-x objective-c++ -fobjc-arc -D_FORTIFY_SOURCE=1 -D__DATE__=\"redacted\" -D__TIMESTAMP__=\"redacted\" -D__TIME__=\"redacted\""; + PRODUCT_NAME = _idx_core_F3E5C6E5_ios_min15.5; + SDKROOT = iphoneos; + USER_HEADER_SEARCH_PATHS = "$(TULSI_WR)"; + }; + name = Debug; + }; + 7E4137623277CBB400000006 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS = "DEBUG=1"; + HEADER_SEARCH_PATHS = "$(inherited) $(TULSI_WR)/. $(TULSI_EXECUTION_ROOT)/bazel-tulsi-includes/x/x/ $(TULSI_WR)/mediapipe/render/core/math $(TULSI_EXECUTION_ROOT)/bazel-tulsi-includes/x/x/mediapipe/render/core/math "; + IPHONEOS_DEPLOYMENT_TARGET = 15.5; + OTHER_CFLAGS = "-D_FORTIFY_SOURCE=1 -D__DATE__=\"redacted\" -D__TIMESTAMP__=\"redacted\" -D__TIME__=\"redacted\""; + PRODUCT_NAME = _idx_math_702C098E_ios_min15.5; + SDKROOT = iphoneos; + USER_HEADER_SEARCH_PATHS = "$(TULSI_WR)"; + }; + name = Debug; + }; + 7E4137623277CBB400000007 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS = "DEBUG=1"; + HEADER_SEARCH_PATHS = "$(inherited) $(TULSI_WR)/. $(TULSI_EXECUTION_ROOT)/bazel-tulsi-includes/x/x/ "; + IPHONEOS_DEPLOYMENT_TARGET = 15.5; + OTHER_CFLAGS = "-D_FORTIFY_SOURCE=1 -D__DATE__=\"redacted\" -D__TIMESTAMP__=\"redacted\" -D__TIME__=\"redacted\""; + PRODUCT_NAME = _idx_ref_gpuimagemath_gpuimageutil_8DCE756C_ios_min15.5; + SDKROOT = iphoneos; + USER_HEADER_SEARCH_PATHS = "$(TULSI_WR)"; + }; + name = Debug; + }; + 7E4137623277CBB400000008 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = "Stub Launch Image"; + BAZEL_TARGET = "//mediapipe/render/ios:OlaRenderDevelop"; + DEBUG_INFORMATION_FORMAT = dwarf; + GCC_PREPROCESSOR_DEFINITIONS = "DEBUG=1"; + INFOPLIST_FILE = "${PROJECT_FILE_PATH}/.tulsi/Resources/StubInfoPlist.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.5; + PRODUCT_NAME = "mediapipe-render-ios-OlaRenderDevelop"; + SDKROOT = iphoneos; + TULSI_BUILD_PATH = mediapipe/render/ios; + TULSI_XCODE_VERSION = 13.4.1.13F100; + }; + name = Debug; + }; + 7E413762509ED3ED00000000 /* __TulsiTestRunner_Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGNING_REQUIRED = NO; + CODE_SIGN_IDENTITY = ""; + DONT_RUN_SWIFT_STDLIB_TOOL = YES; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ""; + GCC_PREPROCESSOR_DEFINITIONS = "DEBUG=1"; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ""; + ONLY_ACTIVE_ARCH = YES; + OTHER_CFLAGS = "--version"; + OTHER_LDFLAGS = "--version"; + OTHER_SWIFT_FLAGS = "--version"; + PYTHONIOENCODING = utf8; + SDKROOT = iphoneos; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_OBJC_INTERFACE_HEADER_NAME = "$(PRODUCT_NAME).h"; + TULSI_BWRS = "$(PROJECT_FILE_PATH)/.tulsi/tulsi-execution-root"; + TULSI_EXECUTION_ROOT = "$(PROJECT_FILE_PATH)/.tulsi/tulsi-execution-root"; + TULSI_LLDBINIT_FILE = "$(PROJECT_FILE_PATH)/.tulsi/Utils/lldbinit"; + TULSI_OUTPUT_BASE = "$(PROJECT_FILE_PATH)/.tulsi/tulsi-output-base"; + TULSI_PROJECT = OlaVideo; + TULSI_VERSION = 0.20220209.88; + TULSI_WR = "${SRCROOT}/../../.."; + }; + name = __TulsiTestRunner_Debug; + }; + 7E413762509ED3ED00000001 /* __TulsiTestRunner_Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = "Stub Launch Image"; + BAZEL_TARGET = "//mediapipe/render/ios:OlaRenderDevelopFramework"; + DEBUG_INFORMATION_FORMAT = dwarf; + FRAMEWORK_SEARCH_PATHS = ""; + GCC_PREPROCESSOR_DEFINITIONS = "DEBUG=1"; + HEADER_SEARCH_PATHS = ""; + INFOPLIST_FILE = "${PROJECT_FILE_PATH}/.tulsi/Resources/StubInfoPlist.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + ONLY_ACTIVE_ARCH = YES; + OTHER_CFLAGS = "--version"; + OTHER_LDFLAGS = "--version"; + OTHER_SWIFT_FLAGS = "--version"; + PRODUCT_BUNDLE_IDENTIFIER = com.ola.olarender.develop; + PRODUCT_NAME = OlaRenderDevelopFramework; + SDKROOT = iphoneos; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_OBJC_INTERFACE_HEADER_NAME = "$(PRODUCT_NAME).h"; + TULSI_BUILD_PATH = mediapipe/render/ios; + TULSI_XCODE_VERSION = 13.4.1.13F100; + }; + name = __TulsiTestRunner_Debug; + }; + 7E413762509ED3ED00000002 /* __TulsiTestRunner_Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = "Stub Launch Image"; + BAZEL_TARGET = "//mediapipe/render/ios:OlaRenderDevelop"; + DEBUG_INFORMATION_FORMAT = dwarf; + FRAMEWORK_SEARCH_PATHS = ""; + GCC_PREPROCESSOR_DEFINITIONS = "DEBUG=1"; + HEADER_SEARCH_PATHS = ""; + INFOPLIST_FILE = "${PROJECT_FILE_PATH}/.tulsi/Resources/StubInfoPlist.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.5; + ONLY_ACTIVE_ARCH = YES; + OTHER_CFLAGS = "--version"; + OTHER_LDFLAGS = "--version"; + OTHER_SWIFT_FLAGS = "--version"; + PRODUCT_NAME = "mediapipe-render-ios-OlaRenderDevelop"; + SDKROOT = iphoneos; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_OBJC_INTERFACE_HEADER_NAME = "$(PRODUCT_NAME).h"; + TULSI_BUILD_PATH = mediapipe/render/ios; + TULSI_XCODE_VERSION = 13.4.1.13F100; + }; + name = __TulsiTestRunner_Debug; + }; + 7E41376250C156B800000000 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGNING_REQUIRED = NO; + CODE_SIGN_IDENTITY = ""; + DONT_RUN_SWIFT_STDLIB_TOOL = YES; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = "$(PLATFORM_DIR)/Developer/Library/Frameworks"; + GCC_PREPROCESSOR_DEFINITIONS = "NDEBUG=1"; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = "$(TULSI_EXECUTION_ROOT) $(TULSI_WR)/bazel-bin $(TULSI_WR)/bazel-genfiles $(TULSI_EXECUTION_ROOT)/bazel-tulsi-includes/x/x"; + ONLY_ACTIVE_ARCH = YES; + PYTHONIOENCODING = utf8; + SDKROOT = iphoneos; + TULSI_BWRS = "$(PROJECT_FILE_PATH)/.tulsi/tulsi-execution-root"; + TULSI_EXECUTION_ROOT = "$(PROJECT_FILE_PATH)/.tulsi/tulsi-execution-root"; + TULSI_LLDBINIT_FILE = "$(PROJECT_FILE_PATH)/.tulsi/Utils/lldbinit"; + TULSI_OUTPUT_BASE = "$(PROJECT_FILE_PATH)/.tulsi/tulsi-output-base"; + TULSI_PROJECT = OlaVideo; + TULSI_VERSION = 0.20220209.88; + TULSI_WR = "${SRCROOT}/../../.."; + }; + name = Release; + }; + 7E41376250C156B800000001 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = "Stub Launch Image"; + BAZEL_TARGET = "//mediapipe/render/ios:OlaRenderDevelopFramework"; + DEBUG_INFORMATION_FORMAT = dwarf; + GCC_PREPROCESSOR_DEFINITIONS = "NDEBUG=1"; + INFOPLIST_FILE = "${PROJECT_FILE_PATH}/.tulsi/Resources/StubInfoPlist.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + PRODUCT_BUNDLE_IDENTIFIER = com.ola.olarender.develop; + PRODUCT_NAME = OlaRenderDevelopFramework; + SDKROOT = iphoneos; + TULSI_BUILD_PATH = mediapipe/render/ios; + TULSI_XCODE_VERSION = 13.4.1.13F100; + }; + name = Release; + }; + 7E41376250C156B800000002 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS = "NDEBUG=1"; + HEADER_SEARCH_PATHS = "$(inherited) $(TULSI_WR)/. $(TULSI_EXECUTION_ROOT)/bazel-tulsi-includes/x/x/ $(TULSI_WR)/mediapipe/render/core/math $(TULSI_EXECUTION_ROOT)/bazel-tulsi-includes/x/x/mediapipe/render/core/math "; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + OTHER_CFLAGS = "-x objective-c++ -fobjc-arc -D_FORTIFY_SOURCE=1 -D__DATE__=\"redacted\" -D__TIMESTAMP__=\"redacted\" -D__TIME__=\"redacted\""; + PRODUCT_NAME = _idx_core_F3E5C6E5_ios_min11.0; + SDKROOT = iphoneos; + USER_HEADER_SEARCH_PATHS = "$(TULSI_WR)"; + }; + name = Release; + }; + 7E41376250C156B800000003 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS = "NDEBUG=1"; + HEADER_SEARCH_PATHS = "$(inherited) $(TULSI_WR)/. $(TULSI_EXECUTION_ROOT)/bazel-tulsi-includes/x/x/ "; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + OTHER_CFLAGS = "-D_FORTIFY_SOURCE=1 -D__DATE__=\"redacted\" -D__TIMESTAMP__=\"redacted\" -D__TIME__=\"redacted\""; + PRODUCT_NAME = _idx_ref_gpuimagemath_gpuimageutil_8DCE756C_ios_min11.0; + SDKROOT = iphoneos; + USER_HEADER_SEARCH_PATHS = "$(TULSI_WR)"; + }; + name = Release; + }; + 7E41376250C156B800000004 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS = "NDEBUG=1"; + HEADER_SEARCH_PATHS = "$(inherited) $(TULSI_WR)/. $(TULSI_EXECUTION_ROOT)/bazel-tulsi-includes/x/x/ $(TULSI_WR)/mediapipe/render/core/math $(TULSI_EXECUTION_ROOT)/bazel-tulsi-includes/x/x/mediapipe/render/core/math "; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + OTHER_CFLAGS = "-D_FORTIFY_SOURCE=1 -D__DATE__=\"redacted\" -D__TIMESTAMP__=\"redacted\" -D__TIME__=\"redacted\""; + PRODUCT_NAME = _idx_math_702C098E_ios_min11.0; + SDKROOT = iphoneos; + USER_HEADER_SEARCH_PATHS = "$(TULSI_WR)"; + }; + name = Release; + }; + 7E41376250C156B800000005 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS = "NDEBUG=1"; + HEADER_SEARCH_PATHS = "$(inherited) $(TULSI_WR)/. $(TULSI_EXECUTION_ROOT)/bazel-tulsi-includes/x/x/ $(TULSI_WR)/mediapipe/render/core/math $(TULSI_EXECUTION_ROOT)/bazel-tulsi-includes/x/x/mediapipe/render/core/math "; + IPHONEOS_DEPLOYMENT_TARGET = 15.5; + OTHER_CFLAGS = "-x objective-c++ -fobjc-arc -D_FORTIFY_SOURCE=1 -D__DATE__=\"redacted\" -D__TIMESTAMP__=\"redacted\" -D__TIME__=\"redacted\""; + PRODUCT_NAME = _idx_core_F3E5C6E5_ios_min15.5; + SDKROOT = iphoneos; + USER_HEADER_SEARCH_PATHS = "$(TULSI_WR)"; + }; + name = Release; + }; + 7E41376250C156B800000006 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS = "NDEBUG=1"; + HEADER_SEARCH_PATHS = "$(inherited) $(TULSI_WR)/. $(TULSI_EXECUTION_ROOT)/bazel-tulsi-includes/x/x/ $(TULSI_WR)/mediapipe/render/core/math $(TULSI_EXECUTION_ROOT)/bazel-tulsi-includes/x/x/mediapipe/render/core/math "; + IPHONEOS_DEPLOYMENT_TARGET = 15.5; + OTHER_CFLAGS = "-D_FORTIFY_SOURCE=1 -D__DATE__=\"redacted\" -D__TIMESTAMP__=\"redacted\" -D__TIME__=\"redacted\""; + PRODUCT_NAME = _idx_math_702C098E_ios_min15.5; + SDKROOT = iphoneos; + USER_HEADER_SEARCH_PATHS = "$(TULSI_WR)"; + }; + name = Release; + }; + 7E41376250C156B800000007 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS = "NDEBUG=1"; + HEADER_SEARCH_PATHS = "$(inherited) $(TULSI_WR)/. $(TULSI_EXECUTION_ROOT)/bazel-tulsi-includes/x/x/ "; + IPHONEOS_DEPLOYMENT_TARGET = 15.5; + OTHER_CFLAGS = "-D_FORTIFY_SOURCE=1 -D__DATE__=\"redacted\" -D__TIMESTAMP__=\"redacted\" -D__TIME__=\"redacted\""; + PRODUCT_NAME = _idx_ref_gpuimagemath_gpuimageutil_8DCE756C_ios_min15.5; + SDKROOT = iphoneos; + USER_HEADER_SEARCH_PATHS = "$(TULSI_WR)"; + }; + name = Release; + }; + 7E41376250C156B800000008 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = "Stub Launch Image"; + BAZEL_TARGET = "//mediapipe/render/ios:OlaRenderDevelop"; + DEBUG_INFORMATION_FORMAT = dwarf; + GCC_PREPROCESSOR_DEFINITIONS = "NDEBUG=1"; + INFOPLIST_FILE = "${PROJECT_FILE_PATH}/.tulsi/Resources/StubInfoPlist.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.5; + PRODUCT_NAME = "mediapipe-render-ios-OlaRenderDevelop"; + SDKROOT = iphoneos; + TULSI_BUILD_PATH = mediapipe/render/ios; + TULSI_XCODE_VERSION = 13.4.1.13F100; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + BA35A3F630A77E2E00000000 /* Build configuration list for PBXNativeTarget "mediapipe-render-ios-OlaRenderDevelop" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7E4137623277CBB400000008 /* Debug */, + 7E41376250C156B800000008 /* Release */, + 7E413762509ED3ED00000002 /* __TulsiTestRunner_Debug */, + 7E41376205236FF600000002 /* __TulsiTestRunner_Release */, + ); + defaultConfigurationIsVisible = 0; + }; + BA35A3F6759537C100000000 /* Build configuration list for PBXNativeTarget "_idx_math_702C098E_ios_min11.0" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7E4137623277CBB400000004 /* Debug */, + 7E41376250C156B800000004 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; + BA35A3F678E35B6B00000000 /* Build configuration list for PBXProject "OlaVideo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7E4137623277CBB400000000 /* Debug */, + 7E41376250C156B800000000 /* Release */, + 7E413762509ED3ED00000000 /* __TulsiTestRunner_Debug */, + 7E41376205236FF600000000 /* __TulsiTestRunner_Release */, + ); + defaultConfigurationIsVisible = 0; + }; + BA35A3F679C39EDD00000000 /* Build configuration list for PBXNativeTarget "_idx_core_F3E5C6E5_ios_min11.0" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7E4137623277CBB400000002 /* Debug */, + 7E41376250C156B800000002 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; + BA35A3F69A9D9AED00000000 /* Build configuration list for PBXNativeTarget "_idx_core_F3E5C6E5_ios_min15.5" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7E4137623277CBB400000005 /* Debug */, + 7E41376250C156B800000005 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; + BA35A3F6A0C2EAAF00000000 /* Build configuration list for PBXLegacyTarget "_bazel_clean_" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + ); + defaultConfigurationIsVisible = 0; + }; + BA35A3F6A53D5D0F00000000 /* Build configuration list for PBXNativeTarget "OlaRenderDevelopFramework" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7E4137623277CBB400000001 /* Debug */, + 7E41376250C156B800000001 /* Release */, + 7E413762509ED3ED00000001 /* __TulsiTestRunner_Debug */, + 7E41376205236FF600000001 /* __TulsiTestRunner_Release */, + ); + defaultConfigurationIsVisible = 0; + }; + BA35A3F6AA12506300000000 /* Build configuration list for PBXNativeTarget "_idx_math_702C098E_ios_min15.5" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7E4137623277CBB400000006 /* Debug */, + 7E41376250C156B800000006 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; + BA35A3F6C741168500000000 /* Build configuration list for PBXNativeTarget "_idx_ref_gpuimagemath_gpuimageutil_8DCE756C_ios_min15.5" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7E4137623277CBB400000007 /* Debug */, + 7E41376250C156B800000007 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; + BA35A3F6EB0434D400000000 /* Build configuration list for PBXNativeTarget "_idx_ref_gpuimagemath_gpuimageutil_8DCE756C_ios_min11.0" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7E4137623277CBB400000003 /* Debug */, + 7E41376250C156B800000003 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; +/* End XCConfigurationList section */ + }; + rootObject = 82C5998AA8C9888400000000 /* Project object */; +} \ No newline at end of file diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/mediapipe/render/ios/OlaVideo.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..94b2795e2 --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,4 @@ + + + diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/mediapipe/render/ios/OlaVideo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/mediapipe/render/ios/OlaVideo.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 000000000..a821c4662 --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,14 @@ + + + + + BuildSystemType + Original + DisableBuildSystemDeprecationDiagnostic + + DisableBuildSystemDeprecationWarning + + IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded + + + diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/project.xcworkspace/xcuserdata/wangrenzhu.xcuserdatad/UserInterfaceState.xcuserstate b/mediapipe/render/ios/OlaVideo.xcodeproj/project.xcworkspace/xcuserdata/wangrenzhu.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..508c2f4f600ed53f8af232dc5d7081862ee52d76 GIT binary patch literal 15388 zcmeHud3aM*^Z!}W0u5!9kqpJ5cr*Yd%uHX*2ZC;&cUHP9(9+?Cx4QI@&p$KW*Svsl2?di8 zzIbyJmsIVX!Y|`nOCycmLIcsDdS}QL;u*eIiN_;38jQ3k73okm%0YINi}FxDDnNy( z995u7Gzm>cRp@Lq1x-Z_Xa<^zW+5K6p?1`P+-MOBq7Yh+R-o00p^MO^Xf3)5U5&0o z*P~777IZ6m96f=aL{Fio(KF~-v=jXcJ%^r0yU-r=GI|}of!;)Kp?&Bp^ffwwzCquj zgXlYS4E=|Jdwi4(B!fr-k(0qhK@v$4;fRtX6AdwuAtaq- z5Ie~w#bhKIL(U>)WD1#1oMZ->Lz>8Z(n|c~ToNEb5+aO*$@%00av@nmE+^NJb>w=| zMY_orvX$IM?j`q;hsYD;S+bk#A+L~qKck=1FX)%_EBZD4p8i6ArN`+B`Wrndi<8C62FMa*dYM6Hl$m5h zWJ6_US*FY)%a#?$iex4A>E2F{XD?EqM3jU$q(Yh*)y~|7{IcL|_#5HnhV&MXD;VrX zN|ek9qunS4shN!JWkZ{|^br*WWg{v|3hl*3r4IXu{K|>;lKkRwdw%h#Q5BAfB_k?I z%bK{9s`82%zQDqu-_^pG`&v2|@!n8$Vm%s;Y_}r=G9nWif`+0rG>pZucs76yWP?}& zli!ZaC>>>>OlXvaGT31DCR@thf<`IuH?xTw*LVCnS96)q8w&V59zM`iR5og4MP-@8 zUQkdD1eO+#w2vyPth5)5EXgk`E2%7~95t~~=rE;`T{VHZcBB2g&c*+xYk%Kv$9lj;iuEp+l7py=kioKQwcvy!LTGfZ# z9(Tyi2WPljLmg7HDsRvavdHEoQ;~0Z7Z6C=AwD1k?EO%8JTG-nvYzl8O>)ySQ;A!zhUN-O1CG(2gH+|xNI6w z0WuzDo9YUNVlxTFO`N9Q+jhprsnQsHYkgJ!aia7rKnsy(^JX@*2YHbX`O&$vrEBN~ z{+ua2^1->)&T==fl+Wu5EbE3=ftl6L>7ojfIHn&xP9K~ZG>p#CiIyNu7h24QccG=s zEL>-S%g)%R2L!}Qv_%r1cnmci1eE6M%MQN@V~mBo!H z8Z*ls;unc41zrJZ5-M$J;e$cG6|M%~7;F*lYK<=lEamgg3r3Eu3iPvkK|WY9bGpaX;BMu8vlj8KZkONf=Nke%GzmD} zz95HtIAwC;nWpBK`dwZ@lZ(VTN_UNS*1ocP2TYWb*qtEn(P&e3f3x58DL)bpK~IBj z3((YK8Zz|ncAdzL%7u=@bX^HO=Jbre+pYB6oLcB+(RC+e&8!LdT06n?=&@zz{M`X& z?|Zoi2FTS3o0wPE;tTLS1%-~k+ufN|5fZnoG4bYLcX3Jg$dP6g`PV&aw0Xk0(u;Y* z`Wo?RGuS^$km0!?ho*onGY{^T2b~KR%!TN3uw1SI%jHh=7+5JUqTOJhe1?vq6X+yH zSO(UJ5od$#F$#|XyTb`~#zO4JL9jH!csJHU!~1T2W1crX4O?1rE4ulP4YNj%sK zsS+IoM~FKs@;CB_=%iZ~M(2a*uUP8$NWy!1XUOCB@(pf&iDbbEY#+I?ThIkSG)Tz5 z*}jQuZmJ7SDr+bxE^nyoodcv-VR7$kpDF8>`T5|;$aGB&&L&4eZ#$7)ogk;Z?NzOC z{oHMC&~?%>E=HF$ajI(Pw9b$~aIb{ef-V+hMD+e&277MnLTgx77pexi3bHNZ%u-bp znz_zU02r(@z?&!dCx}}Y9qAf$tuWF$mfeNcvm9ZhVVyxfP!r(W_&|VfErV;`?h7od zSQ_HR>sD1B>=CVw8_>qh%q|grBf6D`17p!A7tmR?J4S5;lsBz6;%r?m_pW`_TR90rVhx z2t5qXkFqgrEE~thvk9z}-NEi>FTwN6qN0gvkzPIJ1o0NC5(H2Uh@vLWHj!_Gt5fD% zkKt<>Qm?tIU(4@nf+3`XtfASTKmgqU<(lN<$Rk9CMf5dJKH5)ofavo5l~GKj_4G* z9&DWETIycpUe32hgt$`d-460qAW^s>d(jJUYm?ARfGl={I;?iac4#W^Z5OSCK4lFq zPbbe|4zaVO!+!<6I;T&4H+l^P`WDQd?&rN#UND)09BSf{Bl|IxZwuA=YTfM}A&H@S z(8eybmrZ2$D3iQ{K0>x_z#i|R{pfx40s0V_qKuWZ3RcM`Z9^ZUPtd3E`*W}?C$lPc zG5o$=vMZI+Zo;Hs1V)ywlFBB-Mgd1dVavkcJgH1L;Q~kY96@tU0SzS@1}3n0Iz6p| z-BSbRb}fHyCzyx8EP@RjqdvrVRkl~(hZ{T9yS%Y5-wA+uMeyCRB=BEv^3-bi51w%BHc#_t0Elw0jKhB^e0GBj0vV7OXJ{a03O)H=~^SU zxWtqoErh|VMH_e+m@d3vx(b3QHy8?ltT~mPl7a%3?UgW1oWUy^kCBm1ZLjQCE6g(| zNlG9+>BeeV2XnJ(b`d`ri8u*!Sc#Ld3f%)+6NMO4 zeJ!G4(%35`r7NqB*@?A2UkI!*UMh#4i(GDRZ*$lqadW4)MaS%|V@<4vH8Y+~XJebV zyqN6lx0%v_y>@9#ii*dDwdnY5I2G%#9viTcox|$cOg5X%WsQ6BP@D#HNf(z6)l}|elhRy`ExrsBHk!$!C6h55iWeM@`A|)jUkCHcc2?v1r_#} zZK7mk;~Z>e4QvLh6KtwzaXz{Sie~|z)c(da8+oQG zu$=K!JPlXR_JgvJ4uG|?mL_h_KS{4>{pKzeK#@P-TOiSU4z8U8)JEC68#_U!_9>8B z)#C;U$oAvgUZ&}PiM#O(VW|S}{afw#;#sf*vvCEUi^~M}LbEH#gJ91M@E*9Ei+P4v zJDV?&(uC*NS35xzbmJyrmLz{?v&Y?%+hXtFU0}^eWF>CFUS!*jTQQH@a69h6ZoB~O zK@VQU7O;iP!xk|w^D#d=mjzgGJNAL|0RDry7y|8|ftR2x76K73{9ncxu;Ee`1{e&o zR`2w623kOwxAKxu&z0~9=xewsr&oelpXT<0iuQxibH-|6s4^e;2wm-f35TAsO_g`C z^poBs3Uwa>tv0Ryt@n?--_4Z%Y`4dm@N^18o7a- zeqi))uf-bxm*Vwoc^AHptq^djzMS`jT+(?+ia)j)(O#SI%}CRYZ^SpTm26cvz6IaP z&SR_D&^f|7MUlq`8(Sm#PBKX(lD4Abn^_~b!~E<~2@phwyc6#bhTM+tV&}69`V3j$ z2J1g{uqMtP(*S}`LZUV*DROK0c2}@7*n4gg$3KK0mfT}f^FAuR8$Tjk0l{^4TAf7r zV_@pw$Jr%dKjWw1l0A)|0SMpH2^P0EbXp&FDcg2tli)f0eAFZmmFzlp*_oB>ZoDU| zWZ5-rO;qVZC5C0f)+qeP4PsFG;W zH=+W$x}O5+r!pkv5IxEt@b7}a_z@oiVE8ls1;F8Pd;;D9X=(@`df(-np1O`!oz#u8?mWaS0U?6P; z0Dq70!)}H17JeGJsIQO=CBr~kkTllSMTWEPzb7q7Cb5drf@FcT*wW`}pCTb5{6q3c zp(qMS0f>Uz{&RcrQj-!g3V_%%ffClTDa9`t^|b_g$_;9{q1MulCfl5?Ec-y z?(BE}NIBd;Qb8)oBr=&)vF+?Gwu9Zx?)m?6|HxeN{@wdG?;qjG0`RYrHquTyh?_mY z9%K)(hqsc2#DjB)mp#Is1Viy@mN`=ZbON57C1N_^X|^QsCHO3CTnux@AZ+xQI>~Zj zn#E)ZSxT0%N7-ZSarVSkxXkz9Ti^;W1$xhuuC1W~u)5$M0UtZRL_lZ3TGtX0mV(;T z_pgn3B%LijKd8*KewAW(UjXnlC|9>1Kq2(k^lKuHF2JZLofnZyz+plzW>0kiSBn@= z2{DVH&%=YU2Hs_1vC+m?khMbNE7>z$8V5BI)h>PulhzCU(Os+*6yUBX8f$d~3 z!~ih4f!u^NTgXPTiQLHk#hzo&Zy{|ci`)w5kivGcq4Qw4UVt%Ickf6cg8S#H_xiej$TqV5wDH?v{JY_lQ`n1aDD?36>v2DM0NKF3of%!@!{pJ}8Xsf3 zS*Em}Cx!JqMV@AR*lWG(*-3VtHs1>{-%IQjnD13KbXM%@nJ2jC_nY}u^5$uM-$EH= zFMA!h;|)Q4Bth?}dqeP#m?zBLDUJcw(25lWBMVD%((H~x$EuvP6@^8``8jC?BMORE zt?D8BQ4)Edd>~l4tpJ>-D`k87yTaoKWc^=b$DeTAz(InqJ245I*{T$^;F{JOj3(pI zv|+=+Yn*ABSMBT*#R4ko+#wI}s}e#|QiT+l;sX%g6MPzie+rsa1;J6#0Csm(RXGF@ zs)Ex10t1S!c2>Frf{#Dw_X)mqu-eOnP@v==;9{dn_cI99&JcLCrn!O(0XD~~p+9(z zCh=adfCUG?=$w@3iJ|bSa*3o#0l!Ft;L~Vb3f@4eU3KT8WlAVvlOXppf1 zN|wZ7hyp4(q_o!E%OzXE`EAe5%O5pz z_vjKIXM*692cka>5NB_Nn7a?9rKLbH64AkTz@CYUY3&qwZ zEdgSsql!!NA^teRUR+RE0{s?>JsQi%yjuJ=NsNzydHAJn(-ZM_VU7tiS`ji#YOfKpwnJb;izzw7v&cfjVhcQ~J!Of^zC9x0*dhH}oX$|X{tcuZ7dwjqP{n__x&Nga z)^|>Aj29&;yU(eF;=20&A-KBAIr&Q+uKW=Ng$1sBG1{Sr$h8&nIYvSrhX*1Z=R=I6 z3p~{KL2kyY;FA0f{fbrC3XzSm;3uetOp02FZq(rhJOj_dbMQPoA7UM?fO9(l;WB(N z#5o?tKS4%BKIr-Bkmt}$+@MDn5g+6^1j%x;fovx`$UTtF@Gkk1d`o^Jf6&1+iKfzF zw2Zb=M$e}g(u?VBkYBKyzDGZREP_Kcf_-8!k{P1Ni~XX%vmVK~`G|ZBf+iYV05P|P zd_+D$0T3X9w=gQvKO^5E+nwZd@&yp_75SPRAm0En2ieV9XNTP0h*ZiKBDjJR-^0Uz zy}od%+eC0%w2B?wp=IC_0gVr;B6?9JjuQ+A=}8Dzc-vt%ujFU1^0xV)dDLYaYo1!m zx5U6&bTEPB$Tm_$2`EN9kX_hCDf>94F=;#<1ny!yfDQy_=qKGYfy&uu>}P1u>u{l* z=v?{qA9j%mal*W^2JwD1ceX)@C%41zk5a6nLjY>g6so2gss*moQ9U(KBQ>$l*%$0f z_7(e@9bn(EZ`nci-F7-uf?CupK`m+lJMH@j)H)o2TE~DP{^y(V1^!W}MT-Dx(PDNe z0=4L(vXwgaZY!PVDDgatPbkix|mibX|%bWtVM0=0c zh_0CEj857hf-YJQpzEjq+&9{OE^QY$Zys%=O>{nW(Pr8L@{Xr%>=*VcJI+q9-`Gj^ zJNtwEoBg?+c0@SOLl+5NLFz|YVT>f!3u6+-1Hd$28ivdFKkgH9bpBcHJ5S)g)nSaI z>~}t}ADn~uA2we4-xxjI%jo3-`>hFM+C{GjW7*$iz^m!C5(BPdE5kSrxQK3GKZbGq zX)LIW-xo_?h|YQ=y+vZdo7wqcJm@caM|*6g+XOmq3uAc~y*-Qv1H1xjP_UV!#+UBY z_<|@&mq318bdVkNQKZ>U@22$a#sd@oIXvTq0iEtC?kwh!&nDA46LjRV|^GK!q^zbCgAj;vmhg= zoew$7r+{9Ro*|IrZh`b3R|uloi)Oon6&`oHkoyL(wr`6n$o>K+KIHKLR)`HF0$(ra z#(twk10`U2N-f3kLI~2cAfF&sD9v2yTIBXD14Fp)WC9@e2%hxQhyWWIjNA}E*X{4{ zd3j&3peVO!X7r_rbF?lFwTer!1Cn*u2#sKIEqn(!aruBf+H$nNw-6SwsCWclGh0M0 z?iTlSXY^>^ru)IgK=;vi=)3g2FdiDlX<3bmTJ(f|m!UHdFT*k-qhXvI#(80!&oa&9BPMSPO3NT9O@!~Vf#iefN_yf{*#3V{ z`5ri^E&w5B$oJ-S^1-SUqsfw$TQX|&@G;{jO|Ck7$~pB7v*$%JaV2aI7%8$qDbEie zMrjBFx6Pd)J_s4Osf^BYc0vLj-^#b{RcjKpI>Q-oVOJ`Xb?E^etH3g^goN0AL%>sz zD7p%uM1XuSQ(L9S)h;Fy#@ts>DM%~xgiL8`m6vjmiW|?gz{$C#ejzVq86=4;s;?48 zod~yRZ=wjin>ejBQ?Dy5# zy#~UB0^zaF;EV&OM4eDx$-4w$;^aeM(zgfuGyxneHL0(v4?++wR@I|PJZoInSip!W z!rT+e4Be#@g@oDe@(L+u7E%(RYjk8GozxfT^_0PaW3_^NueXLnTzt>eY1Pxu1dID) z#_F0FD25)jP5_z_a3!Tc)z;O(>59*QAf$x|n=UQ|dd!$9xoThwdiTA1R?Qhoq4k`( z5pL+7QvZ3-D-=?+gqD!^2VWk@iX%CI!ZToy7^r29z;8PEIv@wWh#3ue>*s(sZZ2ws z?=ijxFTqK`zzX>OA_Z`!ftu)0@NY~8%ijZER;;3{;me8(=tcArdKr9Kv5DS9Z=svv z>k6>X=pCT;j>C$l%Dl2QvfE@2$o?gJUiO0QCE0G-E3(&QZ^%BDeJcB0_NDA=**CI- zvhQVw<8WL`Tvptexao1tasIe-gD@ka;92c!%r7~mLCH0a=cr)SMgf9~gBz&9j zeZt{{qw-YwFnO-LK<6 zr`)XUR&G^pOO_|6B-@hnk}Hy{lV>H*NuHPdWb&@$H-x6{=d*Y*m}8 zL$yHVQFW?TsF-S<>Q>c5sz+3hsh&_hrFurSQ}vu`m+D2;%c_r5pQt`leWChFbwKs4 z>O0jT)e+SXs$(f!N?wXHr88w?%Cjk7sEK-*dYpQa`fT-7b+vkidcL|@-KuU=cc>Sr zJ!-Gor(UUEtq!X%R9~#VRDGNJ0rjKm$JI}&cdDOL?^3_0?oofHKB)dqeMo&oeOwc# zNze?|Bx+O|h#+WmnxUFpO{1n=bDrh`%_hwj%{I*)n(dkgHLq*l)bwbMX@1uHsyU%K zsrf_mrxt6e)~Fq#P16q7rfV~`S=s{aS=w>h3EGL;a&4t{vbJ73Lpw`5N86!Yp!I0I z+7;SW+SS^ycCGem?K3O1KMx3-)RqNk7$3; z9@GA;{Z)G+H8GV-O-@Zo)ug7T>QjxWLsHXHho`2emZr{6y)boK>Ymi2x)hy5SF7{s zmg-jMR_RvjF4bM5yH>YBcfD?-?nd3sy6w8Vb@%EX&^@GkM7LM>sqQP?0o}K{!@8ro zA9X+Jsh-oT^;*47KSZCVAFfZ=JM?Gi>-4kq=jt!e-=x1qzggd{->ToHze9h&{we)4 z`kngc^t<#g>R;CH)4!|Vum3>*jsBqid;MYkN&O%CKMmNBXy6RVh7`jvgV~T_uo&_U zV-4dCrG_#?jbWByj$xjm$>1_9FnA1JgWnJ^gbb?;ml)O=wi_Nb>@+-Q*kyRp@Ur18 z!(PKa!@Gw4h7SxUj2h!8W392t*lcVywj15Xg~rv!D~wkeuQ9GSUT3_)xWo9c@d@Ko z#%GK>jjtKsHojwg&-lLaGvgP=uZ#zb-x_~4$xK>Pn#pb&VJbG2m`0mQO=YGE(3P$urv0W*O`n^-G<|J4WIAH{!F0^@^N;~UxFLB%N`_1@Cz?64&TKK~nv2X6&GqIP z=2_-B=6U8Ov&-CK=FRQq<>r;<^UPuMh2~4lYs^=guQp$6-eBHg-fe!zd?-CFy)b=x zx+{HU`eo@?q_0iCCjHv<4e8zKx2NBkepmW^=?|nol>SKi^XV_7zm&c^BR6AAMomU- zMqNfj#>|Y_8FMolGv;SBXS8N4%UF@IDr0pVYnfr0Wtn4{XYp7%EsHHnEf-nVSgx?FwOni2V7cD1(Q=37Vap!NtCrU-Z(4dR zZ(H86yk~je@}cEp%Q4F@mgAP+EWca+%pzH`toW=!S@JAJmMyC)Yf;u!Sr2CI&-%k^ zw2raPw7RUV)^@Ag8nCXguClJShOHM^FS4$)Zm`~9z0rD$b+h$p>mKVH*0-#0TlZT( zuzqa))Oy7FqxGb1piN;*vL)NJHl59A8)CEDM%%{PCfLesmA1*Y23x?k+P2!j*Mgr4ekr7dT%oE^Q>ZI677i^OUYJ){SU93^ zWZ~$-vkJ!*PAKFH*AzZf_;KNZ!lQ-99oQjrC>$vcog>Rp;27a3hEQ9DW3uCH$23Qc qqt-FU(dd}(Xm%`gcpP5G630r%c@8F-MkHb{%Em?v#K<4V`Tq|DQ)g5F literal 0 HcmV?d00001 diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/project.xcworkspace/xcuserdata/wangrenzhu.xcuserdatad/WorkspaceSettings.xcsettings b/mediapipe/render/ios/OlaVideo.xcodeproj/project.xcworkspace/xcuserdata/wangrenzhu.xcuserdatad/WorkspaceSettings.xcsettings new file mode 100644 index 000000000..8ab079c11 --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/project.xcworkspace/xcuserdata/wangrenzhu.xcuserdatad/WorkspaceSettings.xcsettings @@ -0,0 +1,10 @@ + + + + + IssueFilterStyle + ShowAll + LiveSourceIssuesEnabled + + + diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/xcshareddata/xcschemes/OlaRenderDevelopFramework.xcscheme b/mediapipe/render/ios/OlaVideo.xcodeproj/xcshareddata/xcschemes/OlaRenderDevelopFramework.xcscheme new file mode 100644 index 000000000..8f4216aa4 --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/xcshareddata/xcschemes/OlaRenderDevelopFramework.xcscheme @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/xcshareddata/xcschemes/_idx_Scheme.xcscheme b/mediapipe/render/ios/OlaVideo.xcodeproj/xcshareddata/xcschemes/_idx_Scheme.xcscheme new file mode 100644 index 000000000..4311abdbb --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/xcshareddata/xcschemes/_idx_Scheme.xcscheme @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/xcshareddata/xcschemes/mediapipe-render-ios-OlaRenderDevelop.xcscheme b/mediapipe/render/ios/OlaVideo.xcodeproj/xcshareddata/xcschemes/mediapipe-render-ios-OlaRenderDevelop.xcscheme new file mode 100644 index 000000000..ddbe0a5c9 --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/xcshareddata/xcschemes/mediapipe-render-ios-OlaRenderDevelop.xcscheme @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mediapipe/render/ios/OlaVideo.xcodeproj/xcuserdata/wangrenzhu.xcuserdatad/xcschemes/xcschememanagement.plist b/mediapipe/render/ios/OlaVideo.xcodeproj/xcuserdata/wangrenzhu.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 000000000..cbcb733fa --- /dev/null +++ b/mediapipe/render/ios/OlaVideo.xcodeproj/xcuserdata/wangrenzhu.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,26 @@ + + + + + SchemeUserState + + OlaRenderDevelopFramework.xcscheme_^#shared#^_ + + isShown + + + _idx_Scheme.xcscheme_^#shared#^_ + + isShown + + + mediapipe-render-ios-OlaRenderDevelop.xcscheme_^#shared#^_ + + isShown + + + + SuppressBuildableAutocreation + + + diff --git a/mediapipe/render/module/beauty/BUILD b/mediapipe/render/module/beauty/BUILD new file mode 100644 index 000000000..e69de29bb