From 4b25e1b640a315b7cd27d254ab3099606030f8c5 Mon Sep 17 00:00:00 2001 From: Lars Johan Blome Date: Tue, 28 Oct 2025 17:32:00 -0700 Subject: [PATCH 1/3] encapp: x264 in iOS Signed-off-by: Lars Johan Blome --- ios/Encapp.xcodeproj/project.pbxproj | 256 ++++----- .../contents.xcworkspacedata | 7 + .../xcshareddata/swiftpm/Package.resolved | 15 + .../UserInterfaceState.xcuserstate | Bin 0 -> 72715 bytes .../xcschemes/Encapp test.xcscheme | 78 +++ .../xcshareddata/xcschemes/Encapp.xcscheme | 108 ++++ .../xcdebugger/Breakpoints_v2.xcbkptlist | 153 ++++++ .../Copy of Copy of Encapp test.xcscheme | 100 ++++ .../xcschemes/Copy of Encapp test.xcscheme | 78 +++ .../xcschemes/xcschememanagement.plist | 47 ++ ios/Encapp/Encapp.entitlements | 2 - ios/Encapp/X264Encoder.swift | 491 ++++++++++++++++++ ios/Encapp/debug.txt | 3 + ios/Encapp/profile.txt | 3 + ios/Encapp/utils/CodecHelper.swift | 2 +- ios/Encapp/utils/Utils.swift | 2 +- ios/ObjC/.DS_Store | Bin 0 -> 6148 bytes ios/ObjC/X264Wrapper.h | 35 ++ ios/ObjC/X264WrapperBridge.h | 30 ++ ios/debug.txt | 461 ++++++++++++++++ ios/profile.txt | 459 ++++++++++++++++ 21 files changed, 2162 insertions(+), 168 deletions(-) create mode 100644 ios/Encapp.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ios/Encapp.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved create mode 100644 ios/Encapp.xcodeproj/project.xcworkspace/xcuserdata/jblome.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ios/Encapp.xcodeproj/xcshareddata/xcschemes/Encapp test.xcscheme create mode 100644 ios/Encapp.xcodeproj/xcshareddata/xcschemes/Encapp.xcscheme create mode 100644 ios/Encapp.xcodeproj/xcuserdata/jblome.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 ios/Encapp.xcodeproj/xcuserdata/jblome.xcuserdatad/xcschemes/Copy of Copy of Encapp test.xcscheme create mode 100644 ios/Encapp.xcodeproj/xcuserdata/jblome.xcuserdatad/xcschemes/Copy of Encapp test.xcscheme create mode 100644 ios/Encapp.xcodeproj/xcuserdata/jblome.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 ios/Encapp/X264Encoder.swift create mode 100644 ios/Encapp/debug.txt create mode 100644 ios/Encapp/profile.txt create mode 100644 ios/ObjC/.DS_Store create mode 100644 ios/ObjC/X264Wrapper.h create mode 100644 ios/ObjC/X264WrapperBridge.h create mode 100644 ios/debug.txt create mode 100644 ios/profile.txt diff --git a/ios/Encapp.xcodeproj/project.pbxproj b/ios/Encapp.xcodeproj/project.pbxproj index e1f6ea18..bd3f50cc 100644 --- a/ios/Encapp.xcodeproj/project.pbxproj +++ b/ios/Encapp.xcodeproj/project.pbxproj @@ -8,8 +8,8 @@ /* Begin PBXBuildFile section */ CA53D6F729689DB200485E4D /* Decoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA53D6F629689DB200485E4D /* Decoder.swift */; }; - CA8256F6293E7BEB0082B2BE /* SwiftProtobuf in Frameworks */ = {isa = PBXBuildFile; productRef = CA8256F5293E7BEB0082B2BE /* SwiftProtobuf */; }; - CA8256F8293E7BEB0082B2BE /* SwiftProtobufPluginLibrary in Frameworks */ = {isa = PBXBuildFile; productRef = CA8256F7293E7BEB0082B2BE /* SwiftProtobufPluginLibrary */; }; + CA707E7F2E97133C00ABC79F /* X264Encoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA707E7E2E97133C00ABC79F /* X264Encoder.swift */; }; + CA707E862E9723C900ABC79F /* libx264.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CA707E842E97238C00ABC79F /* libx264.a */; }; CAAB92C6292D2ABB009009B2 /* EncappApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB92C5292D2ABB009009B2 /* EncappApp.swift */; }; CAAB92C8292D2ABB009009B2 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB92C7292D2ABB009009B2 /* ContentView.swift */; }; CAAB92CA292D2ABC009009B2 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CAAB92C9292D2ABC009009B2 /* Assets.xcassets */; }; @@ -18,35 +18,19 @@ CAAB92F4292D2ADF009009B2 /* SwiftProtobufPluginLibrary in Frameworks */ = {isa = PBXBuildFile; productRef = CAAB92F3292D2ADF009009B2 /* SwiftProtobufPluginLibrary */; }; CAAB92F6292D2B89009009B2 /* tests.pb.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB92F5292D2B88009009B2 /* tests.pb.swift */; }; CAAB92F8292D2BD5009009B2 /* ListProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB92F7292D2BD5009009B2 /* ListProperties.swift */; }; - CAAB92FB292D380F009009B2 /* ListProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB92F7292D2BD5009009B2 /* ListProperties.swift */; }; CAAB92FD292D7A44009009B2 /* FileHandling.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB92FC292D7A44009009B2 /* FileHandling.swift */; }; - CAAB92FE292D7A44009009B2 /* FileHandling.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB92FC292D7A44009009B2 /* FileHandling.swift */; }; CAAB9300292E7C40009009B2 /* Encoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB92FF292E7C40009009B2 /* Encoder.swift */; }; - CAAB9301292E7C40009009B2 /* Encoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB92FF292E7C40009009B2 /* Encoder.swift */; }; CAAB9303292E92EC009009B2 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB9302292E92EC009009B2 /* Utils.swift */; }; - CAAB9304292E92EC009009B2 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB9302292E92EC009009B2 /* Utils.swift */; }; CAAB9307293910D9009009B2 /* Statistics.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB9306293910D9009009B2 /* Statistics.swift */; }; - CAAB9308293910D9009009B2 /* Statistics.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB9306293910D9009009B2 /* Statistics.swift */; }; CAAB930A293911E8009009B2 /* FrameInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB9309293911E8009009B2 /* FrameInfo.swift */; }; - CAAB930B293911E8009009B2 /* FrameInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB9309293911E8009009B2 /* FrameInfo.swift */; }; CAAB930D29392CC8009009B2 /* JsonStats.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB930C29392CC8009009B2 /* JsonStats.swift */; }; - CAAB930E29392CC8009009B2 /* JsonStats.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB930C29392CC8009009B2 /* JsonStats.swift */; }; CAAB931029395655009009B2 /* TestRunner.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB930F29395655009009B2 /* TestRunner.swift */; }; - CAAB931129395655009009B2 /* TestRunner.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB930F29395655009009B2 /* TestRunner.swift */; }; CAAB9313293A7478009009B2 /* CodecHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB9312293A7478009009B2 /* CodecHelper.swift */; }; - CAAB9314293A7478009009B2 /* CodecHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB9312293A7478009009B2 /* CodecHelper.swift */; }; CAE00008293E907400727B6D /* EncappMain.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAE00007293E907400727B6D /* EncappMain.swift */; }; CAE0000A293EAA8200727B6D /* LocalLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAE00009293EAA8200727B6D /* LocalLogger.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - CAAB92D4292D2ABD009009B2 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = CAAB92BA292D2ABB009009B2 /* Project object */; - proxyType = 1; - remoteGlobalIDString = CAAB92C1292D2ABB009009B2; - remoteInfo = Encapp; - }; CAAB92DE292D2ABD009009B2 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = CAAB92BA292D2ABB009009B2 /* Project object */; @@ -58,13 +42,17 @@ /* Begin PBXFileReference section */ CA53D6F629689DB200485E4D /* Decoder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Decoder.swift; sourceTree = ""; }; + CA707E7E2E97133C00ABC79F /* X264Encoder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = X264Encoder.swift; sourceTree = ""; }; + CA707E812E97238C00ABC79F /* x264.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = x264.h; sourceTree = ""; }; + CA707E822E97238C00ABC79F /* x264_config.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = x264_config.h; sourceTree = ""; }; + CA707E842E97238C00ABC79F /* libx264.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libx264.a; sourceTree = ""; }; + CA707E8B2E9882E300ABC79F /* X264WrapperBridge.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = X264WrapperBridge.h; sourceTree = ""; }; CAAB92C2292D2ABB009009B2 /* Encapp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Encapp.app; sourceTree = BUILT_PRODUCTS_DIR; }; CAAB92C5292D2ABB009009B2 /* EncappApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EncappApp.swift; sourceTree = ""; }; CAAB92C7292D2ABB009009B2 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; CAAB92C9292D2ABC009009B2 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; CAAB92CB292D2ABC009009B2 /* Encapp.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Encapp.entitlements; sourceTree = ""; }; CAAB92CD292D2ABC009009B2 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; - CAAB92D3292D2ABD009009B2 /* EncappTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = EncappTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; CAAB92DD292D2ABD009009B2 /* EncappUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = EncappUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; CAAB92F5292D2B88009009B2 /* tests.pb.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = tests.pb.swift; sourceTree = ""; }; CAAB92F7292D2BD5009009B2 /* ListProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListProperties.swift; sourceTree = ""; }; @@ -85,20 +73,12 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + CA707E862E9723C900ABC79F /* libx264.a in Frameworks */, CAAB92F4292D2ADF009009B2 /* SwiftProtobufPluginLibrary in Frameworks */, CAAB92F2292D2ADF009009B2 /* SwiftProtobuf in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - CAAB92D0292D2ABD009009B2 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - CA8256F8293E7BEB0082B2BE /* SwiftProtobufPluginLibrary in Frameworks */, - CA8256F6293E7BEB0082B2BE /* SwiftProtobuf in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; CAAB92DA292D2ABD009009B2 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -109,6 +89,31 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + CA707E832E97238C00ABC79F /* include */ = { + isa = PBXGroup; + children = ( + CA707E812E97238C00ABC79F /* x264.h */, + CA707E822E97238C00ABC79F /* x264_config.h */, + ); + path = include; + sourceTree = ""; + }; + CA707E852E97238C00ABC79F /* libs */ = { + isa = PBXGroup; + children = ( + CA707E842E97238C00ABC79F /* libx264.a */, + ); + path = libs; + sourceTree = ""; + }; + CA707E892E97255A00ABC79F /* ObjC */ = { + isa = PBXGroup; + children = ( + CA707E8B2E9882E300ABC79F /* X264WrapperBridge.h */, + ); + path = ObjC; + sourceTree = ""; + }; CA8256F4293E7BDF0082B2BE /* Frameworks */ = { isa = PBXGroup; children = ( @@ -119,6 +124,9 @@ CAAB92B9292D2ABB009009B2 = { isa = PBXGroup; children = ( + CA707E892E97255A00ABC79F /* ObjC */, + CA707E832E97238C00ABC79F /* include */, + CA707E852E97238C00ABC79F /* libs */, CAAB92C4292D2ABB009009B2 /* Encapp */, CAAB92C3292D2ABB009009B2 /* Products */, CA8256F4293E7BDF0082B2BE /* Frameworks */, @@ -129,7 +137,6 @@ isa = PBXGroup; children = ( CAAB92C2292D2ABB009009B2 /* Encapp.app */, - CAAB92D3292D2ABD009009B2 /* EncappTests.xctest */, CAAB92DD292D2ABD009009B2 /* EncappUITests.xctest */, ); name = Products; @@ -142,6 +149,7 @@ CAAB92F5292D2B88009009B2 /* tests.pb.swift */, CAAB930F29395655009009B2 /* TestRunner.swift */, CAAB92FF292E7C40009009B2 /* Encoder.swift */, + CA707E7E2E97133C00ABC79F /* X264Encoder.swift */, CA53D6F629689DB200485E4D /* Decoder.swift */, CAAB92C5292D2ABB009009B2 /* EncappApp.swift */, CAAB92C7292D2ABB009009B2 /* ContentView.swift */, @@ -200,28 +208,6 @@ productReference = CAAB92C2292D2ABB009009B2 /* Encapp.app */; productType = "com.apple.product-type.application"; }; - CAAB92D2292D2ABD009009B2 /* EncappTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = CAAB92EA292D2ABD009009B2 /* Build configuration list for PBXNativeTarget "EncappTests" */; - buildPhases = ( - CAAB92CF292D2ABD009009B2 /* Sources */, - CAAB92D0292D2ABD009009B2 /* Frameworks */, - CAAB92D1292D2ABD009009B2 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - CAAB92D5292D2ABD009009B2 /* PBXTargetDependency */, - ); - name = EncappTests; - packageProductDependencies = ( - CA8256F5293E7BEB0082B2BE /* SwiftProtobuf */, - CA8256F7293E7BEB0082B2BE /* SwiftProtobufPluginLibrary */, - ); - productName = EncappTests; - productReference = CAAB92D3292D2ABD009009B2 /* EncappTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; CAAB92DC292D2ABD009009B2 /* EncappUITests */ = { isa = PBXNativeTarget; buildConfigurationList = CAAB92ED292D2ABD009009B2 /* Build configuration list for PBXNativeTarget "EncappUITests" */; @@ -253,10 +239,6 @@ CAAB92C1292D2ABB009009B2 = { CreatedOnToolsVersion = 14.0; }; - CAAB92D2292D2ABD009009B2 = { - CreatedOnToolsVersion = 14.0; - TestTargetID = CAAB92C1292D2ABB009009B2; - }; CAAB92DC292D2ABD009009B2 = { CreatedOnToolsVersion = 14.0; TestTargetID = CAAB92C1292D2ABB009009B2; @@ -280,7 +262,6 @@ projectRoot = ""; targets = ( CAAB92C1292D2ABB009009B2 /* Encapp */, - CAAB92D2292D2ABD009009B2 /* EncappTests */, CAAB92DC292D2ABD009009B2 /* EncappUITests */, ); }; @@ -296,13 +277,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - CAAB92D1292D2ABD009009B2 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; CAAB92DB292D2ABD009009B2 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -329,28 +303,13 @@ CAAB931029395655009009B2 /* TestRunner.swift in Sources */, CAAB9307293910D9009009B2 /* Statistics.swift in Sources */, CAAB92F6292D2B89009009B2 /* tests.pb.swift in Sources */, + CA707E7F2E97133C00ABC79F /* X264Encoder.swift in Sources */, CAAB9313293A7478009009B2 /* CodecHelper.swift in Sources */, CA53D6F729689DB200485E4D /* Decoder.swift in Sources */, CAAB930D29392CC8009009B2 /* JsonStats.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - CAAB92CF292D2ABD009009B2 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - CAAB9304292E92EC009009B2 /* Utils.swift in Sources */, - CAAB931129395655009009B2 /* TestRunner.swift in Sources */, - CAAB9301292E7C40009009B2 /* Encoder.swift in Sources */, - CAAB92FB292D380F009009B2 /* ListProperties.swift in Sources */, - CAAB930E29392CC8009009B2 /* JsonStats.swift in Sources */, - CAAB930B293911E8009009B2 /* FrameInfo.swift in Sources */, - CAAB9308293910D9009009B2 /* Statistics.swift in Sources */, - CAAB9314293A7478009009B2 /* CodecHelper.swift in Sources */, - CAAB92FE292D7A44009009B2 /* FileHandling.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; CAAB92D9292D2ABD009009B2 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -361,11 +320,6 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - CAAB92D5292D2ABD009009B2 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = CAAB92C1292D2ABB009009B2 /* Encapp */; - targetProxy = CAAB92D4292D2ABD009009B2 /* PBXContainerItemProxy */; - }; CAAB92DF292D2ABD009009B2 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = CAAB92C1292D2ABB009009B2 /* Encapp */; @@ -426,6 +380,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; + "HEADER_SEARCH_PATHS[arch=*]" = "$(SRCROOT)/include"; IPHONEOS_DEPLOYMENT_TARGET = 14.5; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; @@ -434,7 +389,9 @@ SUPPORTED_PLATFORMS = "watchsimulator watchos macosx iphonesimulator iphoneos driverkit appletvsimulator appletvos"; SUPPORTS_MACCATALYST = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + "SWIFT_OBJC_BRIDGING_HEADER[arch=*]" = ObjC/X264WrapperBridge.h; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + "USER_HEADER_SEARCH_PATHS[arch=*]" = "$(SRCROOT)/include"; }; name = Debug; }; @@ -484,6 +441,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; + "HEADER_SEARCH_PATHS[arch=*]" = "$(SRCROOT)/include"; IPHONEOS_DEPLOYMENT_TARGET = 14.5; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; @@ -491,7 +449,9 @@ SUPPORTED_PLATFORMS = "watchsimulator watchos macosx iphonesimulator iphoneos driverkit appletvsimulator appletvos"; SUPPORTS_MACCATALYST = YES; SWIFT_COMPILATION_MODE = wholemodule; + "SWIFT_OBJC_BRIDGING_HEADER[arch=*]" = ObjC/X264WrapperBridge.h; SWIFT_OPTIMIZATION_LEVEL = "-O"; + "USER_HEADER_SEARCH_PATHS[arch=*]" = "$(SRCROOT)/include"; }; name = Release; }; @@ -508,10 +468,27 @@ CURRENT_PROJECT_VERSION = 1; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = "\"Encapp/Preview Content\""; - DEVELOPMENT_TEAM = HG384GL4RL; + DEVELOPMENT_TEAM = PWNNZ9S7WJ; + ENABLE_APP_SANDBOX = YES; + ENABLE_FILE_ACCESS_DOWNLOADS_FOLDER = readwrite; + ENABLE_FILE_ACCESS_MOVIES_FOLDER = readwrite; + ENABLE_FILE_ACCESS_MUSIC_FOLDER = readwrite; + ENABLE_FILE_ACCESS_PICTURE_FOLDER = readwrite; ENABLE_HARDENED_RUNTIME = YES; + ENABLE_INCOMING_NETWORK_CONNECTIONS = YES; + ENABLE_OUTGOING_NETWORK_CONNECTIONS = YES; ENABLE_PREVIEWS = YES; + ENABLE_RESOURCE_ACCESS_AUDIO_INPUT = NO; + ENABLE_RESOURCE_ACCESS_BLUETOOTH = NO; + ENABLE_RESOURCE_ACCESS_CALENDARS = NO; + ENABLE_RESOURCE_ACCESS_CAMERA = NO; + ENABLE_RESOURCE_ACCESS_CONTACTS = NO; + ENABLE_RESOURCE_ACCESS_LOCATION = NO; + ENABLE_RESOURCE_ACCESS_PRINTING = NO; + ENABLE_RESOURCE_ACCESS_USB = YES; + ENABLE_USER_SELECTED_FILES = readwrite; GENERATE_INFOPLIST_FILE = YES; + "HEADER_SEARCH_PATHS[arch=*]" = "$(SRCROOT)/include"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools"; "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; @@ -526,10 +503,14 @@ IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/libs", + ); MACOSX_DEPLOYMENT_TARGET = 12.3; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = Meta.Encapp; - "PRODUCT_BUNDLE_IDENTIFIER[sdk=iphoneos*]" = Encapp; + "PRODUCT_BUNDLE_IDENTIFIER[sdk=iphoneos*]" = EncappX; "PRODUCT_BUNDLE_IDENTIFIER[sdk=macosx*]" = Encapp; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -538,6 +519,7 @@ SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; + "USER_HEADER_SEARCH_PATHS[arch=*]" = "$(SRCROOT)/inlcude"; }; name = Debug; }; @@ -554,9 +536,26 @@ CURRENT_PROJECT_VERSION = 1; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = "\"Encapp/Preview Content\""; - DEVELOPMENT_TEAM = HG384GL4RL; + DEVELOPMENT_TEAM = PWNNZ9S7WJ; + ENABLE_APP_SANDBOX = YES; + ENABLE_FILE_ACCESS_DOWNLOADS_FOLDER = readwrite; + ENABLE_FILE_ACCESS_MOVIES_FOLDER = readwrite; + ENABLE_FILE_ACCESS_MUSIC_FOLDER = readwrite; + ENABLE_FILE_ACCESS_PICTURE_FOLDER = readwrite; + ENABLE_INCOMING_NETWORK_CONNECTIONS = YES; + ENABLE_OUTGOING_NETWORK_CONNECTIONS = YES; ENABLE_PREVIEWS = YES; + ENABLE_RESOURCE_ACCESS_AUDIO_INPUT = NO; + ENABLE_RESOURCE_ACCESS_BLUETOOTH = NO; + ENABLE_RESOURCE_ACCESS_CALENDARS = NO; + ENABLE_RESOURCE_ACCESS_CAMERA = NO; + ENABLE_RESOURCE_ACCESS_CONTACTS = NO; + ENABLE_RESOURCE_ACCESS_LOCATION = NO; + ENABLE_RESOURCE_ACCESS_PRINTING = NO; + ENABLE_RESOURCE_ACCESS_USB = YES; + ENABLE_USER_SELECTED_FILES = readwrite; GENERATE_INFOPLIST_FILE = YES; + "HEADER_SEARCH_PATHS[arch=*]" = "$(SRCROOT)/include"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools"; "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; @@ -571,10 +570,14 @@ IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/libs", + ); MACOSX_DEPLOYMENT_TARGET = 12.3; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = Meta.Encapp; - "PRODUCT_BUNDLE_IDENTIFIER[sdk=iphoneos*]" = Encapp; + "PRODUCT_BUNDLE_IDENTIFIER[sdk=iphoneos*]" = EncappX; "PRODUCT_BUNDLE_IDENTIFIER[sdk=macosx*]" = Encapp; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = auto; @@ -582,63 +585,7 @@ SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; - CAAB92EB292D2ABD009009B2 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - BUNDLE_LOADER = "$(TEST_HOST)"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 1; - DEAD_CODE_STRIPPING = YES; - DEVELOPMENT_TEAM = ""; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HG384GL4RL; - "DEVELOPMENT_TEAM[sdk=macosx*]" = HG384GL4RL; - GENERATE_INFOPLIST_FILE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 14.5; - MACOSX_DEPLOYMENT_TARGET = 12.3; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = Meta.EncappTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SDKROOT = auto; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Encapp.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Encapp"; - }; - name = Debug; - }; - CAAB92EC292D2ABD009009B2 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - BUNDLE_LOADER = "$(TEST_HOST)"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Mac Developer"; - CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 1; - DEAD_CODE_STRIPPING = YES; - DEVELOPMENT_TEAM = ""; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HG384GL4RL; - "DEVELOPMENT_TEAM[sdk=macosx*]" = HG384GL4RL; - GENERATE_INFOPLIST_FILE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 14.5; - MACOSX_DEPLOYMENT_TARGET = 12.3; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = Meta.EncappTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SDKROOT = auto; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Encapp.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Encapp"; + "USER_HEADER_SEARCH_PATHS[arch=*]" = "$(SRCROOT)/inlcude"; }; name = Release; }; @@ -709,15 +656,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - CAAB92EA292D2ABD009009B2 /* Build configuration list for PBXNativeTarget "EncappTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - CAAB92EB292D2ABD009009B2 /* Debug */, - CAAB92EC292D2ABD009009B2 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; CAAB92ED292D2ABD009009B2 /* Build configuration list for PBXNativeTarget "EncappUITests" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -741,16 +679,6 @@ /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - CA8256F5293E7BEB0082B2BE /* SwiftProtobuf */ = { - isa = XCSwiftPackageProductDependency; - package = CAAB92F0292D2ADF009009B2 /* XCRemoteSwiftPackageReference "swift-protobuf" */; - productName = SwiftProtobuf; - }; - CA8256F7293E7BEB0082B2BE /* SwiftProtobufPluginLibrary */ = { - isa = XCSwiftPackageProductDependency; - package = CAAB92F0292D2ADF009009B2 /* XCRemoteSwiftPackageReference "swift-protobuf" */; - productName = SwiftProtobufPluginLibrary; - }; CAAB92F1292D2ADF009009B2 /* SwiftProtobuf */ = { isa = XCSwiftPackageProductDependency; package = CAAB92F0292D2ADF009009B2 /* XCRemoteSwiftPackageReference "swift-protobuf" */; diff --git a/ios/Encapp.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Encapp.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/ios/Encapp.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ios/Encapp.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ios/Encapp.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 00000000..126666db --- /dev/null +++ b/ios/Encapp.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,15 @@ +{ + "originHash" : "9f1e4ec4211205225a9be53f971e143ca4f7b80574f1ff773ebee5bf69ffe8ab", + "pins" : [ + { + "identity" : "swift-protobuf", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-protobuf.git", + "state" : { + "revision" : "2547102afd04fe49f1b286090f13ebce07284980", + "version" : "1.31.1" + } + } + ], + "version" : 3 +} diff --git a/ios/Encapp.xcodeproj/project.xcworkspace/xcuserdata/jblome.xcuserdatad/UserInterfaceState.xcuserstate b/ios/Encapp.xcodeproj/project.xcworkspace/xcuserdata/jblome.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..d6188905db1566cae131dbc312d8235f8f9a541d GIT binary patch literal 72715 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 z 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 literal 0 HcmV?d00001 diff --git a/ios/Encapp.xcodeproj/xcshareddata/xcschemes/Encapp test.xcscheme b/ios/Encapp.xcodeproj/xcshareddata/xcschemes/Encapp test.xcscheme new file mode 100644 index 00000000..a4da5f10 --- /dev/null +++ b/ios/Encapp.xcodeproj/xcshareddata/xcschemes/Encapp test.xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Encapp.xcodeproj/xcshareddata/xcschemes/Encapp.xcscheme b/ios/Encapp.xcodeproj/xcshareddata/xcschemes/Encapp.xcscheme new file mode 100644 index 00000000..fe4724ea --- /dev/null +++ b/ios/Encapp.xcodeproj/xcshareddata/xcschemes/Encapp.xcscheme @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Encapp.xcodeproj/xcuserdata/jblome.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/ios/Encapp.xcodeproj/xcuserdata/jblome.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 00000000..7b7ee619 --- /dev/null +++ b/ios/Encapp.xcodeproj/xcuserdata/jblome.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Encapp.xcodeproj/xcuserdata/jblome.xcuserdatad/xcschemes/Copy of Copy of Encapp test.xcscheme b/ios/Encapp.xcodeproj/xcuserdata/jblome.xcuserdatad/xcschemes/Copy of Copy of Encapp test.xcscheme new file mode 100644 index 00000000..730cbc13 --- /dev/null +++ b/ios/Encapp.xcodeproj/xcuserdata/jblome.xcuserdatad/xcschemes/Copy of Copy of Encapp test.xcscheme @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Encapp.xcodeproj/xcuserdata/jblome.xcuserdatad/xcschemes/Copy of Encapp test.xcscheme b/ios/Encapp.xcodeproj/xcuserdata/jblome.xcuserdatad/xcschemes/Copy of Encapp test.xcscheme new file mode 100644 index 00000000..a4da5f10 --- /dev/null +++ b/ios/Encapp.xcodeproj/xcuserdata/jblome.xcuserdatad/xcschemes/Copy of Encapp test.xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Encapp.xcodeproj/xcuserdata/jblome.xcuserdatad/xcschemes/xcschememanagement.plist b/ios/Encapp.xcodeproj/xcuserdata/jblome.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 00000000..2ff29ac8 --- /dev/null +++ b/ios/Encapp.xcodeproj/xcuserdata/jblome.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,47 @@ + + + + + SchemeUserState + + Copy of Copy of Encapp test.xcscheme + + orderHint + 3 + + Copy of Encapp test.xcscheme + + orderHint + 2 + + Encapp test.xcscheme_^#shared#^_ + + orderHint + 1 + + Encapp.xcscheme_^#shared#^_ + + orderHint + 0 + + + SuppressBuildableAutocreation + + CAAB92C1292D2ABB009009B2 + + primary + + + CAAB92D2292D2ABD009009B2 + + primary + + + CAAB92DC292D2ABD009009B2 + + primary + + + + + diff --git a/ios/Encapp/Encapp.entitlements b/ios/Encapp/Encapp.entitlements index 18aff0ce..852fa1a4 100644 --- a/ios/Encapp/Encapp.entitlements +++ b/ios/Encapp/Encapp.entitlements @@ -4,7 +4,5 @@ com.apple.security.app-sandbox - com.apple.security.files.user-selected.read-only - diff --git a/ios/Encapp/X264Encoder.swift b/ios/Encapp/X264Encoder.swift new file mode 100644 index 00000000..49350679 --- /dev/null +++ b/ios/Encapp/X264Encoder.swift @@ -0,0 +1,491 @@ +// +// Encoder.swift +// Encapp +// +// Created by Johan Blome on 11/23/22. +// + +import Foundation +import VideoToolbox +import AVFoundation + +typealias x264_t_ptr = OpaquePointer + +class X264Encoder: Encoder{ + var x264Encoder: x264_t_ptr? + var inputBuffer: UnsafeMutableRawPointer? + var x264InputFrame: UnsafeMutablePointer? + var x264OutputFrame: UnsafeMutablePointer? + var yPlaneSize: Int! + var uvPlaneSize: Int! + var formatDescription: CMFormatDescription! + + override init(test: Test){ + super.init(test: test) + } + + func parseConfiguration(test: Test, params: inout x264_param_t) -> Int { + var preset = "fast" + var tune: String? = nil + + for param in test.configure.parameter { + if param.key == "preset" { + preset = param.value + log.debug("Set preset: \(preset)") + } else if param.key == "tune" { + if param.value != "none" { + tune = param.value + log.debug("Set tune: \(tune)") + } + } + } + + + let result = x264_param_default_preset(¶ms, preset, tune) + if result < 0 { + log.error("Failed to set preset and tune") + } else { + log.debug("Preset and tune set successfully") + } + + + // Logging, skip unless needed. + //params.pointee.i_csp = X264_CSP_I420 + //params.pointee.p_log_private = nil + //params.pointee.i_log_level = Int32(X264_LOG_DEBUG) // Or another log level + //x264_set_log_callback(params) + + return 0 + } + + + override func Encode() throws -> String { + log.info("Starting x264 encoder") + statistics = Statistics(description: "raw encoder", test: definition) + if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first { + log.info("Encode, current test definition = \n\(definition)") + + // Check input + let resolution = splitX(text: definition.input.resolution) + let sourceWidth = resolution[0] + let sourceHeight = resolution[1] + // TODO: it seems the encoder is expecting aligned planes + let width = Int((resolution[0] >> 1) << 1) + let height = Int((resolution[1] >> 1) << 1) + inputFrameRate = (definition.input.hasFramerate) ? definition.input.framerate: 30.0 + outputFrameRate = (definition.configure.hasFramerate) ? definition.configure.framerate: inputFrameRate + + if inputFrameRate <= 0 { + inputFrameRate = 30.0 + } + if outputFrameRate <= 0 { + outputFrameRate = 30.0 + } + keepInterval = inputFrameRate / outputFrameRate; + frameDurationUsec = calculateFrameTimingUsec(frameRate: outputFrameRate); + inputFrameDurationUsec = calculateFrameTimingUsec(frameRate: inputFrameRate); + inputFrameDurationMs = Float(frameDurationUsec) / 1000.0 + scale = 1000_000 //should be 90000? + frameDurationUsec = calculateFrameTimingUsec(frameRate: outputFrameRate); + frameDurationMs = Float(frameDurationUsec) / 1000.0 + frameDurationSec = Float(frameDurationUsec) / 1000_000.0 + frameDurationCMTime = CMTime.init(value: Int64(1.0/30.0 * Double(scale)), timescale: CMTimeScale(scale)) + + // Codec type + if !definition.configure.hasCodec { + log.error("No codec defined") + return "" + } + let props = ListProps() + self.inputBuffer = UnsafeMutableRawPointer.allocate(byteCount: width * height * 3/2, alignment: 16) // Really 1.5, no odd ones + self.yPlaneSize = width * height + self.uvPlaneSize = width * height / 4 + statistics.setEncoderName(encoderName: "x264") + + + log.debug(String(format: "Create x264 encoder with %dx%d", width, height)) + var params = UnsafeMutablePointer.allocate(capacity: 1) + //x264_param_default(params) + if parseConfiguration(test: definition, params: ¶ms.pointee) < 0 { + log.debug("Failed to set preset ans tune") + } + + params.pointee.i_width = Int32(width) + params.pointee.i_height = Int32(height) + var frameRate: Float = 30.0 + if definition.configure.hasFramerate { + frameRate = definition.configure.framerate + } else if definition.input.hasFramerate { + frameRate = definition.input.framerate + } + params.pointee.i_fps_num = UInt32(frameRate) + params.pointee.i_fps_den = 1 + + // TODO: Bitrate mode is a mess, to bps + params.pointee.rc.i_bitrate = Int32(magnitudeToInt(stringValue: definition.configure.bitrate)) + + // i frame interval is in seconds on Android and in frames here, translate + params.pointee.i_frame_reference = Int32(frameRate) + + //TODO: default? + params.pointee.i_threads = 0 + + params.pointee.i_timebase_den = 1 + params.pointee.i_timebase_num = 1000000 + + self.x264Encoder = x264_encoder_open_157(¶ms.pointee) + self.x264InputFrame = UnsafeMutablePointer.allocate(capacity: 1) + self.x264OutputFrame = UnsafeMutablePointer.allocate(capacity: 1) + x264_picture_init(x264InputFrame) + x264_picture_alloc(x264InputFrame, X264_CSP_I420, Int32(sourceWidth), Int32(sourceHeight)) + x264_picture_init(x264OutputFrame) + + + let frameSize = Int(Float(sourceWidth) * Float(sourceHeight) * 1.5) + // Filehandling + let fileURL = dir.appendingPathComponent(definition.input.filepath) + if FileManager.default.fileExists(atPath: fileURL.path) { + log.info("Input media file: \(fileURL.path)") + } else { + log.error("Media file: \(fileURL.path) doe not exist") + return "Error: no media file" + } + let outputURL = dir.appendingPathComponent("\(statistics.id!).mov") + let outputPath = outputURL.path + try? FileManager.default.removeItem(atPath: outputPath) + + // Nil for encoded data, only mov works + let outputWriter = try AVAssetWriter(outputURL: outputURL, fileType: AVFileType.mov) + outputWriterInput = AVAssetWriterInput(mediaType: AVMediaType.video, outputSettings: nil) + outputWriter.add(outputWriterInput) + + outputWriter.startWriting() + outputWriter.startSession(atSourceTime: CMTime.zero) + + var splitname = definition.input.filepath.components(separatedBy: "/") + statistics.setSourceFile(filename: splitname[splitname.count - 1]) + splitname = outputPath.components(separatedBy: "/") + statistics.setEncodedFile(filename: splitname[splitname.count - 1]) + var lastNow = timeStampNs() + let realtime = definition.input.realtime + if var stream: InputStream = InputStream(fileAtPath: fileURL.path) { + stream.open() + statistics.start() + + while (!inputDone) {//} || !outputDone) { + if (inputFrameCounter % 100 == 0) { + log.info(""" + \(definition.common.id) - BufferEncoder: frames: \(framesAdded) \ + input frames: \(inputFrameCounter) current loop: \(currentLoop) current time: \(currentTimeSec) + """) + let now = timeStampNs() + log.info("time since last time \((Float(now)-Float(lastNow))/1000_000_000.0)") + lastNow = now + } + if doneReading(test: definition, stream: stream, frame: framesAdded, time: currentTimeSec, loop: false) { + inputDone = true + } + + // PUSH + let size = queueInputBuffer(stream: stream, frameSize: frameSize, realtime: realtime) + if size == -2 { + continue; + } else if (size <= 0 ) { + // restart loop + stream.close() + currentLoop += 1 + + if doneReading(test: definition, stream: stream, frame: framesAdded, time: currentTimeSec, loop: true) { + inputDone = true; + } else { + log.info(" *********** OPEN FILE AGAIN *******"); + stream = InputStream(fileAtPath: fileURL.path)! + stream.open() + log.info("*** Loop ended start \(currentLoop) ***"); + } + } + } + + statistics.stop() + //Flush + let framePts = computePresentationTimeUsec(frameIndex: inputFrameCounter, frameTimeUsec: inputFrameDurationUsec, offset: Int64(pts)) + let lastTime = CMTime.init(value: Int64(framePts), timescale: CMTimeScale(scale)) + outputWriterInput.markAsFinished() + log.info("Wait for all pending frames") + sleep(1) + log.info("Call writer finish") + outputWriter.finishWriting { + sleep(1) + } + + while outputWriter.status == AVAssetWriter.Status.writing { + sleep(1) + } + + stream.close() + } + x264_picture_clean(x264InputFrame) + x264InputFrame!.deallocate() + x264OutputFrame!.deallocate() + } + log.info("Done, leaving encoder, encoded: \(statistics.encodedFrames.count)") + return "" + } + + func convertAnnexBToAVCC(nals: [x264_nal_t]) -> Data { + var avccData = Data() + for nal in nals { + var length = UInt32(nal.i_payload).bigEndian + avccData.append(Data(bytes: &length, count: 4)) + avccData.append(Data(bytes: nal.p_payload, count: Int(nal.i_payload))) + } + return avccData + } + + func stripStartCode(_ payload: UnsafePointer, length: Int) -> [UInt8] { + var offset = 0 + // Check for 4-byte start code + if length > 4 && payload[0] == 0 && payload[1] == 0 && payload[2] == 0 && payload[3] == 1 { + offset = 4 + } else if length > 3 && payload[0] == 0 && payload[1] == 0 && payload[2] == 1 { + offset = 3 + } + return Array(UnsafeBufferPointer(start: payload + offset, count: length - offset)) + } + + func createCMSampleBuffer(from avccData: Data, pts: CMTime, dts: CMTime, formatDesc: CMFormatDescription) -> CMSampleBuffer? { + var blockBuffer: CMBlockBuffer? + let status = CMBlockBufferCreateWithMemoryBlock( + allocator: kCFAllocatorDefault, + memoryBlock: UnsafeMutableRawPointer(mutating: (avccData as NSData).bytes), + blockLength: avccData.count, + blockAllocator: kCFAllocatorNull, + customBlockSource: nil, + offsetToData: 0, + dataLength: avccData.count, + flags: 0, + blockBufferOut: &blockBuffer + ) + guard status == kCMBlockBufferNoErr, let blockBuffer = blockBuffer else { return nil } + var sampleBuffer: CMSampleBuffer? + let sampleSizes = [avccData.count] + let err = CMSampleBufferCreate( + allocator: kCFAllocatorDefault, + dataBuffer: blockBuffer, + dataReady: true, + makeDataReadyCallback: nil, + refcon: nil, + formatDescription: formatDesc, + sampleCount: 1, + sampleTimingEntryCount: 1, + sampleTimingArray: [CMSampleTimingInfo(duration: .invalid, presentationTimeStamp: pts, decodeTimeStamp: dts)], + sampleSizeEntryCount: 1, + sampleSizeArray: sampleSizes, + sampleBufferOut: &sampleBuffer + ) + return (err == noErr) ? sampleBuffer : nil + } + + func writeData(sampleBuffer: CMSampleBuffer) -> Void { + let size = sampleBuffer.totalSampleSize + var buffer = [UInt8](repeating: 0, count: size) + var bufferPtr: UnsafeMutablePointer? + let status = buffer.withUnsafeMutableBytes { tmp in + CMBlockBufferAccessDataBytes( + (sampleBuffer.dataBuffer)!, + atOffset: 0, + length: size, + temporaryBlock: tmp.baseAddress!, + returnedPointerOut: &bufferPtr + ) + } + guard status == noErr else { + log.error("Failed to get base address for blockbuffer") + return + } + if let attachments = CMSampleBufferGetSampleAttachmentsArray(sampleBuffer, createIfNecessary: true) { + let rawDic: UnsafeRawPointer = CFArrayGetValueAtIndex(attachments, 0) + let dic: CFDictionary = Unmanaged.fromOpaque(rawDic).takeUnretainedValue() + + //let keyFrame = !CFDictionaryContainsKey(dic, Unmanaged.passUnretained(kCMSampleAttachmentKey_NotSync).toOpaque()) + currentTimeSec = Float(sampleBuffer.presentationTimeStamp.value) / Float(scale) + framesAdded += 1 + + if outputWriterInput.isReadyForMoreMediaData { + outputWriterInput.append(sampleBuffer) + } else { + log.error("Writer not ready for input") + } + } + } + + + + + func queueInputBuffer(stream: InputStream, frameSize: Int, realtime: Bool) -> Int { + if !stream.hasBytesAvailable { + log.info("Nothing more to read") + return -1; + } + + var read = stream.read(inputBuffer!, maxLength: frameSize) + if read == 0 { + log.info("End of stream") + return -1; + } + + + var timeInfo = CMSampleTimingInfo() + let framePts = computePresentationTimeUsec(frameIndex: inputFrameCounter, frameTimeUsec: inputFrameDurationUsec, offset: Int64(pts)) + setRuntimeParameters(frame: Int64(inputFrameCounter)); + dropNext = dropFrame(frame: Int64(inputFrameCounter)) + updateDynamicFramerate(frame: Int64(inputFrameCounter)); + + if !dropNext { + dropNext = dropFromDynamicFramerate(frame: inputFrameCounter, keepInterval: keepInterval); + } + inputFrameCounter += 1 + if dropNext { + dropNext = false + skipped += 1 + read = -2 //TODO: enum + } else if (read == frameSize) { + timeInfo.presentationTimeStamp = CMTime.init(value: Int64(framePts), timescale: CMTimeScale(scale)) + timeInfo.duration = CMTime.init(value: Int64(frameDurationUsec), timescale: CMTimeScale(scale)) + timeInfo.decodeTimeStamp = timeInfo.presentationTimeStamp + + if realtime { + sleepUntilNextFrame() + } + + guard let dataloc = inputBuffer else { + log.error("No data from stream") + return -1; + } + + // Copy Y plane + memcpy(x264InputFrame!.pointee.img.plane.0, dataloc, yPlaneSize) + + // Copy U plane + let uPointer = dataloc.advanced(by: yPlaneSize) + memcpy(x264InputFrame!.pointee.img.plane.1, uPointer, uvPlaneSize) + + // Copy V plane + let vPointer = dataloc.advanced(by: yPlaneSize + uvPlaneSize) + memcpy(x264InputFrame!.pointee.img.plane.2, vPointer, uvPlaneSize) + + x264InputFrame!.pointee.i_pts = Int64(framePts) + var nalPtr: UnsafeMutablePointer? = nil + var piNal: Int32 = 0 + // Write nals to file or process + statistics.startEncoding(pts: Int64(framePts), originalFrame: inputFrameCounter) + let bytes = x264_encoder_encode(self.x264Encoder, &nalPtr, &piNal, x264InputFrame!, x264OutputFrame!) + + + var keyFrame = false + if piNal > 0 { + let nals = Array(UnsafeBufferPointer(start: nalPtr, count: Int(piNal))) + let avcc = convertAnnexBToAVCC(nals: nals) + let pts = CMTime(value: x264OutputFrame!.pointee.i_pts, timescale: CMTimeScale(scale)) + let dts = CMTime(value: x264OutputFrame!.pointee.i_dts, timescale: CMTimeScale(scale)) + + if formatDescription == nil { + // Looks for sps and ppa and create format + let nals = Array(UnsafeBufferPointer(start: nalPtr, count: Int(piNal))) + var sps: [UInt8] = [] + var pps: [UInt8] = [] + var status: OSStatus = -1 + for nal in nals { + if nal.i_type == 7 { // SPS + sps = stripStartCode(nal.p_payload, length: Int(nal.i_payload)) + } else if nal.i_type == 8 { // PPS + pps = stripStartCode(nal.p_payload, length: Int(nal.i_payload)) + } + } + + // Only proceed if both SPS and PPS are found + guard !sps.isEmpty, !pps.isEmpty else { + print("SPS or PPS not found") + return -1 + } + sps.withUnsafeBytes { spsBuffer in + pps.withUnsafeBytes { ppsBuffer in + let parameterSetPointers: [UnsafePointer] = [ + spsBuffer.baseAddress!.assumingMemoryBound(to: UInt8.self), + ppsBuffer.baseAddress!.assumingMemoryBound(to: UInt8.self) + ] + let parameterSetSizes: [Int] = [sps.count, pps.count] + status = CMVideoFormatDescriptionCreateFromH264ParameterSets( + allocator: kCFAllocatorDefault, + parameterSetCount: 2, + parameterSetPointers: parameterSetPointers, + parameterSetSizes: parameterSetSizes, + nalUnitHeaderLength: 4, + formatDescriptionOut: &formatDescription + ) + } + } + + if status != noErr { + log.error("Failed to extract sps/pps") + return -1 + } + } + let buffer = createCMSampleBuffer(from: avcc, pts: pts, dts: dts, formatDesc: formatDescription) + keyFrame = (((x264OutputFrame!.pointee.i_type == X264_TYPE_AUTO || x264OutputFrame!.pointee.i_type == X264_TYPE_IDR) ? 1 : 0) != 0) + statistics.stopEncoding(pts: framePts, size: Int64(bytes), isKeyFrame: keyFrame) + writeData(sampleBuffer: buffer!) + + } else { + log.debug("No nals") + } + + lastPts = timeInfo.presentationTimeStamp + + } else { + log.info("Could not read all - only: \(read)") + read = -1 + } + + return read + } + + + + override func setRuntimeParameters(frame: Int64) { + if !definition.hasRuntime { + return + } + + for setting in definition.runtime.videoBitrate { + if setting.framenum == frame { + setBitrate(compSession: compSession, bps: magnitudeToInt(stringValue: setting.bitrate), cbr: false) + } + } + + for framenum in definition.runtime.requestSync { + if framenum == frame { + let status = VTSessionSetProperty(compSession, key: kVTEncodeFrameOptionKey_ForceKeyFrame, value: true as CFBoolean) + if status != 0 { + log.error("failed force key frame, status: \(status)") + } + } + } + + for setting in definition.runtime.parameter { + if setting.framenum == frame { + switch setting.type { + case DataValueType.floatType: + break + case DataValueType.intType: + break + case DataValueType.longType: + break + case DataValueType.stringType: + break + } + } + } + } + +} diff --git a/ios/Encapp/debug.txt b/ios/Encapp/debug.txt new file mode 100644 index 00000000..747fe2ac --- /dev/null +++ b/ios/Encapp/debug.txt @@ -0,0 +1,3 @@ +Command line invocation: + /Users/jblome/Downloads/Xcode.app/Contents/Developer/usr/bin/xcodebuild -showBuildSettings -configuration Debug + diff --git a/ios/Encapp/profile.txt b/ios/Encapp/profile.txt new file mode 100644 index 00000000..8b541746 --- /dev/null +++ b/ios/Encapp/profile.txt @@ -0,0 +1,3 @@ +Command line invocation: + /Users/jblome/Downloads/Xcode.app/Contents/Developer/usr/bin/xcodebuild -showBuildSettings -configuration Profile + diff --git a/ios/Encapp/utils/CodecHelper.swift b/ios/Encapp/utils/CodecHelper.swift index fc9e722e..24c9826e 100644 --- a/ios/Encapp/utils/CodecHelper.swift +++ b/ios/Encapp/utils/CodecHelper.swift @@ -21,7 +21,7 @@ func logVTSessionProperties(statistics: Statistics, compSession: VTSession) { if d?["PropertyType"]! as? String == "Number"{ var propval: CFNumber! status = VTSessionCopyProperty(compSession, key: key as! CFString, allocator: nil, valueOut: &propval) - if status == noErr{ + if status == noErr && propval != nil { log.debug("---val: \(propval.debugDescription)") statistics.addProp(name: key as! String, val: "\(propval!)") } diff --git a/ios/Encapp/utils/Utils.swift b/ios/Encapp/utils/Utils.swift index 91a3505a..46b88fac 100644 --- a/ios/Encapp/utils/Utils.swift +++ b/ios/Encapp/utils/Utils.swift @@ -87,7 +87,7 @@ func doneReading(test: Test, stream: InputStream?, frame: Int, time: Float, loop if (test.input.hasPlayoutFrames && test.input.playoutFrames > 0) { // 2. stop the reader based on explicit playout frames parameter: // stop if we reached the explicit playout frames - if (frame >= test.input.playoutFrames) { + if (frame >= test.input.playoutFrames) { return true } } diff --git a/ios/ObjC/.DS_Store b/ios/ObjC/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..3f99181a964ec6cbe44ae8005888b4d752ce5ff4 GIT binary patch literal 6148 zcmeHK%Sr=55Uh?l1VspV@i<=~DB{J-vc!XD5%s1qiw0IB67Tzuet@5%)zfWYH!FA& z(e9tK?f07Sh;XJf3_W#uHt!m%-A4NZ(nG^+R$LyXSyEb$Z&EtDY+;=Ti2GSXKkWi)77+H pqXCU^>k`0>?jyUo((04OY*#oohT4mkXF4%10$GqqLV+Jp-~*LUNMHZ} literal 0 HcmV?d00001 diff --git a/ios/ObjC/X264Wrapper.h b/ios/ObjC/X264Wrapper.h new file mode 100644 index 00000000..168fb001 --- /dev/null +++ b/ios/ObjC/X264Wrapper.h @@ -0,0 +1,35 @@ +#import +#import "x264.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface X264Wrapper : NSObject + +/* +// Encoder lifecycle +- (instancetype)initWithParams:(x264_param_t *)params; +- (void)close; + +// Encoding +- (int)encodeFrame:(x264_picture_t *)picIn + picOut:(x264_picture_t *)picOut + nals:(x264_nal_t *_Nonnull*_Nonnull)ppNal + nalCount:(int *)piNal; + +// Headers +- (int)getHeaders:(x264_nal_t *_Nonnull*_Nonnull)ppNal nalCount:(int *)piNal; + +// Intra refresh +- (void)intraRefresh; + +// Invalidate reference +- (int)invalidateReference:(int64_t)pts; + +// Delayed frames +- (int)delayedFrames; +- (int)maximumDelayedFrames; +*/ + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/ObjC/X264WrapperBridge.h b/ios/ObjC/X264WrapperBridge.h new file mode 100644 index 00000000..9909b066 --- /dev/null +++ b/ios/ObjC/X264WrapperBridge.h @@ -0,0 +1,30 @@ +// +// Header.h +// Encapp +// +// Created by Lars Johan Blome on 10/9/25. +// + +#ifndef X264WrapperBridge_h +#define X264WrapperBridge_h +#include +#include "x264.h" + + +// X264WrapperBridge.h +void x264_swift_log_callback(void *p_unused, int i_level, const char *psz, va_list arg); +// Helper function to set the log callback +void x264_set_log_callback(x264_param_t *params); + +// +//x264_t *x264_encoder_open( x264_param_t * ); +x264_t *x264_encoder_open_157(x264_param_t *); +void x264_encoder_close( x264_t * ); +int x264_param_default_preset( x264_param_t *, const char *preset, const char *tune ); +int x264_encoder_encode( x264_t *, x264_nal_t **pp_nal, int *pi_nal, x264_picture_t *pic_in, x264_picture_t *pic_out ); +int x264_encoder_headers( x264_t *, x264_nal_t **pp_nal, int *pi_nal ); +void x264_encoder_intra_refresh( x264_t * ); +int x264_encoder_invalidate_reference( x264_t *, int64_t pts ); +int x264_encoder_delayed_frames( x264_t * ); +int x264_encoder_maximum_delayed_frames( x264_t * ); +#endif /* X264WrapperBridge_h */ diff --git a/ios/debug.txt b/ios/debug.txt new file mode 100644 index 00000000..71de9d04 --- /dev/null +++ b/ios/debug.txt @@ -0,0 +1,461 @@ +Command line invocation: + /Users/jblome/Downloads/Xcode.app/Contents/Developer/usr/bin/xcodebuild -showBuildSettings -configuration Debug + +Resolve Package Graph + + +Resolved source packages: + SwiftProtobuf: https://github.com/apple/swift-protobuf.git @ 1.31.1 + +Build settings for action build and target Encapp: + ACTION = build + ALLOW_BUILD_REQUEST_OVERRIDES = NO + ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES + ALTERNATE_GROUP = staff + ALTERNATE_MODE = u+w,go-w,a+rX + ALTERNATE_OWNER = jblome + ALTERNATIVE_DISTRIBUTION_WEB = NO + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO + ALWAYS_SEARCH_USER_PATHS = NO + ALWAYS_USE_SEPARATE_HEADERMAPS = NO + APPLICATION_EXTENSION_API_ONLY = NO + APPLY_RULES_IN_COPY_FILES = NO + APPLY_RULES_IN_COPY_HEADERS = NO + APP_SHORTCUTS_ENABLE_FLEXIBLE_MATCHING = YES + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor + AUTOMATICALLY_MERGE_DEPENDENCIES = NO + AUTOMATION_APPLE_EVENTS = NO + AVAILABLE_PLATFORMS = android appletvos appletvsimulator driverkit iphoneos iphonesimulator macosx qnx watchos watchsimulator webassembly xros xrsimulator + BUILD_ACTIVE_RESOURCES_ONLY = NO + BUILD_COMPONENTS = headers build + BUILD_DIR = /Users/jblome/code/encapp/ios/build + BUILD_LIBRARY_FOR_DISTRIBUTION = NO + BUILD_ROOT = /Users/jblome/code/encapp/ios/build + BUILD_STYLE = + BUILD_VARIANTS = normal + BUILT_PRODUCTS_DIR = /Users/jblome/code/encapp/ios/build/Debug-unknown + BUNDLE_CONTENTS_FOLDER_PATH_deep = Contents/ + BUNDLE_EXECUTABLE_FOLDER_NAME_deep = MacOS + BUNDLE_EXTENSIONS_FOLDER_PATH = Extensions + BUNDLE_FORMAT = shallow + BUNDLE_FRAMEWORKS_FOLDER_PATH = Frameworks + BUNDLE_PLUGINS_FOLDER_PATH = PlugIns + BUNDLE_PRIVATE_HEADERS_FOLDER_PATH = PrivateHeaders + BUNDLE_PUBLIC_HEADERS_FOLDER_PATH = Headers + CACHE_ROOT = /var/folders/kc/2krxxjfs7xs4cg0387d1j5q40000gn/C/com.apple.DeveloperTools/26.0.1-17A400/Xcode + CCHROOT = /var/folders/kc/2krxxjfs7xs4cg0387d1j5q40000gn/C/com.apple.DeveloperTools/26.0.1-17A400/Xcode + CHMOD = /bin/chmod + CHOWN = /usr/sbin/chown + CLANG_ANALYZER_NONNULL = YES + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE + CLANG_CACHE_FINE_GRAINED_OUTPUTS = YES + CLANG_CXX_LANGUAGE_STANDARD = gnu++20 + CLANG_ENABLE_EXPLICIT_MODULES = YES + CLANG_ENABLE_MODULES = YES + CLANG_ENABLE_OBJC_ARC = YES + CLANG_ENABLE_OBJC_WEAK = YES + CLANG_MODULES_BUILD_SESSION_FILE = /var/folders/kc/2krxxjfs7xs4cg0387d1j5q40000gn/C/org.llvm.clang/ModuleCache.noindex/Session.modulevalidation + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES + CLANG_WARN_BOOL_CONVERSION = YES + CLANG_WARN_COMMA = YES + CLANG_WARN_CONSTANT_CONVERSION = YES + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR + CLANG_WARN_DOCUMENTATION_COMMENTS = YES + CLANG_WARN_EMPTY_BODY = YES + CLANG_WARN_ENUM_CONVERSION = YES + CLANG_WARN_INFINITE_RECURSION = YES + CLANG_WARN_INT_CONVERSION = YES + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES + CLANG_WARN_STRICT_PROTOTYPES = YES + CLANG_WARN_SUSPICIOUS_MOVE = YES + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE + CLANG_WARN_UNREACHABLE_CODE = YES + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES + CLASS_FILE_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/JavaClasses + CLEAN_PRECOMPS = YES + CLONE_HEADERS = NO + CODESIGNING_FOLDER_PATH = /Users/jblome/code/encapp/ios/build/Debug-unknown/ + CODE_SIGNING_ALLOWED = NO + CODE_SIGN_ENTITLEMENTS = Encapp/Encapp.entitlements + CODE_SIGN_IDENTITY = Apple Development + CODE_SIGN_INJECT_BASE_ENTITLEMENTS = YES + CODE_SIGN_STYLE = Automatic + COLOR_DIAGNOSTICS = NO + COMBINE_HIDPI_IMAGES = NO + COMPILATION_CACHE_CAS_PATH = /var/folders/kc/2krxxjfs7xs4cg0387d1j5q40000gn/C/com.apple.DeveloperTools/26.0.1-17A400/Xcode/CompilationCache.noindex + COMPILATION_CACHE_KEEP_CAS_DIRECTORY = YES + COMPILER_INDEX_STORE_ENABLE = Default + COMPOSITE_SDK_DIRS = /Users/jblome/code/encapp/ios/build/CompositeSDKs + CONFIGURATION = Debug + CONFIGURATION_BUILD_DIR = /Users/jblome/code/encapp/ios/build/Debug-unknown + CONFIGURATION_TEMP_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown + COPYING_PRESERVES_HFS_DATA = NO + COPY_HEADERS_RUN_UNIFDEF = NO + COPY_PHASE_STRIP = NO + CP = /bin/cp + CREATE_INFOPLIST_SECTION_IN_BINARY = NO + CURRENT_ARCH = undefined_arch + CURRENT_PROJECT_VERSION = 1 + CURRENT_VARIANT = normal + DEAD_CODE_STRIPPING = YES + DEBUGGING_SYMBOLS = YES + DEBUG_INFORMATION_FORMAT = dwarf + DEBUG_INFORMATION_VERSION = compiler-default + DEFAULT_DEXT_INSTALL_PATH = /System/Library/DriverExtensions + DEFAULT_KEXT_INSTALL_PATH = /System/Library/Extensions + DEFINES_MODULE = NO + DEPLOYMENT_LOCATION = NO + DEPLOYMENT_POSTPROCESSING = NO + DERIVED_FILES_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/DerivedSources + DERIVED_FILE_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/DerivedSources + DERIVED_SOURCES_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/DerivedSources + DEVELOPER_APPLICATIONS_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Applications + DEVELOPER_BIN_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/usr/bin + DEVELOPER_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer + DEVELOPER_FRAMEWORKS_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Library/Frameworks + DEVELOPER_FRAMEWORKS_DIR_QUOTED = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Library/Frameworks + DEVELOPER_LIBRARY_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Library + DEVELOPER_SDK_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs + DEVELOPER_TOOLS_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Tools + DEVELOPER_USR_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/usr + DEVELOPMENT_ASSET_PATHS = "Encapp/Preview Content" + DEVELOPMENT_LANGUAGE = en + DEVELOPMENT_TEAM = PWNNZ9S7WJ + DIAGNOSE_MISSING_TARGET_DEPENDENCIES = YES + DIFF = /usr/bin/diff + DONT_GENERATE_INFOPLIST_FILE = NO + DRIVERKIT_DEPLOYMENT_TARGET = 25.0 + DSTROOT = /tmp/Encapp.dst + DT_TOOLCHAIN_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain + DWARF_DSYM_FILE_NAME = .dSYM + DWARF_DSYM_FILE_SHOULD_ACCOMPANY_PRODUCT = NO + DWARF_DSYM_FOLDER_PATH = /Users/jblome/code/encapp/ios/build/Debug-unknown + EAGER_COMPILATION_ALLOW_SCRIPTS = NO + EAGER_LINKING = NO + EFFECTIVE_PLATFORM_NAME = -unknown + EMBEDDED_CONTENT_CONTAINS_SWIFT = NO + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO + ENABLE_APP_SANDBOX = YES + ENABLE_CODE_COVERAGE = YES + ENABLE_CPLUSPLUS_BOUNDS_SAFE_BUFFERS = NO + ENABLE_C_BOUNDS_SAFETY = NO + ENABLE_DEFAULT_HEADER_SEARCH_PATHS = YES + ENABLE_DEFAULT_SEARCH_PATHS = YES + ENABLE_ENHANCED_SECURITY = NO + ENABLE_FILE_ACCESS_DOWNLOADS_FOLDER = readwrite + ENABLE_FILE_ACCESS_MOVIES_FOLDER = readwrite + ENABLE_FILE_ACCESS_MUSIC_FOLDER = readwrite + ENABLE_FILE_ACCESS_PICTURE_FOLDER = readwrite + ENABLE_HARDENED_RUNTIME = YES + ENABLE_HEADER_DEPENDENCIES = YES + ENABLE_INCOMING_NETWORK_CONNECTIONS = YES + ENABLE_ON_DEMAND_RESOURCES = NO + ENABLE_OUTGOING_NETWORK_CONNECTIONS = YES + ENABLE_POINTER_AUTHENTICATION = NO + ENABLE_PREVIEWS = YES + ENABLE_RESOURCE_ACCESS_AUDIO_INPUT = NO + ENABLE_RESOURCE_ACCESS_BLUETOOTH = NO + ENABLE_RESOURCE_ACCESS_CALENDARS = NO + ENABLE_RESOURCE_ACCESS_CAMERA = NO + ENABLE_RESOURCE_ACCESS_CONTACTS = NO + ENABLE_RESOURCE_ACCESS_LOCATION = NO + ENABLE_RESOURCE_ACCESS_PHOTO_LIBRARY = NO + ENABLE_RESOURCE_ACCESS_PRINTING = NO + ENABLE_RESOURCE_ACCESS_USB = YES + ENABLE_SDK_IMPORTS = NO + ENABLE_SECURITY_COMPILER_WARNINGS = NO + ENABLE_STRICT_OBJC_MSGSEND = YES + ENABLE_TESTABILITY = YES + ENABLE_TESTING_SEARCH_PATHS = NO + ENABLE_THREAD_SANITIZER = NO + ENABLE_USER_SCRIPT_SANDBOXING = NO + ENABLE_USER_SELECTED_FILES = readwrite + ENFORCE_VALID_ARCHS = YES + EXCLUDED_INSTALLSRC_SUBDIRECTORY_PATTERNS = .DS_Store .svn .git .hg CVS + EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES = *.nib *.lproj *.framework *.gch *.xcode* *.xcassets *.icon (*) .DS_Store CVS .svn .git .hg *.pbproj *.pbxproj + FILE_LIST = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/Objects/LinkFileList + FIXED_FILES_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/FixedFiles + FRAMEWORK_SEARCH_PATHS = /Users/jblome/code/encapp/ios/build/Debug-unknown + FRAMEWORK_VERSION = A + FUSE_BUILD_PHASES = YES + FUSE_BUILD_SCRIPT_PHASES = NO + GCC3_VERSION = 3.3 + GCC_C_LANGUAGE_STANDARD = gnu11 + GCC_DYNAMIC_NO_PIC = NO + GCC_NO_COMMON_BLOCKS = YES + GCC_OPTIMIZATION_LEVEL = 0 + GCC_PFE_FILE_C_DIALECTS = c objective-c c++ objective-c++ + GCC_PREPROCESSOR_DEFINITIONS = DEBUG=1 + GCC_TREAT_WARNINGS_AS_ERRORS = NO + GCC_VERSION = com.apple.compilers.llvm.clang.1_0 + GCC_VERSION_IDENTIFIER = com_apple_compilers_llvm_clang_1_0 + GCC_WARN_64_TO_32_BIT_CONVERSION = YES + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR + GCC_WARN_UNDECLARED_SELECTOR = YES + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE + GCC_WARN_UNUSED_FUNCTION = YES + GCC_WARN_UNUSED_VARIABLE = YES + GENERATED_MODULEMAP_DIR = /Users/jblome/code/encapp/ios/build/GeneratedModuleMaps-unknown + GENERATE_INFOPLIST_FILE = YES + GENERATE_INTERMEDIATE_TEXT_BASED_STUBS = YES + GENERATE_PKGINFO_FILE = NO + GENERATE_PRELINK_OBJECT_FILE = NO + GENERATE_PROFILING_CODE = NO + GENERATE_TEXT_BASED_STUBS = NO + GID = 20 + GROUP = staff + HEADERMAP_INCLUDES_FLAT_ENTRIES_FOR_TARGET_BEING_BUILT = YES + HEADERMAP_INCLUDES_FRAMEWORK_ENTRIES_FOR_ALL_PRODUCT_TYPES = YES + HEADERMAP_INCLUDES_FRAMEWORK_ENTRIES_FOR_TARGETS_NOT_BEING_BUILT = YES + HEADERMAP_INCLUDES_NONPUBLIC_NONPRIVATE_HEADERS = YES + HEADERMAP_INCLUDES_PROJECT_HEADERS = YES + HEADERMAP_USES_FRAMEWORK_PREFIX_ENTRIES = YES + HEADERMAP_USES_VFS = NO + HEADER_SEARCH_PATHS = /Users/jblome/code/encapp/ios/build/Debug-unknown/include /Users/jblome/code/encapp/ios/include + HOME = /Users/jblome + HOST_ARCH = arm64 + HOST_PLATFORM = macosx + ICONV = /usr/bin/iconv + IMPLICIT_DEPENDENCY_DOMAIN = default + INFOPLIST_ENABLE_CFBUNDLEICONS_MERGE = YES + INFOPLIST_EXPAND_BUILD_SETTINGS = YES + INFOPLIST_KEY_LSApplicationCategoryType = public.app-category.developer-tools + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + INFOPLIST_OUTPUT_FORMAT = same-as-input + INFOPLIST_PREPROCESS = NO + INLINE_PRIVATE_FRAMEWORKS = NO + INSTALLAPI_IGNORE_SKIP_INSTALL = YES + INSTALLHDRS_COPY_PHASE = NO + INSTALLHDRS_SCRIPT_PHASE = NO + INSTALL_DIR = /tmp/Encapp.dst + INSTALL_GROUP = staff + INSTALL_MODE_FLAG = u+w,go-w,a+rX + INSTALL_OWNER = jblome + INSTALL_ROOT = /tmp/Encapp.dst + IPHONEOS_DEPLOYMENT_TARGET = 15.0 + IS_UNOPTIMIZED_BUILD = YES + JAVAC_DEFAULT_FLAGS = -J-Xms64m -J-XX:NewSize=4M -J-Dfile.encoding=UTF8 + JAVA_APP_STUB = /System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub + JAVA_ARCHIVE_CLASSES = YES + JAVA_ARCHIVE_TYPE = JAR + JAVA_COMPILER = /usr/bin/javac + JAVA_FRAMEWORK_RESOURCES_DIRS = Resources + JAVA_JAR_FLAGS = cv + JAVA_SOURCE_SUBDIR = . + JAVA_USE_DEPENDENCIES = YES + JAVA_ZIP_FLAGS = -urg + JIKES_DEFAULT_FLAGS = +E +OLDCSO + KEEP_PRIVATE_EXTERNS = NO + LD_DEPENDENCY_INFO_FILE = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/Objects-normal/undefined_arch/Encapp_dependency_info.dat + LD_EXPORT_SYMBOLS = YES + LD_GENERATE_MAP_FILE = NO + LD_MAP_FILE_PATH = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/Encapp-LinkMap-normal-undefined_arch.txt + LD_NO_PIE = NO + LD_QUOTE_LINKER_ARGUMENTS_FOR_COMPILER_DRIVER = YES + LD_RUNPATH_SEARCH_PATHS = @executable_path/Frameworks + LD_SHARED_CACHE_ELIGIBLE = Automatic + LD_WARN_DUPLICATE_LIBRARIES = NO + LD_WARN_UNUSED_DYLIBS = NO + LEGACY_DEVELOPER_DIR = /Users/jblome/Downloads/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer + LEX = lex + LIBRARY_DEXT_INSTALL_PATH = /Library/DriverExtensions + LIBRARY_FLAG_NOSPACE = YES + LIBRARY_KEXT_INSTALL_PATH = /Library/Extensions + LIBRARY_SEARCH_PATHS = /Users/jblome/code/encapp/ios/build/Debug-unknown /Users/jblome/code/encapp/ios/libs + LINKER_DISPLAYS_MANGLED_NAMES = NO + LINK_WITH_STANDARD_LIBRARIES = YES + LLVM_TARGET_TRIPLE_VENDOR = apple + LOCALIZATION_EXPORT_SUPPORTED = YES + LOCALIZATION_PREFERS_STRING_CATALOGS = NO + LOCALIZED_STRING_MACRO_NAMES = NSLocalizedString CFCopyLocalizedString + LOCALIZED_STRING_SWIFTUI_SUPPORT = YES + LOCAL_ADMIN_APPS_DIR = /Applications/Utilities + LOCAL_APPS_DIR = /Applications + LOCAL_DEVELOPER_DIR = /Library/Developer + LOCAL_LIBRARY_DIR = /Library + LOCROOT = /Users/jblome/code/encapp/ios + LOCSYMROOT = /Users/jblome/code/encapp/ios + MACOSX_DEPLOYMENT_TARGET = 12.3 + MAC_OS_X_PRODUCT_BUILD_VERSION = 24G222 + MAC_OS_X_VERSION_ACTUAL = 150700 + MAC_OS_X_VERSION_MAJOR = 150000 + MAC_OS_X_VERSION_MINOR = 150700 + MAKE_MERGEABLE = NO + MARKETING_VERSION = 1.0 + MERGEABLE_LIBRARY = NO + MERGED_BINARY_TYPE = none + MERGE_LINKED_LIBRARIES = NO + METAL_LIBRARY_FILE_BASE = default + METAL_LIBRARY_OUTPUT_DIR = /Users/jblome/code/encapp/ios/build/Debug-unknown/ + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE + MTL_FAST_MATH = YES + NATIVE_ARCH = arm64 + NATIVE_ARCH_32_BIT = arm + NATIVE_ARCH_64_BIT = arm64 + NATIVE_ARCH_ACTUAL = arm64 + NO_COMMON = YES + OBJECT_FILE_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/Objects + OBJECT_FILE_DIR_normal = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/Objects-normal + OBJROOT = /Users/jblome/code/encapp/ios/build + ONLY_ACTIVE_ARCH = YES + OS = MACOS + OSAC = /usr/bin/osacompile + PASCAL_STRINGS = YES + PATH = /Users/jblome/Downloads/Xcode.app/Contents/SharedFrameworks/SwiftBuild.framework/Versions/A/PlugIns/SWBBuildService.bundle/Contents/PlugIns/SWBUniversalPlatformPlugin.bundle/Contents/Frameworks/SWBUniversalPlatform.framework/Resources:/Users/jblome/Downloads/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:/Users/jblome/Downloads/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/local/bin:/Users/jblome/Downloads/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/libexec:/Users/jblome/Downloads/Xcode.app/Contents/Developer/usr/bin:/Users/jblome/Downloads/Xcode.app/Contents/Developer/usr/local/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/opt/facebook/bin:/opt/facebook/bin/biggrep:/opt/facebook/nix/bin:/opt/facebook/ops/scripts/chef:/opt/facebook/hg/bin:/usr/local/munki:/Applications/kitty.app/Contents/MacOS + PATH_PREFIXES_EXCLUDED_FROM_HEADER_DEPENDENCIES = /usr/include /usr/local/include /System/Library/Frameworks /System/Library/PrivateFrameworks /Users/jblome/Downloads/Xcode.app/Contents/Developer/Headers /Users/jblome/Downloads/Xcode.app/Contents/Developer/SDKs /Users/jblome/Downloads/Xcode.app/Contents/Developer/Platforms + PER_ARCH_MODULE_FILE_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/Objects-normal/undefined_arch/Modules + PER_ARCH_OBJECT_FILE_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/Objects-normal/undefined_arch + PER_VARIANT_OBJECT_FILE_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/Objects-normal + PKGINFO_FILE_PATH = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/PkgInfo + PLIST_FILE_OUTPUT_FORMAT = same-as-input + PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = YES + PRECOMP_DESTINATION_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/PrefixHeaders + PROCESSED_INFOPLIST_PATH = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/Objects-normal/undefined_arch/Processed-Info.plist + PRODUCT_BUNDLE_IDENTIFIER = Meta.Encapp + PRODUCT_MODULE_NAME = Encapp + PRODUCT_NAME = Encapp + PRODUCT_SETTINGS_PATH = + PRODUCT_TYPE = com.apple.product-type.application + PROFILING_CODE = NO + PROJECT = Encapp + PROJECT_DERIVED_FILE_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/DerivedSources + PROJECT_DIR = /Users/jblome/code/encapp/ios + PROJECT_FILE_PATH = /Users/jblome/code/encapp/ios/Encapp.xcodeproj + PROJECT_GUID = 3b197d7739ee5ce795a0ebec593f75b5 + PROJECT_NAME = Encapp + PROJECT_TEMP_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build + PROJECT_TEMP_ROOT = /Users/jblome/code/encapp/ios/build + RECURSIVE_SEARCH_PATHS_FOLLOW_SYMLINKS = YES + REMOVE_CVS_FROM_RESOURCES = YES + REMOVE_GIT_FROM_RESOURCES = YES + REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES = YES + REMOVE_HG_FROM_RESOURCES = YES + REMOVE_STATIC_EXECUTABLES_FROM_EMBEDDED_BUNDLES = YES + REMOVE_SVN_FROM_RESOURCES = YES + RESCHEDULE_INDEPENDENT_HEADERS_PHASES = YES + REZ_COLLECTOR_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/ResourceManagerResources + REZ_OBJECTS_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/ResourceManagerResources/Objects + REZ_SEARCH_PATHS = /Users/jblome/code/encapp/ios/build/Debug-unknown + RUNTIME_EXCEPTION_ALLOW_DYLD_ENVIRONMENT_VARIABLES = NO + RUNTIME_EXCEPTION_ALLOW_JIT = NO + RUNTIME_EXCEPTION_ALLOW_UNSIGNED_EXECUTABLE_MEMORY = NO + RUNTIME_EXCEPTION_DEBUGGING_TOOL = NO + RUNTIME_EXCEPTION_DISABLE_EXECUTABLE_PAGE_PROTECTION = NO + RUNTIME_EXCEPTION_DISABLE_LIBRARY_VALIDATION = NO + SCAN_ALL_SOURCE_FILES_FOR_INCLUDES = NO + SDKROOT = auto + SDK_STAT_CACHE_ENABLE = YES + SED = /usr/bin/sed + SEPARATE_STRIP = NO + SEPARATE_SYMBOL_EDIT = NO + SET_DIR_MODE_OWNER_GROUP = YES + SET_FILE_MODE_OWNER_GROUP = NO + SHALLOW_BUNDLE = NO + SHARED_DERIVED_FILE_DIR = /Users/jblome/code/encapp/ios/build/Debug-unknown/DerivedSources + SHARED_PRECOMPS_DIR = /Users/jblome/code/encapp/ios/build/SharedPrecompiledHeaders + SKIP_INSTALL = YES + SOURCE_ROOT = /Users/jblome/code/encapp/ios + SRCROOT = /Users/jblome/code/encapp/ios + STRINGSDATA_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/Objects-normal/undefined_arch + STRINGSDATA_ROOT = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build + STRINGS_FILE_INFOPLIST_RENAME = YES + STRINGS_FILE_OUTPUT_ENCODING = UTF-16 + STRING_CATALOG_GENERATE_SYMBOLS = NO + STRIP_BITCODE_FROM_COPIED_FILES = NO + STRIP_INSTALLED_PRODUCT = NO + STRIP_STYLE = all + STRIP_SWIFT_SYMBOLS = YES + SUPPORTED_PLATFORMS = iphoneos iphonesimulator macosx + SUPPORTS_MACCATALYST = YES + SUPPORTS_TEXT_BASED_API = NO + SUPPRESS_WARNINGS = NO + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG + SWIFT_EMIT_CONST_VALUE_PROTOCOLS = AppIntent EntityQuery AppEntity TransientEntity AppEnum AppShortcutProviding AppShortcutsProvider AnyResolverProviding AppIntentsPackage DynamicOptionsProvider _IntentValueRepresentable _AssistantIntentsProvider _GenerativeFunctionExtractable IntentValueQuery Resolver AppExtension ExtensionPointDefining + SWIFT_EMIT_LOC_STRINGS = YES + SWIFT_OBJC_BRIDGING_HEADER = ObjC/X264WrapperBridge.h + SWIFT_OPTIMIZATION_LEVEL = -Onone + SWIFT_VERSION = 5.0 + SYMROOT = /Users/jblome/code/encapp/ios/build + SYSTEM_ADMIN_APPS_DIR = /Applications/Utilities + SYSTEM_APPS_DIR = /Applications + SYSTEM_CORE_SERVICES_DIR = /System/Library/CoreServices + SYSTEM_DEMOS_DIR = /Applications/Extras + SYSTEM_DEVELOPER_APPS_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Applications + SYSTEM_DEVELOPER_BIN_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/usr/bin + SYSTEM_DEVELOPER_DEMOS_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Applications/Utilities/Built Examples + SYSTEM_DEVELOPER_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer + SYSTEM_DEVELOPER_DOC_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/ADC Reference Library + SYSTEM_DEVELOPER_GRAPHICS_TOOLS_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Applications/Graphics Tools + SYSTEM_DEVELOPER_JAVA_TOOLS_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Applications/Java Tools + SYSTEM_DEVELOPER_PERFORMANCE_TOOLS_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Applications/Performance Tools + SYSTEM_DEVELOPER_RELEASENOTES_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes + SYSTEM_DEVELOPER_TOOLS = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Tools + SYSTEM_DEVELOPER_TOOLS_DOC_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/ADC Reference Library/documentation/DeveloperTools + SYSTEM_DEVELOPER_TOOLS_RELEASENOTES_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes/DeveloperTools + SYSTEM_DEVELOPER_USR_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/usr + SYSTEM_DEVELOPER_UTILITIES_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Applications/Utilities + SYSTEM_DEXT_INSTALL_PATH = /System/Library/DriverExtensions + SYSTEM_DOCUMENTATION_DIR = /Library/Documentation + SYSTEM_KEXT_INSTALL_PATH = /System/Library/Extensions + SYSTEM_LIBRARY_DIR = /System/Library + TAPI_DEMANGLE = YES + TAPI_ENABLE_PROJECT_HEADERS = NO + TAPI_LANGUAGE = objective-c + TAPI_LANGUAGE_STANDARD = compiler-default + TAPI_VERIFY_MODE = ErrorsOnly + TARGETED_DEVICE_FAMILY = 1,2 + TARGETNAME = Encapp + TARGET_BUILD_DIR = /Users/jblome/code/encapp/ios/build/Debug-unknown + TARGET_NAME = Encapp + TARGET_TEMP_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build + TEMP_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build + TEMP_FILES_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build + TEMP_FILE_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build + TEMP_ROOT = /Users/jblome/code/encapp/ios/build + TEMP_SANDBOX_DIR = /Users/jblome/code/encapp/ios/build/TemporaryTaskSandboxes + TOOLCHAINS = com.apple.dt.toolchain.XcodeDefault + TOOLCHAIN_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain + TREAT_MISSING_BASELINES_AS_TEST_FAILURES = NO + TREAT_MISSING_SCRIPT_PHASE_OUTPUTS_AS_ERRORS = NO + TVOS_DEPLOYMENT_TARGET = 26.0 + UID = 501 + UNINSTALLED_PRODUCTS_DIR = /Users/jblome/code/encapp/ios/build/UninstalledProducts + UNSTRIPPED_PRODUCT = NO + USER = jblome + USER_APPS_DIR = /Users/jblome/Applications + USER_LIBRARY_DIR = /Users/jblome/Library + USE_DYNAMIC_NO_PIC = YES + USE_HEADERMAP = YES + USE_HEADER_SYMLINKS = NO + VALIDATE_DEVELOPMENT_ASSET_PATHS = YES_ERROR + VALIDATE_PRODUCT = NO + VERBOSE_PBXCP = NO + VERSION_INFO_BUILDER = jblome + VERSION_INFO_FILE = Encapp_vers.c + VERSION_INFO_STRING = "@(#)PROGRAM:Encapp PROJECT:Encapp-1" + WATCHOS_DEPLOYMENT_TARGET = 26.0 + WORKSPACE_DIR = /Users/jblome/code/encapp/ios/Encapp.xcodeproj + WRAP_ASSET_PACKS_IN_SEPARATE_DIRECTORIES = NO + XCODE_APP_SUPPORT_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Library/Xcode + XCODE_PRODUCT_BUILD_VERSION = 17A400 + XCODE_VERSION_ACTUAL = 2601 + XCODE_VERSION_MAJOR = 2600 + XCODE_VERSION_MINOR = 2600 + XPCSERVICES_FOLDER_PATH = /XPCServices + XROS_DEPLOYMENT_TARGET = 26.0 + YACC = yacc + _DISCOVER_COMMAND_LINE_LINKER_INPUTS = YES + _DISCOVER_COMMAND_LINE_LINKER_INPUTS_INCLUDE_WL = YES + _LD_MULTIARCH = YES + __DIAGNOSE_DEPRECATED_ARCHS = YES + arch = undefined_arch + variant = normal + diff --git a/ios/profile.txt b/ios/profile.txt new file mode 100644 index 00000000..7e5b8720 --- /dev/null +++ b/ios/profile.txt @@ -0,0 +1,459 @@ +Command line invocation: + /Users/jblome/Downloads/Xcode.app/Contents/Developer/usr/bin/xcodebuild -showBuildSettings -configuration Profile + +Resolve Package Graph + + +Resolved source packages: + SwiftProtobuf: https://github.com/apple/swift-protobuf.git @ 1.31.1 + +Build settings for action build and target Encapp: + ACTION = build + ALLOW_BUILD_REQUEST_OVERRIDES = NO + ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES + ALTERNATE_GROUP = staff + ALTERNATE_MODE = u+w,go-w,a+rX + ALTERNATE_OWNER = jblome + ALTERNATIVE_DISTRIBUTION_WEB = NO + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO + ALWAYS_SEARCH_USER_PATHS = NO + ALWAYS_USE_SEPARATE_HEADERMAPS = NO + APPLICATION_EXTENSION_API_ONLY = NO + APPLY_RULES_IN_COPY_FILES = NO + APPLY_RULES_IN_COPY_HEADERS = NO + APP_SHORTCUTS_ENABLE_FLEXIBLE_MATCHING = YES + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor + AUTOMATICALLY_MERGE_DEPENDENCIES = NO + AUTOMATION_APPLE_EVENTS = NO + AVAILABLE_PLATFORMS = android appletvos appletvsimulator driverkit iphoneos iphonesimulator macosx qnx watchos watchsimulator webassembly xros xrsimulator + BUILD_ACTIVE_RESOURCES_ONLY = NO + BUILD_COMPONENTS = headers build + BUILD_DIR = /Users/jblome/code/encapp/ios/build + BUILD_LIBRARY_FOR_DISTRIBUTION = NO + BUILD_ROOT = /Users/jblome/code/encapp/ios/build + BUILD_STYLE = + BUILD_VARIANTS = normal + BUILT_PRODUCTS_DIR = /Users/jblome/code/encapp/ios/build/Release-unknown + BUNDLE_CONTENTS_FOLDER_PATH_deep = Contents/ + BUNDLE_EXECUTABLE_FOLDER_NAME_deep = MacOS + BUNDLE_EXTENSIONS_FOLDER_PATH = Extensions + BUNDLE_FORMAT = shallow + BUNDLE_FRAMEWORKS_FOLDER_PATH = Frameworks + BUNDLE_PLUGINS_FOLDER_PATH = PlugIns + BUNDLE_PRIVATE_HEADERS_FOLDER_PATH = PrivateHeaders + BUNDLE_PUBLIC_HEADERS_FOLDER_PATH = Headers + CACHE_ROOT = /var/folders/kc/2krxxjfs7xs4cg0387d1j5q40000gn/C/com.apple.DeveloperTools/26.0.1-17A400/Xcode + CCHROOT = /var/folders/kc/2krxxjfs7xs4cg0387d1j5q40000gn/C/com.apple.DeveloperTools/26.0.1-17A400/Xcode + CHMOD = /bin/chmod + CHOWN = /usr/sbin/chown + CLANG_ANALYZER_NONNULL = YES + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE + CLANG_CACHE_FINE_GRAINED_OUTPUTS = YES + CLANG_CXX_LANGUAGE_STANDARD = gnu++20 + CLANG_ENABLE_EXPLICIT_MODULES = YES + CLANG_ENABLE_MODULES = YES + CLANG_ENABLE_OBJC_ARC = YES + CLANG_ENABLE_OBJC_WEAK = YES + CLANG_MODULES_BUILD_SESSION_FILE = /var/folders/kc/2krxxjfs7xs4cg0387d1j5q40000gn/C/org.llvm.clang/ModuleCache.noindex/Session.modulevalidation + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES + CLANG_WARN_BOOL_CONVERSION = YES + CLANG_WARN_COMMA = YES + CLANG_WARN_CONSTANT_CONVERSION = YES + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR + CLANG_WARN_DOCUMENTATION_COMMENTS = YES + CLANG_WARN_EMPTY_BODY = YES + CLANG_WARN_ENUM_CONVERSION = YES + CLANG_WARN_INFINITE_RECURSION = YES + CLANG_WARN_INT_CONVERSION = YES + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES + CLANG_WARN_STRICT_PROTOTYPES = YES + CLANG_WARN_SUSPICIOUS_MOVE = YES + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE + CLANG_WARN_UNREACHABLE_CODE = YES + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES + CLASS_FILE_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/JavaClasses + CLEAN_PRECOMPS = YES + CLONE_HEADERS = NO + CODESIGNING_FOLDER_PATH = /Users/jblome/code/encapp/ios/build/Release-unknown/ + CODE_SIGNING_ALLOWED = NO + CODE_SIGN_ENTITLEMENTS = Encapp/Encapp.entitlements + CODE_SIGN_IDENTITY = - + CODE_SIGN_INJECT_BASE_ENTITLEMENTS = YES + CODE_SIGN_STYLE = Automatic + COLOR_DIAGNOSTICS = NO + COMBINE_HIDPI_IMAGES = NO + COMPILATION_CACHE_CAS_PATH = /var/folders/kc/2krxxjfs7xs4cg0387d1j5q40000gn/C/com.apple.DeveloperTools/26.0.1-17A400/Xcode/CompilationCache.noindex + COMPILATION_CACHE_KEEP_CAS_DIRECTORY = YES + COMPILER_INDEX_STORE_ENABLE = Default + COMPOSITE_SDK_DIRS = /Users/jblome/code/encapp/ios/build/CompositeSDKs + CONFIGURATION = Release + CONFIGURATION_BUILD_DIR = /Users/jblome/code/encapp/ios/build/Release-unknown + CONFIGURATION_TEMP_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown + COPYING_PRESERVES_HFS_DATA = NO + COPY_HEADERS_RUN_UNIFDEF = NO + COPY_PHASE_STRIP = NO + CP = /bin/cp + CREATE_INFOPLIST_SECTION_IN_BINARY = NO + CURRENT_ARCH = undefined_arch + CURRENT_PROJECT_VERSION = 1 + CURRENT_VARIANT = normal + DEAD_CODE_STRIPPING = YES + DEBUGGING_SYMBOLS = YES + DEBUG_INFORMATION_FORMAT = dwarf-with-dsym + DEBUG_INFORMATION_VERSION = compiler-default + DEFAULT_DEXT_INSTALL_PATH = /System/Library/DriverExtensions + DEFAULT_KEXT_INSTALL_PATH = /System/Library/Extensions + DEFINES_MODULE = NO + DEPLOYMENT_LOCATION = NO + DEPLOYMENT_POSTPROCESSING = NO + DERIVED_FILES_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/DerivedSources + DERIVED_FILE_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/DerivedSources + DERIVED_SOURCES_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/DerivedSources + DEVELOPER_APPLICATIONS_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Applications + DEVELOPER_BIN_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/usr/bin + DEVELOPER_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer + DEVELOPER_FRAMEWORKS_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Library/Frameworks + DEVELOPER_FRAMEWORKS_DIR_QUOTED = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Library/Frameworks + DEVELOPER_LIBRARY_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Library + DEVELOPER_SDK_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs + DEVELOPER_TOOLS_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Tools + DEVELOPER_USR_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/usr + DEVELOPMENT_ASSET_PATHS = "Encapp/Preview Content" + DEVELOPMENT_LANGUAGE = en + DEVELOPMENT_TEAM = PWNNZ9S7WJ + DIAGNOSE_MISSING_TARGET_DEPENDENCIES = YES + DIFF = /usr/bin/diff + DONT_GENERATE_INFOPLIST_FILE = NO + DRIVERKIT_DEPLOYMENT_TARGET = 25.0 + DSTROOT = /tmp/Encapp.dst + DT_TOOLCHAIN_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain + DWARF_DSYM_FILE_NAME = .dSYM + DWARF_DSYM_FILE_SHOULD_ACCOMPANY_PRODUCT = NO + DWARF_DSYM_FOLDER_PATH = /Users/jblome/code/encapp/ios/build/Release-unknown + EAGER_COMPILATION_ALLOW_SCRIPTS = NO + EAGER_LINKING = NO + EFFECTIVE_PLATFORM_NAME = -unknown + EMBEDDED_CONTENT_CONTAINS_SWIFT = NO + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO + ENABLE_APP_SANDBOX = YES + ENABLE_CODE_COVERAGE = YES + ENABLE_CPLUSPLUS_BOUNDS_SAFE_BUFFERS = NO + ENABLE_C_BOUNDS_SAFETY = NO + ENABLE_DEBUG_DYLIB = NO + ENABLE_DEFAULT_HEADER_SEARCH_PATHS = YES + ENABLE_DEFAULT_SEARCH_PATHS = YES + ENABLE_ENHANCED_SECURITY = NO + ENABLE_FILE_ACCESS_DOWNLOADS_FOLDER = readwrite + ENABLE_FILE_ACCESS_MOVIES_FOLDER = readwrite + ENABLE_FILE_ACCESS_MUSIC_FOLDER = readwrite + ENABLE_FILE_ACCESS_PICTURE_FOLDER = readwrite + ENABLE_HARDENED_RUNTIME = NO + ENABLE_HEADER_DEPENDENCIES = YES + ENABLE_INCOMING_NETWORK_CONNECTIONS = YES + ENABLE_NS_ASSERTIONS = NO + ENABLE_ON_DEMAND_RESOURCES = NO + ENABLE_OUTGOING_NETWORK_CONNECTIONS = YES + ENABLE_POINTER_AUTHENTICATION = NO + ENABLE_PREVIEWS = NO + ENABLE_RESOURCE_ACCESS_AUDIO_INPUT = NO + ENABLE_RESOURCE_ACCESS_BLUETOOTH = NO + ENABLE_RESOURCE_ACCESS_CALENDARS = NO + ENABLE_RESOURCE_ACCESS_CAMERA = NO + ENABLE_RESOURCE_ACCESS_CONTACTS = NO + ENABLE_RESOURCE_ACCESS_LOCATION = NO + ENABLE_RESOURCE_ACCESS_PHOTO_LIBRARY = NO + ENABLE_RESOURCE_ACCESS_PRINTING = NO + ENABLE_RESOURCE_ACCESS_USB = YES + ENABLE_SDK_IMPORTS = NO + ENABLE_SECURITY_COMPILER_WARNINGS = NO + ENABLE_STRICT_OBJC_MSGSEND = YES + ENABLE_TESTABILITY = NO + ENABLE_TESTING_SEARCH_PATHS = NO + ENABLE_USER_SCRIPT_SANDBOXING = NO + ENABLE_USER_SELECTED_FILES = readwrite + ENABLE_XOJIT_PREVIEWS = NO + ENFORCE_VALID_ARCHS = YES + EXCLUDED_INSTALLSRC_SUBDIRECTORY_PATTERNS = .DS_Store .svn .git .hg CVS + EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES = *.nib *.lproj *.framework *.gch *.xcode* *.xcassets *.icon (*) .DS_Store CVS .svn .git .hg *.pbproj *.pbxproj + FILE_LIST = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/Objects/LinkFileList + FIXED_FILES_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/FixedFiles + FRAMEWORK_SEARCH_PATHS = /Users/jblome/code/encapp/ios/build/Release-unknown + FRAMEWORK_VERSION = A + FUSE_BUILD_PHASES = YES + FUSE_BUILD_SCRIPT_PHASES = NO + GCC3_VERSION = 3.3 + GCC_C_LANGUAGE_STANDARD = gnu11 + GCC_NO_COMMON_BLOCKS = YES + GCC_PFE_FILE_C_DIALECTS = c objective-c c++ objective-c++ + GCC_TREAT_WARNINGS_AS_ERRORS = NO + GCC_VERSION = com.apple.compilers.llvm.clang.1_0 + GCC_VERSION_IDENTIFIER = com_apple_compilers_llvm_clang_1_0 + GCC_WARN_64_TO_32_BIT_CONVERSION = YES + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR + GCC_WARN_UNDECLARED_SELECTOR = YES + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE + GCC_WARN_UNUSED_FUNCTION = YES + GCC_WARN_UNUSED_VARIABLE = YES + GENERATED_MODULEMAP_DIR = /Users/jblome/code/encapp/ios/build/GeneratedModuleMaps-unknown + GENERATE_INFOPLIST_FILE = YES + GENERATE_INTERMEDIATE_TEXT_BASED_STUBS = YES + GENERATE_PKGINFO_FILE = NO + GENERATE_PRELINK_OBJECT_FILE = NO + GENERATE_PROFILING_CODE = NO + GENERATE_TEXT_BASED_STUBS = NO + GID = 20 + GROUP = staff + HEADERMAP_INCLUDES_FLAT_ENTRIES_FOR_TARGET_BEING_BUILT = YES + HEADERMAP_INCLUDES_FRAMEWORK_ENTRIES_FOR_ALL_PRODUCT_TYPES = YES + HEADERMAP_INCLUDES_FRAMEWORK_ENTRIES_FOR_TARGETS_NOT_BEING_BUILT = YES + HEADERMAP_INCLUDES_NONPUBLIC_NONPRIVATE_HEADERS = YES + HEADERMAP_INCLUDES_PROJECT_HEADERS = YES + HEADERMAP_USES_FRAMEWORK_PREFIX_ENTRIES = YES + HEADERMAP_USES_VFS = NO + HEADER_SEARCH_PATHS = /Users/jblome/code/encapp/ios/build/Release-unknown/include /Users/jblome/code/encapp/ios/include + HOME = /Users/jblome + HOST_ARCH = arm64 + HOST_PLATFORM = macosx + ICONV = /usr/bin/iconv + IMPLICIT_DEPENDENCY_DOMAIN = default + INFOPLIST_ENABLE_CFBUNDLEICONS_MERGE = YES + INFOPLIST_EXPAND_BUILD_SETTINGS = YES + INFOPLIST_KEY_LSApplicationCategoryType = public.app-category.developer-tools + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + INFOPLIST_OUTPUT_FORMAT = same-as-input + INFOPLIST_PREPROCESS = NO + INLINE_PRIVATE_FRAMEWORKS = NO + INSTALLAPI_IGNORE_SKIP_INSTALL = YES + INSTALLHDRS_COPY_PHASE = NO + INSTALLHDRS_SCRIPT_PHASE = NO + INSTALL_DIR = /tmp/Encapp.dst + INSTALL_GROUP = staff + INSTALL_MODE_FLAG = u+w,go-w,a+rX + INSTALL_OWNER = jblome + INSTALL_ROOT = /tmp/Encapp.dst + IPHONEOS_DEPLOYMENT_TARGET = 15.0 + IS_UNOPTIMIZED_BUILD = NO + JAVAC_DEFAULT_FLAGS = -J-Xms64m -J-XX:NewSize=4M -J-Dfile.encoding=UTF8 + JAVA_APP_STUB = /System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub + JAVA_ARCHIVE_CLASSES = YES + JAVA_ARCHIVE_TYPE = JAR + JAVA_COMPILER = /usr/bin/javac + JAVA_FRAMEWORK_RESOURCES_DIRS = Resources + JAVA_JAR_FLAGS = cv + JAVA_SOURCE_SUBDIR = . + JAVA_USE_DEPENDENCIES = YES + JAVA_ZIP_FLAGS = -urg + JIKES_DEFAULT_FLAGS = +E +OLDCSO + KEEP_PRIVATE_EXTERNS = NO + LD_DEPENDENCY_INFO_FILE = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/Objects-normal/undefined_arch/Encapp_dependency_info.dat + LD_EXPORT_SYMBOLS = YES + LD_GENERATE_MAP_FILE = NO + LD_MAP_FILE_PATH = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/Encapp-LinkMap-normal-undefined_arch.txt + LD_NO_PIE = NO + LD_QUOTE_LINKER_ARGUMENTS_FOR_COMPILER_DRIVER = YES + LD_RUNPATH_SEARCH_PATHS = @executable_path/Frameworks + LD_SHARED_CACHE_ELIGIBLE = Automatic + LD_WARN_DUPLICATE_LIBRARIES = NO + LD_WARN_UNUSED_DYLIBS = NO + LEGACY_DEVELOPER_DIR = /Users/jblome/Downloads/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer + LEX = lex + LIBRARY_DEXT_INSTALL_PATH = /Library/DriverExtensions + LIBRARY_FLAG_NOSPACE = YES + LIBRARY_KEXT_INSTALL_PATH = /Library/Extensions + LIBRARY_SEARCH_PATHS = /Users/jblome/code/encapp/ios/build/Release-unknown /Users/jblome/code/encapp/ios/libs + LINKER_DISPLAYS_MANGLED_NAMES = NO + LINK_WITH_STANDARD_LIBRARIES = YES + LLVM_TARGET_TRIPLE_VENDOR = apple + LOCALIZATION_EXPORT_SUPPORTED = YES + LOCALIZATION_PREFERS_STRING_CATALOGS = NO + LOCALIZED_STRING_MACRO_NAMES = NSLocalizedString CFCopyLocalizedString + LOCALIZED_STRING_SWIFTUI_SUPPORT = YES + LOCAL_ADMIN_APPS_DIR = /Applications/Utilities + LOCAL_APPS_DIR = /Applications + LOCAL_DEVELOPER_DIR = /Library/Developer + LOCAL_LIBRARY_DIR = /Library + LOCROOT = /Users/jblome/code/encapp/ios + LOCSYMROOT = /Users/jblome/code/encapp/ios + MACOSX_DEPLOYMENT_TARGET = 12.3 + MAC_OS_X_PRODUCT_BUILD_VERSION = 24G222 + MAC_OS_X_VERSION_ACTUAL = 150700 + MAC_OS_X_VERSION_MAJOR = 150000 + MAC_OS_X_VERSION_MINOR = 150700 + MAKE_MERGEABLE = NO + MARKETING_VERSION = 1.0 + MERGEABLE_LIBRARY = NO + MERGED_BINARY_TYPE = none + MERGE_LINKED_LIBRARIES = NO + METAL_LIBRARY_FILE_BASE = default + METAL_LIBRARY_OUTPUT_DIR = /Users/jblome/code/encapp/ios/build/Release-unknown/ + MTL_ENABLE_DEBUG_INFO = NO + MTL_FAST_MATH = YES + NATIVE_ARCH = arm64 + NATIVE_ARCH_32_BIT = arm + NATIVE_ARCH_64_BIT = arm64 + NATIVE_ARCH_ACTUAL = arm64 + NO_COMMON = YES + OBJECT_FILE_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/Objects + OBJECT_FILE_DIR_normal = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/Objects-normal + OBJROOT = /Users/jblome/code/encapp/ios/build + ONLY_ACTIVE_ARCH = NO + OS = MACOS + OSAC = /usr/bin/osacompile + PASCAL_STRINGS = YES + PATH = /Users/jblome/Downloads/Xcode.app/Contents/SharedFrameworks/SwiftBuild.framework/Versions/A/PlugIns/SWBBuildService.bundle/Contents/PlugIns/SWBUniversalPlatformPlugin.bundle/Contents/Frameworks/SWBUniversalPlatform.framework/Resources:/Users/jblome/Downloads/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:/Users/jblome/Downloads/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/local/bin:/Users/jblome/Downloads/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/libexec:/Users/jblome/Downloads/Xcode.app/Contents/Developer/usr/bin:/Users/jblome/Downloads/Xcode.app/Contents/Developer/usr/local/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/opt/facebook/bin:/opt/facebook/bin/biggrep:/opt/facebook/nix/bin:/opt/facebook/ops/scripts/chef:/opt/facebook/hg/bin:/usr/local/munki:/Applications/kitty.app/Contents/MacOS + PATH_PREFIXES_EXCLUDED_FROM_HEADER_DEPENDENCIES = /usr/include /usr/local/include /System/Library/Frameworks /System/Library/PrivateFrameworks /Users/jblome/Downloads/Xcode.app/Contents/Developer/Headers /Users/jblome/Downloads/Xcode.app/Contents/Developer/SDKs /Users/jblome/Downloads/Xcode.app/Contents/Developer/Platforms + PER_ARCH_MODULE_FILE_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/Objects-normal/undefined_arch/Modules + PER_ARCH_OBJECT_FILE_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/Objects-normal/undefined_arch + PER_VARIANT_OBJECT_FILE_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/Objects-normal + PKGINFO_FILE_PATH = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/PkgInfo + PLIST_FILE_OUTPUT_FORMAT = same-as-input + PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = YES + PRECOMP_DESTINATION_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/PrefixHeaders + PROCESSED_INFOPLIST_PATH = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/Objects-normal/undefined_arch/Processed-Info.plist + PRODUCT_BUNDLE_IDENTIFIER = Meta.Encapp + PRODUCT_MODULE_NAME = Encapp + PRODUCT_NAME = Encapp + PRODUCT_SETTINGS_PATH = + PRODUCT_TYPE = com.apple.product-type.application + PROFILING_CODE = NO + PROJECT = Encapp + PROJECT_DERIVED_FILE_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/DerivedSources + PROJECT_DIR = /Users/jblome/code/encapp/ios + PROJECT_FILE_PATH = /Users/jblome/code/encapp/ios/Encapp.xcodeproj + PROJECT_GUID = 3b197d7739ee5ce795a0ebec593f75b5 + PROJECT_NAME = Encapp + PROJECT_TEMP_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build + PROJECT_TEMP_ROOT = /Users/jblome/code/encapp/ios/build + RECURSIVE_SEARCH_PATHS_FOLLOW_SYMLINKS = YES + REMOVE_CVS_FROM_RESOURCES = YES + REMOVE_GIT_FROM_RESOURCES = YES + REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES = YES + REMOVE_HG_FROM_RESOURCES = YES + REMOVE_STATIC_EXECUTABLES_FROM_EMBEDDED_BUNDLES = YES + REMOVE_SVN_FROM_RESOURCES = YES + RESCHEDULE_INDEPENDENT_HEADERS_PHASES = YES + REZ_COLLECTOR_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/ResourceManagerResources + REZ_OBJECTS_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/ResourceManagerResources/Objects + REZ_SEARCH_PATHS = /Users/jblome/code/encapp/ios/build/Release-unknown + RUNTIME_EXCEPTION_ALLOW_DYLD_ENVIRONMENT_VARIABLES = NO + RUNTIME_EXCEPTION_ALLOW_JIT = NO + RUNTIME_EXCEPTION_ALLOW_UNSIGNED_EXECUTABLE_MEMORY = NO + RUNTIME_EXCEPTION_DEBUGGING_TOOL = NO + RUNTIME_EXCEPTION_DISABLE_EXECUTABLE_PAGE_PROTECTION = NO + RUNTIME_EXCEPTION_DISABLE_LIBRARY_VALIDATION = NO + SCAN_ALL_SOURCE_FILES_FOR_INCLUDES = NO + SDKROOT = auto + SDK_STAT_CACHE_ENABLE = YES + SED = /usr/bin/sed + SEPARATE_STRIP = NO + SEPARATE_SYMBOL_EDIT = NO + SET_DIR_MODE_OWNER_GROUP = YES + SET_FILE_MODE_OWNER_GROUP = NO + SHALLOW_BUNDLE = NO + SHARED_DERIVED_FILE_DIR = /Users/jblome/code/encapp/ios/build/Release-unknown/DerivedSources + SHARED_PRECOMPS_DIR = /Users/jblome/code/encapp/ios/build/SharedPrecompiledHeaders + SKIP_INSTALL = YES + SOURCE_ROOT = /Users/jblome/code/encapp/ios + SRCROOT = /Users/jblome/code/encapp/ios + STRINGSDATA_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/Objects-normal/undefined_arch + STRINGSDATA_ROOT = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build + STRINGS_FILE_INFOPLIST_RENAME = YES + STRINGS_FILE_OUTPUT_ENCODING = UTF-16 + STRING_CATALOG_GENERATE_SYMBOLS = NO + STRIP_BITCODE_FROM_COPIED_FILES = NO + STRIP_INSTALLED_PRODUCT = YES + STRIP_STYLE = all + STRIP_SWIFT_SYMBOLS = YES + SUPPORTED_PLATFORMS = iphoneos iphonesimulator macosx + SUPPORTS_MACCATALYST = YES + SUPPORTS_TEXT_BASED_API = NO + SUPPRESS_WARNINGS = NO + SWIFT_COMPILATION_MODE = wholemodule + SWIFT_EMIT_CONST_VALUE_PROTOCOLS = AppIntent EntityQuery AppEntity TransientEntity AppEnum AppShortcutProviding AppShortcutsProvider AnyResolverProviding AppIntentsPackage DynamicOptionsProvider _IntentValueRepresentable _AssistantIntentsProvider _GenerativeFunctionExtractable IntentValueQuery Resolver AppExtension ExtensionPointDefining + SWIFT_EMIT_LOC_STRINGS = YES + SWIFT_OPTIMIZATION_LEVEL = -O + SWIFT_VERSION = 5.0 + SYMROOT = /Users/jblome/code/encapp/ios/build + SYSTEM_ADMIN_APPS_DIR = /Applications/Utilities + SYSTEM_APPS_DIR = /Applications + SYSTEM_CORE_SERVICES_DIR = /System/Library/CoreServices + SYSTEM_DEMOS_DIR = /Applications/Extras + SYSTEM_DEVELOPER_APPS_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Applications + SYSTEM_DEVELOPER_BIN_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/usr/bin + SYSTEM_DEVELOPER_DEMOS_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Applications/Utilities/Built Examples + SYSTEM_DEVELOPER_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer + SYSTEM_DEVELOPER_DOC_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/ADC Reference Library + SYSTEM_DEVELOPER_GRAPHICS_TOOLS_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Applications/Graphics Tools + SYSTEM_DEVELOPER_JAVA_TOOLS_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Applications/Java Tools + SYSTEM_DEVELOPER_PERFORMANCE_TOOLS_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Applications/Performance Tools + SYSTEM_DEVELOPER_RELEASENOTES_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes + SYSTEM_DEVELOPER_TOOLS = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Tools + SYSTEM_DEVELOPER_TOOLS_DOC_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/ADC Reference Library/documentation/DeveloperTools + SYSTEM_DEVELOPER_TOOLS_RELEASENOTES_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes/DeveloperTools + SYSTEM_DEVELOPER_USR_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/usr + SYSTEM_DEVELOPER_UTILITIES_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Applications/Utilities + SYSTEM_DEXT_INSTALL_PATH = /System/Library/DriverExtensions + SYSTEM_DOCUMENTATION_DIR = /Library/Documentation + SYSTEM_KEXT_INSTALL_PATH = /System/Library/Extensions + SYSTEM_LIBRARY_DIR = /System/Library + TAPI_DEMANGLE = YES + TAPI_ENABLE_PROJECT_HEADERS = NO + TAPI_LANGUAGE = objective-c + TAPI_LANGUAGE_STANDARD = compiler-default + TAPI_VERIFY_MODE = ErrorsOnly + TARGETED_DEVICE_FAMILY = 1,2 + TARGETNAME = Encapp + TARGET_BUILD_DIR = /Users/jblome/code/encapp/ios/build/Release-unknown + TARGET_NAME = Encapp + TARGET_TEMP_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build + TEMP_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build + TEMP_FILES_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build + TEMP_FILE_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build + TEMP_ROOT = /Users/jblome/code/encapp/ios/build + TEMP_SANDBOX_DIR = /Users/jblome/code/encapp/ios/build/TemporaryTaskSandboxes + TOOLCHAINS = com.apple.dt.toolchain.XcodeDefault + TOOLCHAIN_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain + TREAT_MISSING_BASELINES_AS_TEST_FAILURES = NO + TREAT_MISSING_SCRIPT_PHASE_OUTPUTS_AS_ERRORS = NO + TVOS_DEPLOYMENT_TARGET = 26.0 + UID = 501 + UNINSTALLED_PRODUCTS_DIR = /Users/jblome/code/encapp/ios/build/UninstalledProducts + UNSTRIPPED_PRODUCT = NO + USER = jblome + USER_APPS_DIR = /Users/jblome/Applications + USER_LIBRARY_DIR = /Users/jblome/Library + USE_DYNAMIC_NO_PIC = YES + USE_HEADERMAP = YES + USE_HEADER_SYMLINKS = NO + VALIDATE_DEVELOPMENT_ASSET_PATHS = YES_ERROR + VALIDATE_PRODUCT = NO + VERBOSE_PBXCP = NO + VERSION_INFO_BUILDER = jblome + VERSION_INFO_FILE = Encapp_vers.c + VERSION_INFO_STRING = "@(#)PROGRAM:Encapp PROJECT:Encapp-1" + WATCHOS_DEPLOYMENT_TARGET = 26.0 + WORKSPACE_DIR = /Users/jblome/code/encapp/ios/Encapp.xcodeproj + WRAP_ASSET_PACKS_IN_SEPARATE_DIRECTORIES = NO + XCODE_APP_SUPPORT_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Library/Xcode + XCODE_PRODUCT_BUILD_VERSION = 17A400 + XCODE_VERSION_ACTUAL = 2601 + XCODE_VERSION_MAJOR = 2600 + XCODE_VERSION_MINOR = 2600 + XPCSERVICES_FOLDER_PATH = /XPCServices + XROS_DEPLOYMENT_TARGET = 26.0 + YACC = yacc + _DISCOVER_COMMAND_LINE_LINKER_INPUTS = YES + _DISCOVER_COMMAND_LINE_LINKER_INPUTS_INCLUDE_WL = YES + _LD_MULTIARCH = YES + __DIAGNOSE_DEPRECATED_ARCHS = YES + arch = undefined_arch + variant = normal + From 7f51bcbceef78a3705b3c9488405f27f2a240241 Mon Sep 17 00:00:00 2001 From: Johan Blome Date: Tue, 25 Nov 2025 10:07:14 -0800 Subject: [PATCH 2/3] encapp: bitrate hhandling in x264 Signed-off-by: Johan Blome --- README.dev.md | 30 +- ios/Encapp.xcodeproj/project.pbxproj | 264 +++++++++++++++++- .../UserInterfaceState.xcuserstate | Bin 72715 -> 70015 bytes .../xcschemes/Copy of Encapp test.xcscheme | 78 ------ ios/Encapp/EncappMain.swift | 13 +- ios/Encapp/Encoder.swift | 1 + ios/Encapp/TestRunner.swift | 27 +- ios/Encapp/X264Encoder.swift | 28 +- ios/Encapp/utils/FileHandling.swift | 21 +- ios/Encapp/utils/Statistics.swift | 24 +- ios/ObjC/X264WrapperBridge.h | 4 +- 11 files changed, 378 insertions(+), 112 deletions(-) delete mode 100644 ios/Encapp.xcodeproj/xcuserdata/jblome.xcuserdatad/xcschemes/Copy of Encapp test.xcscheme diff --git a/README.dev.md b/README.dev.md index 7c522b37..2cda0e8b 100644 --- a/README.dev.md +++ b/README.dev.md @@ -848,18 +848,18 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - + - name: Set up JDK uses: actions/setup-java@v2 with: distribution: 'adopt' java-version: '17' - + - name: Run dry-run tests run: | export ANDROID_SERIAL=${{ secrets.DEVICE_SERIAL }} ./scripts/release.sh --dry-run - + - name: Upload APK uses: actions/upload-artifact@v2 with: @@ -872,18 +872,18 @@ jobs: ```groovy pipeline { agent any - + environment { ANDROID_SERIAL = credentials('android-device-serial') } - + stages { stage('Test') { steps { sh './scripts/release.sh --dry-run' } } - + stage('Build Release') { when { branch 'main' @@ -893,7 +893,7 @@ pipeline { } } } - + post { success { archiveArtifacts 'app/releases/*.apk' @@ -936,3 +936,19 @@ export ANDROID_SERIAL=emulator-5554 - `0` - Success - `1` - Error (build failure, test failure, user abort, etc.) + +# 6. Native Modules + +## 6.1. libX264 + +### 6.1.1. iOS + +Building libX264 for iOS: + +```bash +export CC="xcrun --sdk iphoneos clang" +export CFLAGS="-arch arm64 -mios-version-min=11.0 -isysroot $(xcrun --sdk iphoneos --show-sdk-path)" +export LDFLAGS="-arch arm64 -mios-version-min=11.0 -isysroot $(xcrun --sdk iphoneos --show-sdk-path)" +./configure --host=aarch64-apple-darwin --enable-static --enable-pic --disable-cli +make -jX +``` diff --git a/ios/Encapp.xcodeproj/project.pbxproj b/ios/Encapp.xcodeproj/project.pbxproj index bd3f50cc..3a45e90e 100644 --- a/ios/Encapp.xcodeproj/project.pbxproj +++ b/ios/Encapp.xcodeproj/project.pbxproj @@ -10,6 +10,27 @@ CA53D6F729689DB200485E4D /* Decoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA53D6F629689DB200485E4D /* Decoder.swift */; }; CA707E7F2E97133C00ABC79F /* X264Encoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA707E7E2E97133C00ABC79F /* X264Encoder.swift */; }; CA707E862E9723C900ABC79F /* libx264.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CA707E842E97238C00ABC79F /* libx264.a */; }; + CA84B4C02ED6264F00D19FBE /* FrameInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB9309293911E8009009B2 /* FrameInfo.swift */; }; + CA84B4C12ED6264F00D19FBE /* ListProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB92F7292D2BD5009009B2 /* ListProperties.swift */; }; + CA84B4C22ED6264F00D19FBE /* EncappMain.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAE00007293E907400727B6D /* EncappMain.swift */; }; + CA84B4C32ED6264F00D19FBE /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB92C7292D2ABB009009B2 /* ContentView.swift */; }; + CA84B4C42ED6264F00D19FBE /* Encoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB92FF292E7C40009009B2 /* Encoder.swift */; }; + CA84B4C52ED6264F00D19FBE /* LocalLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAE00009293EAA8200727B6D /* LocalLogger.swift */; }; + CA84B4C62ED6264F00D19FBE /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB9302292E92EC009009B2 /* Utils.swift */; }; + CA84B4C72ED6264F00D19FBE /* FileHandling.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB92FC292D7A44009009B2 /* FileHandling.swift */; }; + CA84B4C82ED6264F00D19FBE /* EncappApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB92C5292D2ABB009009B2 /* EncappApp.swift */; }; + CA84B4C92ED6264F00D19FBE /* TestRunner.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB930F29395655009009B2 /* TestRunner.swift */; }; + CA84B4CA2ED6264F00D19FBE /* Statistics.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB9306293910D9009009B2 /* Statistics.swift */; }; + CA84B4CB2ED6264F00D19FBE /* tests.pb.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB92F5292D2B88009009B2 /* tests.pb.swift */; }; + CA84B4CC2ED6264F00D19FBE /* X264Encoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA707E7E2E97133C00ABC79F /* X264Encoder.swift */; }; + CA84B4CD2ED6264F00D19FBE /* CodecHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB9312293A7478009009B2 /* CodecHelper.swift */; }; + CA84B4CE2ED6264F00D19FBE /* Decoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA53D6F629689DB200485E4D /* Decoder.swift */; }; + CA84B4CF2ED6264F00D19FBE /* JsonStats.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB930C29392CC8009009B2 /* JsonStats.swift */; }; + CA84B4D12ED6264F00D19FBE /* libx264.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CA707E842E97238C00ABC79F /* libx264.a */; }; + CA84B4D22ED6264F00D19FBE /* SwiftProtobufPluginLibrary in Frameworks */ = {isa = PBXBuildFile; productRef = CA84B4BE2ED6264F00D19FBE /* SwiftProtobufPluginLibrary */; }; + CA84B4D32ED6264F00D19FBE /* SwiftProtobuf in Frameworks */ = {isa = PBXBuildFile; productRef = CA84B4BC2ED6264F00D19FBE /* SwiftProtobuf */; }; + CA84B4D52ED6264F00D19FBE /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CAAB92CD292D2ABC009009B2 /* Preview Assets.xcassets */; }; + CA84B4D62ED6264F00D19FBE /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CAAB92C9292D2ABC009009B2 /* Assets.xcassets */; }; CAAB92C6292D2ABB009009B2 /* EncappApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB92C5292D2ABB009009B2 /* EncappApp.swift */; }; CAAB92C8292D2ABB009009B2 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB92C7292D2ABB009009B2 /* ContentView.swift */; }; CAAB92CA292D2ABC009009B2 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CAAB92C9292D2ABC009009B2 /* Assets.xcassets */; }; @@ -43,10 +64,9 @@ /* Begin PBXFileReference section */ CA53D6F629689DB200485E4D /* Decoder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Decoder.swift; sourceTree = ""; }; CA707E7E2E97133C00ABC79F /* X264Encoder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = X264Encoder.swift; sourceTree = ""; }; - CA707E812E97238C00ABC79F /* x264.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = x264.h; sourceTree = ""; }; - CA707E822E97238C00ABC79F /* x264_config.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = x264_config.h; sourceTree = ""; }; CA707E842E97238C00ABC79F /* libx264.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libx264.a; sourceTree = ""; }; CA707E8B2E9882E300ABC79F /* X264WrapperBridge.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = X264WrapperBridge.h; sourceTree = ""; }; + CA84B4DA2ED6264F00D19FBE /* Encapp.x264.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Encapp.x264.app; sourceTree = BUILT_PRODUCTS_DIR; }; CAAB92C2292D2ABB009009B2 /* Encapp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Encapp.app; sourceTree = BUILT_PRODUCTS_DIR; }; CAAB92C5292D2ABB009009B2 /* EncappApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EncappApp.swift; sourceTree = ""; }; CAAB92C7292D2ABB009009B2 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; @@ -69,6 +89,16 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + CA84B4D02ED6264F00D19FBE /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + CA84B4D12ED6264F00D19FBE /* libx264.a in Frameworks */, + CA84B4D22ED6264F00D19FBE /* SwiftProtobufPluginLibrary in Frameworks */, + CA84B4D32ED6264F00D19FBE /* SwiftProtobuf in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; CAAB92BF292D2ABB009009B2 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -92,8 +122,6 @@ CA707E832E97238C00ABC79F /* include */ = { isa = PBXGroup; children = ( - CA707E812E97238C00ABC79F /* x264.h */, - CA707E822E97238C00ABC79F /* x264_config.h */, ); path = include; sourceTree = ""; @@ -138,6 +166,7 @@ children = ( CAAB92C2292D2ABB009009B2 /* Encapp.app */, CAAB92DD292D2ABD009009B2 /* EncappUITests.xctest */, + CA84B4DA2ED6264F00D19FBE /* Encapp.x264.app */, ); name = Products; sourceTree = ""; @@ -187,6 +216,27 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ + CA84B4BB2ED6264F00D19FBE /* Encapp.x264 */ = { + isa = PBXNativeTarget; + buildConfigurationList = CA84B4D72ED6264F00D19FBE /* Build configuration list for PBXNativeTarget "Encapp.x264" */; + buildPhases = ( + CA84B4BF2ED6264F00D19FBE /* Sources */, + CA84B4D02ED6264F00D19FBE /* Frameworks */, + CA84B4D42ED6264F00D19FBE /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Encapp.x264; + packageProductDependencies = ( + CA84B4BC2ED6264F00D19FBE /* SwiftProtobuf */, + CA84B4BE2ED6264F00D19FBE /* SwiftProtobufPluginLibrary */, + ); + productName = Encapp; + productReference = CA84B4DA2ED6264F00D19FBE /* Encapp.x264.app */; + productType = "com.apple.product-type.application"; + }; CAAB92C1292D2ABB009009B2 /* Encapp */ = { isa = PBXNativeTarget; buildConfigurationList = CAAB92E7292D2ABD009009B2 /* Build configuration list for PBXNativeTarget "Encapp" */; @@ -263,11 +313,21 @@ targets = ( CAAB92C1292D2ABB009009B2 /* Encapp */, CAAB92DC292D2ABD009009B2 /* EncappUITests */, + CA84B4BB2ED6264F00D19FBE /* Encapp.x264 */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + CA84B4D42ED6264F00D19FBE /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CA84B4D52ED6264F00D19FBE /* Preview Assets.xcassets in Resources */, + CA84B4D62ED6264F00D19FBE /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; CAAB92C0292D2ABB009009B2 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -287,6 +347,29 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + CA84B4BF2ED6264F00D19FBE /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CA84B4C02ED6264F00D19FBE /* FrameInfo.swift in Sources */, + CA84B4C12ED6264F00D19FBE /* ListProperties.swift in Sources */, + CA84B4C22ED6264F00D19FBE /* EncappMain.swift in Sources */, + CA84B4C32ED6264F00D19FBE /* ContentView.swift in Sources */, + CA84B4C42ED6264F00D19FBE /* Encoder.swift in Sources */, + CA84B4C52ED6264F00D19FBE /* LocalLogger.swift in Sources */, + CA84B4C62ED6264F00D19FBE /* Utils.swift in Sources */, + CA84B4C72ED6264F00D19FBE /* FileHandling.swift in Sources */, + CA84B4C82ED6264F00D19FBE /* EncappApp.swift in Sources */, + CA84B4C92ED6264F00D19FBE /* TestRunner.swift in Sources */, + CA84B4CA2ED6264F00D19FBE /* Statistics.swift in Sources */, + CA84B4CB2ED6264F00D19FBE /* tests.pb.swift in Sources */, + CA84B4CC2ED6264F00D19FBE /* X264Encoder.swift in Sources */, + CA84B4CD2ED6264F00D19FBE /* CodecHelper.swift in Sources */, + CA84B4CE2ED6264F00D19FBE /* Decoder.swift in Sources */, + CA84B4CF2ED6264F00D19FBE /* JsonStats.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; CAAB92BE292D2ABB009009B2 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -328,6 +411,140 @@ /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ + CA84B4D82ED6264F00D19FBE /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = Encapp/Encapp.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = YES; + DEVELOPMENT_ASSET_PATHS = "\"Encapp/Preview Content\""; + DEVELOPMENT_TEAM = PWNNZ9S7WJ; + ENABLE_APP_SANDBOX = YES; + ENABLE_FILE_ACCESS_DOWNLOADS_FOLDER = readwrite; + ENABLE_FILE_ACCESS_MOVIES_FOLDER = readwrite; + ENABLE_FILE_ACCESS_MUSIC_FOLDER = readwrite; + ENABLE_FILE_ACCESS_PICTURE_FOLDER = readwrite; + ENABLE_HARDENED_RUNTIME = YES; + ENABLE_INCOMING_NETWORK_CONNECTIONS = YES; + ENABLE_OUTGOING_NETWORK_CONNECTIONS = YES; + ENABLE_PREVIEWS = YES; + ENABLE_RESOURCE_ACCESS_AUDIO_INPUT = NO; + ENABLE_RESOURCE_ACCESS_BLUETOOTH = NO; + ENABLE_RESOURCE_ACCESS_CALENDARS = NO; + ENABLE_RESOURCE_ACCESS_CAMERA = NO; + ENABLE_RESOURCE_ACCESS_CONTACTS = NO; + ENABLE_RESOURCE_ACCESS_LOCATION = NO; + ENABLE_RESOURCE_ACCESS_PRINTING = NO; + ENABLE_RESOURCE_ACCESS_USB = YES; + ENABLE_USER_SELECTED_FILES = readwrite; + GENERATE_INFOPLIST_FILE = YES; + "HEADER_SEARCH_PATHS[arch=*]" = "$(SRCROOT)/../modules/x264/"; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools"; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/../modules/x264", + ); + MACOSX_DEPLOYMENT_TARGET = 12.3; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = Meta.Encapp; + "PRODUCT_BUNDLE_IDENTIFIER[sdk=iphoneos*]" = EncappX; + "PRODUCT_BUNDLE_IDENTIFIER[sdk=macosx*]" = Encapp; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + "USER_HEADER_SEARCH_PATHS[arch=*]" = "$(SRCROOT)/../modules/x264/"; + }; + name = Debug; + }; + CA84B4D92ED6264F00D19FBE /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = Encapp/Encapp.entitlements; + CODE_SIGN_IDENTITY = "-"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = YES; + DEVELOPMENT_ASSET_PATHS = "\"Encapp/Preview Content\""; + DEVELOPMENT_TEAM = PWNNZ9S7WJ; + ENABLE_APP_SANDBOX = YES; + ENABLE_FILE_ACCESS_DOWNLOADS_FOLDER = readwrite; + ENABLE_FILE_ACCESS_MOVIES_FOLDER = readwrite; + ENABLE_FILE_ACCESS_MUSIC_FOLDER = readwrite; + ENABLE_FILE_ACCESS_PICTURE_FOLDER = readwrite; + ENABLE_INCOMING_NETWORK_CONNECTIONS = YES; + ENABLE_OUTGOING_NETWORK_CONNECTIONS = YES; + ENABLE_PREVIEWS = YES; + ENABLE_RESOURCE_ACCESS_AUDIO_INPUT = NO; + ENABLE_RESOURCE_ACCESS_BLUETOOTH = NO; + ENABLE_RESOURCE_ACCESS_CALENDARS = NO; + ENABLE_RESOURCE_ACCESS_CAMERA = NO; + ENABLE_RESOURCE_ACCESS_CONTACTS = NO; + ENABLE_RESOURCE_ACCESS_LOCATION = NO; + ENABLE_RESOURCE_ACCESS_PRINTING = NO; + ENABLE_RESOURCE_ACCESS_USB = YES; + ENABLE_USER_SELECTED_FILES = readwrite; + GENERATE_INFOPLIST_FILE = YES; + "HEADER_SEARCH_PATHS[arch=*]" = "$(SRCROOT)/../modules/x264/"; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools"; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/../modules/x264", + ); + MACOSX_DEPLOYMENT_TARGET = 12.3; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = Meta.Encapp; + "PRODUCT_BUNDLE_IDENTIFIER[sdk=iphoneos*]" = EncappX; + "PRODUCT_BUNDLE_IDENTIFIER[sdk=macosx*]" = Encapp; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + "USER_HEADER_SEARCH_PATHS[arch=*]" = "$(SRCROOT)/../modules/x264/"; + }; + name = Release; + }; CAAB92E5292D2ABD009009B2 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -488,7 +705,7 @@ ENABLE_RESOURCE_ACCESS_USB = YES; ENABLE_USER_SELECTED_FILES = readwrite; GENERATE_INFOPLIST_FILE = YES; - "HEADER_SEARCH_PATHS[arch=*]" = "$(SRCROOT)/include"; + "HEADER_SEARCH_PATHS[arch=*]" = "$(SRCROOT)/../modules/x264/"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools"; "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; @@ -505,7 +722,7 @@ "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", - "$(PROJECT_DIR)/libs", + "$(PROJECT_DIR)/../modules/x264", ); MACOSX_DEPLOYMENT_TARGET = 12.3; MARKETING_VERSION = 1.0; @@ -519,7 +736,7 @@ SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; - "USER_HEADER_SEARCH_PATHS[arch=*]" = "$(SRCROOT)/inlcude"; + "USER_HEADER_SEARCH_PATHS[arch=*]" = "$(SRCROOT)/../modules/x264/"; }; name = Debug; }; @@ -555,7 +772,7 @@ ENABLE_RESOURCE_ACCESS_USB = YES; ENABLE_USER_SELECTED_FILES = readwrite; GENERATE_INFOPLIST_FILE = YES; - "HEADER_SEARCH_PATHS[arch=*]" = "$(SRCROOT)/include"; + "HEADER_SEARCH_PATHS[arch=*]" = "$(SRCROOT)/../modules/x264/"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools"; "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; @@ -572,7 +789,7 @@ "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", - "$(PROJECT_DIR)/libs", + "$(PROJECT_DIR)/../modules/x264", ); MACOSX_DEPLOYMENT_TARGET = 12.3; MARKETING_VERSION = 1.0; @@ -585,7 +802,7 @@ SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; - "USER_HEADER_SEARCH_PATHS[arch=*]" = "$(SRCROOT)/inlcude"; + "USER_HEADER_SEARCH_PATHS[arch=*]" = "$(SRCROOT)/../modules/x264/"; }; name = Release; }; @@ -638,6 +855,15 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + CA84B4D72ED6264F00D19FBE /* Build configuration list for PBXNativeTarget "Encapp.x264" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CA84B4D82ED6264F00D19FBE /* Debug */, + CA84B4D92ED6264F00D19FBE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; CAAB92BD292D2ABB009009B2 /* Build configuration list for PBXProject "Encapp" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -668,6 +894,14 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ + CA84B4BD2ED6264F00D19FBE /* XCRemoteSwiftPackageReference "swift-protobuf" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/apple/swift-protobuf.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 1.0.0; + }; + }; CAAB92F0292D2ADF009009B2 /* XCRemoteSwiftPackageReference "swift-protobuf" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/apple/swift-protobuf.git"; @@ -679,6 +913,16 @@ /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ + CA84B4BC2ED6264F00D19FBE /* SwiftProtobuf */ = { + isa = XCSwiftPackageProductDependency; + package = CA84B4BD2ED6264F00D19FBE /* XCRemoteSwiftPackageReference "swift-protobuf" */; + productName = SwiftProtobuf; + }; + CA84B4BE2ED6264F00D19FBE /* SwiftProtobufPluginLibrary */ = { + isa = XCSwiftPackageProductDependency; + package = CA84B4BD2ED6264F00D19FBE /* XCRemoteSwiftPackageReference "swift-protobuf" */; + productName = SwiftProtobufPluginLibrary; + }; CAAB92F1292D2ADF009009B2 /* SwiftProtobuf */ = { isa = XCSwiftPackageProductDependency; package = CAAB92F0292D2ADF009009B2 /* XCRemoteSwiftPackageReference "swift-protobuf" */; diff --git a/ios/Encapp.xcodeproj/project.xcworkspace/xcuserdata/jblome.xcuserdatad/UserInterfaceState.xcuserstate b/ios/Encapp.xcodeproj/project.xcworkspace/xcuserdata/jblome.xcuserdatad/UserInterfaceState.xcuserstate index d6188905db1566cae131dbc312d8235f8f9a541d..4dba6e30a45989984acb7e5f036d85b5c3a5382b 100644 GIT binary patch literal 70015 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�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

-~rl6Bxl3`t5g`R3B_S1|V?u^PBq3uVQz3I9OCc8_ z4Byh$31d+9En4dLk!897LQ%TtwVNs3M*s-Xgvt{vv@Q!6Km|c_J4@W<)-T z?h`#K>L!{fS}WQwIxKoubWC(Y^uFk0(O*P=75z>0h3G3Wlo%woL2Q#4ix`_2PK+QX zEoLNUBjzOLBIYJW74s7d5DO9u5epM*6dM+MFU};+D!xyAKghpuL|jK)PuxP>M%+%E zBJLvYCQcRi6ps*x#S_F6#goOe#mmL3#cRdSi8qU%7jF~4Abwr^uJ|MIC*n`VpNT&g ze<}W2{H^#q@jt{rN?;}M66_M365JBoC3Z^eme?!7BXL0Dkc7H~okXlejl?a9SCX8P zQj#P|Z^;nJa7mivDal01Ov!A?T*-XNLdjyuGm>SJ6_U-8?UENIFG+Sw_DJ?h_DMdF zf~0U#oKoCU+okqM?UULsbr1-fGEy2+$E9?o^rZ}>Or^}FETycaY@`yTI;Cc%9!kBE zUN5~-8Y{g^T2xwGT3K2{nkcO$tt+iBZ6IwVZ71z19W5Oz9WR|Ioh*G?I!!u5I!ii7 zI#0Smx=Ff4x>dSe`l9qD=}ze`=_}G#rLRdZ$e?8Q%V^5D$fU}&%G{NCDa$I$CA(dA zr|fQ7URhCDaal=OX<1oWIoYGKI;u^)*@v>f%Kj$%LiUyHnd3t#vqv5rSvvCY$fF~_%VFfW<+jW1l-n)0SB^*SfZQRu!*cv`f^w>I8gfKAEjevD zUAYr-Msj31Q#o@vOSxdVJh{tq^YZKD56kPwyU8cYSIalcx5{6T|4II;{0;fr@+0!2 z@)Pn?@-y;t@(c3MUCreLXHt6;C-sNk#+s1T-* zppd4JsgR?PuTZK`p-`nzqfnY9kfMm9f}*~nfugyhlVXTsm|~1#ykfRufnt&3 z8O2J)D#cpGbBY~`1B$bX_Z1fvA1Xdpe5&}H;!DLhitiLZD6uKwmDrUymAI95DD6_( zqqI-yfYKqQ!%CV;6s35jI;A0{H_F_~GRnrvzRF?BH04O;Xyp{;9OZoFBIPs6<;s=H zRmwHW?aCd>UCKSm*OdpAZz|tb{zZjFWxL8A6&{rXDtsz}D#9wFD#|KqD*7tMDrPE{ zDkoJORa{iuRXkL@RPt4Bs{E?*R&|{!hbouqUR5Dg6;(A=eN~dGv8tJ>wW^J(y{dz% zpXw>q9Myc)BGogh<*H{@YgEsvHmbI$wyFNCdP{Xkbwu^9>bUBZ>Wu1~>VoQ`>arS> z+FmscHAl5XwPv+3wb$x+brE%0b$N9qbrtnv>W1nhbz^l?b#rw~br*FHb#HY)^O<<|>Qm}7>htOk)gP-rRez@bT!ULfTf8wfB^wb2`cr?>AOEjxB>on^%8#OyMKNFdV5OE`M3z3D0B@&37#BIc# z#63hF;z8nJq5x5tC`Obd$`Ivd_w${_?-BP_?Gyd_>uVe zDAQ5QQS4FtQTC%;M_rBv91S`eay0zt@X^_$^G6qsE@??=scC6w5w(tK6>8OJ)oImh zH63F*#(E5U41bK{nEf%YV?M|Hjs+h3`Pjs;&vF0b1INdXPaK~*KBFU~Bd4RFqokv%lc`gxQ?65~ zQ?2ud?grgWx?6NvbWiHK>w4&V>H6wk*S)JdraPfKttX%-t0$+Ypr@>tu2-U0s#mUe zR`0bwT7R8Bq`y($Oy5!8S>IKks((fQmj00bi2mq_gD1pKNS=^BapXkOiM$g9CyGv- zIq~wuX9KjsI)n8FCI%D(M+0XAH-j#N8wR%wh79f)?l%-Q6gQMKlrc;&%rVR}EHErK zd~W!s;b$YX5ypsYWM@P%ax`)=>NFZO`q}7)(JiBCqkBd(Msr5L7(F%m)#x{)k4AqQ zeIlVqTS+V=RuY!9i?o-tpLB?Hn8Z&~Bx#e5lXOUWBny%y$%=H6Y9n1G^^&fUu9NPPMoD9&3DOd2ne>qKi1dc^ zmh?O6J$XHO19>BPGntdjMdl`NC-ai|$wFjNvN&0ie3VQglgY+pQ?diuk?cfvAqS8H z$wA~0avV9HoIp+@=aKWt1>_=fExC?-j@&@*Aa{~4le@_`$+yV2$;0GX@*H`dyg+_N z{*C;c{F40H7-ft$UT4f^j5Wp?6O8v78yJ&}O^nTqEsU*=ZH+0$PR1_A?#7jG9yOjYo;IE}zHhu}{LuKZ@l)g9 zj9(hRF@9(K!T6I2+5}^=!DN#OhY6R-Hj|wu7ADRnt|sm#o+h;>7fgOK=`iUs`NMRB z=_b=HrYxrFrYB4dO-ZIErn#n-rd6gjrsqtbnEr11-t>d%Co@GeZ8IG+Ju?Hd(`JQc z#b#&B%FUjdy*K+{_NO_@T+`gpoMdinZf0I=UT0o!-e}%p{?h!j1=?br#d-@li=!6D zERI{~StMHITI5?4T9jCfTP#{ETdY_-vD|AZWGP}PW+`duVHs+fW|?7`Wtn4{XIWrb zWLaWaYFTbsX?e-=vSqhrk7cjrb;|+EpDk}%4q1*^-nE>uoVR>nxn%jPrU%#>mKV~>-*N9 zPx749IO%-y^vUxl@0@&L!(zi}v(09w&2AfB8&Mkx8)=&(HVQUMHYzr1HX1etHpVt) zHkLNFHWV8t8yA~cn_8O-Hk~%zHa#}iZ3b;_*xa(2v6;7dYV*qGt<8IzkGAV<*V}Hg z-D11dR?61NHr_Vfw#2r@w$=8s?a#Kew)3`6ZC}{FvVCj&!S+u(lpT{D)^3-bxSgb( zw4JP-oSlN5lAVg3nw^Fn(ayro+RnxfTrIM5vU9bg+Iiaf*!kH7*wO4F?PBcW?9%M= z?TYNq*p=IzwX3$PwL53`lUW3_ptY}54MlB&$lnMue5Km@3Zf>AGW_^KX1Qe|Iq%i z{WJUL_OI;UP%soMM2c>^OTE}4oVm03T4&-<*?NO=fLj3 z>9E6Lx5His9tSZ8Ne5L2EeCA}9S1!JvV)0(xr3F%Ne5>Ke}{O7M2Ad=QioQDc86|< z9*5fwcOAwYCLLxS<{ch5EIGV#L^-lMayf2y+~v5}alhjsM?ObEM-fMH$D@wgjyjHd zjwc+A9LbI*j%JRQj@FJgj^U0)jy;ZxP8*yAolZD;I-Pbp=hWtO(W%4fveR{^A*VY| zV@{J!_nc;(=A9Oto;kg8dh7Jw>60_s8RNX(na5ev+0fa<+1%L@%G4!8)p$hqjc=)0J@IJgA4gt)}HB)gn;Nq5O{ z$#W@mDR!xMx#TkBa>r%NWzyxI%bd%C%aY5A%M+JhU71`V*A1?lT(`KgxME!it{kr1 zuG?LAx*l;gbq#YZaqV?|?6%cSz)joD$<52n*Db&;$nBI{qFahvnp>t@j$58vfm@MV zty`m8i(8x9CAZ6NSKO|;ExR+hv$}J*bGz?w-|c?T{jj@$yO6txyQzDk`#JYE_p9z> z?i23!-G8N`s7zE=DuK#L<)-eU?xpfj4^Snj(o|WhCRLlNL)E8}sK!(?ss+`R8c0p1 zrcyJg+0;C0A+>~BMy;e)Q|qW#sJ+xaYCm<5dXsvaI!wJo9ivWAr>Ji|*ga%D%snDJ zDm?~09(iu?-0vyqDdH*aDe0-`N%Yk6)b`Zz)bl*yY2|6>>EP+?N%i#d^!4=j%c&k4^d&qtoWc)s)e?8W2-d2RG!^}>0vdvSVkd#QT)dS!VPd)0Y$ zd0p`u^cwei?DdP+JFh>zK6^8HZ}8sa&FszMz0;e|TM4-HHN1~{YkTW@pYS&FHug62 zw)FP)_VW(#4)PB14)>;cpYo3Kj`fcBPV}z!?)U!1XRD8>kFigPPrlDjKI1;~J`a4B zeO7#)`@Hx0==0f^$rtk7;Je9}!*{#yF5kVr2YnCw3it~7YWq@sLwsqzk-pKs3BJj` zr+w3W&-j-4Hu|>v{^Z-~+wFVZchL8y?`_{<-}ip}e#iYteztyoegS?ozhu8Ner0}* zeyx7(en0tj`Cakr_3QH+^;__J>-Wy@55JFopZrn&O#T@E_5K_EH~a7Q-{-&I|DZpw zKfk|_zo@^szm&g>{}F#Re@%Zae{Fvwe@p+9{&xNj{?7ic{_g%B{-OS`f0Tc$f0F-c z|8)OM|7QPD{{{bt{*V2C@qh0B%Kwf3?*Z!rHU)45>kphA(Cf=BIIevZy_&3-h{jh z`4I9c6dj5Q-4MDtba&{!(EXtYLwQ5_Lj^;HLq$U+LZw1wLP?>%p}C=#Lg&ITVZ33) zFo&?nu%xilVd-I+VMSqQ!)n6n!WzPw!dk+*!>)z(hy5Hj6m}C(vu_xki zgj9r9gm#2Ugk^+vgl&XlgmZ*j1T`WoA|awAqBNpBqB5c?q9&p)qCTQAqB-Jx#6ZN2 zh+7du5hD?!5#te)5z`T~5%UoX5lRMEP)Xk{dQ6o`zqaH*pN3BG?j(Q*U zA?j1~x@ahRWAx@|?&yQja?uLWO3^COYS9|e#AvN(?P#57y=ePr$7tth*J$@>&uH&x z-)R5npy-h3u;`fR_~@kQl<1u3Gtp(y713v-tD|e9FGP1ncSm21?vMUC`d0K%^wSvD zm>n^DWA?`!jNy+FiV=wsi&2SDk2w)z5@Qx)5n~lYiE)Z?iE)qdhzX2|j>(P5k13C7 zis_B%i@6gs5i=Dt6SEMr81pdZQOxhLm{{)E?Xf#!cgOCH<%vBIdnopBEPt$EtZJ-A zEHPFqRy$TV_C%~l*7G>mM5tdnz_6Ha0dPHYqkGwjlOQYSIMq0oB^ zaq)zBj(D#4ZSlhKV(}93Qt>kJa`B4sD)DOZn(;^DkHs6tljBX}&ExIk-Qzvued7J& z1LK3^L*v8a6XR3kGvc%33*w98OXJJquf#9LKaYPC|1SQI_|FMU37CZS3G4}62?r7c z5`+>&62uZ@6XX*V6I2q^5{@UBCb%U~69N*V5^@sq63P-P5}Fg*6D}rnBwR_jn$VZf zpD>=VnD8#)kA#m2pAu1tOo^Dp^@$r3HzzVD?oHgEcrcMSkuOm&Q6y13Q8G~`@kpY4 zqDJD;MD0YKL~^2aqHQ82(J9e2(LFIZF(UC)Vsv6cVsc_?VtQg@;+@3##HGZCiH{SX zB|cAlmG~wJle8g;khDE%XVUJZy-B=D{7FJdB1vLNa!E&%%#$pW9FlyJVv^#LvXb(X z3X@8bDw577)g;v=T}tXtnn{{Vx}WqQX({Pp(xap&Nl%lWB|T4uk~b!APG(MKNya7< zk~x#PlXoQVO5T%vI9VWBI9W9LNU~b8X7bTw?PQ%~y<~%A>ty?6$7Gjek7Vy;zvO`A z{NxMC*OG4}-%1`z9!Z`|zLz|kd_Va?@-NBnQnsXQP2ou4Ns&sCNzq6-mU28rFU2T@ zoMM_{p5l_?k>ZsSo)Vc7of4OloN_uPJtZ@xJf$h6FJ&O*M#}A!k(AMtiInM-*_8V! ziz)9?KBWAa^7%CSH0JdB(;H83KE3rc>uKz1q0>62y-sJGzHoXr6`i^#RVmdXm6Ga| z>YD1F>Yo~s3a3V8ZM1J zjVoSOw4Suyw3}&DX;0IhrF}?8r8A{N>6_D;(^=E8>3h-z)5X#y z(xubo(-qTI($&%p(yh~d)BV!}(}UAP)5Ftg>8H}8(qq!&(u>m1q?e^vq@PW%Nk5m~ znBJV;n%u44!%Ph+x%R0+G%OT4-%QY)FD=aG^D=jM{D=RA} zt2paSR(aOhtm>@htgft)th-q=S&y?mW_`*=XR~DEv)Qw`vUg_h&fb^3KU+LoIh&Mi zl5L)Cm2H!4pY53KlI@=DneCGumz|iMoP9bwEju$iJ3BW!Kf5TqB)c@bD||YQ9E3F<&cRJ6|_nKi?qVBR?g-C4V&kUBRvb)dHIWT0v34*@Bva za|I0r7YeQv^cGw%7%aG1aJyi*;7-AO!BW9W!IOgD3SJhxDfqo`TcLEJdZBiqZsCbS zqeAmSt3sPXyFyA~O5v5lg~BI=zZY#TVlHAY+E*l5BweIlq*ZjhNVmwah+Je+WLD%{ z|^6kbFtiY$sNN+?P$I$cy;R9Dnc)LhhBbfM^{qU%KiML!qaDi$u5FIFm6E!HSL zT70bdWU+g(XR%MQe{oQ8Nb%|7!s43ZbH$CtEyZoc7mGWJ2a0bL-!2|09xa|Io-Up# z{#3$MB3WWy5?qp2l3#MUihZoLHV*-d+B({Bs3U1yr%IVoSx=ift9UEA~|! zsNky*tPrjctx&5lt#GJtu5hdHsPL}vt$-^MD>5r`D)K7|D@rRWD(Wj*D}JiDTCrU5 zsN$E3XB96hURV5H@khm*CoR35GrtCXu$uhgj|S6Wv( zReDthS4LJQRc2KdS5{RvRi3YGue?~ieRq7=X}ojoeMlyf9}$`&U0Podd|JA zUsu1rep5YjJ!?I-Ua(%OUbbGoUa{V=-l5*J-lyKL-oHMmKD0i*zNo&jzNNmczN`Lv z{b2pg`my@O`X}`->i=k1->{{DvtdtzY=d%xX@f^YXhTH9sfOr=xQ2v=vki?6Ee&lA z7aDFh3^j~2+-VqVm~2>Xc+~Jq!?T7L4X+wLHhgYmYQ!{hH|}WM)wsKHU*myBu|~;8 znMS!r#YW{ui$+SLQ=@C6d*i9b=*HN_xW>fBl*WR_;>Oa(+Q$0ErpC*SR~ma8uQv`h z-e??coM@bGoN0W~_`30J3Y*( z)6J%_rpcyzO^=#>X?oW5qUm+h+h$BNNAvFHea-uu4>pT8OEt?h%QY)DD>rL3A8*!e z)^E0Kwr_T9c4>BR_H7Pm4sH%>j%Ys9JlTS7VQIm)aI|o@>}uKDvcKhEi%bi-#k$3@ z#k0kyCA1~7C9Wl{CBLPprM9K9rKP2<ny`a6gy|lfe{cQVC`=1vMU*NwWb3y5X>IIDpM=$7IFt|XvU~<9ig3Se& zj-Zavj`)u3j=YY-j*^bDj>?Yej<$}A9UUEA9X%b_I{G^XJDzpoI~6(|J3TvtI!|>* zch+{E?`-XC@9gay?VRYG?wsws-?`ZNu=8=})6PFTKVL>)#$4WTdDCU)%Pg1KF5@n% zUN*bze7W}W-OF#fuw4RO+Fd4Hu3gkFuP)!NfUe-Kur69xWLHdAUROa^aaUR8Ygd2Qbl02#??$_e3rCrOsmeY5<&$Q2}&$W-*=hf%i7tj~n7uJ{5ce*dVFRL%Nub{8E zue7hc?^fT7>xAp_*KMvxUGKd9q<>TYp?;ly@BWhhbNv_kFZEyUztZ2^f4zUCf3$zR zf3p8x|6Kq5{@(}o4rmRS54a2j3emlZB zvSVcD2;YeKh}4Mei2R7s$k7q)5#5m!BSs_S5%&>zB!8rBrk=rA~BfpHi z9{GLbkI_w|9HTs=2S*Q&3XBSmij7K+s*b9U5=XU0wMTVFPmCIl`iv%zR*haAogIBL z`fBv;==;%+qo2n%j%^uZ8Dks6kFk#ljv0={j#ZB}kF}0n7`rsqGxqb?#Ms=}(%7@H z-^bpK{V|Rk-#*SeE;ueSEx>Txr~SJb65OJZC&_yllL2{MvZ`_|N0F#)rr6 zj*pK|jn9nFk3Sgyef*E{kK>;wm?of!jT2iYSSGL&gb9ubz6s+AhY7EVoQcMXzKKVZ zTPB4jSWGj{$$}~$zuvsV!41Q*2ZFrue4>r-Y}DPMJ@+Or4s_nrfbEow_h} zY3lOSm8q*!uc!W;#!PRR-aNf^nss`|^r30NX_0BMX~}8rX`^YM>A>ln>5A#9>6+>F@)7Pi(PLEGdP2an>{oek2NA4-zBi*yQ=X}rYp2xj2_iFC7-RrzJaBuqF z;tb0SenxSIICE@9XGU+vV#ayKZN_89d&X}ja3*9XZYE(Sc_wuxV>PRy zKPNgzoHL(uoQs}|n@gNanM<3?oXeTZpDUaznY%dGG1oQMGk0ySe{OK@&fL`8%-sCk zgSn--7jv)Y-p;+BUq8QTe#<<|{Py`>^Lyrb=0)bk=cVRl=8w$>&&SRe&X>%W%~#G> z&)3a2%s0=s&R>|nG(R*yGJkh|e13BN-u&GB{rLy;%kwMqkMD22FK}P$zU%$d_uKAI z-G8^hxgfEiu%Nu4wxF?~yI{OvwqUVfyjtzYw$#x&SXkEyOOwFPvQ%To_-t zw=lbKe_?rHW#P%f(}fQYHa=i|fP29Hfa}5T2m2lzcyQ>!;Rgl}q8?N}Xn4@^;P!*z z2U8CoK6wA&!{Wxpt&6OSxJAxI?!_I8yA}l()fZhCeHRlKQx~fiTNf`cURms2yuLWN zcxQ2JadPqA;@sl>#m7tNCFUiLC7vaLCE+EpCCMe3C6y($C5oRrObJ=IvZ#iN)ZaHiD>~hWWx#h;?mgTnPi_0C$UCTquBg=P}$Cf9S zrx9!$(7}mCo8|MJYRXU^83pBl@E{b^w?e$6BFZ;kj401{rgDr{{ZR*EvEng delta 35884 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�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 P`rkbEzp-!Mm#hB=R-ywb diff --git a/ios/Encapp.xcodeproj/xcuserdata/jblome.xcuserdatad/xcschemes/Copy of Encapp test.xcscheme b/ios/Encapp.xcodeproj/xcuserdata/jblome.xcuserdatad/xcschemes/Copy of Encapp test.xcscheme deleted file mode 100644 index a4da5f10..00000000 --- a/ios/Encapp.xcodeproj/xcuserdata/jblome.xcuserdatad/xcschemes/Copy of Encapp test.xcscheme +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ios/Encapp/EncappMain.swift b/ios/Encapp/EncappMain.swift index 0eb9a802..c366e1a3 100644 --- a/ios/Encapp/EncappMain.swift +++ b/ios/Encapp/EncappMain.swift @@ -43,6 +43,7 @@ class EncappMain { completion() } else if command.trimmingCharacters(in: .whitespacesAndNewlines).lowercased() == "test" { log.info("Running a test suite.") + let io = FileIO() io.writeData(filename: runningLockName, data: "Running") if CommandLine.arguments.count < 3 { @@ -55,12 +56,22 @@ class EncappMain { log.error("Non existing test file: \(testToRun)") completion() } + var overrideSource = "" + if CommandLine.arguments.count > 3 { + let c2 = CommandLine.arguments[3] as String + if c2 == "-i" { + overrideSource = (CommandLine.arguments[4] as String) + } + } log.info("Start testing: '\(testToRun)'") overview.updateTestsLog(text: "Starting test: '\(testToRun)'") - let runner = TestRunner(filename: testToRun, completion: completion) + let runner = TestRunner(filename: testToRun, input: overrideSource, completion: completion) runner.start() } else if command == "standby" { // This is only to keep the screen on while doing slow io + } else if command == "files" { + let io = FileIO() + io.listFiles() } } diff --git a/ios/Encapp/Encoder.swift b/ios/Encapp/Encoder.swift index 7580ee13..1660f298 100644 --- a/ios/Encapp/Encoder.swift +++ b/ios/Encapp/Encoder.swift @@ -286,6 +286,7 @@ class Encoder { func sleepUntilNextFrame() { + log.debug("*** Sleep until next frame *****") let now = timeStampNs() / 1000000 if lastTimeMs <= 0 { lastTimeMs = now diff --git a/ios/Encapp/TestRunner.swift b/ios/Encapp/TestRunner.swift index da73ea77..cf92fe24 100644 --- a/ios/Encapp/TestRunner.swift +++ b/ios/Encapp/TestRunner.swift @@ -9,13 +9,15 @@ import Foundation class TestRunner: Thread { var filename: String + var overrideInput: String? = nil var testsRunning = Array() var isRunning = true var completion: ()->()? - - init(filename: String, completion: @escaping ()->()) { + + init(filename: String, input: String, completion: @escaping ()->()) { self.filename = filename self.completion = completion + self.overrideInput = input } override func main() { // Thread's starting point @@ -28,20 +30,25 @@ class TestRunner: Thread { let io = FileIO() let testsuite = io.readTestDefinition(inputfile: filename) log.info("Test definition: \(testsuite)") + if testsuite.test.count == 0 { log.error("No test, probably faulty path or definition") return } - + var counter = 1 for test in testsuite.test { let descr = "** Running \(counter)/\(testsuite.test.count), test: \(test.common.id)" log.info(descr) overview.updateTestsLog(text: descr) + var test_ = test + if overrideInput!.count > 0 { + test_.input.filepath = overrideInput! + } counter += 1 //TODO: add start sync - if test.hasParallel { - for parallel in test.parallel.test { + if test_.hasParallel { + for parallel in test_.parallel.test { let task = RunSingleTest(test: parallel, completion: completion) testsRunning.append(task) @@ -49,7 +56,7 @@ class TestRunner: Thread { task.start() } } - let task = RunSingleTest(test: test, completion: completion) + let task = RunSingleTest(test: test_, completion: completion) log.info("** start blocking") testsRunning.append(task) task.start() @@ -100,7 +107,13 @@ class TestRunner: Thread { } else { //TODO: fix later, for now simple things log.info("Start encoding test: \(test.common.id)") - let encoder = Encoder(test: test) + // Check the encoder if x264 choose the x264 encoder (duh) + let encoder: Encoder + if test.configure.codec.contains("x264") { + encoder = X264Encoder(test: test) + } else { + encoder = Encoder(test: test) + } let result = try encoder.Encode() statistics = encoder.statistics log.info("\(result)") diff --git a/ios/Encapp/X264Encoder.swift b/ios/Encapp/X264Encoder.swift index 49350679..86055471 100644 --- a/ios/Encapp/X264Encoder.swift +++ b/ios/Encapp/X264Encoder.swift @@ -58,7 +58,7 @@ class X264Encoder: Encoder{ return 0 } - + // override func Encode() throws -> String { log.info("Starting x264 encoder") statistics = Statistics(description: "raw encoder", test: definition) @@ -86,6 +86,7 @@ class X264Encoder: Encoder{ inputFrameDurationUsec = calculateFrameTimingUsec(frameRate: inputFrameRate); inputFrameDurationMs = Float(frameDurationUsec) / 1000.0 scale = 1000_000 //should be 90000? + statistics.setTimescale(timeScale: scale) frameDurationUsec = calculateFrameTimingUsec(frameRate: outputFrameRate); frameDurationMs = Float(frameDurationUsec) / 1000.0 frameDurationSec = Float(frameDurationUsec) / 1000_000.0 @@ -122,8 +123,28 @@ class X264Encoder: Encoder{ params.pointee.i_fps_den = 1 // TODO: Bitrate mode is a mess, to bps - params.pointee.rc.i_bitrate = Int32(magnitudeToInt(stringValue: definition.configure.bitrate)) + params.pointee.rc.i_bitrate = Int32(magnitudeToInt(stringValue: definition.configure.bitrate)/1000) //x264 is using kbps + log.debug("Bitrate set: \(definition.configure.bitrate) to \(params.pointee.rc.i_bitrate) kbps") + let bitrate_mode = definition.configure.bitrateMode + if bitrate_mode == Configure.BitrateMode.cbr { + params.pointee.rc.i_rc_method = X264_RC_ABR + params.pointee.rc.i_vbv_max_bitrate = params.pointee.rc.i_bitrate + params.pointee.rc.i_vbv_buffer_size = params.pointee.rc.i_vbv_max_bitrate * 2 + } else if bitrate_mode == Configure.BitrateMode.cq { + // map 0-100 to 0-51 + params.pointee.rc.i_rc_method = X264_RC_CRF + params.pointee.rc.i_vbv_max_bitrate = params.pointee.rc.i_bitrate + params.pointee.rc.i_vbv_buffer_size = params.pointee.rc.i_vbv_max_bitrate * 2 + params.pointee.rc.f_rf_constant = Float(definition.configure.quality) / 100.0 * 51.0 + } else { + // vbr or crf in this case + params.pointee.rc.i_rc_method = X264_RC_CRF + params.pointee.rc.i_vbv_max_bitrate = params.pointee.rc.i_bitrate + params.pointee.rc.i_vbv_buffer_size = params.pointee.rc.i_vbv_max_bitrate * 2 + params.pointee.rc.f_rf_constant = 18 + params.pointee.rc.f_rf_constant_max = 25 + } // i frame interval is in seconds on Android and in frames here, translate params.pointee.i_frame_reference = Int32(frameRate) @@ -133,7 +154,7 @@ class X264Encoder: Encoder{ params.pointee.i_timebase_den = 1 params.pointee.i_timebase_num = 1000000 - self.x264Encoder = x264_encoder_open_157(¶ms.pointee) + self.x264Encoder = x264_encoder_open_165(¶ms.pointee) self.x264InputFrame = UnsafeMutablePointer.allocate(capacity: 1) self.x264OutputFrame = UnsafeMutablePointer.allocate(capacity: 1) x264_picture_init(x264InputFrame) @@ -229,6 +250,7 @@ class X264Encoder: Encoder{ x264OutputFrame!.deallocate() } log.info("Done, leaving encoder, encoded: \(statistics.encodedFrames.count)") + log.debug("Average bitrate: \(Float(statistics.getAverageBitrate())) kbps") return "" } diff --git a/ios/Encapp/utils/FileHandling.swift b/ios/Encapp/utils/FileHandling.swift index d69aad45..7324fc3b 100644 --- a/ios/Encapp/utils/FileHandling.swift +++ b/ios/Encapp/utils/FileHandling.swift @@ -74,10 +74,11 @@ struct FileIO { var text = "" do { text = try String(contentsOf: fileURL, encoding: .utf8) + log.info("\(text)") tests = try TestSuite.init(textFormatString: text) } catch {/* error handling here */ - log.error("Failed to read data: \(text)") + log.error("Failed to read data: \(text), missmatch in protobuf?") } } @@ -160,4 +161,22 @@ struct FileIO { } return false } + + func listFiles() { + let fileManager = FileManager.default + if let dir = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first { + do { + let directoryContents = try fileManager.contentsOfDirectory( + at: dir, + includingPropertiesForKeys: nil + , options: .skipsHiddenFiles) + + for d in directoryContents { + log.debug(d.absoluteString) + } + } catch { + log.error("Failed to read directory contents") + } + } + } } diff --git a/ios/Encapp/utils/Statistics.swift b/ios/Encapp/utils/Statistics.swift index 95257e2b..c6284bdb 100644 --- a/ios/Encapp/utils/Statistics.swift +++ b/ios/Encapp/utils/Statistics.swift @@ -24,6 +24,7 @@ class Statistics { var decodedFrames: Array var frameLock = NSLock() var props: Array + var timeScale_ = 1 as Int init(description: String, test: Test) { self.description = description @@ -112,14 +113,31 @@ class Statistics { return frameInfo } - func getAverageBitrate(frames: Array)->Int { - return 0 + // bps + func getAverageBitrate()->Int64 { + let frames = encodedFrames + if frames.count == 0 { + return 0 + } + var sum: Int64 = 0 + for info in frames { + sum += Int64(info.size!) + } + let bps0 = frames[0].pts + let bpsN = frames[frames.count-1].pts + let duration: Int64 = (bpsN - bps0)/Int64(timeScale_) + log.debug("duration: \(duration)") + return sum/duration } func getProcessingTime() -> Int64 { return (stopTime! - startTime!); } + func setTimescale(timeScale: Int) { + timeScale_ = timeScale + } + func setEncoderName(encoderName: String) { self.encoderName = encoderName } @@ -201,7 +219,7 @@ class Statistics { test: jtest, environment: environment, codec: encoderName, - meanbitrate: getAverageBitrate(frames: encodedFrames), + meanbitrate: Int(getAverageBitrate()), date: DateFormatter().string(from: date!), encapp_version: appVersion, proctime: getProcessingTime(), diff --git a/ios/ObjC/X264WrapperBridge.h b/ios/ObjC/X264WrapperBridge.h index 9909b066..ac383704 100644 --- a/ios/ObjC/X264WrapperBridge.h +++ b/ios/ObjC/X264WrapperBridge.h @@ -17,8 +17,8 @@ void x264_swift_log_callback(void *p_unused, int i_level, const char *psz, va_li void x264_set_log_callback(x264_param_t *params); // -//x264_t *x264_encoder_open( x264_param_t * ); -x264_t *x264_encoder_open_157(x264_param_t *); +x264_t *x264_encoder_open( x264_param_t * ); +//x264_t *x264_encoder_open_157(x264_param_t *); void x264_encoder_close( x264_t * ); int x264_param_default_preset( x264_param_t *, const char *preset, const char *tune ); int x264_encoder_encode( x264_t *, x264_nal_t **pp_nal, int *pi_nal, x264_picture_t *pic_in, x264_picture_t *pic_out ); From e1bf0964a4659e10e2eb33fa06ec203090cc0925 Mon Sep 17 00:00:00 2001 From: Johan Blome Date: Tue, 25 Nov 2025 13:28:00 -0800 Subject: [PATCH 3/3] encapp: two build targets for ios * encapp * encapp.x264 Quirk: if the build version of the x264 lib you are building against is different than the one I used you will have to change that in explicitly. I.e. instead of open_165 you will need to use open_xxx depenign on the x264 version. Signed-off-by: Johan Blome --- ios/Encapp.xcodeproj/project.pbxproj | 16 +- ios/Encapp/TestRunner.swift | 12 +- ios/Encapp/utils/Utils.swift | 4 + ios/ObjC/X264WrapperBridge.h | 2 + ios/debug.txt | 461 --------------------------- ios/profile.txt | 459 -------------------------- 6 files changed, 18 insertions(+), 936 deletions(-) delete mode 100644 ios/debug.txt delete mode 100644 ios/profile.txt diff --git a/ios/Encapp.xcodeproj/project.pbxproj b/ios/Encapp.xcodeproj/project.pbxproj index 3a45e90e..507c515b 100644 --- a/ios/Encapp.xcodeproj/project.pbxproj +++ b/ios/Encapp.xcodeproj/project.pbxproj @@ -8,8 +8,6 @@ /* Begin PBXBuildFile section */ CA53D6F729689DB200485E4D /* Decoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA53D6F629689DB200485E4D /* Decoder.swift */; }; - CA707E7F2E97133C00ABC79F /* X264Encoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA707E7E2E97133C00ABC79F /* X264Encoder.swift */; }; - CA707E862E9723C900ABC79F /* libx264.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CA707E842E97238C00ABC79F /* libx264.a */; }; CA84B4C02ED6264F00D19FBE /* FrameInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB9309293911E8009009B2 /* FrameInfo.swift */; }; CA84B4C12ED6264F00D19FBE /* ListProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAAB92F7292D2BD5009009B2 /* ListProperties.swift */; }; CA84B4C22ED6264F00D19FBE /* EncappMain.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAE00007293E907400727B6D /* EncappMain.swift */; }; @@ -103,7 +101,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - CA707E862E9723C900ABC79F /* libx264.a in Frameworks */, CAAB92F4292D2ADF009009B2 /* SwiftProtobufPluginLibrary in Frameworks */, CAAB92F2292D2ADF009009B2 /* SwiftProtobuf in Frameworks */, ); @@ -119,13 +116,6 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - CA707E832E97238C00ABC79F /* include */ = { - isa = PBXGroup; - children = ( - ); - path = include; - sourceTree = ""; - }; CA707E852E97238C00ABC79F /* libs */ = { isa = PBXGroup; children = ( @@ -153,7 +143,6 @@ isa = PBXGroup; children = ( CA707E892E97255A00ABC79F /* ObjC */, - CA707E832E97238C00ABC79F /* include */, CA707E852E97238C00ABC79F /* libs */, CAAB92C4292D2ABB009009B2 /* Encapp */, CAAB92C3292D2ABB009009B2 /* Products */, @@ -386,7 +375,6 @@ CAAB931029395655009009B2 /* TestRunner.swift in Sources */, CAAB9307293910D9009009B2 /* Statistics.swift in Sources */, CAAB92F6292D2B89009009B2 /* tests.pb.swift in Sources */, - CA707E7F2E97133C00ABC79F /* X264Encoder.swift in Sources */, CAAB9313293A7478009009B2 /* CodecHelper.swift in Sources */, CA53D6F729689DB200485E4D /* Decoder.swift in Sources */, CAAB930D29392CC8009009B2 /* JsonStats.swift in Sources */, @@ -443,6 +431,7 @@ ENABLE_RESOURCE_ACCESS_PRINTING = NO; ENABLE_RESOURCE_ACCESS_USB = YES; ENABLE_USER_SELECTED_FILES = readwrite; + "GCC_PREPROCESSOR_DEFINITIONS[arch=*]" = "X264=1"; GENERATE_INFOPLIST_FILE = YES; "HEADER_SEARCH_PATHS[arch=*]" = "$(SRCROOT)/../modules/x264/"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools"; @@ -472,6 +461,7 @@ PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = auto; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + "SWIFT_ACTIVE_COMPILATION_CONDITIONS[arch=*]" = X264; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; @@ -510,6 +500,7 @@ ENABLE_RESOURCE_ACCESS_PRINTING = NO; ENABLE_RESOURCE_ACCESS_USB = YES; ENABLE_USER_SELECTED_FILES = readwrite; + "GCC_PREPROCESSOR_DEFINITIONS[arch=*]" = "X264=1"; GENERATE_INFOPLIST_FILE = YES; "HEADER_SEARCH_PATHS[arch=*]" = "$(SRCROOT)/../modules/x264/"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools"; @@ -538,6 +529,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = auto; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + "SWIFT_ACTIVE_COMPILATION_CONDITIONS[arch=*]" = X264; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; diff --git a/ios/Encapp/TestRunner.swift b/ios/Encapp/TestRunner.swift index cf92fe24..e7c7d0bf 100644 --- a/ios/Encapp/TestRunner.swift +++ b/ios/Encapp/TestRunner.swift @@ -29,7 +29,6 @@ class TestRunner: Thread { log.info("Starting threaded test") let io = FileIO() let testsuite = io.readTestDefinition(inputfile: filename) - log.info("Test definition: \(testsuite)") if testsuite.test.count == 0 { log.error("No test, probably faulty path or definition") @@ -110,7 +109,12 @@ class TestRunner: Thread { // Check the encoder if x264 choose the x264 encoder (duh) let encoder: Encoder if test.configure.codec.contains("x264") { + #if X264 encoder = X264Encoder(test: test) + #else + log.error("X264 build is not included in this build") + throw EncappErrors.x264NotAvailable + #endif } else { encoder = Encoder(test: test) } @@ -119,12 +123,12 @@ class TestRunner: Thread { log.info("\(result)") log.info("Done testing: ") } - + done = true + self.completion(self) } catch { log.error("Error running single test") } - done = true - self.completion(self) + sem.signal() } diff --git a/ios/Encapp/utils/Utils.swift b/ios/Encapp/utils/Utils.swift index 46b88fac..65c439a6 100644 --- a/ios/Encapp/utils/Utils.swift +++ b/ios/Encapp/utils/Utils.swift @@ -145,3 +145,7 @@ func sleepUntilNextFrame(lastTimeMs: Int64, frameDurationMs: Double) -> Int64 { return updatedLastTime } +enum EncappErrors: Error { + case x264NotAvailable +} + diff --git a/ios/ObjC/X264WrapperBridge.h b/ios/ObjC/X264WrapperBridge.h index ac383704..ac44b012 100644 --- a/ios/ObjC/X264WrapperBridge.h +++ b/ios/ObjC/X264WrapperBridge.h @@ -8,6 +8,7 @@ #ifndef X264WrapperBridge_h #define X264WrapperBridge_h #include +#ifdef X264 #include "x264.h" @@ -27,4 +28,5 @@ void x264_encoder_intra_refresh( x264_t * ); int x264_encoder_invalidate_reference( x264_t *, int64_t pts ); int x264_encoder_delayed_frames( x264_t * ); int x264_encoder_maximum_delayed_frames( x264_t * ); +#endif #endif /* X264WrapperBridge_h */ diff --git a/ios/debug.txt b/ios/debug.txt deleted file mode 100644 index 71de9d04..00000000 --- a/ios/debug.txt +++ /dev/null @@ -1,461 +0,0 @@ -Command line invocation: - /Users/jblome/Downloads/Xcode.app/Contents/Developer/usr/bin/xcodebuild -showBuildSettings -configuration Debug - -Resolve Package Graph - - -Resolved source packages: - SwiftProtobuf: https://github.com/apple/swift-protobuf.git @ 1.31.1 - -Build settings for action build and target Encapp: - ACTION = build - ALLOW_BUILD_REQUEST_OVERRIDES = NO - ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES - ALTERNATE_GROUP = staff - ALTERNATE_MODE = u+w,go-w,a+rX - ALTERNATE_OWNER = jblome - ALTERNATIVE_DISTRIBUTION_WEB = NO - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO - ALWAYS_SEARCH_USER_PATHS = NO - ALWAYS_USE_SEPARATE_HEADERMAPS = NO - APPLICATION_EXTENSION_API_ONLY = NO - APPLY_RULES_IN_COPY_FILES = NO - APPLY_RULES_IN_COPY_HEADERS = NO - APP_SHORTCUTS_ENABLE_FLEXIBLE_MATCHING = YES - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor - AUTOMATICALLY_MERGE_DEPENDENCIES = NO - AUTOMATION_APPLE_EVENTS = NO - AVAILABLE_PLATFORMS = android appletvos appletvsimulator driverkit iphoneos iphonesimulator macosx qnx watchos watchsimulator webassembly xros xrsimulator - BUILD_ACTIVE_RESOURCES_ONLY = NO - BUILD_COMPONENTS = headers build - BUILD_DIR = /Users/jblome/code/encapp/ios/build - BUILD_LIBRARY_FOR_DISTRIBUTION = NO - BUILD_ROOT = /Users/jblome/code/encapp/ios/build - BUILD_STYLE = - BUILD_VARIANTS = normal - BUILT_PRODUCTS_DIR = /Users/jblome/code/encapp/ios/build/Debug-unknown - BUNDLE_CONTENTS_FOLDER_PATH_deep = Contents/ - BUNDLE_EXECUTABLE_FOLDER_NAME_deep = MacOS - BUNDLE_EXTENSIONS_FOLDER_PATH = Extensions - BUNDLE_FORMAT = shallow - BUNDLE_FRAMEWORKS_FOLDER_PATH = Frameworks - BUNDLE_PLUGINS_FOLDER_PATH = PlugIns - BUNDLE_PRIVATE_HEADERS_FOLDER_PATH = PrivateHeaders - BUNDLE_PUBLIC_HEADERS_FOLDER_PATH = Headers - CACHE_ROOT = /var/folders/kc/2krxxjfs7xs4cg0387d1j5q40000gn/C/com.apple.DeveloperTools/26.0.1-17A400/Xcode - CCHROOT = /var/folders/kc/2krxxjfs7xs4cg0387d1j5q40000gn/C/com.apple.DeveloperTools/26.0.1-17A400/Xcode - CHMOD = /bin/chmod - CHOWN = /usr/sbin/chown - CLANG_ANALYZER_NONNULL = YES - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE - CLANG_CACHE_FINE_GRAINED_OUTPUTS = YES - CLANG_CXX_LANGUAGE_STANDARD = gnu++20 - CLANG_ENABLE_EXPLICIT_MODULES = YES - CLANG_ENABLE_MODULES = YES - CLANG_ENABLE_OBJC_ARC = YES - CLANG_ENABLE_OBJC_WEAK = YES - CLANG_MODULES_BUILD_SESSION_FILE = /var/folders/kc/2krxxjfs7xs4cg0387d1j5q40000gn/C/org.llvm.clang/ModuleCache.noindex/Session.modulevalidation - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES - CLANG_WARN_BOOL_CONVERSION = YES - CLANG_WARN_COMMA = YES - CLANG_WARN_CONSTANT_CONVERSION = YES - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR - CLANG_WARN_DOCUMENTATION_COMMENTS = YES - CLANG_WARN_EMPTY_BODY = YES - CLANG_WARN_ENUM_CONVERSION = YES - CLANG_WARN_INFINITE_RECURSION = YES - CLANG_WARN_INT_CONVERSION = YES - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES - CLANG_WARN_STRICT_PROTOTYPES = YES - CLANG_WARN_SUSPICIOUS_MOVE = YES - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE - CLANG_WARN_UNREACHABLE_CODE = YES - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES - CLASS_FILE_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/JavaClasses - CLEAN_PRECOMPS = YES - CLONE_HEADERS = NO - CODESIGNING_FOLDER_PATH = /Users/jblome/code/encapp/ios/build/Debug-unknown/ - CODE_SIGNING_ALLOWED = NO - CODE_SIGN_ENTITLEMENTS = Encapp/Encapp.entitlements - CODE_SIGN_IDENTITY = Apple Development - CODE_SIGN_INJECT_BASE_ENTITLEMENTS = YES - CODE_SIGN_STYLE = Automatic - COLOR_DIAGNOSTICS = NO - COMBINE_HIDPI_IMAGES = NO - COMPILATION_CACHE_CAS_PATH = /var/folders/kc/2krxxjfs7xs4cg0387d1j5q40000gn/C/com.apple.DeveloperTools/26.0.1-17A400/Xcode/CompilationCache.noindex - COMPILATION_CACHE_KEEP_CAS_DIRECTORY = YES - COMPILER_INDEX_STORE_ENABLE = Default - COMPOSITE_SDK_DIRS = /Users/jblome/code/encapp/ios/build/CompositeSDKs - CONFIGURATION = Debug - CONFIGURATION_BUILD_DIR = /Users/jblome/code/encapp/ios/build/Debug-unknown - CONFIGURATION_TEMP_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown - COPYING_PRESERVES_HFS_DATA = NO - COPY_HEADERS_RUN_UNIFDEF = NO - COPY_PHASE_STRIP = NO - CP = /bin/cp - CREATE_INFOPLIST_SECTION_IN_BINARY = NO - CURRENT_ARCH = undefined_arch - CURRENT_PROJECT_VERSION = 1 - CURRENT_VARIANT = normal - DEAD_CODE_STRIPPING = YES - DEBUGGING_SYMBOLS = YES - DEBUG_INFORMATION_FORMAT = dwarf - DEBUG_INFORMATION_VERSION = compiler-default - DEFAULT_DEXT_INSTALL_PATH = /System/Library/DriverExtensions - DEFAULT_KEXT_INSTALL_PATH = /System/Library/Extensions - DEFINES_MODULE = NO - DEPLOYMENT_LOCATION = NO - DEPLOYMENT_POSTPROCESSING = NO - DERIVED_FILES_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/DerivedSources - DERIVED_FILE_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/DerivedSources - DERIVED_SOURCES_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/DerivedSources - DEVELOPER_APPLICATIONS_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Applications - DEVELOPER_BIN_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/usr/bin - DEVELOPER_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer - DEVELOPER_FRAMEWORKS_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Library/Frameworks - DEVELOPER_FRAMEWORKS_DIR_QUOTED = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Library/Frameworks - DEVELOPER_LIBRARY_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Library - DEVELOPER_SDK_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs - DEVELOPER_TOOLS_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Tools - DEVELOPER_USR_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/usr - DEVELOPMENT_ASSET_PATHS = "Encapp/Preview Content" - DEVELOPMENT_LANGUAGE = en - DEVELOPMENT_TEAM = PWNNZ9S7WJ - DIAGNOSE_MISSING_TARGET_DEPENDENCIES = YES - DIFF = /usr/bin/diff - DONT_GENERATE_INFOPLIST_FILE = NO - DRIVERKIT_DEPLOYMENT_TARGET = 25.0 - DSTROOT = /tmp/Encapp.dst - DT_TOOLCHAIN_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain - DWARF_DSYM_FILE_NAME = .dSYM - DWARF_DSYM_FILE_SHOULD_ACCOMPANY_PRODUCT = NO - DWARF_DSYM_FOLDER_PATH = /Users/jblome/code/encapp/ios/build/Debug-unknown - EAGER_COMPILATION_ALLOW_SCRIPTS = NO - EAGER_LINKING = NO - EFFECTIVE_PLATFORM_NAME = -unknown - EMBEDDED_CONTENT_CONTAINS_SWIFT = NO - EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO - ENABLE_APP_SANDBOX = YES - ENABLE_CODE_COVERAGE = YES - ENABLE_CPLUSPLUS_BOUNDS_SAFE_BUFFERS = NO - ENABLE_C_BOUNDS_SAFETY = NO - ENABLE_DEFAULT_HEADER_SEARCH_PATHS = YES - ENABLE_DEFAULT_SEARCH_PATHS = YES - ENABLE_ENHANCED_SECURITY = NO - ENABLE_FILE_ACCESS_DOWNLOADS_FOLDER = readwrite - ENABLE_FILE_ACCESS_MOVIES_FOLDER = readwrite - ENABLE_FILE_ACCESS_MUSIC_FOLDER = readwrite - ENABLE_FILE_ACCESS_PICTURE_FOLDER = readwrite - ENABLE_HARDENED_RUNTIME = YES - ENABLE_HEADER_DEPENDENCIES = YES - ENABLE_INCOMING_NETWORK_CONNECTIONS = YES - ENABLE_ON_DEMAND_RESOURCES = NO - ENABLE_OUTGOING_NETWORK_CONNECTIONS = YES - ENABLE_POINTER_AUTHENTICATION = NO - ENABLE_PREVIEWS = YES - ENABLE_RESOURCE_ACCESS_AUDIO_INPUT = NO - ENABLE_RESOURCE_ACCESS_BLUETOOTH = NO - ENABLE_RESOURCE_ACCESS_CALENDARS = NO - ENABLE_RESOURCE_ACCESS_CAMERA = NO - ENABLE_RESOURCE_ACCESS_CONTACTS = NO - ENABLE_RESOURCE_ACCESS_LOCATION = NO - ENABLE_RESOURCE_ACCESS_PHOTO_LIBRARY = NO - ENABLE_RESOURCE_ACCESS_PRINTING = NO - ENABLE_RESOURCE_ACCESS_USB = YES - ENABLE_SDK_IMPORTS = NO - ENABLE_SECURITY_COMPILER_WARNINGS = NO - ENABLE_STRICT_OBJC_MSGSEND = YES - ENABLE_TESTABILITY = YES - ENABLE_TESTING_SEARCH_PATHS = NO - ENABLE_THREAD_SANITIZER = NO - ENABLE_USER_SCRIPT_SANDBOXING = NO - ENABLE_USER_SELECTED_FILES = readwrite - ENFORCE_VALID_ARCHS = YES - EXCLUDED_INSTALLSRC_SUBDIRECTORY_PATTERNS = .DS_Store .svn .git .hg CVS - EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES = *.nib *.lproj *.framework *.gch *.xcode* *.xcassets *.icon (*) .DS_Store CVS .svn .git .hg *.pbproj *.pbxproj - FILE_LIST = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/Objects/LinkFileList - FIXED_FILES_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/FixedFiles - FRAMEWORK_SEARCH_PATHS = /Users/jblome/code/encapp/ios/build/Debug-unknown - FRAMEWORK_VERSION = A - FUSE_BUILD_PHASES = YES - FUSE_BUILD_SCRIPT_PHASES = NO - GCC3_VERSION = 3.3 - GCC_C_LANGUAGE_STANDARD = gnu11 - GCC_DYNAMIC_NO_PIC = NO - GCC_NO_COMMON_BLOCKS = YES - GCC_OPTIMIZATION_LEVEL = 0 - GCC_PFE_FILE_C_DIALECTS = c objective-c c++ objective-c++ - GCC_PREPROCESSOR_DEFINITIONS = DEBUG=1 - GCC_TREAT_WARNINGS_AS_ERRORS = NO - GCC_VERSION = com.apple.compilers.llvm.clang.1_0 - GCC_VERSION_IDENTIFIER = com_apple_compilers_llvm_clang_1_0 - GCC_WARN_64_TO_32_BIT_CONVERSION = YES - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR - GCC_WARN_UNDECLARED_SELECTOR = YES - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE - GCC_WARN_UNUSED_FUNCTION = YES - GCC_WARN_UNUSED_VARIABLE = YES - GENERATED_MODULEMAP_DIR = /Users/jblome/code/encapp/ios/build/GeneratedModuleMaps-unknown - GENERATE_INFOPLIST_FILE = YES - GENERATE_INTERMEDIATE_TEXT_BASED_STUBS = YES - GENERATE_PKGINFO_FILE = NO - GENERATE_PRELINK_OBJECT_FILE = NO - GENERATE_PROFILING_CODE = NO - GENERATE_TEXT_BASED_STUBS = NO - GID = 20 - GROUP = staff - HEADERMAP_INCLUDES_FLAT_ENTRIES_FOR_TARGET_BEING_BUILT = YES - HEADERMAP_INCLUDES_FRAMEWORK_ENTRIES_FOR_ALL_PRODUCT_TYPES = YES - HEADERMAP_INCLUDES_FRAMEWORK_ENTRIES_FOR_TARGETS_NOT_BEING_BUILT = YES - HEADERMAP_INCLUDES_NONPUBLIC_NONPRIVATE_HEADERS = YES - HEADERMAP_INCLUDES_PROJECT_HEADERS = YES - HEADERMAP_USES_FRAMEWORK_PREFIX_ENTRIES = YES - HEADERMAP_USES_VFS = NO - HEADER_SEARCH_PATHS = /Users/jblome/code/encapp/ios/build/Debug-unknown/include /Users/jblome/code/encapp/ios/include - HOME = /Users/jblome - HOST_ARCH = arm64 - HOST_PLATFORM = macosx - ICONV = /usr/bin/iconv - IMPLICIT_DEPENDENCY_DOMAIN = default - INFOPLIST_ENABLE_CFBUNDLEICONS_MERGE = YES - INFOPLIST_EXPAND_BUILD_SETTINGS = YES - INFOPLIST_KEY_LSApplicationCategoryType = public.app-category.developer-tools - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight - INFOPLIST_OUTPUT_FORMAT = same-as-input - INFOPLIST_PREPROCESS = NO - INLINE_PRIVATE_FRAMEWORKS = NO - INSTALLAPI_IGNORE_SKIP_INSTALL = YES - INSTALLHDRS_COPY_PHASE = NO - INSTALLHDRS_SCRIPT_PHASE = NO - INSTALL_DIR = /tmp/Encapp.dst - INSTALL_GROUP = staff - INSTALL_MODE_FLAG = u+w,go-w,a+rX - INSTALL_OWNER = jblome - INSTALL_ROOT = /tmp/Encapp.dst - IPHONEOS_DEPLOYMENT_TARGET = 15.0 - IS_UNOPTIMIZED_BUILD = YES - JAVAC_DEFAULT_FLAGS = -J-Xms64m -J-XX:NewSize=4M -J-Dfile.encoding=UTF8 - JAVA_APP_STUB = /System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub - JAVA_ARCHIVE_CLASSES = YES - JAVA_ARCHIVE_TYPE = JAR - JAVA_COMPILER = /usr/bin/javac - JAVA_FRAMEWORK_RESOURCES_DIRS = Resources - JAVA_JAR_FLAGS = cv - JAVA_SOURCE_SUBDIR = . - JAVA_USE_DEPENDENCIES = YES - JAVA_ZIP_FLAGS = -urg - JIKES_DEFAULT_FLAGS = +E +OLDCSO - KEEP_PRIVATE_EXTERNS = NO - LD_DEPENDENCY_INFO_FILE = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/Objects-normal/undefined_arch/Encapp_dependency_info.dat - LD_EXPORT_SYMBOLS = YES - LD_GENERATE_MAP_FILE = NO - LD_MAP_FILE_PATH = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/Encapp-LinkMap-normal-undefined_arch.txt - LD_NO_PIE = NO - LD_QUOTE_LINKER_ARGUMENTS_FOR_COMPILER_DRIVER = YES - LD_RUNPATH_SEARCH_PATHS = @executable_path/Frameworks - LD_SHARED_CACHE_ELIGIBLE = Automatic - LD_WARN_DUPLICATE_LIBRARIES = NO - LD_WARN_UNUSED_DYLIBS = NO - LEGACY_DEVELOPER_DIR = /Users/jblome/Downloads/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer - LEX = lex - LIBRARY_DEXT_INSTALL_PATH = /Library/DriverExtensions - LIBRARY_FLAG_NOSPACE = YES - LIBRARY_KEXT_INSTALL_PATH = /Library/Extensions - LIBRARY_SEARCH_PATHS = /Users/jblome/code/encapp/ios/build/Debug-unknown /Users/jblome/code/encapp/ios/libs - LINKER_DISPLAYS_MANGLED_NAMES = NO - LINK_WITH_STANDARD_LIBRARIES = YES - LLVM_TARGET_TRIPLE_VENDOR = apple - LOCALIZATION_EXPORT_SUPPORTED = YES - LOCALIZATION_PREFERS_STRING_CATALOGS = NO - LOCALIZED_STRING_MACRO_NAMES = NSLocalizedString CFCopyLocalizedString - LOCALIZED_STRING_SWIFTUI_SUPPORT = YES - LOCAL_ADMIN_APPS_DIR = /Applications/Utilities - LOCAL_APPS_DIR = /Applications - LOCAL_DEVELOPER_DIR = /Library/Developer - LOCAL_LIBRARY_DIR = /Library - LOCROOT = /Users/jblome/code/encapp/ios - LOCSYMROOT = /Users/jblome/code/encapp/ios - MACOSX_DEPLOYMENT_TARGET = 12.3 - MAC_OS_X_PRODUCT_BUILD_VERSION = 24G222 - MAC_OS_X_VERSION_ACTUAL = 150700 - MAC_OS_X_VERSION_MAJOR = 150000 - MAC_OS_X_VERSION_MINOR = 150700 - MAKE_MERGEABLE = NO - MARKETING_VERSION = 1.0 - MERGEABLE_LIBRARY = NO - MERGED_BINARY_TYPE = none - MERGE_LINKED_LIBRARIES = NO - METAL_LIBRARY_FILE_BASE = default - METAL_LIBRARY_OUTPUT_DIR = /Users/jblome/code/encapp/ios/build/Debug-unknown/ - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE - MTL_FAST_MATH = YES - NATIVE_ARCH = arm64 - NATIVE_ARCH_32_BIT = arm - NATIVE_ARCH_64_BIT = arm64 - NATIVE_ARCH_ACTUAL = arm64 - NO_COMMON = YES - OBJECT_FILE_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/Objects - OBJECT_FILE_DIR_normal = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/Objects-normal - OBJROOT = /Users/jblome/code/encapp/ios/build - ONLY_ACTIVE_ARCH = YES - OS = MACOS - OSAC = /usr/bin/osacompile - PASCAL_STRINGS = YES - PATH = /Users/jblome/Downloads/Xcode.app/Contents/SharedFrameworks/SwiftBuild.framework/Versions/A/PlugIns/SWBBuildService.bundle/Contents/PlugIns/SWBUniversalPlatformPlugin.bundle/Contents/Frameworks/SWBUniversalPlatform.framework/Resources:/Users/jblome/Downloads/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:/Users/jblome/Downloads/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/local/bin:/Users/jblome/Downloads/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/libexec:/Users/jblome/Downloads/Xcode.app/Contents/Developer/usr/bin:/Users/jblome/Downloads/Xcode.app/Contents/Developer/usr/local/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/opt/facebook/bin:/opt/facebook/bin/biggrep:/opt/facebook/nix/bin:/opt/facebook/ops/scripts/chef:/opt/facebook/hg/bin:/usr/local/munki:/Applications/kitty.app/Contents/MacOS - PATH_PREFIXES_EXCLUDED_FROM_HEADER_DEPENDENCIES = /usr/include /usr/local/include /System/Library/Frameworks /System/Library/PrivateFrameworks /Users/jblome/Downloads/Xcode.app/Contents/Developer/Headers /Users/jblome/Downloads/Xcode.app/Contents/Developer/SDKs /Users/jblome/Downloads/Xcode.app/Contents/Developer/Platforms - PER_ARCH_MODULE_FILE_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/Objects-normal/undefined_arch/Modules - PER_ARCH_OBJECT_FILE_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/Objects-normal/undefined_arch - PER_VARIANT_OBJECT_FILE_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/Objects-normal - PKGINFO_FILE_PATH = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/PkgInfo - PLIST_FILE_OUTPUT_FORMAT = same-as-input - PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = YES - PRECOMP_DESTINATION_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/PrefixHeaders - PROCESSED_INFOPLIST_PATH = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/Objects-normal/undefined_arch/Processed-Info.plist - PRODUCT_BUNDLE_IDENTIFIER = Meta.Encapp - PRODUCT_MODULE_NAME = Encapp - PRODUCT_NAME = Encapp - PRODUCT_SETTINGS_PATH = - PRODUCT_TYPE = com.apple.product-type.application - PROFILING_CODE = NO - PROJECT = Encapp - PROJECT_DERIVED_FILE_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/DerivedSources - PROJECT_DIR = /Users/jblome/code/encapp/ios - PROJECT_FILE_PATH = /Users/jblome/code/encapp/ios/Encapp.xcodeproj - PROJECT_GUID = 3b197d7739ee5ce795a0ebec593f75b5 - PROJECT_NAME = Encapp - PROJECT_TEMP_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build - PROJECT_TEMP_ROOT = /Users/jblome/code/encapp/ios/build - RECURSIVE_SEARCH_PATHS_FOLLOW_SYMLINKS = YES - REMOVE_CVS_FROM_RESOURCES = YES - REMOVE_GIT_FROM_RESOURCES = YES - REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES = YES - REMOVE_HG_FROM_RESOURCES = YES - REMOVE_STATIC_EXECUTABLES_FROM_EMBEDDED_BUNDLES = YES - REMOVE_SVN_FROM_RESOURCES = YES - RESCHEDULE_INDEPENDENT_HEADERS_PHASES = YES - REZ_COLLECTOR_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/ResourceManagerResources - REZ_OBJECTS_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/ResourceManagerResources/Objects - REZ_SEARCH_PATHS = /Users/jblome/code/encapp/ios/build/Debug-unknown - RUNTIME_EXCEPTION_ALLOW_DYLD_ENVIRONMENT_VARIABLES = NO - RUNTIME_EXCEPTION_ALLOW_JIT = NO - RUNTIME_EXCEPTION_ALLOW_UNSIGNED_EXECUTABLE_MEMORY = NO - RUNTIME_EXCEPTION_DEBUGGING_TOOL = NO - RUNTIME_EXCEPTION_DISABLE_EXECUTABLE_PAGE_PROTECTION = NO - RUNTIME_EXCEPTION_DISABLE_LIBRARY_VALIDATION = NO - SCAN_ALL_SOURCE_FILES_FOR_INCLUDES = NO - SDKROOT = auto - SDK_STAT_CACHE_ENABLE = YES - SED = /usr/bin/sed - SEPARATE_STRIP = NO - SEPARATE_SYMBOL_EDIT = NO - SET_DIR_MODE_OWNER_GROUP = YES - SET_FILE_MODE_OWNER_GROUP = NO - SHALLOW_BUNDLE = NO - SHARED_DERIVED_FILE_DIR = /Users/jblome/code/encapp/ios/build/Debug-unknown/DerivedSources - SHARED_PRECOMPS_DIR = /Users/jblome/code/encapp/ios/build/SharedPrecompiledHeaders - SKIP_INSTALL = YES - SOURCE_ROOT = /Users/jblome/code/encapp/ios - SRCROOT = /Users/jblome/code/encapp/ios - STRINGSDATA_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build/Objects-normal/undefined_arch - STRINGSDATA_ROOT = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build - STRINGS_FILE_INFOPLIST_RENAME = YES - STRINGS_FILE_OUTPUT_ENCODING = UTF-16 - STRING_CATALOG_GENERATE_SYMBOLS = NO - STRIP_BITCODE_FROM_COPIED_FILES = NO - STRIP_INSTALLED_PRODUCT = NO - STRIP_STYLE = all - STRIP_SWIFT_SYMBOLS = YES - SUPPORTED_PLATFORMS = iphoneos iphonesimulator macosx - SUPPORTS_MACCATALYST = YES - SUPPORTS_TEXT_BASED_API = NO - SUPPRESS_WARNINGS = NO - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG - SWIFT_EMIT_CONST_VALUE_PROTOCOLS = AppIntent EntityQuery AppEntity TransientEntity AppEnum AppShortcutProviding AppShortcutsProvider AnyResolverProviding AppIntentsPackage DynamicOptionsProvider _IntentValueRepresentable _AssistantIntentsProvider _GenerativeFunctionExtractable IntentValueQuery Resolver AppExtension ExtensionPointDefining - SWIFT_EMIT_LOC_STRINGS = YES - SWIFT_OBJC_BRIDGING_HEADER = ObjC/X264WrapperBridge.h - SWIFT_OPTIMIZATION_LEVEL = -Onone - SWIFT_VERSION = 5.0 - SYMROOT = /Users/jblome/code/encapp/ios/build - SYSTEM_ADMIN_APPS_DIR = /Applications/Utilities - SYSTEM_APPS_DIR = /Applications - SYSTEM_CORE_SERVICES_DIR = /System/Library/CoreServices - SYSTEM_DEMOS_DIR = /Applications/Extras - SYSTEM_DEVELOPER_APPS_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Applications - SYSTEM_DEVELOPER_BIN_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/usr/bin - SYSTEM_DEVELOPER_DEMOS_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Applications/Utilities/Built Examples - SYSTEM_DEVELOPER_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer - SYSTEM_DEVELOPER_DOC_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/ADC Reference Library - SYSTEM_DEVELOPER_GRAPHICS_TOOLS_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Applications/Graphics Tools - SYSTEM_DEVELOPER_JAVA_TOOLS_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Applications/Java Tools - SYSTEM_DEVELOPER_PERFORMANCE_TOOLS_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Applications/Performance Tools - SYSTEM_DEVELOPER_RELEASENOTES_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes - SYSTEM_DEVELOPER_TOOLS = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Tools - SYSTEM_DEVELOPER_TOOLS_DOC_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/ADC Reference Library/documentation/DeveloperTools - SYSTEM_DEVELOPER_TOOLS_RELEASENOTES_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes/DeveloperTools - SYSTEM_DEVELOPER_USR_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/usr - SYSTEM_DEVELOPER_UTILITIES_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Applications/Utilities - SYSTEM_DEXT_INSTALL_PATH = /System/Library/DriverExtensions - SYSTEM_DOCUMENTATION_DIR = /Library/Documentation - SYSTEM_KEXT_INSTALL_PATH = /System/Library/Extensions - SYSTEM_LIBRARY_DIR = /System/Library - TAPI_DEMANGLE = YES - TAPI_ENABLE_PROJECT_HEADERS = NO - TAPI_LANGUAGE = objective-c - TAPI_LANGUAGE_STANDARD = compiler-default - TAPI_VERIFY_MODE = ErrorsOnly - TARGETED_DEVICE_FAMILY = 1,2 - TARGETNAME = Encapp - TARGET_BUILD_DIR = /Users/jblome/code/encapp/ios/build/Debug-unknown - TARGET_NAME = Encapp - TARGET_TEMP_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build - TEMP_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build - TEMP_FILES_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build - TEMP_FILE_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Debug-unknown/Encapp.build - TEMP_ROOT = /Users/jblome/code/encapp/ios/build - TEMP_SANDBOX_DIR = /Users/jblome/code/encapp/ios/build/TemporaryTaskSandboxes - TOOLCHAINS = com.apple.dt.toolchain.XcodeDefault - TOOLCHAIN_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain - TREAT_MISSING_BASELINES_AS_TEST_FAILURES = NO - TREAT_MISSING_SCRIPT_PHASE_OUTPUTS_AS_ERRORS = NO - TVOS_DEPLOYMENT_TARGET = 26.0 - UID = 501 - UNINSTALLED_PRODUCTS_DIR = /Users/jblome/code/encapp/ios/build/UninstalledProducts - UNSTRIPPED_PRODUCT = NO - USER = jblome - USER_APPS_DIR = /Users/jblome/Applications - USER_LIBRARY_DIR = /Users/jblome/Library - USE_DYNAMIC_NO_PIC = YES - USE_HEADERMAP = YES - USE_HEADER_SYMLINKS = NO - VALIDATE_DEVELOPMENT_ASSET_PATHS = YES_ERROR - VALIDATE_PRODUCT = NO - VERBOSE_PBXCP = NO - VERSION_INFO_BUILDER = jblome - VERSION_INFO_FILE = Encapp_vers.c - VERSION_INFO_STRING = "@(#)PROGRAM:Encapp PROJECT:Encapp-1" - WATCHOS_DEPLOYMENT_TARGET = 26.0 - WORKSPACE_DIR = /Users/jblome/code/encapp/ios/Encapp.xcodeproj - WRAP_ASSET_PACKS_IN_SEPARATE_DIRECTORIES = NO - XCODE_APP_SUPPORT_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Library/Xcode - XCODE_PRODUCT_BUILD_VERSION = 17A400 - XCODE_VERSION_ACTUAL = 2601 - XCODE_VERSION_MAJOR = 2600 - XCODE_VERSION_MINOR = 2600 - XPCSERVICES_FOLDER_PATH = /XPCServices - XROS_DEPLOYMENT_TARGET = 26.0 - YACC = yacc - _DISCOVER_COMMAND_LINE_LINKER_INPUTS = YES - _DISCOVER_COMMAND_LINE_LINKER_INPUTS_INCLUDE_WL = YES - _LD_MULTIARCH = YES - __DIAGNOSE_DEPRECATED_ARCHS = YES - arch = undefined_arch - variant = normal - diff --git a/ios/profile.txt b/ios/profile.txt deleted file mode 100644 index 7e5b8720..00000000 --- a/ios/profile.txt +++ /dev/null @@ -1,459 +0,0 @@ -Command line invocation: - /Users/jblome/Downloads/Xcode.app/Contents/Developer/usr/bin/xcodebuild -showBuildSettings -configuration Profile - -Resolve Package Graph - - -Resolved source packages: - SwiftProtobuf: https://github.com/apple/swift-protobuf.git @ 1.31.1 - -Build settings for action build and target Encapp: - ACTION = build - ALLOW_BUILD_REQUEST_OVERRIDES = NO - ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES - ALTERNATE_GROUP = staff - ALTERNATE_MODE = u+w,go-w,a+rX - ALTERNATE_OWNER = jblome - ALTERNATIVE_DISTRIBUTION_WEB = NO - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO - ALWAYS_SEARCH_USER_PATHS = NO - ALWAYS_USE_SEPARATE_HEADERMAPS = NO - APPLICATION_EXTENSION_API_ONLY = NO - APPLY_RULES_IN_COPY_FILES = NO - APPLY_RULES_IN_COPY_HEADERS = NO - APP_SHORTCUTS_ENABLE_FLEXIBLE_MATCHING = YES - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor - AUTOMATICALLY_MERGE_DEPENDENCIES = NO - AUTOMATION_APPLE_EVENTS = NO - AVAILABLE_PLATFORMS = android appletvos appletvsimulator driverkit iphoneos iphonesimulator macosx qnx watchos watchsimulator webassembly xros xrsimulator - BUILD_ACTIVE_RESOURCES_ONLY = NO - BUILD_COMPONENTS = headers build - BUILD_DIR = /Users/jblome/code/encapp/ios/build - BUILD_LIBRARY_FOR_DISTRIBUTION = NO - BUILD_ROOT = /Users/jblome/code/encapp/ios/build - BUILD_STYLE = - BUILD_VARIANTS = normal - BUILT_PRODUCTS_DIR = /Users/jblome/code/encapp/ios/build/Release-unknown - BUNDLE_CONTENTS_FOLDER_PATH_deep = Contents/ - BUNDLE_EXECUTABLE_FOLDER_NAME_deep = MacOS - BUNDLE_EXTENSIONS_FOLDER_PATH = Extensions - BUNDLE_FORMAT = shallow - BUNDLE_FRAMEWORKS_FOLDER_PATH = Frameworks - BUNDLE_PLUGINS_FOLDER_PATH = PlugIns - BUNDLE_PRIVATE_HEADERS_FOLDER_PATH = PrivateHeaders - BUNDLE_PUBLIC_HEADERS_FOLDER_PATH = Headers - CACHE_ROOT = /var/folders/kc/2krxxjfs7xs4cg0387d1j5q40000gn/C/com.apple.DeveloperTools/26.0.1-17A400/Xcode - CCHROOT = /var/folders/kc/2krxxjfs7xs4cg0387d1j5q40000gn/C/com.apple.DeveloperTools/26.0.1-17A400/Xcode - CHMOD = /bin/chmod - CHOWN = /usr/sbin/chown - CLANG_ANALYZER_NONNULL = YES - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE - CLANG_CACHE_FINE_GRAINED_OUTPUTS = YES - CLANG_CXX_LANGUAGE_STANDARD = gnu++20 - CLANG_ENABLE_EXPLICIT_MODULES = YES - CLANG_ENABLE_MODULES = YES - CLANG_ENABLE_OBJC_ARC = YES - CLANG_ENABLE_OBJC_WEAK = YES - CLANG_MODULES_BUILD_SESSION_FILE = /var/folders/kc/2krxxjfs7xs4cg0387d1j5q40000gn/C/org.llvm.clang/ModuleCache.noindex/Session.modulevalidation - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES - CLANG_WARN_BOOL_CONVERSION = YES - CLANG_WARN_COMMA = YES - CLANG_WARN_CONSTANT_CONVERSION = YES - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR - CLANG_WARN_DOCUMENTATION_COMMENTS = YES - CLANG_WARN_EMPTY_BODY = YES - CLANG_WARN_ENUM_CONVERSION = YES - CLANG_WARN_INFINITE_RECURSION = YES - CLANG_WARN_INT_CONVERSION = YES - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES - CLANG_WARN_STRICT_PROTOTYPES = YES - CLANG_WARN_SUSPICIOUS_MOVE = YES - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE - CLANG_WARN_UNREACHABLE_CODE = YES - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES - CLASS_FILE_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/JavaClasses - CLEAN_PRECOMPS = YES - CLONE_HEADERS = NO - CODESIGNING_FOLDER_PATH = /Users/jblome/code/encapp/ios/build/Release-unknown/ - CODE_SIGNING_ALLOWED = NO - CODE_SIGN_ENTITLEMENTS = Encapp/Encapp.entitlements - CODE_SIGN_IDENTITY = - - CODE_SIGN_INJECT_BASE_ENTITLEMENTS = YES - CODE_SIGN_STYLE = Automatic - COLOR_DIAGNOSTICS = NO - COMBINE_HIDPI_IMAGES = NO - COMPILATION_CACHE_CAS_PATH = /var/folders/kc/2krxxjfs7xs4cg0387d1j5q40000gn/C/com.apple.DeveloperTools/26.0.1-17A400/Xcode/CompilationCache.noindex - COMPILATION_CACHE_KEEP_CAS_DIRECTORY = YES - COMPILER_INDEX_STORE_ENABLE = Default - COMPOSITE_SDK_DIRS = /Users/jblome/code/encapp/ios/build/CompositeSDKs - CONFIGURATION = Release - CONFIGURATION_BUILD_DIR = /Users/jblome/code/encapp/ios/build/Release-unknown - CONFIGURATION_TEMP_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown - COPYING_PRESERVES_HFS_DATA = NO - COPY_HEADERS_RUN_UNIFDEF = NO - COPY_PHASE_STRIP = NO - CP = /bin/cp - CREATE_INFOPLIST_SECTION_IN_BINARY = NO - CURRENT_ARCH = undefined_arch - CURRENT_PROJECT_VERSION = 1 - CURRENT_VARIANT = normal - DEAD_CODE_STRIPPING = YES - DEBUGGING_SYMBOLS = YES - DEBUG_INFORMATION_FORMAT = dwarf-with-dsym - DEBUG_INFORMATION_VERSION = compiler-default - DEFAULT_DEXT_INSTALL_PATH = /System/Library/DriverExtensions - DEFAULT_KEXT_INSTALL_PATH = /System/Library/Extensions - DEFINES_MODULE = NO - DEPLOYMENT_LOCATION = NO - DEPLOYMENT_POSTPROCESSING = NO - DERIVED_FILES_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/DerivedSources - DERIVED_FILE_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/DerivedSources - DERIVED_SOURCES_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/DerivedSources - DEVELOPER_APPLICATIONS_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Applications - DEVELOPER_BIN_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/usr/bin - DEVELOPER_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer - DEVELOPER_FRAMEWORKS_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Library/Frameworks - DEVELOPER_FRAMEWORKS_DIR_QUOTED = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Library/Frameworks - DEVELOPER_LIBRARY_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Library - DEVELOPER_SDK_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs - DEVELOPER_TOOLS_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Tools - DEVELOPER_USR_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/usr - DEVELOPMENT_ASSET_PATHS = "Encapp/Preview Content" - DEVELOPMENT_LANGUAGE = en - DEVELOPMENT_TEAM = PWNNZ9S7WJ - DIAGNOSE_MISSING_TARGET_DEPENDENCIES = YES - DIFF = /usr/bin/diff - DONT_GENERATE_INFOPLIST_FILE = NO - DRIVERKIT_DEPLOYMENT_TARGET = 25.0 - DSTROOT = /tmp/Encapp.dst - DT_TOOLCHAIN_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain - DWARF_DSYM_FILE_NAME = .dSYM - DWARF_DSYM_FILE_SHOULD_ACCOMPANY_PRODUCT = NO - DWARF_DSYM_FOLDER_PATH = /Users/jblome/code/encapp/ios/build/Release-unknown - EAGER_COMPILATION_ALLOW_SCRIPTS = NO - EAGER_LINKING = NO - EFFECTIVE_PLATFORM_NAME = -unknown - EMBEDDED_CONTENT_CONTAINS_SWIFT = NO - EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO - ENABLE_APP_SANDBOX = YES - ENABLE_CODE_COVERAGE = YES - ENABLE_CPLUSPLUS_BOUNDS_SAFE_BUFFERS = NO - ENABLE_C_BOUNDS_SAFETY = NO - ENABLE_DEBUG_DYLIB = NO - ENABLE_DEFAULT_HEADER_SEARCH_PATHS = YES - ENABLE_DEFAULT_SEARCH_PATHS = YES - ENABLE_ENHANCED_SECURITY = NO - ENABLE_FILE_ACCESS_DOWNLOADS_FOLDER = readwrite - ENABLE_FILE_ACCESS_MOVIES_FOLDER = readwrite - ENABLE_FILE_ACCESS_MUSIC_FOLDER = readwrite - ENABLE_FILE_ACCESS_PICTURE_FOLDER = readwrite - ENABLE_HARDENED_RUNTIME = NO - ENABLE_HEADER_DEPENDENCIES = YES - ENABLE_INCOMING_NETWORK_CONNECTIONS = YES - ENABLE_NS_ASSERTIONS = NO - ENABLE_ON_DEMAND_RESOURCES = NO - ENABLE_OUTGOING_NETWORK_CONNECTIONS = YES - ENABLE_POINTER_AUTHENTICATION = NO - ENABLE_PREVIEWS = NO - ENABLE_RESOURCE_ACCESS_AUDIO_INPUT = NO - ENABLE_RESOURCE_ACCESS_BLUETOOTH = NO - ENABLE_RESOURCE_ACCESS_CALENDARS = NO - ENABLE_RESOURCE_ACCESS_CAMERA = NO - ENABLE_RESOURCE_ACCESS_CONTACTS = NO - ENABLE_RESOURCE_ACCESS_LOCATION = NO - ENABLE_RESOURCE_ACCESS_PHOTO_LIBRARY = NO - ENABLE_RESOURCE_ACCESS_PRINTING = NO - ENABLE_RESOURCE_ACCESS_USB = YES - ENABLE_SDK_IMPORTS = NO - ENABLE_SECURITY_COMPILER_WARNINGS = NO - ENABLE_STRICT_OBJC_MSGSEND = YES - ENABLE_TESTABILITY = NO - ENABLE_TESTING_SEARCH_PATHS = NO - ENABLE_USER_SCRIPT_SANDBOXING = NO - ENABLE_USER_SELECTED_FILES = readwrite - ENABLE_XOJIT_PREVIEWS = NO - ENFORCE_VALID_ARCHS = YES - EXCLUDED_INSTALLSRC_SUBDIRECTORY_PATTERNS = .DS_Store .svn .git .hg CVS - EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES = *.nib *.lproj *.framework *.gch *.xcode* *.xcassets *.icon (*) .DS_Store CVS .svn .git .hg *.pbproj *.pbxproj - FILE_LIST = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/Objects/LinkFileList - FIXED_FILES_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/FixedFiles - FRAMEWORK_SEARCH_PATHS = /Users/jblome/code/encapp/ios/build/Release-unknown - FRAMEWORK_VERSION = A - FUSE_BUILD_PHASES = YES - FUSE_BUILD_SCRIPT_PHASES = NO - GCC3_VERSION = 3.3 - GCC_C_LANGUAGE_STANDARD = gnu11 - GCC_NO_COMMON_BLOCKS = YES - GCC_PFE_FILE_C_DIALECTS = c objective-c c++ objective-c++ - GCC_TREAT_WARNINGS_AS_ERRORS = NO - GCC_VERSION = com.apple.compilers.llvm.clang.1_0 - GCC_VERSION_IDENTIFIER = com_apple_compilers_llvm_clang_1_0 - GCC_WARN_64_TO_32_BIT_CONVERSION = YES - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR - GCC_WARN_UNDECLARED_SELECTOR = YES - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE - GCC_WARN_UNUSED_FUNCTION = YES - GCC_WARN_UNUSED_VARIABLE = YES - GENERATED_MODULEMAP_DIR = /Users/jblome/code/encapp/ios/build/GeneratedModuleMaps-unknown - GENERATE_INFOPLIST_FILE = YES - GENERATE_INTERMEDIATE_TEXT_BASED_STUBS = YES - GENERATE_PKGINFO_FILE = NO - GENERATE_PRELINK_OBJECT_FILE = NO - GENERATE_PROFILING_CODE = NO - GENERATE_TEXT_BASED_STUBS = NO - GID = 20 - GROUP = staff - HEADERMAP_INCLUDES_FLAT_ENTRIES_FOR_TARGET_BEING_BUILT = YES - HEADERMAP_INCLUDES_FRAMEWORK_ENTRIES_FOR_ALL_PRODUCT_TYPES = YES - HEADERMAP_INCLUDES_FRAMEWORK_ENTRIES_FOR_TARGETS_NOT_BEING_BUILT = YES - HEADERMAP_INCLUDES_NONPUBLIC_NONPRIVATE_HEADERS = YES - HEADERMAP_INCLUDES_PROJECT_HEADERS = YES - HEADERMAP_USES_FRAMEWORK_PREFIX_ENTRIES = YES - HEADERMAP_USES_VFS = NO - HEADER_SEARCH_PATHS = /Users/jblome/code/encapp/ios/build/Release-unknown/include /Users/jblome/code/encapp/ios/include - HOME = /Users/jblome - HOST_ARCH = arm64 - HOST_PLATFORM = macosx - ICONV = /usr/bin/iconv - IMPLICIT_DEPENDENCY_DOMAIN = default - INFOPLIST_ENABLE_CFBUNDLEICONS_MERGE = YES - INFOPLIST_EXPAND_BUILD_SETTINGS = YES - INFOPLIST_KEY_LSApplicationCategoryType = public.app-category.developer-tools - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight - INFOPLIST_OUTPUT_FORMAT = same-as-input - INFOPLIST_PREPROCESS = NO - INLINE_PRIVATE_FRAMEWORKS = NO - INSTALLAPI_IGNORE_SKIP_INSTALL = YES - INSTALLHDRS_COPY_PHASE = NO - INSTALLHDRS_SCRIPT_PHASE = NO - INSTALL_DIR = /tmp/Encapp.dst - INSTALL_GROUP = staff - INSTALL_MODE_FLAG = u+w,go-w,a+rX - INSTALL_OWNER = jblome - INSTALL_ROOT = /tmp/Encapp.dst - IPHONEOS_DEPLOYMENT_TARGET = 15.0 - IS_UNOPTIMIZED_BUILD = NO - JAVAC_DEFAULT_FLAGS = -J-Xms64m -J-XX:NewSize=4M -J-Dfile.encoding=UTF8 - JAVA_APP_STUB = /System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub - JAVA_ARCHIVE_CLASSES = YES - JAVA_ARCHIVE_TYPE = JAR - JAVA_COMPILER = /usr/bin/javac - JAVA_FRAMEWORK_RESOURCES_DIRS = Resources - JAVA_JAR_FLAGS = cv - JAVA_SOURCE_SUBDIR = . - JAVA_USE_DEPENDENCIES = YES - JAVA_ZIP_FLAGS = -urg - JIKES_DEFAULT_FLAGS = +E +OLDCSO - KEEP_PRIVATE_EXTERNS = NO - LD_DEPENDENCY_INFO_FILE = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/Objects-normal/undefined_arch/Encapp_dependency_info.dat - LD_EXPORT_SYMBOLS = YES - LD_GENERATE_MAP_FILE = NO - LD_MAP_FILE_PATH = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/Encapp-LinkMap-normal-undefined_arch.txt - LD_NO_PIE = NO - LD_QUOTE_LINKER_ARGUMENTS_FOR_COMPILER_DRIVER = YES - LD_RUNPATH_SEARCH_PATHS = @executable_path/Frameworks - LD_SHARED_CACHE_ELIGIBLE = Automatic - LD_WARN_DUPLICATE_LIBRARIES = NO - LD_WARN_UNUSED_DYLIBS = NO - LEGACY_DEVELOPER_DIR = /Users/jblome/Downloads/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer - LEX = lex - LIBRARY_DEXT_INSTALL_PATH = /Library/DriverExtensions - LIBRARY_FLAG_NOSPACE = YES - LIBRARY_KEXT_INSTALL_PATH = /Library/Extensions - LIBRARY_SEARCH_PATHS = /Users/jblome/code/encapp/ios/build/Release-unknown /Users/jblome/code/encapp/ios/libs - LINKER_DISPLAYS_MANGLED_NAMES = NO - LINK_WITH_STANDARD_LIBRARIES = YES - LLVM_TARGET_TRIPLE_VENDOR = apple - LOCALIZATION_EXPORT_SUPPORTED = YES - LOCALIZATION_PREFERS_STRING_CATALOGS = NO - LOCALIZED_STRING_MACRO_NAMES = NSLocalizedString CFCopyLocalizedString - LOCALIZED_STRING_SWIFTUI_SUPPORT = YES - LOCAL_ADMIN_APPS_DIR = /Applications/Utilities - LOCAL_APPS_DIR = /Applications - LOCAL_DEVELOPER_DIR = /Library/Developer - LOCAL_LIBRARY_DIR = /Library - LOCROOT = /Users/jblome/code/encapp/ios - LOCSYMROOT = /Users/jblome/code/encapp/ios - MACOSX_DEPLOYMENT_TARGET = 12.3 - MAC_OS_X_PRODUCT_BUILD_VERSION = 24G222 - MAC_OS_X_VERSION_ACTUAL = 150700 - MAC_OS_X_VERSION_MAJOR = 150000 - MAC_OS_X_VERSION_MINOR = 150700 - MAKE_MERGEABLE = NO - MARKETING_VERSION = 1.0 - MERGEABLE_LIBRARY = NO - MERGED_BINARY_TYPE = none - MERGE_LINKED_LIBRARIES = NO - METAL_LIBRARY_FILE_BASE = default - METAL_LIBRARY_OUTPUT_DIR = /Users/jblome/code/encapp/ios/build/Release-unknown/ - MTL_ENABLE_DEBUG_INFO = NO - MTL_FAST_MATH = YES - NATIVE_ARCH = arm64 - NATIVE_ARCH_32_BIT = arm - NATIVE_ARCH_64_BIT = arm64 - NATIVE_ARCH_ACTUAL = arm64 - NO_COMMON = YES - OBJECT_FILE_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/Objects - OBJECT_FILE_DIR_normal = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/Objects-normal - OBJROOT = /Users/jblome/code/encapp/ios/build - ONLY_ACTIVE_ARCH = NO - OS = MACOS - OSAC = /usr/bin/osacompile - PASCAL_STRINGS = YES - PATH = /Users/jblome/Downloads/Xcode.app/Contents/SharedFrameworks/SwiftBuild.framework/Versions/A/PlugIns/SWBBuildService.bundle/Contents/PlugIns/SWBUniversalPlatformPlugin.bundle/Contents/Frameworks/SWBUniversalPlatform.framework/Resources:/Users/jblome/Downloads/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:/Users/jblome/Downloads/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/local/bin:/Users/jblome/Downloads/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/libexec:/Users/jblome/Downloads/Xcode.app/Contents/Developer/usr/bin:/Users/jblome/Downloads/Xcode.app/Contents/Developer/usr/local/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/opt/facebook/bin:/opt/facebook/bin/biggrep:/opt/facebook/nix/bin:/opt/facebook/ops/scripts/chef:/opt/facebook/hg/bin:/usr/local/munki:/Applications/kitty.app/Contents/MacOS - PATH_PREFIXES_EXCLUDED_FROM_HEADER_DEPENDENCIES = /usr/include /usr/local/include /System/Library/Frameworks /System/Library/PrivateFrameworks /Users/jblome/Downloads/Xcode.app/Contents/Developer/Headers /Users/jblome/Downloads/Xcode.app/Contents/Developer/SDKs /Users/jblome/Downloads/Xcode.app/Contents/Developer/Platforms - PER_ARCH_MODULE_FILE_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/Objects-normal/undefined_arch/Modules - PER_ARCH_OBJECT_FILE_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/Objects-normal/undefined_arch - PER_VARIANT_OBJECT_FILE_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/Objects-normal - PKGINFO_FILE_PATH = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/PkgInfo - PLIST_FILE_OUTPUT_FORMAT = same-as-input - PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = YES - PRECOMP_DESTINATION_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/PrefixHeaders - PROCESSED_INFOPLIST_PATH = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/Objects-normal/undefined_arch/Processed-Info.plist - PRODUCT_BUNDLE_IDENTIFIER = Meta.Encapp - PRODUCT_MODULE_NAME = Encapp - PRODUCT_NAME = Encapp - PRODUCT_SETTINGS_PATH = - PRODUCT_TYPE = com.apple.product-type.application - PROFILING_CODE = NO - PROJECT = Encapp - PROJECT_DERIVED_FILE_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/DerivedSources - PROJECT_DIR = /Users/jblome/code/encapp/ios - PROJECT_FILE_PATH = /Users/jblome/code/encapp/ios/Encapp.xcodeproj - PROJECT_GUID = 3b197d7739ee5ce795a0ebec593f75b5 - PROJECT_NAME = Encapp - PROJECT_TEMP_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build - PROJECT_TEMP_ROOT = /Users/jblome/code/encapp/ios/build - RECURSIVE_SEARCH_PATHS_FOLLOW_SYMLINKS = YES - REMOVE_CVS_FROM_RESOURCES = YES - REMOVE_GIT_FROM_RESOURCES = YES - REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES = YES - REMOVE_HG_FROM_RESOURCES = YES - REMOVE_STATIC_EXECUTABLES_FROM_EMBEDDED_BUNDLES = YES - REMOVE_SVN_FROM_RESOURCES = YES - RESCHEDULE_INDEPENDENT_HEADERS_PHASES = YES - REZ_COLLECTOR_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/ResourceManagerResources - REZ_OBJECTS_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/ResourceManagerResources/Objects - REZ_SEARCH_PATHS = /Users/jblome/code/encapp/ios/build/Release-unknown - RUNTIME_EXCEPTION_ALLOW_DYLD_ENVIRONMENT_VARIABLES = NO - RUNTIME_EXCEPTION_ALLOW_JIT = NO - RUNTIME_EXCEPTION_ALLOW_UNSIGNED_EXECUTABLE_MEMORY = NO - RUNTIME_EXCEPTION_DEBUGGING_TOOL = NO - RUNTIME_EXCEPTION_DISABLE_EXECUTABLE_PAGE_PROTECTION = NO - RUNTIME_EXCEPTION_DISABLE_LIBRARY_VALIDATION = NO - SCAN_ALL_SOURCE_FILES_FOR_INCLUDES = NO - SDKROOT = auto - SDK_STAT_CACHE_ENABLE = YES - SED = /usr/bin/sed - SEPARATE_STRIP = NO - SEPARATE_SYMBOL_EDIT = NO - SET_DIR_MODE_OWNER_GROUP = YES - SET_FILE_MODE_OWNER_GROUP = NO - SHALLOW_BUNDLE = NO - SHARED_DERIVED_FILE_DIR = /Users/jblome/code/encapp/ios/build/Release-unknown/DerivedSources - SHARED_PRECOMPS_DIR = /Users/jblome/code/encapp/ios/build/SharedPrecompiledHeaders - SKIP_INSTALL = YES - SOURCE_ROOT = /Users/jblome/code/encapp/ios - SRCROOT = /Users/jblome/code/encapp/ios - STRINGSDATA_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build/Objects-normal/undefined_arch - STRINGSDATA_ROOT = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build - STRINGS_FILE_INFOPLIST_RENAME = YES - STRINGS_FILE_OUTPUT_ENCODING = UTF-16 - STRING_CATALOG_GENERATE_SYMBOLS = NO - STRIP_BITCODE_FROM_COPIED_FILES = NO - STRIP_INSTALLED_PRODUCT = YES - STRIP_STYLE = all - STRIP_SWIFT_SYMBOLS = YES - SUPPORTED_PLATFORMS = iphoneos iphonesimulator macosx - SUPPORTS_MACCATALYST = YES - SUPPORTS_TEXT_BASED_API = NO - SUPPRESS_WARNINGS = NO - SWIFT_COMPILATION_MODE = wholemodule - SWIFT_EMIT_CONST_VALUE_PROTOCOLS = AppIntent EntityQuery AppEntity TransientEntity AppEnum AppShortcutProviding AppShortcutsProvider AnyResolverProviding AppIntentsPackage DynamicOptionsProvider _IntentValueRepresentable _AssistantIntentsProvider _GenerativeFunctionExtractable IntentValueQuery Resolver AppExtension ExtensionPointDefining - SWIFT_EMIT_LOC_STRINGS = YES - SWIFT_OPTIMIZATION_LEVEL = -O - SWIFT_VERSION = 5.0 - SYMROOT = /Users/jblome/code/encapp/ios/build - SYSTEM_ADMIN_APPS_DIR = /Applications/Utilities - SYSTEM_APPS_DIR = /Applications - SYSTEM_CORE_SERVICES_DIR = /System/Library/CoreServices - SYSTEM_DEMOS_DIR = /Applications/Extras - SYSTEM_DEVELOPER_APPS_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Applications - SYSTEM_DEVELOPER_BIN_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/usr/bin - SYSTEM_DEVELOPER_DEMOS_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Applications/Utilities/Built Examples - SYSTEM_DEVELOPER_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer - SYSTEM_DEVELOPER_DOC_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/ADC Reference Library - SYSTEM_DEVELOPER_GRAPHICS_TOOLS_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Applications/Graphics Tools - SYSTEM_DEVELOPER_JAVA_TOOLS_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Applications/Java Tools - SYSTEM_DEVELOPER_PERFORMANCE_TOOLS_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Applications/Performance Tools - SYSTEM_DEVELOPER_RELEASENOTES_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes - SYSTEM_DEVELOPER_TOOLS = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Tools - SYSTEM_DEVELOPER_TOOLS_DOC_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/ADC Reference Library/documentation/DeveloperTools - SYSTEM_DEVELOPER_TOOLS_RELEASENOTES_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes/DeveloperTools - SYSTEM_DEVELOPER_USR_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/usr - SYSTEM_DEVELOPER_UTILITIES_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Applications/Utilities - SYSTEM_DEXT_INSTALL_PATH = /System/Library/DriverExtensions - SYSTEM_DOCUMENTATION_DIR = /Library/Documentation - SYSTEM_KEXT_INSTALL_PATH = /System/Library/Extensions - SYSTEM_LIBRARY_DIR = /System/Library - TAPI_DEMANGLE = YES - TAPI_ENABLE_PROJECT_HEADERS = NO - TAPI_LANGUAGE = objective-c - TAPI_LANGUAGE_STANDARD = compiler-default - TAPI_VERIFY_MODE = ErrorsOnly - TARGETED_DEVICE_FAMILY = 1,2 - TARGETNAME = Encapp - TARGET_BUILD_DIR = /Users/jblome/code/encapp/ios/build/Release-unknown - TARGET_NAME = Encapp - TARGET_TEMP_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build - TEMP_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build - TEMP_FILES_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build - TEMP_FILE_DIR = /Users/jblome/code/encapp/ios/build/Encapp.build/Release-unknown/Encapp.build - TEMP_ROOT = /Users/jblome/code/encapp/ios/build - TEMP_SANDBOX_DIR = /Users/jblome/code/encapp/ios/build/TemporaryTaskSandboxes - TOOLCHAINS = com.apple.dt.toolchain.XcodeDefault - TOOLCHAIN_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain - TREAT_MISSING_BASELINES_AS_TEST_FAILURES = NO - TREAT_MISSING_SCRIPT_PHASE_OUTPUTS_AS_ERRORS = NO - TVOS_DEPLOYMENT_TARGET = 26.0 - UID = 501 - UNINSTALLED_PRODUCTS_DIR = /Users/jblome/code/encapp/ios/build/UninstalledProducts - UNSTRIPPED_PRODUCT = NO - USER = jblome - USER_APPS_DIR = /Users/jblome/Applications - USER_LIBRARY_DIR = /Users/jblome/Library - USE_DYNAMIC_NO_PIC = YES - USE_HEADERMAP = YES - USE_HEADER_SYMLINKS = NO - VALIDATE_DEVELOPMENT_ASSET_PATHS = YES_ERROR - VALIDATE_PRODUCT = NO - VERBOSE_PBXCP = NO - VERSION_INFO_BUILDER = jblome - VERSION_INFO_FILE = Encapp_vers.c - VERSION_INFO_STRING = "@(#)PROGRAM:Encapp PROJECT:Encapp-1" - WATCHOS_DEPLOYMENT_TARGET = 26.0 - WORKSPACE_DIR = /Users/jblome/code/encapp/ios/Encapp.xcodeproj - WRAP_ASSET_PACKS_IN_SEPARATE_DIRECTORIES = NO - XCODE_APP_SUPPORT_DIR = /Users/jblome/Downloads/Xcode.app/Contents/Developer/Library/Xcode - XCODE_PRODUCT_BUILD_VERSION = 17A400 - XCODE_VERSION_ACTUAL = 2601 - XCODE_VERSION_MAJOR = 2600 - XCODE_VERSION_MINOR = 2600 - XPCSERVICES_FOLDER_PATH = /XPCServices - XROS_DEPLOYMENT_TARGET = 26.0 - YACC = yacc - _DISCOVER_COMMAND_LINE_LINKER_INPUTS = YES - _DISCOVER_COMMAND_LINE_LINKER_INPUTS_INCLUDE_WL = YES - _LD_MULTIARCH = YES - __DIAGNOSE_DEPRECATED_ARCHS = YES - arch = undefined_arch - variant = normal -