├── .gitignore ├── LICENSE ├── NOTES.rtf ├── Options.h ├── Options.m ├── Packaging ├── build-package.sh ├── notarize.sh └── staple.sh ├── README.md ├── TimeLapse.m ├── TimeLapse.xcodeproj ├── jim.mode1v3 ├── jim.pbxuser └── project.pbxproj ├── Version.h ├── timelapse.1 ├── timelapse.pdf └── timelapse_Prefix.pch /.gitignore: -------------------------------------------------------------------------------- 1 | TimeLapse.xcodeproj/project.xcworkspace 2 | TimeLapse.xcodeproj/xcuserdata 3 | .DS_Store 4 | build 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Jim Studt 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /NOTES.rtf: -------------------------------------------------------------------------------- 1 | {\rtf1\ansi\ansicpg1252\cocoartf1265 2 | {\fonttbl\f0\fnil\fcharset0 Monaco;} 3 | {\colortbl;\red255\green255\blue255;} 4 | \viewkind0 5 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural 6 | 7 | \f0\fs20 \cf0 In this file, Jim Studt talks to himself about his plans for timelapse.\ 8 | \ 9 | Currently he has dumped everything into the github issue tracker, so there is nothing here.} 10 | -------------------------------------------------------------------------------- /Options.h: -------------------------------------------------------------------------------- 1 | // 2 | // Options.h 3 | // TimeLapse 4 | // 5 | // Created by Jim Studt on 9/25/09. 6 | // Copyright 2009 Lunarware. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | 12 | @interface Options : NSObject { 13 | 14 | } 15 | 16 | +(void)parseArgc:(int *)argc argv:(const char *[])argv ; 17 | +(BOOL)verbose; 18 | +(NSString *)output; 19 | +(int) framesPerSecond; 20 | +(NSString *const)codec; 21 | +(NSString *const)profile; 22 | +(NSString *const)level; 23 | +(int)width; 24 | +(int)height; 25 | +(NSNumber *const)quality; // jpeg only 26 | +(NSNumber *const)averageBitRate; // h.264 only 27 | // i skip some h.264 keyframe options 28 | 29 | +(BOOL)noDuplicates; 30 | +(NSString *)posterFile; 31 | 32 | @end 33 | -------------------------------------------------------------------------------- /Options.m: -------------------------------------------------------------------------------- 1 | // 2 | // Options.m 3 | // TimeLapse 4 | // 5 | // Created by Jim Studt on 9/25/09. 6 | // Copyright 2009 Lunarware. All rights reserved. 7 | // 8 | 9 | #import "Options.h" 10 | #import "Version.h" 11 | #include 12 | 13 | static BOOL verbose = NO; 14 | static NSString *outputName = @"timelapse.mov"; 15 | static BOOL noDups = NO; 16 | static NSString *codec = nil; 17 | static NSString *profile = nil; 18 | static NSString *level = nil; 19 | static int width = 0; 20 | static int height = 0; 21 | static NSNumber *quality = nil; 22 | static NSNumber *averageBitRate = nil; 23 | static int framesPerSecond = 30; 24 | static NSString *posterFile = nil; 25 | 26 | @implementation Options 27 | 28 | +(BOOL)verbose { return verbose; } 29 | +(BOOL)noDuplicates { return noDups; } 30 | +(NSString *)output { return outputName; } 31 | +(NSString *const)codec { return codec; } 32 | +(NSString *const)profile {return profile; } 33 | +(int)width{ return width; } 34 | +(int)height { return height; } 35 | +(NSString *const)level { return level; } 36 | +(NSNumber *const)quality { return quality; } // jpeg only 37 | +(NSNumber *const)averageBitRate {return averageBitRate; } // h.264 only 38 | +(int)framesPerSecond { return framesPerSecond; } 39 | +(NSString *)posterFile { return posterFile;} 40 | 41 | static void usage(const char *name, int error) __attribute__((__noreturn__)); 42 | static void usage(const char *name, int error) { 43 | FILE *f = (error ? stderr : stdout); 44 | const char *slash = strrchr( name, '/'); 45 | const char *n = (slash ? slash+1 : name); 46 | 47 | fprintf(f, "Usage: %s -o outfile [options] inputdir_or_images...\n", n); 48 | fprintf(f, 49 | " version " TIMELAPSE_VERSION "\n" 50 | " -v | --verbose verbose output\n" 51 | " -h | --help display usage and exit\n" 52 | " -W | --width output width\n" 53 | " -H | --height output height\n" 54 | " -o fname | --output fname specify output file - required\n" 55 | " end with .mp4 .m4v or .mov to select format\n" 56 | " -P fname | --poster fname path for a JPEG image from near the middle of the movie\n" 57 | " -f fps | --framesPerSecond fps frames per second, must be an integer, default is 30\n" 58 | " -n | --nodups skip duplicated frames\n" 59 | " -c codec | --codec name codec name: h264 jpeg prores4444 prores422 hevc\n" 60 | " -p profile | --profile name h.264 profile: baseline main(default) high\n" 61 | " -l level | --level name h.264 level: 3.0 3.1 3.2 4.0 4.1 auto(default)\n" 62 | " -b bitrate | --bitrate num average bit rate in Mbps: e.g. 2.0\n" 63 | " -q quality | --quality num jpeg quality: e.g. 0.8\n"); 64 | 65 | exit( error ? 1 : 0); 66 | } 67 | 68 | +(void)parseArgc:(int *)argc argv:(const char *[])argv 69 | { 70 | static const char *optstring = "v?nho:f:c:p:W:H:l:b:q:P:"; 71 | static const struct option longopts[] = { 72 | { "verbose", no_argument, 0, 'v'}, 73 | { "help", no_argument, 0, 'h'}, 74 | { "output", required_argument, 0, 'o'}, 75 | { "framesPerSecond", required_argument, 0, 'f'}, 76 | { "codec", required_argument, 0, 'c'}, 77 | { "profile", required_argument, 0, 'p'}, 78 | { "width", required_argument, 0, 'W'}, 79 | { "height", required_argument, 0, 'H'}, 80 | { "level", required_argument, 0, 'l'}, 81 | { "bitrate", required_argument, 0, 'b'}, 82 | { "quality", required_argument, 0, 'q'}, 83 | { "nodup", no_argument, 0, 'n'}, 84 | { "poster", required_argument, 0, 'P'}, 85 | {0,0,0,0} 86 | }; 87 | int ch; 88 | 89 | while( (ch = getopt_long(*argc, (char * const *)argv, optstring, longopts, NULL)) != -1) { 90 | switch(ch) { 91 | case 'v': 92 | verbose = YES; 93 | break; 94 | case 'o': 95 | outputName = @(optarg); 96 | break; 97 | case 'h': 98 | usage( argv[0], 0); 99 | break; 100 | case 'f': 101 | framesPerSecond = atoi(optarg); 102 | break; 103 | case 'n': 104 | noDups = YES; 105 | break; 106 | case 'c': 107 | codec = @(optarg); 108 | break; 109 | case 'p': 110 | profile = @(optarg); 111 | break; 112 | case 'W': 113 | width = atoi(optarg); 114 | break; 115 | case 'H': 116 | height = atoi(optarg); 117 | break; 118 | case 'l': 119 | level = @(optarg); 120 | break; 121 | case 'q': 122 | quality = @([@(optarg) doubleValue]); 123 | break; 124 | case 'b': 125 | averageBitRate = @([@(optarg) doubleValue]*1000000.0); 126 | break; 127 | case 'P': 128 | posterFile = @(optarg); 129 | break; 130 | default: 131 | usage( argv[0], 1); 132 | break; 133 | } 134 | } 135 | for ( int i = 0; i < (*argc - optind); i++) { 136 | argv[i] = argv[i+optind]; 137 | } 138 | *argc -= optind; 139 | } 140 | 141 | @end 142 | -------------------------------------------------------------------------------- /Packaging/build-package.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # build-package.sh 4 | # TimeLapse 5 | # 6 | # Created by Jim Studt on 2/11/14. 7 | # Copyright (c) 2014 Lunarware. All rights reserved. 8 | 9 | set -x 10 | set -e 11 | 12 | if ( echo "${BUILT_PRODUCTS_DIR}" | fgrep "/Debug/" ) ;then 13 | echo You are trying to build a package of a Debug release. Not what you want. 14 | exit 1 15 | fi 16 | 17 | CERTIFICATE_CN="Developer ID Installer: James Studt (HJS98U3F75)" 18 | 19 | VERSION=$(sed -E -n -e 's/#define *TIMELAPSE_VERSION *"([^"]*)"/\1/p' "${SOURCE_ROOT}"/Version.h) 20 | PACKAGE_NAME=`echo "$PRODUCT_NAME" | sed "s/ /_/g"` 21 | 22 | FAKEROOT=${BUILT_PRODUCTS_DIR}/install-usr 23 | COMPONENT_PACKAGE=${BUILT_PRODUCTS_DIR}/timelapse.pkg 24 | 25 | rm -rf "${FAKEROOT}" 26 | mkdir "${FAKEROOT}" 27 | mkdir -p "${FAKEROOT}/usr/local/bin" 28 | mkdir -p "${FAKEROOT}/usr/local/share/man/man1" 29 | cp "${BUILT_PRODUCTS_DIR}/timelapse" "${FAKEROOT}/usr/local/bin/" 30 | cp "${SOURCE_ROOT}/timelapse.1" "${FAKEROOT}/usr/local/share/man/man1/" 31 | 32 | pkgbuild --root "${FAKEROOT}" \ 33 | --identifier com.lunarware.timelapse \ 34 | --version "${VERSION}" \ 35 | --ownership recommended \ 36 | --sign "${CERTIFICATE_CN}" \ 37 | "${COMPONENT_PACKAGE}" 38 | 39 | cp ${COMPONENT_PACKAGE} ${SOURCE_ROOT}/build/ 40 | -------------------------------------------------------------------------------- /Packaging/notarize.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # notarize.sh 4 | # TimeLapse 5 | # 6 | # Created by Jim Studt on 12/29/19. 7 | # Copyright © 2019 Lunarware. All rights reserved. 8 | 9 | xcrun altool --notarize-app \ 10 | --primary-bundle-id "com.lunarware.timelapse" \ 11 | --username "jim@studt.net" \ 12 | --password "@keychain:Developer-altool" \ 13 | --file "build/timelapse.pkg" 14 | 15 | #--asc-provider "8VFWL42C8C" -- needed if memebrs of more than one team, isn't working for me. 16 | 17 | -------------------------------------------------------------------------------- /Packaging/staple.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # staple.sh 4 | # TimeLapse 5 | # 6 | # Created by Jim Studt on 12/29/19. 7 | # Copyright © 2019 Lunarware. All rights reserved. 8 | 9 | xcrun stapler staple build/timelapse.pkg 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | timelapse 2 | ========= 3 | 4 | **timelapse** is a Mac OS X command line utility to turn a series of images into a video. 5 | 6 | It uses the AV Foundation to create MPEG-4 or Quicktime movies using the H.264, JPEG, Apple ProRes422, or Apple ProRes4444 codecs. The source images can be anything that NSImage can open; JPEG is most common. 7 | 8 | ## Downloading 9 | 10 | You can download a binary installer package from https://github.com/jimstudt/timelapse/releases/ or build it 11 | from this archive. 12 | 13 | ## Status 14 | 15 | **timelapse** currently has a single user. I use it several times a day to make movies from a series of image captures and it works beautifully for me. Maybe it will work for you too. 16 | 17 | If you misuse an argument or make a mistake in the options, you are going to get a horrific excuse for an error message, usually embedded in a stack backtrace. Put it in an issue on github and I'll make nicer error for it. 18 | 19 | I will not add features until someone asks for them. Feel free to browse the issue tracker and ask for what you need. 20 | 21 | ## Usage 22 | 23 | There is a man page which you can read after you install the package. You can see a PDF version of it at https://github.com/jimstudt/timelapse/timelapse.pdf 24 | 25 | I regenerate that with `man -t timelapse | pstopdf -o timelapse.pdf` when I do a release. 26 | 27 | You should look at this copy of the man page: http://htmlpreview.github.com/?https://raw.github.com/jimstudt/timelapse/master/timelapse.html 28 | 29 | It is tragically formatted, but you will get the idea. 30 | 31 | ## Building and Signing 32 | 33 | This project is set up so I can build signed packages which, presumably, anyone can install and run on macos 10.15 (catalina) or later. If you are going to build it for yourself you probably want to go into your Project, Targets -> timelapse, Signing & Capabilities, and change "Signing Certificate" to "Sign to Run Locally". 34 | 35 | The steps I go through to make the package are: 36 | 37 | - build the **timelapse** target 38 | - build the **Installer Package** target 39 | - The unsigned package is in `build/timelapse.pkg` 40 | 41 | You probably want to stop here, but I will go on and do this to make a notarized package. 42 | 43 | - run the `Packaging/notarize.sh` script. 44 | - wait for the confirmation email from Apple. 45 | - run the `Packaging/staple.sh` script. 46 | - The finished package is in `build/timelapse.pkg` 47 | 48 | ## History 49 | 50 | I wrote **timelapse** years ago when QtKit was new. Since Mac OS 10.9, Mavericks, QtKit is deprecated, so I rewrote it to use AV Foundation instead. This git repository was restarted from scratch so you don't have to see any of that old cruft. 51 | 52 | -------------------------------------------------------------------------------- /TimeLapse.m: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "Options.h" 4 | @import CoreVideo; 5 | @import AVFoundation; 6 | 7 | // 8 | // Examine the Options and construct the dictionary for [AVAssetWriterInput assetWriterInputWithMediaType:outputSettings:] 9 | // 10 | static NSDictionary *getVideoSettings(NSSize size) 11 | { 12 | NSString *const codec = [Options codec]; 13 | if (codec == nil || [codec isEqualToString:@"h264"]) { 14 | NSMutableDictionary *compression = [NSMutableDictionary dictionary]; 15 | 16 | if ( [Options averageBitRate]) compression[AVVideoAverageBitRateKey] = [Options averageBitRate]; 17 | 18 | NSString *const profile = [Options profile]; 19 | if ( profile != nil) { 20 | NSString *const level = [Options level]; 21 | 22 | NSDictionary *profileMap = @{@"baseline3.0": AVVideoProfileLevelH264Baseline30, 23 | @"baseline3.1": AVVideoProfileLevelH264Baseline31, 24 | @"baseline4.1": AVVideoProfileLevelH264Baseline41, 25 | @"baseline": AVVideoProfileLevelH264BaselineAutoLevel, 26 | @"main3.0": AVVideoProfileLevelH264Main30, 27 | @"main3.1": AVVideoProfileLevelH264Main31, 28 | @"main3.2": AVVideoProfileLevelH264Main32, 29 | @"main4.1": AVVideoProfileLevelH264Main41, 30 | @"main": AVVideoProfileLevelH264MainAutoLevel, 31 | @"high4.0": AVVideoProfileLevelH264High40, 32 | @"high4.1": AVVideoProfileLevelH264High41, 33 | @"high": AVVideoProfileLevelH264HighAutoLevel, 34 | }; 35 | NSString *profileLevel = nil; 36 | if ( level == nil) { 37 | profileLevel = profileMap[profile]; 38 | if (profileLevel == nil) NSLog(@"Invalid profile: %@", profile); 39 | } else { 40 | NSString *profileKey = [NSString stringWithFormat:@"%@%@", profile, level]; 41 | profileLevel = profileMap[profileKey]; 42 | if (profileLevel == nil) NSLog(@"Invalid profile,level pair: %@, %@", profile, level); 43 | } 44 | if (profileLevel != nil) compression[AVVideoProfileLevelKey] = profileLevel; 45 | } 46 | return @{ AVVideoCodecKey: AVVideoCodecTypeH264, 47 | AVVideoWidthKey: @(size.width), 48 | AVVideoHeightKey: @(size.height), 49 | AVVideoCompressionPropertiesKey: compression, 50 | }; 51 | } 52 | if ( [codec isEqualToString:@"hevc"]) { 53 | NSMutableDictionary *compression = [NSMutableDictionary dictionary]; 54 | 55 | if ( [Options averageBitRate]) compression[AVVideoAverageBitRateKey] = [Options averageBitRate]; 56 | 57 | return @{ AVVideoCodecKey: AVVideoCodecTypeHEVC, 58 | AVVideoWidthKey: @(size.width), 59 | AVVideoHeightKey: @(size.height), 60 | AVVideoCompressionPropertiesKey: compression, 61 | }; 62 | } 63 | if ( [codec isEqualToString:@"jpeg"]) { 64 | NSMutableDictionary *compression = [NSMutableDictionary dictionary]; 65 | if ( [Options quality]) compression[AVVideoQualityKey] = [Options quality]; 66 | 67 | return @{ AVVideoCodecKey: AVVideoCodecTypeJPEG, 68 | AVVideoWidthKey: @(size.width), 69 | AVVideoHeightKey: @(size.height), 70 | AVVideoCompressionPropertiesKey: compression, 71 | }; 72 | } 73 | if ( [codec isEqualToString:@"prores4444"]) { 74 | return @{ AVVideoCodecKey: AVVideoCodecTypeAppleProRes4444, 75 | AVVideoWidthKey: @(size.width), 76 | AVVideoHeightKey: @(size.height), 77 | }; 78 | } 79 | if ( [codec isEqualToString:@"prores422"]) { 80 | return @{ AVVideoCodecKey: AVVideoCodecTypeAppleProRes422, 81 | AVVideoWidthKey: @(size.width), 82 | AVVideoHeightKey: @(size.height), 83 | }; 84 | } 85 | fprintf(stderr, "Unsupported codec: '%s'. Consider h264, jpeg, prores4444, or prores422\n", [codec UTF8String]); 86 | exit(1); 87 | } 88 | 89 | // 90 | // Examine the output file URL and return the fileType for AVAssetWriter assetWriterWithURL:fileType:error: 91 | // 92 | static NSString *const fileTypeForURL(NSURL *url) 93 | { 94 | NSString *extension = url.path.pathExtension; 95 | 96 | if ( [extension isEqualToString:@"mp4"]) return AVFileTypeMPEG4; 97 | if ( [extension isEqualToString:@"m4v"]) return AVFileTypeAppleM4V; 98 | if ( [extension isEqualToString:@"mov"] || [extension isEqualToString:@".qt"]) return AVFileTypeQuickTimeMovie; 99 | return AVFileTypeMPEG4; 100 | 101 | } 102 | 103 | // 104 | // Given an array of paths, walk all of the directories and sort all the files into an array of NSURLs 105 | // Skip hidden files and omit directories. 106 | // 107 | static NSArray *walkAndSort( NSArray *roots) 108 | { 109 | NSMutableArray *urls = [NSMutableArray array]; 110 | 111 | for (id root in roots) { 112 | NSString *rootStr = root; 113 | NSURL *durl = [NSURL fileURLWithPath:rootStr]; 114 | NSDirectoryEnumerator *denum = [[NSFileManager defaultManager] enumeratorAtURL:durl 115 | includingPropertiesForKeys:NULL 116 | options:NSDirectoryEnumerationSkipsHiddenFiles 117 | errorHandler:NULL]; 118 | NSURL *url = nil; 119 | while( url = [denum nextObject]) { 120 | NSError *error; 121 | NSNumber *isDirectory = nil; 122 | if (! [url getResourceValue:&isDirectory forKey:NSURLIsDirectoryKey error:&error]) { 123 | // handle error 124 | NSLog(@"error testing %@ for being a directory", url); 125 | } else if (! [isDirectory boolValue]) { 126 | [urls addObject:url]; 127 | } 128 | 129 | } 130 | } 131 | [urls sortUsingComparator:^(id a, id b){ return [[a absoluteString] compare:[b absoluteString]]; }]; 132 | 133 | return urls; 134 | } 135 | 136 | // 137 | // Convert an NSImage into a CVPixelBufferRef 138 | // 139 | // From http://stackoverflow.com/questions/17481254/how-to-convert-nsdata-object-with-jpeg-data-into-cvpixelbufferref-in-os-x 140 | // 141 | static CVPixelBufferRef newPixelBufferFromNSImage(NSImage* image) 142 | { 143 | CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); 144 | NSDictionary* pixelBufferProperties = @{(id)kCVPixelBufferCGImageCompatibilityKey:@YES, (id)kCVPixelBufferCGBitmapContextCompatibilityKey:@YES}; 145 | CVPixelBufferRef pixelBuffer = NULL; 146 | CVPixelBufferCreate(kCFAllocatorDefault, [image size].width, [image size].height, k32ARGBPixelFormat, (__bridge CFDictionaryRef)pixelBufferProperties, &pixelBuffer); 147 | CVPixelBufferLockBaseAddress(pixelBuffer, 0); 148 | void* baseAddress = CVPixelBufferGetBaseAddress(pixelBuffer); 149 | size_t bytesPerRow = CVPixelBufferGetBytesPerRow(pixelBuffer); 150 | CGContextRef context = CGBitmapContextCreate(baseAddress, [image size].width, [image size].height, 8, bytesPerRow, colorSpace, kCGImageAlphaNoneSkipFirst); 151 | NSGraphicsContext* imageContext = [NSGraphicsContext graphicsContextWithCGContext:context flipped:NO]; 152 | [NSGraphicsContext saveGraphicsState]; 153 | [NSGraphicsContext setCurrentContext:imageContext]; 154 | [image drawAtPoint:NSMakePoint(0.0, 0.0) fromRect:NSMakeRect(0, 0, [image size].width, [image size].height) operation:NSCompositingOperationCopy fraction:1.0]; 155 | [NSGraphicsContext restoreGraphicsState]; 156 | CVPixelBufferUnlockBaseAddress(pixelBuffer, 0); 157 | CFRelease(context); 158 | CGColorSpaceRelease(colorSpace); 159 | return pixelBuffer; 160 | } 161 | 162 | 163 | int main (int argc, const char * argv[]) { 164 | @autoreleasepool { 165 | NSDate *started = [NSDate date]; 166 | 167 | [Options parseArgc:&argc argv:argv]; 168 | 169 | CMTimeValue framesPerSecond = [Options framesPerSecond]; 170 | if ( framesPerSecond < 1 ) { 171 | NSLog(@"Frames per second is less than 1, error"); 172 | exit(1); 173 | } 174 | 175 | // Walk the roots and come up with a list of urls to process. 176 | // We can't pipeline this since it gets sorted. 177 | NSMutableArray *roots = [NSMutableArray array]; 178 | for ( int i = 0; i < argc; i++) { 179 | [roots addObject:@(argv[i])]; 180 | } 181 | NSArray *urls = walkAndSort(roots); 182 | 183 | // 184 | // If there are no inputs, then we can't do anything. 185 | // 186 | if ( urls.count == 0) { 187 | NSLog(@"No input files. Will not create output."); 188 | exit(0); 189 | } 190 | 191 | // If we have a posterfile name, then work out the index of the middle frame 192 | __block UInt64 posterIndex = UINT64_MAX; 193 | NSString *posterFile = [Options posterFile]; 194 | if ( posterFile) { 195 | posterIndex = urls.count/2; 196 | // might be nice to check if I can write the file here 197 | } 198 | 199 | // Get size from first available image 200 | NSSize size = NSZeroSize; 201 | for (NSURL *file in urls) { 202 | NSImage *img = [[NSImage alloc] initWithContentsOfURL:file]; 203 | if ( img) { 204 | size = img.size; 205 | break; 206 | } 207 | } 208 | 209 | if ( [Options width] && [Options height] ) { 210 | size = NSMakeSize([Options width], [Options height]); 211 | } else if ( [Options width] && ([Options height]==0) ) { 212 | // just a width, work it out 213 | int newHeight = [Options width] * (int)size.height / (int)size.width; 214 | size = NSMakeSize( [Options width], newHeight); 215 | } else if ( [Options height] && ([Options width]==0)) { 216 | // just a height, work it out 217 | int newWidth = [Options height] * (int)size.width / (int)size.height; 218 | size = NSMakeSize( newWidth, [Options height]); 219 | } 220 | 221 | // 222 | // Abort if we have a zero size 223 | // 224 | if ( size.width == 0 || size.height == 0) { 225 | NSLog(@"First image had a zero dimension. Unable to choose an output size."); 226 | exit(1); 227 | } 228 | 229 | 230 | NSString *outputPath = [Options output]; 231 | 232 | // Delete file if already present 233 | { 234 | NSError *rmError = nil; 235 | [[NSFileManager defaultManager] removeItemAtPath:outputPath error:&rmError]; 236 | } 237 | 238 | NSURL *outputURL = [NSURL fileURLWithPath:outputPath]; 239 | NSError *awError = nil; 240 | AVAssetWriter *writer = [AVAssetWriter assetWriterWithURL:outputURL fileType:fileTypeForURL(outputURL) error:&awError]; 241 | if ( !writer) { 242 | NSLog(@"Failed to create AVAssetWriter: %@", awError); 243 | } 244 | 245 | AVAssetWriterInput *writerInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo 246 | outputSettings:getVideoSettings(size)]; 247 | [writer addInput:writerInput]; 248 | 249 | AVAssetWriterInputPixelBufferAdaptor *pixelBufferAdaptor = 250 | [AVAssetWriterInputPixelBufferAdaptor assetWriterInputPixelBufferAdaptorWithAssetWriterInput:writerInput 251 | sourcePixelBufferAttributes:nil]; 252 | 253 | NSDate *readyToWriteMovie = [NSDate date]; 254 | 255 | if ( ![ writer startWriting]) { 256 | NSLog(@"Failed to start writing: %@", [writer error]); 257 | } 258 | [writer startSessionAtSourceTime:kCMTimeZero]; 259 | if ( [Options verbose]) NSLog(@"started session"); 260 | 261 | dispatch_group_t decodingGroup = dispatch_group_create(); 262 | dispatch_group_enter(decodingGroup); 263 | 264 | dispatch_queue_t decoderQueue = dispatch_queue_create("frameDecoder", DISPATCH_QUEUE_SERIAL); 265 | 266 | __block CMTimeValue frame = 0; 267 | __block NSData *previousImgData = nil; 268 | __block NSUInteger nextUrl = 0; 269 | 270 | // 271 | // This is invoked repeatedly by requestMeduaDataWhenReadyOnQueue:usingBlock: to produce frames. 272 | // It is to return whenever writerInput is not ready for more data. Sort of a little inside-out 273 | // flowcontrol. 274 | // 275 | dispatch_block_t generator = ^() { 276 | for (;;) { 277 | // If we have reached the end, then bail out. 278 | if ( nextUrl >= [urls count]) { 279 | [writerInput markAsFinished]; 280 | dispatch_group_leave(decodingGroup); 281 | return; 282 | } 283 | 284 | // If we have overrun the encoder, then exit. We will get called again 285 | // when it is ready. 286 | if ( ![writerInput isReadyForMoreMediaData]) return; 287 | 288 | // Get our next URL 289 | NSURL *file = [urls objectAtIndex:nextUrl++]; 290 | 291 | @autoreleasepool { 292 | NSData *data = [[NSData alloc] initWithContentsOfURL:file]; 293 | if ( !data) { 294 | NSLog(@"bad url %@, skipped", file); 295 | } else { 296 | if ( !previousImgData || ![Options noDuplicates] || ![data isEqualToData:previousImgData]) { 297 | previousImgData = data; 298 | NSImage *img = [[NSImage alloc] initWithData:data]; 299 | if ( !img) { 300 | NSLog(@"bad image %@, skipped", file); 301 | } else { 302 | CVPixelBufferRef pBuf = newPixelBufferFromNSImage(img); 303 | [pixelBufferAdaptor appendPixelBuffer:pBuf 304 | withPresentationTime:CMTimeMake(frame++,(int)framesPerSecond)]; 305 | CFRelease(pBuf); 306 | if ( [Options verbose] ) NSLog(@"did image %@", file); 307 | 308 | if (nextUrl > posterIndex) { 309 | NSImage *small = [[NSImage alloc] initWithSize: size]; 310 | [small lockFocus]; 311 | [[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationHigh]; 312 | [img drawInRect:NSMakeRect(0, 0, size.width, size.height)]; 313 | [small unlockFocus]; 314 | 315 | NSBitmapImageRep *sbm = [NSBitmapImageRep imageRepWithData:[small TIFFRepresentation]]; 316 | NSData *jdata = [sbm representationUsingType:NSBitmapImageFileTypeJPEG properties:@{}]; 317 | 318 | NSError *err = 0; 319 | if ( ![jdata writeToFile:posterFile options:NSDataWritingAtomic error:&err]) { 320 | NSLog(@"Unable to write poster image to %@: %@", posterFile, [err localizedDescription]); 321 | } 322 | posterIndex = UINT64_MAX; 323 | } 324 | } 325 | } else { 326 | if ( [Options verbose] ) NSLog(@"skipped %@", file); 327 | } 328 | } 329 | } 330 | } 331 | }; 332 | 333 | // Start requesting frames 334 | [writerInput requestMediaDataWhenReadyOnQueue:decoderQueue usingBlock:generator]; 335 | 336 | // Wait for the decoding to complete. 337 | dispatch_group_wait(decodingGroup, DISPATCH_TIME_FOREVER); 338 | 339 | // Use a group to tell when we are done writing output. 340 | dispatch_group_t outputGroup = dispatch_group_create(); 341 | dispatch_group_enter(outputGroup); 342 | 343 | 344 | [writer finishWritingWithCompletionHandler:^() { 345 | if ( writer.status != AVAssetWriterStatusCompleted) { 346 | NSLog(@"encoding FAILED: %@", writer.error); 347 | } 348 | if ( [Options verbose] ) NSLog(@"finished writing"); 349 | dispatch_group_leave(outputGroup); 350 | }]; 351 | 352 | if ( [Options verbose] ) NSLog(@"waiting to finish"); 353 | dispatch_group_wait(outputGroup, DISPATCH_TIME_FOREVER); 354 | if ( [Options verbose] ) NSLog(@"finished"); 355 | 356 | NSDate *finished = [NSDate date]; 357 | 358 | if ( [Options verbose]) { 359 | NSLog(@"time to write movie: %6.2f seconds.", [finished timeIntervalSinceDate:readyToWriteMovie]); 360 | NSLog(@" total runtime: %6.2f seconds.", [finished timeIntervalSinceDate:started]); 361 | } 362 | } 363 | return 0; 364 | } 365 | -------------------------------------------------------------------------------- /TimeLapse.xcodeproj/jim.mode1v3: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ActivePerspectiveName 6 | Project 7 | AllowedModules 8 | 9 | 10 | BundleLoadPath 11 | 12 | MaxInstances 13 | n 14 | Module 15 | PBXSmartGroupTreeModule 16 | Name 17 | Groups and Files Outline View 18 | 19 | 20 | BundleLoadPath 21 | 22 | MaxInstances 23 | n 24 | Module 25 | PBXNavigatorGroup 26 | Name 27 | Editor 28 | 29 | 30 | BundleLoadPath 31 | 32 | MaxInstances 33 | n 34 | Module 35 | XCTaskListModule 36 | Name 37 | Task List 38 | 39 | 40 | BundleLoadPath 41 | 42 | MaxInstances 43 | n 44 | Module 45 | XCDetailModule 46 | Name 47 | File and Smart Group Detail Viewer 48 | 49 | 50 | BundleLoadPath 51 | 52 | MaxInstances 53 | 1 54 | Module 55 | PBXBuildResultsModule 56 | Name 57 | Detailed Build Results Viewer 58 | 59 | 60 | BundleLoadPath 61 | 62 | MaxInstances 63 | 1 64 | Module 65 | PBXProjectFindModule 66 | Name 67 | Project Batch Find Tool 68 | 69 | 70 | BundleLoadPath 71 | 72 | MaxInstances 73 | n 74 | Module 75 | XCProjectFormatConflictsModule 76 | Name 77 | Project Format Conflicts List 78 | 79 | 80 | BundleLoadPath 81 | 82 | MaxInstances 83 | n 84 | Module 85 | PBXBookmarksModule 86 | Name 87 | Bookmarks Tool 88 | 89 | 90 | BundleLoadPath 91 | 92 | MaxInstances 93 | n 94 | Module 95 | PBXClassBrowserModule 96 | Name 97 | Class Browser 98 | 99 | 100 | BundleLoadPath 101 | 102 | MaxInstances 103 | n 104 | Module 105 | PBXCVSModule 106 | Name 107 | Source Code Control Tool 108 | 109 | 110 | BundleLoadPath 111 | 112 | MaxInstances 113 | n 114 | Module 115 | PBXDebugBreakpointsModule 116 | Name 117 | Debug Breakpoints Tool 118 | 119 | 120 | BundleLoadPath 121 | 122 | MaxInstances 123 | n 124 | Module 125 | XCDockableInspector 126 | Name 127 | Inspector 128 | 129 | 130 | BundleLoadPath 131 | 132 | MaxInstances 133 | n 134 | Module 135 | PBXOpenQuicklyModule 136 | Name 137 | Open Quickly Tool 138 | 139 | 140 | BundleLoadPath 141 | 142 | MaxInstances 143 | 1 144 | Module 145 | PBXDebugSessionModule 146 | Name 147 | Debugger 148 | 149 | 150 | BundleLoadPath 151 | 152 | MaxInstances 153 | 1 154 | Module 155 | PBXDebugCLIModule 156 | Name 157 | Debug Console 158 | 159 | 160 | BundleLoadPath 161 | 162 | MaxInstances 163 | n 164 | Module 165 | XCSnapshotModule 166 | Name 167 | Snapshots Tool 168 | 169 | 170 | BundlePath 171 | /Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources 172 | Description 173 | DefaultDescriptionKey 174 | DockingSystemVisible 175 | 176 | Extension 177 | mode1v3 178 | FavBarConfig 179 | 180 | PBXProjectModuleGUID 181 | 38BCD10E106DC9F9001322EE 182 | XCBarModuleItemNames 183 | 184 | XCBarModuleItems 185 | 186 | 187 | FirstTimeWindowDisplayed 188 | 189 | Identifier 190 | com.apple.perspectives.project.mode1v3 191 | MajorVersion 192 | 33 193 | MinorVersion 194 | 0 195 | Name 196 | Default 197 | Notifications 198 | 199 | OpenEditors 200 | 201 | PerspectiveWidths 202 | 203 | -1 204 | -1 205 | 206 | Perspectives 207 | 208 | 209 | ChosenToolbarItems 210 | 211 | active-combo-popup 212 | action 213 | NSToolbarFlexibleSpaceItem 214 | debugger-enable-breakpoints 215 | build-and-go 216 | com.apple.ide.PBXToolbarStopButton 217 | get-info 218 | NSToolbarFlexibleSpaceItem 219 | com.apple.pbx.toolbar.searchfield 220 | 221 | ControllerClassBaseName 222 | 223 | IconName 224 | WindowOfProjectWithEditor 225 | Identifier 226 | perspective.project 227 | IsVertical 228 | 229 | Layout 230 | 231 | 232 | ContentConfiguration 233 | 234 | PBXBottomSmartGroupGIDs 235 | 236 | 1C37FBAC04509CD000000102 237 | 1C37FAAC04509CD000000102 238 | 1C37FABC05509CD000000102 239 | 1C37FABC05539CD112110102 240 | E2644B35053B69B200211256 241 | 1C37FABC04509CD000100104 242 | 1CC0EA4004350EF90044410B 243 | 1CC0EA4004350EF90041110B 244 | 245 | PBXProjectModuleGUID 246 | 1CE0B1FE06471DED0097A5F4 247 | PBXProjectModuleLabel 248 | Files 249 | PBXProjectStructureProvided 250 | yes 251 | PBXSmartGroupTreeModuleColumnData 252 | 253 | PBXSmartGroupTreeModuleColumnWidthsKey 254 | 255 | 186 256 | 257 | PBXSmartGroupTreeModuleColumnsKey_v4 258 | 259 | MainColumn 260 | 261 | 262 | PBXSmartGroupTreeModuleOutlineStateKey_v7 263 | 264 | PBXSmartGroupTreeModuleOutlineStateExpansionKey 265 | 266 | 08FB7794FE84155DC02AAC07 267 | 08FB7795FE84155DC02AAC07 268 | C6859EA2029092E104C91782 269 | 08FB779DFE84155DC02AAC07 270 | 1C37FBAC04509CD000000102 271 | 1C37FAAC04509CD000000102 272 | 1C37FABC05509CD000000102 273 | 274 | PBXSmartGroupTreeModuleOutlineStateSelectionKey 275 | 276 | 277 | 5 278 | 1 279 | 0 280 | 281 | 282 | PBXSmartGroupTreeModuleOutlineStateVisibleRectKey 283 | {{0, 0}, {186, 941}} 284 | 285 | PBXTopSmartGroupGIDs 286 | 287 | XCIncludePerspectivesSwitch 288 | 289 | XCSharingToken 290 | com.apple.Xcode.GFSharingToken 291 | 292 | GeometryConfiguration 293 | 294 | Frame 295 | {{0, 0}, {203, 959}} 296 | GroupTreeTableConfiguration 297 | 298 | MainColumn 299 | 186 300 | 301 | RubberWindowFrame 302 | 16 178 1234 1000 0 0 1920 1178 303 | 304 | Module 305 | PBXSmartGroupTreeModule 306 | Proportion 307 | 203pt 308 | 309 | 310 | Dock 311 | 312 | 313 | BecomeActive 314 | 315 | ContentConfiguration 316 | 317 | PBXProjectModuleGUID 318 | 1CE0B20306471E060097A5F4 319 | PBXProjectModuleLabel 320 | TimeLapse.m 321 | PBXSplitModuleInNavigatorKey 322 | 323 | Split0 324 | 325 | PBXProjectModuleGUID 326 | 1CE0B20406471E060097A5F4 327 | PBXProjectModuleLabel 328 | TimeLapse.m 329 | _historyCapacity 330 | 0 331 | bookmark 332 | 3831F26F129E360F004EA2CC 333 | history 334 | 335 | 38F6277B10858F98003C8009 336 | 382D48B811CC31D500FDB318 337 | 3831F217129DD8D9004EA2CC 338 | 3831F218129DD8D9004EA2CC 339 | 3831F268129DDF66004EA2CC 340 | 3831F26B129E360F004EA2CC 341 | 3831F26C129E360F004EA2CC 342 | 3831F26D129E360F004EA2CC 343 | 3831F26E129E360F004EA2CC 344 | 345 | 346 | SplitCount 347 | 1 348 | 349 | StatusBarVisibility 350 | 351 | 352 | GeometryConfiguration 353 | 354 | Frame 355 | {{0, 0}, {1026, 754}} 356 | RubberWindowFrame 357 | 16 178 1234 1000 0 0 1920 1178 358 | 359 | Module 360 | PBXNavigatorGroup 361 | Proportion 362 | 754pt 363 | 364 | 365 | ContentConfiguration 366 | 367 | PBXProjectModuleGUID 368 | 1CE0B20506471E060097A5F4 369 | PBXProjectModuleLabel 370 | Detail 371 | 372 | GeometryConfiguration 373 | 374 | Frame 375 | {{0, 759}, {1026, 200}} 376 | RubberWindowFrame 377 | 16 178 1234 1000 0 0 1920 1178 378 | 379 | Module 380 | XCDetailModule 381 | Proportion 382 | 200pt 383 | 384 | 385 | Proportion 386 | 1026pt 387 | 388 | 389 | Name 390 | Project 391 | ServiceClasses 392 | 393 | XCModuleDock 394 | PBXSmartGroupTreeModule 395 | XCModuleDock 396 | PBXNavigatorGroup 397 | XCDetailModule 398 | 399 | TableOfContents 400 | 401 | 3831F21C129DD8D9004EA2CC 402 | 1CE0B1FE06471DED0097A5F4 403 | 3831F21D129DD8D9004EA2CC 404 | 1CE0B20306471E060097A5F4 405 | 1CE0B20506471E060097A5F4 406 | 407 | ToolbarConfigUserDefaultsMinorVersion 408 | 2 409 | ToolbarConfiguration 410 | xcode.toolbar.config.defaultV3 411 | 412 | 413 | ControllerClassBaseName 414 | 415 | IconName 416 | WindowOfProject 417 | Identifier 418 | perspective.morph 419 | IsVertical 420 | 0 421 | Layout 422 | 423 | 424 | BecomeActive 425 | 1 426 | ContentConfiguration 427 | 428 | PBXBottomSmartGroupGIDs 429 | 430 | 1C37FBAC04509CD000000102 431 | 1C37FAAC04509CD000000102 432 | 1C08E77C0454961000C914BD 433 | 1C37FABC05509CD000000102 434 | 1C37FABC05539CD112110102 435 | E2644B35053B69B200211256 436 | 1C37FABC04509CD000100104 437 | 1CC0EA4004350EF90044410B 438 | 1CC0EA4004350EF90041110B 439 | 440 | PBXProjectModuleGUID 441 | 11E0B1FE06471DED0097A5F4 442 | PBXProjectModuleLabel 443 | Files 444 | PBXProjectStructureProvided 445 | yes 446 | PBXSmartGroupTreeModuleColumnData 447 | 448 | PBXSmartGroupTreeModuleColumnWidthsKey 449 | 450 | 186 451 | 452 | PBXSmartGroupTreeModuleColumnsKey_v4 453 | 454 | MainColumn 455 | 456 | 457 | PBXSmartGroupTreeModuleOutlineStateKey_v7 458 | 459 | PBXSmartGroupTreeModuleOutlineStateExpansionKey 460 | 461 | 29B97314FDCFA39411CA2CEA 462 | 1C37FABC05509CD000000102 463 | 464 | PBXSmartGroupTreeModuleOutlineStateSelectionKey 465 | 466 | 467 | 0 468 | 469 | 470 | PBXSmartGroupTreeModuleOutlineStateVisibleRectKey 471 | {{0, 0}, {186, 337}} 472 | 473 | PBXTopSmartGroupGIDs 474 | 475 | XCIncludePerspectivesSwitch 476 | 1 477 | XCSharingToken 478 | com.apple.Xcode.GFSharingToken 479 | 480 | GeometryConfiguration 481 | 482 | Frame 483 | {{0, 0}, {203, 355}} 484 | GroupTreeTableConfiguration 485 | 486 | MainColumn 487 | 186 488 | 489 | RubberWindowFrame 490 | 373 269 690 397 0 0 1440 878 491 | 492 | Module 493 | PBXSmartGroupTreeModule 494 | Proportion 495 | 100% 496 | 497 | 498 | Name 499 | Morph 500 | PreferredWidth 501 | 300 502 | ServiceClasses 503 | 504 | XCModuleDock 505 | PBXSmartGroupTreeModule 506 | 507 | TableOfContents 508 | 509 | 11E0B1FE06471DED0097A5F4 510 | 511 | ToolbarConfiguration 512 | xcode.toolbar.config.default.shortV3 513 | 514 | 515 | PerspectivesBarVisible 516 | 517 | ShelfIsVisible 518 | 519 | SourceDescription 520 | file at '/Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources/XCPerspectivesSpecificationMode1.xcperspec' 521 | StatusbarIsVisible 522 | 523 | TimeStamp 524 | 0.0 525 | ToolbarConfigUserDefaultsMinorVersion 526 | 2 527 | ToolbarDisplayMode 528 | 1 529 | ToolbarIsVisible 530 | 531 | ToolbarSizeMode 532 | 1 533 | Type 534 | Perspectives 535 | UpdateMessage 536 | The Default Workspace in this version of Xcode now includes support to hide and show the detail view (what has been referred to as the "Metro-Morph" feature). You must discard your current Default Workspace settings and update to the latest Default Workspace in order to gain this feature. Do you wish to update to the latest Workspace defaults for project '%@'? 537 | WindowJustification 538 | 5 539 | WindowOrderList 540 | 541 | 3831F21F129DD8D9004EA2CC 542 | 3831F220129DD8D9004EA2CC 543 | 1CD10A99069EF8BA00B06720 544 | 38BCD0F1106DC6EC001322EE 545 | 1C78EAAD065D492600B07095 546 | /Users/jim/Documents/Software/TimeLapse/TimeLapse.xcodeproj 547 | 548 | WindowString 549 | 16 178 1234 1000 0 0 1920 1178 550 | WindowToolsV3 551 | 552 | 553 | FirstTimeWindowDisplayed 554 | 555 | Identifier 556 | windowTool.build 557 | IsVertical 558 | 559 | Layout 560 | 561 | 562 | Dock 563 | 564 | 565 | ContentConfiguration 566 | 567 | PBXProjectModuleGUID 568 | 1CD0528F0623707200166675 569 | PBXProjectModuleLabel 570 | TimeLapse.m 571 | StatusBarVisibility 572 | 573 | 574 | GeometryConfiguration 575 | 576 | Frame 577 | {{0, 0}, {1110, 470}} 578 | RubberWindowFrame 579 | 587 249 1110 752 0 0 1920 1178 580 | 581 | Module 582 | PBXNavigatorGroup 583 | Proportion 584 | 470pt 585 | 586 | 587 | BecomeActive 588 | 589 | ContentConfiguration 590 | 591 | PBXProjectModuleGUID 592 | XCMainBuildResultsModuleGUID 593 | PBXProjectModuleLabel 594 | Build Results 595 | XCBuildResultsTrigger_Collapse 596 | 1021 597 | XCBuildResultsTrigger_Open 598 | 1011 599 | 600 | GeometryConfiguration 601 | 602 | Frame 603 | {{0, 475}, {1110, 236}} 604 | RubberWindowFrame 605 | 587 249 1110 752 0 0 1920 1178 606 | 607 | Module 608 | PBXBuildResultsModule 609 | Proportion 610 | 236pt 611 | 612 | 613 | Proportion 614 | 711pt 615 | 616 | 617 | Name 618 | Build Results 619 | ServiceClasses 620 | 621 | PBXBuildResultsModule 622 | 623 | StatusbarIsVisible 624 | 625 | TableOfContents 626 | 627 | 38BCD0F1106DC6EC001322EE 628 | 3831F1F6129DCEB7004EA2CC 629 | 1CD0528F0623707200166675 630 | XCMainBuildResultsModuleGUID 631 | 632 | ToolbarConfiguration 633 | xcode.toolbar.config.buildV3 634 | WindowContentMinSize 635 | 486 300 636 | WindowString 637 | 587 249 1110 752 0 0 1920 1178 638 | WindowToolGUID 639 | 38BCD0F1106DC6EC001322EE 640 | WindowToolIsVisible 641 | 642 | 643 | 644 | FirstTimeWindowDisplayed 645 | 646 | Identifier 647 | windowTool.debugger 648 | IsVertical 649 | 650 | Layout 651 | 652 | 653 | Dock 654 | 655 | 656 | ContentConfiguration 657 | 658 | Debugger 659 | 660 | HorizontalSplitView 661 | 662 | _collapsingFrameDimension 663 | 0.0 664 | _indexOfCollapsedView 665 | 0 666 | _percentageOfCollapsedView 667 | 0.0 668 | isCollapsed 669 | yes 670 | sizes 671 | 672 | {{0, 0}, {444, 410}} 673 | {{444, 0}, {531, 410}} 674 | 675 | 676 | VerticalSplitView 677 | 678 | _collapsingFrameDimension 679 | 0.0 680 | _indexOfCollapsedView 681 | 0 682 | _percentageOfCollapsedView 683 | 0.0 684 | isCollapsed 685 | yes 686 | sizes 687 | 688 | {{0, 0}, {975, 410}} 689 | {{0, 410}, {975, 367}} 690 | 691 | 692 | 693 | LauncherConfigVersion 694 | 8 695 | PBXProjectModuleGUID 696 | 1C162984064C10D400B95A72 697 | PBXProjectModuleLabel 698 | Debug - GLUTExamples (Underwater) 699 | 700 | GeometryConfiguration 701 | 702 | DebugConsoleVisible 703 | None 704 | DebugConsoleWindowFrame 705 | {{200, 200}, {500, 300}} 706 | DebugSTDIOWindowFrame 707 | {{200, 200}, {500, 300}} 708 | Frame 709 | {{0, 0}, {975, 777}} 710 | PBXDebugSessionStackFrameViewKey 711 | 712 | DebugVariablesTableConfiguration 713 | 714 | Name 715 | 120 716 | Value 717 | 85 718 | Summary 719 | 301 720 | 721 | Frame 722 | {{444, 0}, {531, 410}} 723 | RubberWindowFrame 724 | 587 183 975 818 0 0 1920 1178 725 | 726 | RubberWindowFrame 727 | 587 183 975 818 0 0 1920 1178 728 | 729 | Module 730 | PBXDebugSessionModule 731 | Proportion 732 | 777pt 733 | 734 | 735 | Proportion 736 | 777pt 737 | 738 | 739 | Name 740 | Debugger 741 | ServiceClasses 742 | 743 | PBXDebugSessionModule 744 | 745 | StatusbarIsVisible 746 | 747 | TableOfContents 748 | 749 | 1CD10A99069EF8BA00B06720 750 | 3831F1F7129DCEB7004EA2CC 751 | 1C162984064C10D400B95A72 752 | 3831F1F8129DCEB7004EA2CC 753 | 3831F1F9129DCEB7004EA2CC 754 | 3831F1FA129DCEB7004EA2CC 755 | 3831F1FB129DCEB7004EA2CC 756 | 3831F1FC129DCEB7004EA2CC 757 | 758 | ToolbarConfiguration 759 | xcode.toolbar.config.debugV3 760 | WindowString 761 | 587 183 975 818 0 0 1920 1178 762 | WindowToolGUID 763 | 1CD10A99069EF8BA00B06720 764 | WindowToolIsVisible 765 | 766 | 767 | 768 | FirstTimeWindowDisplayed 769 | 770 | Identifier 771 | windowTool.find 772 | IsVertical 773 | 774 | Layout 775 | 776 | 777 | Dock 778 | 779 | 780 | Dock 781 | 782 | 783 | ContentConfiguration 784 | 785 | PBXProjectModuleGUID 786 | 1CDD528C0622207200134675 787 | PBXProjectModuleLabel 788 | 789 | StatusBarVisibility 790 | 791 | 792 | GeometryConfiguration 793 | 794 | Frame 795 | {{0, 0}, {878, 599}} 796 | RubberWindowFrame 797 | 815 321 878 857 0 0 1920 1178 798 | 799 | Module 800 | PBXNavigatorGroup 801 | Proportion 802 | 878pt 803 | 804 | 805 | Proportion 806 | 599pt 807 | 808 | 809 | BecomeActive 810 | 811 | ContentConfiguration 812 | 813 | PBXProjectModuleGUID 814 | 1CD0528E0623707200166675 815 | PBXProjectModuleLabel 816 | Project Find 817 | 818 | GeometryConfiguration 819 | 820 | Frame 821 | {{0, 604}, {878, 212}} 822 | RubberWindowFrame 823 | 815 321 878 857 0 0 1920 1178 824 | 825 | Module 826 | PBXProjectFindModule 827 | Proportion 828 | 212pt 829 | 830 | 831 | Proportion 832 | 816pt 833 | 834 | 835 | Name 836 | Project Find 837 | ServiceClasses 838 | 839 | PBXProjectFindModule 840 | 841 | StatusbarIsVisible 842 | 843 | TableOfContents 844 | 845 | 1C530D57069F1CE1000CFCEE 846 | 382D489E11CC25FD00FDB318 847 | 382D489F11CC25FD00FDB318 848 | 1CDD528C0622207200134675 849 | 1CD0528E0623707200166675 850 | 851 | WindowString 852 | 815 321 878 857 0 0 1920 1178 853 | WindowToolGUID 854 | 1C530D57069F1CE1000CFCEE 855 | WindowToolIsVisible 856 | 857 | 858 | 859 | Identifier 860 | MENUSEPARATOR 861 | 862 | 863 | FirstTimeWindowDisplayed 864 | 865 | Identifier 866 | windowTool.debuggerConsole 867 | IsVertical 868 | 869 | Layout 870 | 871 | 872 | Dock 873 | 874 | 875 | BecomeActive 876 | 877 | ContentConfiguration 878 | 879 | PBXProjectModuleGUID 880 | 1C78EAAC065D492600B07095 881 | PBXProjectModuleLabel 882 | Debugger Console 883 | 884 | GeometryConfiguration 885 | 886 | Frame 887 | {{0, 0}, {1007, 384}} 888 | RubberWindowFrame 889 | 24 78 1007 425 0 0 1920 1178 890 | 891 | Module 892 | PBXDebugCLIModule 893 | Proportion 894 | 384pt 895 | 896 | 897 | Proportion 898 | 384pt 899 | 900 | 901 | Name 902 | Debugger Console 903 | ServiceClasses 904 | 905 | PBXDebugCLIModule 906 | 907 | StatusbarIsVisible 908 | 909 | TableOfContents 910 | 911 | 1C78EAAD065D492600B07095 912 | 3831F1FD129DCEB7004EA2CC 913 | 1C78EAAC065D492600B07095 914 | 915 | ToolbarConfiguration 916 | xcode.toolbar.config.consoleV3 917 | WindowString 918 | 24 78 1007 425 0 0 1920 1178 919 | WindowToolGUID 920 | 1C78EAAD065D492600B07095 921 | WindowToolIsVisible 922 | 923 | 924 | 925 | Identifier 926 | windowTool.snapshots 927 | Layout 928 | 929 | 930 | Dock 931 | 932 | 933 | Module 934 | XCSnapshotModule 935 | Proportion 936 | 100% 937 | 938 | 939 | Proportion 940 | 100% 941 | 942 | 943 | Name 944 | Snapshots 945 | ServiceClasses 946 | 947 | XCSnapshotModule 948 | 949 | StatusbarIsVisible 950 | Yes 951 | ToolbarConfiguration 952 | xcode.toolbar.config.snapshots 953 | WindowString 954 | 315 824 300 550 0 0 1440 878 955 | WindowToolIsVisible 956 | Yes 957 | 958 | 959 | Identifier 960 | windowTool.scm 961 | Layout 962 | 963 | 964 | Dock 965 | 966 | 967 | ContentConfiguration 968 | 969 | PBXProjectModuleGUID 970 | 1C78EAB2065D492600B07095 971 | PBXProjectModuleLabel 972 | <No Editor> 973 | PBXSplitModuleInNavigatorKey 974 | 975 | Split0 976 | 977 | PBXProjectModuleGUID 978 | 1C78EAB3065D492600B07095 979 | 980 | SplitCount 981 | 1 982 | 983 | StatusBarVisibility 984 | 1 985 | 986 | GeometryConfiguration 987 | 988 | Frame 989 | {{0, 0}, {452, 0}} 990 | RubberWindowFrame 991 | 743 379 452 308 0 0 1280 1002 992 | 993 | Module 994 | PBXNavigatorGroup 995 | Proportion 996 | 0pt 997 | 998 | 999 | BecomeActive 1000 | 1 1001 | ContentConfiguration 1002 | 1003 | PBXProjectModuleGUID 1004 | 1CD052920623707200166675 1005 | PBXProjectModuleLabel 1006 | SCM 1007 | 1008 | GeometryConfiguration 1009 | 1010 | ConsoleFrame 1011 | {{0, 259}, {452, 0}} 1012 | Frame 1013 | {{0, 7}, {452, 259}} 1014 | RubberWindowFrame 1015 | 743 379 452 308 0 0 1280 1002 1016 | TableConfiguration 1017 | 1018 | Status 1019 | 30 1020 | FileName 1021 | 199 1022 | Path 1023 | 197.0950012207031 1024 | 1025 | TableFrame 1026 | {{0, 0}, {452, 250}} 1027 | 1028 | Module 1029 | PBXCVSModule 1030 | Proportion 1031 | 262pt 1032 | 1033 | 1034 | Proportion 1035 | 266pt 1036 | 1037 | 1038 | Name 1039 | SCM 1040 | ServiceClasses 1041 | 1042 | PBXCVSModule 1043 | 1044 | StatusbarIsVisible 1045 | 1 1046 | TableOfContents 1047 | 1048 | 1C78EAB4065D492600B07095 1049 | 1C78EAB5065D492600B07095 1050 | 1C78EAB2065D492600B07095 1051 | 1CD052920623707200166675 1052 | 1053 | ToolbarConfiguration 1054 | xcode.toolbar.config.scm 1055 | WindowString 1056 | 743 379 452 308 0 0 1280 1002 1057 | 1058 | 1059 | Identifier 1060 | windowTool.breakpoints 1061 | IsVertical 1062 | 0 1063 | Layout 1064 | 1065 | 1066 | Dock 1067 | 1068 | 1069 | BecomeActive 1070 | 1 1071 | ContentConfiguration 1072 | 1073 | PBXBottomSmartGroupGIDs 1074 | 1075 | 1C77FABC04509CD000000102 1076 | 1077 | PBXProjectModuleGUID 1078 | 1CE0B1FE06471DED0097A5F4 1079 | PBXProjectModuleLabel 1080 | Files 1081 | PBXProjectStructureProvided 1082 | no 1083 | PBXSmartGroupTreeModuleColumnData 1084 | 1085 | PBXSmartGroupTreeModuleColumnWidthsKey 1086 | 1087 | 168 1088 | 1089 | PBXSmartGroupTreeModuleColumnsKey_v4 1090 | 1091 | MainColumn 1092 | 1093 | 1094 | PBXSmartGroupTreeModuleOutlineStateKey_v7 1095 | 1096 | PBXSmartGroupTreeModuleOutlineStateExpansionKey 1097 | 1098 | 1C77FABC04509CD000000102 1099 | 1100 | PBXSmartGroupTreeModuleOutlineStateSelectionKey 1101 | 1102 | 1103 | 0 1104 | 1105 | 1106 | PBXSmartGroupTreeModuleOutlineStateVisibleRectKey 1107 | {{0, 0}, {168, 350}} 1108 | 1109 | PBXTopSmartGroupGIDs 1110 | 1111 | XCIncludePerspectivesSwitch 1112 | 0 1113 | 1114 | GeometryConfiguration 1115 | 1116 | Frame 1117 | {{0, 0}, {185, 368}} 1118 | GroupTreeTableConfiguration 1119 | 1120 | MainColumn 1121 | 168 1122 | 1123 | RubberWindowFrame 1124 | 315 424 744 409 0 0 1440 878 1125 | 1126 | Module 1127 | PBXSmartGroupTreeModule 1128 | Proportion 1129 | 185pt 1130 | 1131 | 1132 | ContentConfiguration 1133 | 1134 | PBXProjectModuleGUID 1135 | 1CA1AED706398EBD00589147 1136 | PBXProjectModuleLabel 1137 | Detail 1138 | 1139 | GeometryConfiguration 1140 | 1141 | Frame 1142 | {{190, 0}, {554, 368}} 1143 | RubberWindowFrame 1144 | 315 424 744 409 0 0 1440 878 1145 | 1146 | Module 1147 | XCDetailModule 1148 | Proportion 1149 | 554pt 1150 | 1151 | 1152 | Proportion 1153 | 368pt 1154 | 1155 | 1156 | MajorVersion 1157 | 3 1158 | MinorVersion 1159 | 0 1160 | Name 1161 | Breakpoints 1162 | ServiceClasses 1163 | 1164 | PBXSmartGroupTreeModule 1165 | XCDetailModule 1166 | 1167 | StatusbarIsVisible 1168 | 1 1169 | TableOfContents 1170 | 1171 | 1CDDB66807F98D9800BB5817 1172 | 1CDDB66907F98D9800BB5817 1173 | 1CE0B1FE06471DED0097A5F4 1174 | 1CA1AED706398EBD00589147 1175 | 1176 | ToolbarConfiguration 1177 | xcode.toolbar.config.breakpointsV3 1178 | WindowString 1179 | 315 424 744 409 0 0 1440 878 1180 | WindowToolGUID 1181 | 1CDDB66807F98D9800BB5817 1182 | WindowToolIsVisible 1183 | 1 1184 | 1185 | 1186 | Identifier 1187 | windowTool.debugAnimator 1188 | Layout 1189 | 1190 | 1191 | Dock 1192 | 1193 | 1194 | Module 1195 | PBXNavigatorGroup 1196 | Proportion 1197 | 100% 1198 | 1199 | 1200 | Proportion 1201 | 100% 1202 | 1203 | 1204 | Name 1205 | Debug Visualizer 1206 | ServiceClasses 1207 | 1208 | PBXNavigatorGroup 1209 | 1210 | StatusbarIsVisible 1211 | 1 1212 | ToolbarConfiguration 1213 | xcode.toolbar.config.debugAnimatorV3 1214 | WindowString 1215 | 100 100 700 500 0 0 1280 1002 1216 | 1217 | 1218 | Identifier 1219 | windowTool.bookmarks 1220 | Layout 1221 | 1222 | 1223 | Dock 1224 | 1225 | 1226 | Module 1227 | PBXBookmarksModule 1228 | Proportion 1229 | 100% 1230 | 1231 | 1232 | Proportion 1233 | 100% 1234 | 1235 | 1236 | Name 1237 | Bookmarks 1238 | ServiceClasses 1239 | 1240 | PBXBookmarksModule 1241 | 1242 | StatusbarIsVisible 1243 | 0 1244 | WindowString 1245 | 538 42 401 187 0 0 1280 1002 1246 | 1247 | 1248 | Identifier 1249 | windowTool.projectFormatConflicts 1250 | Layout 1251 | 1252 | 1253 | Dock 1254 | 1255 | 1256 | Module 1257 | XCProjectFormatConflictsModule 1258 | Proportion 1259 | 100% 1260 | 1261 | 1262 | Proportion 1263 | 100% 1264 | 1265 | 1266 | Name 1267 | Project Format Conflicts 1268 | ServiceClasses 1269 | 1270 | XCProjectFormatConflictsModule 1271 | 1272 | StatusbarIsVisible 1273 | 0 1274 | WindowContentMinSize 1275 | 450 300 1276 | WindowString 1277 | 50 850 472 307 0 0 1440 877 1278 | 1279 | 1280 | Identifier 1281 | windowTool.classBrowser 1282 | Layout 1283 | 1284 | 1285 | Dock 1286 | 1287 | 1288 | BecomeActive 1289 | 1 1290 | ContentConfiguration 1291 | 1292 | OptionsSetName 1293 | Hierarchy, all classes 1294 | PBXProjectModuleGUID 1295 | 1CA6456E063B45B4001379D8 1296 | PBXProjectModuleLabel 1297 | Class Browser - NSObject 1298 | 1299 | GeometryConfiguration 1300 | 1301 | ClassesFrame 1302 | {{0, 0}, {374, 96}} 1303 | ClassesTreeTableConfiguration 1304 | 1305 | PBXClassNameColumnIdentifier 1306 | 208 1307 | PBXClassBookColumnIdentifier 1308 | 22 1309 | 1310 | Frame 1311 | {{0, 0}, {630, 331}} 1312 | MembersFrame 1313 | {{0, 105}, {374, 395}} 1314 | MembersTreeTableConfiguration 1315 | 1316 | PBXMemberTypeIconColumnIdentifier 1317 | 22 1318 | PBXMemberNameColumnIdentifier 1319 | 216 1320 | PBXMemberTypeColumnIdentifier 1321 | 97 1322 | PBXMemberBookColumnIdentifier 1323 | 22 1324 | 1325 | PBXModuleWindowStatusBarHidden2 1326 | 1 1327 | RubberWindowFrame 1328 | 385 179 630 352 0 0 1440 878 1329 | 1330 | Module 1331 | PBXClassBrowserModule 1332 | Proportion 1333 | 332pt 1334 | 1335 | 1336 | Proportion 1337 | 332pt 1338 | 1339 | 1340 | Name 1341 | Class Browser 1342 | ServiceClasses 1343 | 1344 | PBXClassBrowserModule 1345 | 1346 | StatusbarIsVisible 1347 | 0 1348 | TableOfContents 1349 | 1350 | 1C0AD2AF069F1E9B00FABCE6 1351 | 1C0AD2B0069F1E9B00FABCE6 1352 | 1CA6456E063B45B4001379D8 1353 | 1354 | ToolbarConfiguration 1355 | xcode.toolbar.config.classbrowser 1356 | WindowString 1357 | 385 179 630 352 0 0 1440 878 1358 | WindowToolGUID 1359 | 1C0AD2AF069F1E9B00FABCE6 1360 | WindowToolIsVisible 1361 | 0 1362 | 1363 | 1364 | Identifier 1365 | windowTool.refactoring 1366 | IncludeInToolsMenu 1367 | 0 1368 | Layout 1369 | 1370 | 1371 | Dock 1372 | 1373 | 1374 | BecomeActive 1375 | 1 1376 | GeometryConfiguration 1377 | 1378 | Frame 1379 | {0, 0}, {500, 335} 1380 | RubberWindowFrame 1381 | {0, 0}, {500, 335} 1382 | 1383 | Module 1384 | XCRefactoringModule 1385 | Proportion 1386 | 100% 1387 | 1388 | 1389 | Proportion 1390 | 100% 1391 | 1392 | 1393 | Name 1394 | Refactoring 1395 | ServiceClasses 1396 | 1397 | XCRefactoringModule 1398 | 1399 | WindowString 1400 | 200 200 500 356 0 0 1920 1200 1401 | 1402 | 1403 | 1404 | 1405 | -------------------------------------------------------------------------------- /TimeLapse.xcodeproj/jim.pbxuser: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | 08FB7793FE84155DC02AAC07 /* Project object */ = { 4 | activeBuildConfigurationName = Release; 5 | activeExecutable = 38BCD0CA106DBB8A001322EE /* TimeLapse */; 6 | activeTarget = 8DD76F960486AA7600D96B5E /* TimeLapse */; 7 | addToTargets = ( 8 | 8DD76F960486AA7600D96B5E /* TimeLapse */, 9 | ); 10 | breakpoints = ( 11 | 3831F22C129DDCF4004EA2CC /* Options.m:70 */, 12 | 3831F22E129DDCF8004EA2CC /* Options.m:28 */, 13 | ); 14 | codeSenseManager = 38BCD0D4106DBBA8001322EE /* Code sense */; 15 | executables = ( 16 | 38BCD0CA106DBB8A001322EE /* TimeLapse */, 17 | ); 18 | perUserDictionary = { 19 | PBXConfiguration.PBXFileTableDataSource3.PBXExecutablesDataSource = { 20 | PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; 21 | PBXFileTableDataSourceColumnSortingKey = PBXExecutablesDataSource_NameID; 22 | PBXFileTableDataSourceColumnWidthsKey = ( 23 | 22, 24 | 300, 25 | 675, 26 | ); 27 | PBXFileTableDataSourceColumnsKey = ( 28 | PBXExecutablesDataSource_ActiveFlagID, 29 | PBXExecutablesDataSource_NameID, 30 | PBXExecutablesDataSource_CommentsID, 31 | ); 32 | }; 33 | PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = { 34 | PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; 35 | PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; 36 | PBXFileTableDataSourceColumnWidthsKey = ( 37 | 20, 38 | 787, 39 | 20, 40 | 48, 41 | 43, 42 | 43, 43 | 20, 44 | ); 45 | PBXFileTableDataSourceColumnsKey = ( 46 | PBXFileDataSource_FiletypeID, 47 | PBXFileDataSource_Filename_ColumnID, 48 | PBXFileDataSource_Built_ColumnID, 49 | PBXFileDataSource_ObjectSize_ColumnID, 50 | PBXFileDataSource_Errors_ColumnID, 51 | PBXFileDataSource_Warnings_ColumnID, 52 | PBXFileDataSource_Target_ColumnID, 53 | ); 54 | }; 55 | PBXConfiguration.PBXFileTableDataSource3.XCSCMDataSource = { 56 | PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; 57 | PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; 58 | PBXFileTableDataSourceColumnWidthsKey = ( 59 | 20, 60 | 20, 61 | 763, 62 | 20, 63 | 48, 64 | 43, 65 | 43, 66 | 20, 67 | ); 68 | PBXFileTableDataSourceColumnsKey = ( 69 | PBXFileDataSource_SCM_ColumnID, 70 | PBXFileDataSource_FiletypeID, 71 | PBXFileDataSource_Filename_ColumnID, 72 | PBXFileDataSource_Built_ColumnID, 73 | PBXFileDataSource_ObjectSize_ColumnID, 74 | PBXFileDataSource_Errors_ColumnID, 75 | PBXFileDataSource_Warnings_ColumnID, 76 | PBXFileDataSource_Target_ColumnID, 77 | ); 78 | }; 79 | PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = { 80 | PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; 81 | PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; 82 | PBXFileTableDataSourceColumnWidthsKey = ( 83 | 20, 84 | 747, 85 | 60, 86 | 20, 87 | 48, 88 | 43, 89 | 43, 90 | ); 91 | PBXFileTableDataSourceColumnsKey = ( 92 | PBXFileDataSource_FiletypeID, 93 | PBXFileDataSource_Filename_ColumnID, 94 | PBXTargetDataSource_PrimaryAttribute, 95 | PBXFileDataSource_Built_ColumnID, 96 | PBXFileDataSource_ObjectSize_ColumnID, 97 | PBXFileDataSource_Errors_ColumnID, 98 | PBXFileDataSource_Warnings_ColumnID, 99 | ); 100 | }; 101 | PBXPerProjectTemplateStateSaveDate = 312330588; 102 | PBXWorkspaceStateSaveDate = 312330588; 103 | }; 104 | perUserProjectItems = { 105 | 382D48A011CC25FD00FDB318 = 382D48A011CC25FD00FDB318 /* PBXTextBookmark */; 106 | 382D48B811CC31D500FDB318 = 382D48B811CC31D500FDB318 /* PBXTextBookmark */; 107 | 382D48E611CC380000FDB318 = 382D48E611CC380000FDB318 /* PBXTextBookmark */; 108 | 382D48F111CC389800FDB318 = 382D48F111CC389800FDB318 /* PBXTextBookmark */; 109 | 382D48F211CC389800FDB318 = 382D48F211CC389800FDB318 /* PBXTextBookmark */; 110 | 382D48FC11CDBC5F00FDB318 = 382D48FC11CDBC5F00FDB318 /* PBXTextBookmark */; 111 | 382D48FD11CDBC5F00FDB318 = 382D48FD11CDBC5F00FDB318 /* PBXTextBookmark */; 112 | 3831F206129DD6DA004EA2CC /* XCBuildMessageTextBookmark */ = 3831F206129DD6DA004EA2CC /* XCBuildMessageTextBookmark */; 113 | 3831F207129DD6DA004EA2CC /* PBXTextBookmark */ = 3831F207129DD6DA004EA2CC /* PBXTextBookmark */; 114 | 3831F216129DD8D9004EA2CC /* PBXTextBookmark */ = 3831F216129DD8D9004EA2CC /* PBXTextBookmark */; 115 | 3831F217129DD8D9004EA2CC /* PBXTextBookmark */ = 3831F217129DD8D9004EA2CC /* PBXTextBookmark */; 116 | 3831F218129DD8D9004EA2CC /* PBXTextBookmark */ = 3831F218129DD8D9004EA2CC /* PBXTextBookmark */; 117 | 3831F219129DD8D9004EA2CC /* PBXTextBookmark */ = 3831F219129DD8D9004EA2CC /* PBXTextBookmark */; 118 | 3831F21A129DD8D9004EA2CC /* PBXTextBookmark */ = 3831F21A129DD8D9004EA2CC /* PBXTextBookmark */; 119 | 3831F21B129DD8D9004EA2CC /* PBXTextBookmark */ = 3831F21B129DD8D9004EA2CC /* PBXTextBookmark */; 120 | 3831F225129DDC93004EA2CC /* PBXTextBookmark */ = 3831F225129DDC93004EA2CC /* PBXTextBookmark */; 121 | 3831F226129DDC93004EA2CC /* PBXTextBookmark */ = 3831F226129DDC93004EA2CC /* PBXTextBookmark */; 122 | 3831F227129DDC93004EA2CC /* PBXTextBookmark */ = 3831F227129DDC93004EA2CC /* PBXTextBookmark */; 123 | 3831F228129DDC93004EA2CC /* PBXTextBookmark */ = 3831F228129DDC93004EA2CC /* PBXTextBookmark */; 124 | 3831F241129DDD9E004EA2CC /* PBXTextBookmark */ = 3831F241129DDD9E004EA2CC /* PBXTextBookmark */; 125 | 3831F242129DDD9E004EA2CC /* PBXTextBookmark */ = 3831F242129DDD9E004EA2CC /* PBXTextBookmark */; 126 | 3831F243129DDD9E004EA2CC /* PBXTextBookmark */ = 3831F243129DDD9E004EA2CC /* PBXTextBookmark */; 127 | 3831F253129DDE93004EA2CC /* PBXTextBookmark */ = 3831F253129DDE93004EA2CC /* PBXTextBookmark */; 128 | 3831F254129DDE93004EA2CC /* PBXTextBookmark */ = 3831F254129DDE93004EA2CC /* PBXTextBookmark */; 129 | 3831F256129DDE93004EA2CC /* PBXTextBookmark */ = 3831F256129DDE93004EA2CC /* PBXTextBookmark */; 130 | 3831F25B129DDEEA004EA2CC /* PBXTextBookmark */ = 3831F25B129DDEEA004EA2CC /* PBXTextBookmark */; 131 | 3831F267129DDF5C004EA2CC /* PBXTextBookmark */ = 3831F267129DDF5C004EA2CC /* PBXTextBookmark */; 132 | 3831F268129DDF66004EA2CC /* PBXTextBookmark */ = 3831F268129DDF66004EA2CC /* PBXTextBookmark */; 133 | 3831F26A129DDF66004EA2CC /* PBXTextBookmark */ = 3831F26A129DDF66004EA2CC /* PBXTextBookmark */; 134 | 3831F26B129E360F004EA2CC /* PBXTextBookmark */ = 3831F26B129E360F004EA2CC /* PBXTextBookmark */; 135 | 3831F26C129E360F004EA2CC /* PBXTextBookmark */ = 3831F26C129E360F004EA2CC /* PBXTextBookmark */; 136 | 3831F26D129E360F004EA2CC /* PBXTextBookmark */ = 3831F26D129E360F004EA2CC /* PBXTextBookmark */; 137 | 3831F26E129E360F004EA2CC /* PBXTextBookmark */ = 3831F26E129E360F004EA2CC /* PBXTextBookmark */; 138 | 3831F26F129E360F004EA2CC /* PBXTextBookmark */ = 3831F26F129E360F004EA2CC /* PBXTextBookmark */; 139 | 3831F272129E3906004EA2CC /* PBXTextBookmark */ = 3831F272129E3906004EA2CC /* PBXTextBookmark */; 140 | 3831F277129E3964004EA2CC /* XCBuildMessageTextBookmark */ = 3831F277129E3964004EA2CC /* XCBuildMessageTextBookmark */; 141 | 3831F278129E3964004EA2CC /* PBXTextBookmark */ = 3831F278129E3964004EA2CC /* PBXTextBookmark */; 142 | 38515789108395F60027E8D7 = 38515789108395F60027E8D7 /* PBXTextBookmark */; 143 | 3851578A108395F60027E8D7 = 3851578A108395F60027E8D7 /* PBXTextBookmark */; 144 | 38F6277B10858F98003C8009 = 38F6277B10858F98003C8009 /* PBXTextBookmark */; 145 | 38F627C51086E984003C8009 = 38F627C51086E984003C8009 /* PBXTextBookmark */; 146 | }; 147 | sourceControlManager = 38BCD0D3106DBBA8001322EE /* Source Control */; 148 | userBuildSettings = { 149 | }; 150 | }; 151 | 08FB7796FE84155DC02AAC07 /* TimeLapse.m */ = { 152 | uiCtxt = { 153 | sepNavIntBoundsRect = "{{0, 0}, {965, 1716}}"; 154 | sepNavSelRange = "{1197, 0}"; 155 | sepNavVisRange = "{130, 2120}"; 156 | sepNavWindowFrame = "{{287, 69}, {938, 1109}}"; 157 | }; 158 | }; 159 | 32A70AAB03705E1F00C91783 /* TimeLapse_Prefix.pch */ = { 160 | uiCtxt = { 161 | sepNavIntBoundsRect = "{{0, 0}, {965, 722}}"; 162 | sepNavSelRange = "{160, 0}"; 163 | sepNavVisRange = "{0, 160}"; 164 | }; 165 | }; 166 | 382D48A011CC25FD00FDB318 /* PBXTextBookmark */ = { 167 | isa = PBXTextBookmark; 168 | fRef = 32A70AAB03705E1F00C91783 /* TimeLapse_Prefix.pch */; 169 | name = "TimeLapse_Prefix.pch: 1"; 170 | rLen = 0; 171 | rLoc = 0; 172 | rType = 0; 173 | vrLen = 160; 174 | vrLoc = 0; 175 | }; 176 | 382D48B811CC31D500FDB318 /* PBXTextBookmark */ = { 177 | isa = PBXTextBookmark; 178 | fRef = 38F6277E10858F98003C8009 /* QTKitDefines.h */; 179 | name = "QTKitDefines.h: 252"; 180 | rLen = 32; 181 | rLoc = 9477; 182 | rType = 0; 183 | vrLen = 1918; 184 | vrLoc = 8241; 185 | }; 186 | 382D48E611CC380000FDB318 /* PBXTextBookmark */ = { 187 | isa = PBXTextBookmark; 188 | fRef = 38BCD0D8106DBD81001322EE /* Options.h */; 189 | name = "Options.h: 22"; 190 | rLen = 0; 191 | rLoc = 376; 192 | rType = 0; 193 | vrLen = 383; 194 | vrLoc = 0; 195 | }; 196 | 382D48F111CC389800FDB318 /* PBXTextBookmark */ = { 197 | isa = PBXTextBookmark; 198 | fRef = 08FB7796FE84155DC02AAC07 /* TimeLapse.m */; 199 | name = "TimeLapse.m: 64"; 200 | rLen = 0; 201 | rLoc = 2203; 202 | rType = 0; 203 | vrLen = 2414; 204 | vrLoc = 282; 205 | }; 206 | 382D48F211CC389800FDB318 /* PBXTextBookmark */ = { 207 | isa = PBXTextBookmark; 208 | fRef = 38BCD0D9106DBD81001322EE /* Options.m */; 209 | name = "Options.m: 76"; 210 | rLen = 0; 211 | rLoc = 1939; 212 | rType = 0; 213 | vrLen = 1514; 214 | vrLoc = 393; 215 | }; 216 | 382D48FC11CDBC5F00FDB318 /* PBXTextBookmark */ = { 217 | isa = PBXTextBookmark; 218 | fRef = 38BCD0D9106DBD81001322EE /* Options.m */; 219 | name = "Options.m: 30"; 220 | rLen = 0; 221 | rLoc = 831; 222 | rType = 0; 223 | vrLen = 1517; 224 | vrLoc = 394; 225 | }; 226 | 382D48FD11CDBC5F00FDB318 /* PBXTextBookmark */ = { 227 | isa = PBXTextBookmark; 228 | fRef = 08FB7796FE84155DC02AAC07 /* TimeLapse.m */; 229 | name = "TimeLapse.m: 66"; 230 | rLen = 0; 231 | rLoc = 2249; 232 | rType = 0; 233 | vrLen = 2696; 234 | vrLoc = 0; 235 | }; 236 | 3831F206129DD6DA004EA2CC /* XCBuildMessageTextBookmark */ = { 237 | isa = PBXTextBookmark; 238 | comments = "'noDuplicates' undeclared (first use in this function)"; 239 | fRef = 08FB7796FE84155DC02AAC07 /* TimeLapse.m */; 240 | fallbackIsa = XCBuildMessageTextBookmark; 241 | rLen = 1; 242 | rLoc = 83; 243 | rType = 1; 244 | }; 245 | 3831F207129DD6DA004EA2CC /* PBXTextBookmark */ = { 246 | isa = PBXTextBookmark; 247 | fRef = 08FB7796FE84155DC02AAC07 /* TimeLapse.m */; 248 | name = "TimeLapse.m: 84"; 249 | rLen = 0; 250 | rLoc = 2977; 251 | rType = 0; 252 | vrLen = 590; 253 | vrLoc = 2689; 254 | }; 255 | 3831F216129DD8D9004EA2CC /* PBXTextBookmark */ = { 256 | isa = PBXTextBookmark; 257 | fRef = 38BCD0D9106DBD81001322EE /* Options.m */; 258 | name = "Options.m: 58"; 259 | rLen = 0; 260 | rLoc = 1559; 261 | rType = 0; 262 | vrLen = 1589; 263 | vrLoc = 0; 264 | }; 265 | 3831F217129DD8D9004EA2CC /* PBXTextBookmark */ = { 266 | isa = PBXTextBookmark; 267 | fRef = C6859EA3029092ED04C91782 /* TimeLapse.1 */; 268 | name = "TimeLapse.1: 1"; 269 | rLen = 0; 270 | rLoc = 0; 271 | rType = 0; 272 | vrLen = 2540; 273 | vrLoc = 0; 274 | }; 275 | 3831F218129DD8D9004EA2CC /* PBXTextBookmark */ = { 276 | isa = PBXTextBookmark; 277 | fRef = 38BCD0D6106DBBD7001322EE /* NOTES.rtf */; 278 | name = "NOTES.rtf: 10"; 279 | rLen = 0; 280 | rLoc = 222; 281 | rType = 0; 282 | vrLen = 333; 283 | vrLoc = 0; 284 | }; 285 | 3831F219129DD8D9004EA2CC /* PBXTextBookmark */ = { 286 | isa = PBXTextBookmark; 287 | fRef = 38BCD0D8106DBD81001322EE /* Options.h */; 288 | name = "Options.h: 24"; 289 | rLen = 0; 290 | rLoc = 398; 291 | rType = 0; 292 | vrLen = 404; 293 | vrLoc = 0; 294 | }; 295 | 3831F21A129DD8D9004EA2CC /* PBXTextBookmark */ = { 296 | isa = PBXTextBookmark; 297 | fRef = 08FB7796FE84155DC02AAC07 /* TimeLapse.m */; 298 | name = "TimeLapse.m: 84"; 299 | rLen = 0; 300 | rLoc = 2977; 301 | rType = 0; 302 | vrLen = 1865; 303 | vrLoc = 0; 304 | }; 305 | 3831F21B129DD8D9004EA2CC /* PBXTextBookmark */ = { 306 | isa = PBXTextBookmark; 307 | fRef = 08FB7796FE84155DC02AAC07 /* TimeLapse.m */; 308 | name = "TimeLapse.m: 84"; 309 | rLen = 0; 310 | rLoc = 2977; 311 | rType = 0; 312 | vrLen = 1923; 313 | vrLoc = 1752; 314 | }; 315 | 3831F225129DDC93004EA2CC /* PBXTextBookmark */ = { 316 | isa = PBXTextBookmark; 317 | fRef = 38BCD0D8106DBD81001322EE /* Options.h */; 318 | name = "Options.h: 24"; 319 | rLen = 0; 320 | rLoc = 398; 321 | rType = 0; 322 | vrLen = 404; 323 | vrLoc = 0; 324 | }; 325 | 3831F226129DDC93004EA2CC /* PBXTextBookmark */ = { 326 | isa = PBXTextBookmark; 327 | fRef = 38BCD0D9106DBD81001322EE /* Options.m */; 328 | name = "Options.m: 65"; 329 | rLen = 0; 330 | rLoc = 1654; 331 | rType = 0; 332 | vrLen = 1513; 333 | vrLoc = 0; 334 | }; 335 | 3831F227129DDC93004EA2CC /* PBXTextBookmark */ = { 336 | isa = PBXTextBookmark; 337 | fRef = 08FB7796FE84155DC02AAC07 /* TimeLapse.m */; 338 | name = "TimeLapse.m: 84"; 339 | rLen = 0; 340 | rLoc = 2977; 341 | rType = 0; 342 | vrLen = 1928; 343 | vrLoc = 1752; 344 | }; 345 | 3831F228129DDC93004EA2CC /* PBXTextBookmark */ = { 346 | isa = PBXTextBookmark; 347 | fRef = 08FB7796FE84155DC02AAC07 /* TimeLapse.m */; 348 | name = "TimeLapse.m: 84"; 349 | rLen = 0; 350 | rLoc = 2977; 351 | rType = 0; 352 | vrLen = 1923; 353 | vrLoc = 1752; 354 | }; 355 | 3831F22C129DDCF4004EA2CC /* Options.m:70 */ = { 356 | isa = PBXFileBreakpoint; 357 | actions = ( 358 | ); 359 | breakpointStyle = 0; 360 | continueAfterActions = 0; 361 | countType = 0; 362 | delayBeforeContinue = 0; 363 | fileReference = 38BCD0D9106DBD81001322EE /* Options.m */; 364 | functionName = "+parseArgc:argv:"; 365 | hitCount = 0; 366 | ignoreCount = 0; 367 | lineNumber = 70; 368 | location = TimeLapse; 369 | modificationTime = 312335613.574248; 370 | originalNumberOfMultipleMatches = 1; 371 | state = 0; 372 | }; 373 | 3831F22E129DDCF8004EA2CC /* Options.m:28 */ = { 374 | isa = PBXFileBreakpoint; 375 | actions = ( 376 | ); 377 | breakpointStyle = 0; 378 | continueAfterActions = 0; 379 | countType = 0; 380 | delayBeforeContinue = 0; 381 | fileReference = 38BCD0D9106DBD81001322EE /* Options.m */; 382 | functionName = "+noDuplicates"; 383 | hitCount = 0; 384 | ignoreCount = 0; 385 | lineNumber = 28; 386 | location = TimeLapse; 387 | modificationTime = 312335635.225898; 388 | originalNumberOfMultipleMatches = 1; 389 | state = 0; 390 | }; 391 | 3831F241129DDD9E004EA2CC /* PBXTextBookmark */ = { 392 | isa = PBXTextBookmark; 393 | fRef = 38BCD0D9106DBD81001322EE /* Options.m */; 394 | name = "Options.m: 36"; 395 | rLen = 0; 396 | rLoc = 996; 397 | rType = 0; 398 | vrLen = 1095; 399 | vrLoc = 955; 400 | }; 401 | 3831F242129DDD9E004EA2CC /* PBXTextBookmark */ = { 402 | isa = PBXTextBookmark; 403 | fRef = 08FB7796FE84155DC02AAC07 /* TimeLapse.m */; 404 | name = "TimeLapse.m: 84"; 405 | rLen = 0; 406 | rLoc = 2977; 407 | rType = 0; 408 | vrLen = 1928; 409 | vrLoc = 1752; 410 | }; 411 | 3831F243129DDD9E004EA2CC /* PBXTextBookmark */ = { 412 | isa = PBXTextBookmark; 413 | fRef = 08FB7796FE84155DC02AAC07 /* TimeLapse.m */; 414 | name = "TimeLapse.m: 84"; 415 | rLen = 0; 416 | rLoc = 2977; 417 | rType = 0; 418 | vrLen = 1797; 419 | vrLoc = 1865; 420 | }; 421 | 3831F253129DDE93004EA2CC /* PBXTextBookmark */ = { 422 | isa = PBXTextBookmark; 423 | fRef = 08FB7796FE84155DC02AAC07 /* TimeLapse.m */; 424 | name = "TimeLapse.m: 84"; 425 | rLen = 0; 426 | rLoc = 2977; 427 | rType = 0; 428 | vrLen = 1853; 429 | vrLoc = 1865; 430 | }; 431 | 3831F254129DDE93004EA2CC /* PBXTextBookmark */ = { 432 | isa = PBXTextBookmark; 433 | fRef = 3831F255129DDE93004EA2CC /* Diff HEAD vs. Local — TimeLapse.m */; 434 | rLen = 0; 435 | rLoc = 9223372036854775807; 436 | rType = 0; 437 | }; 438 | 3831F255129DDE93004EA2CC /* Diff HEAD vs. Local — TimeLapse.m */ = { 439 | isa = PBXFileReference; 440 | lastKnownFileType = file; 441 | path = "Diff HEAD vs. Local — TimeLapse.m"; 442 | sourceTree = ""; 443 | }; 444 | 3831F256129DDE93004EA2CC /* PBXTextBookmark */ = { 445 | isa = PBXTextBookmark; 446 | fRef = 3831F257129DDE93004EA2CC /* Diff HEAD vs. Local — TimeLapse.m */; 447 | name = "Diff HEAD vs. Local — TimeLapse.m: 1"; 448 | rLen = 0; 449 | rLoc = 0; 450 | rType = 0; 451 | vrLen = 1757; 452 | vrLoc = 0; 453 | }; 454 | 3831F257129DDE93004EA2CC /* Diff HEAD vs. Local — TimeLapse.m */ = { 455 | isa = PBXFileReference; 456 | path = "Diff HEAD vs. Local — TimeLapse.m"; 457 | sourceTree = ""; 458 | }; 459 | 3831F25B129DDEEA004EA2CC /* PBXTextBookmark */ = { 460 | isa = PBXTextBookmark; 461 | fRef = 08FB7796FE84155DC02AAC07 /* TimeLapse.m */; 462 | name = "TimeLapse.m: 85"; 463 | rLen = 0; 464 | rLoc = 3065; 465 | rType = 0; 466 | vrLen = 598; 467 | vrLoc = 2689; 468 | }; 469 | 3831F267129DDF5C004EA2CC /* PBXTextBookmark */ = { 470 | isa = PBXTextBookmark; 471 | fRef = 08FB7796FE84155DC02AAC07 /* TimeLapse.m */; 472 | name = "TimeLapse.m: 85"; 473 | rLen = 0; 474 | rLoc = 3065; 475 | rType = 0; 476 | vrLen = 973; 477 | vrLoc = 2689; 478 | }; 479 | 3831F268129DDF66004EA2CC /* PBXTextBookmark */ = { 480 | isa = PBXTextBookmark; 481 | fRef = 3831F269129DDF66004EA2CC /* Diff HEAD vs. Local — TimeLapse.m */; 482 | name = "Diff HEAD vs. Local — TimeLapse.m: 1"; 483 | rLen = 0; 484 | rLoc = 0; 485 | rType = 0; 486 | vrLen = 1757; 487 | vrLoc = 0; 488 | }; 489 | 3831F269129DDF66004EA2CC /* Diff HEAD vs. Local — TimeLapse.m */ = { 490 | isa = PBXFileReference; 491 | lastKnownFileType = sourcecode.c.objc; 492 | path = "Diff HEAD vs. Local — TimeLapse.m"; 493 | sourceTree = ""; 494 | }; 495 | 3831F26A129DDF66004EA2CC /* PBXTextBookmark */ = { 496 | isa = PBXTextBookmark; 497 | fRef = 32A70AAB03705E1F00C91783 /* TimeLapse_Prefix.pch */; 498 | name = "TimeLapse_Prefix.pch: 8"; 499 | rLen = 0; 500 | rLoc = 160; 501 | rType = 0; 502 | vrLen = 160; 503 | vrLoc = 0; 504 | }; 505 | 3831F26B129E360F004EA2CC /* PBXTextBookmark */ = { 506 | isa = PBXTextBookmark; 507 | fRef = 32A70AAB03705E1F00C91783 /* TimeLapse_Prefix.pch */; 508 | name = "TimeLapse_Prefix.pch: 8"; 509 | rLen = 0; 510 | rLoc = 160; 511 | rType = 0; 512 | vrLen = 160; 513 | vrLoc = 0; 514 | }; 515 | 3831F26C129E360F004EA2CC /* PBXTextBookmark */ = { 516 | isa = PBXTextBookmark; 517 | fRef = 38BCD0D8106DBD81001322EE /* Options.h */; 518 | name = "Options.h: 24"; 519 | rLen = 0; 520 | rLoc = 398; 521 | rType = 0; 522 | vrLen = 404; 523 | vrLoc = 0; 524 | }; 525 | 3831F26D129E360F004EA2CC /* PBXTextBookmark */ = { 526 | isa = PBXTextBookmark; 527 | fRef = 38BCD0D9106DBD81001322EE /* Options.m */; 528 | name = "Options.m: 36"; 529 | rLen = 0; 530 | rLoc = 996; 531 | rType = 0; 532 | vrLen = 1513; 533 | vrLoc = 0; 534 | }; 535 | 3831F26E129E360F004EA2CC /* PBXTextBookmark */ = { 536 | isa = PBXTextBookmark; 537 | fRef = 08FB7796FE84155DC02AAC07 /* TimeLapse.m */; 538 | name = "TimeLapse.m: 84"; 539 | rLen = 0; 540 | rLoc = 2977; 541 | rType = 0; 542 | vrLen = 1865; 543 | vrLoc = 0; 544 | }; 545 | 3831F26F129E360F004EA2CC /* PBXTextBookmark */ = { 546 | isa = PBXTextBookmark; 547 | fRef = 08FB7796FE84155DC02AAC07 /* TimeLapse.m */; 548 | name = "TimeLapse.m: 86"; 549 | rLen = 0; 550 | rLoc = 3101; 551 | rType = 0; 552 | vrLen = 1866; 553 | vrLoc = 1937; 554 | }; 555 | 3831F272129E3906004EA2CC /* PBXTextBookmark */ = { 556 | isa = PBXTextBookmark; 557 | fRef = 08FB7796FE84155DC02AAC07 /* TimeLapse.m */; 558 | name = "TimeLapse.m: 85"; 559 | rLen = 0; 560 | rLoc = 3065; 561 | rType = 0; 562 | vrLen = 1022; 563 | vrLoc = 2689; 564 | }; 565 | 3831F277129E3964004EA2CC /* XCBuildMessageTextBookmark */ = { 566 | isa = PBXTextBookmark; 567 | comments = "Potential leak of an object allocated on line 36 and stored into 'movie'"; 568 | fRef = 08FB7796FE84155DC02AAC07 /* TimeLapse.m */; 569 | fallbackIsa = XCBuildMessageTextBookmark; 570 | rLen = 1; 571 | rLoc = 37; 572 | rType = 1; 573 | }; 574 | 3831F278129E3964004EA2CC /* PBXTextBookmark */ = { 575 | isa = PBXTextBookmark; 576 | fRef = 08FB7796FE84155DC02AAC07 /* TimeLapse.m */; 577 | name = "TimeLapse.m: 38"; 578 | rLen = 0; 579 | rLoc = 1197; 580 | rType = 0; 581 | vrLen = 1240; 582 | vrLoc = 0; 583 | }; 584 | 38515789108395F60027E8D7 /* PBXTextBookmark */ = { 585 | isa = PBXTextBookmark; 586 | fRef = 38BCD0D6106DBBD7001322EE /* NOTES.rtf */; 587 | name = "NOTES.rtf: 13"; 588 | rLen = 0; 589 | rLoc = 332; 590 | rType = 0; 591 | vrLen = 333; 592 | vrLoc = 0; 593 | }; 594 | 3851578A108395F60027E8D7 /* PBXTextBookmark */ = { 595 | isa = PBXTextBookmark; 596 | fRef = C6859EA3029092ED04C91782 /* TimeLapse.1 */; 597 | name = "TimeLapse.1: 1"; 598 | rLen = 0; 599 | rLoc = 0; 600 | rType = 0; 601 | vrLen = 1953; 602 | vrLoc = 0; 603 | }; 604 | 38BCD0CA106DBB8A001322EE /* TimeLapse */ = { 605 | isa = PBXExecutable; 606 | activeArgIndices = ( 607 | YES, 608 | YES, 609 | YES, 610 | NO, 611 | YES, 612 | ); 613 | argumentStrings = ( 614 | "-h", 615 | "-v", 616 | "-n", 617 | /tmp/testimages/, 618 | /Users/jim/Pictures/sbi/2010/11/23/, 619 | ); 620 | autoAttachOnCrash = 1; 621 | breakpointsEnabled = 0; 622 | configStateDict = { 623 | }; 624 | customDataFormattersEnabled = 1; 625 | dataTipCustomDataFormattersEnabled = 1; 626 | dataTipShowTypeColumn = 1; 627 | dataTipSortType = 0; 628 | debuggerPlugin = GDBDebugging; 629 | disassemblyDisplayState = 0; 630 | dylibVariantSuffix = ""; 631 | enableDebugStr = 1; 632 | environmentEntries = ( 633 | ); 634 | executableSystemSymbolLevel = 0; 635 | executableUserSymbolLevel = 0; 636 | libgmallocEnabled = 0; 637 | name = TimeLapse; 638 | savedGlobals = { 639 | }; 640 | showTypeColumn = 0; 641 | sourceDirectories = ( 642 | ); 643 | variableFormatDictionary = { 644 | }; 645 | }; 646 | 38BCD0D3106DBBA8001322EE /* Source Control */ = { 647 | isa = PBXSourceControlManager; 648 | fallbackIsa = XCSourceControlManager; 649 | isSCMEnabled = 0; 650 | scmConfiguration = { 651 | repositoryNamesForRoots = { 652 | "" = TimeLapse; 653 | }; 654 | }; 655 | }; 656 | 38BCD0D4106DBBA8001322EE /* Code sense */ = { 657 | isa = PBXCodeSenseManager; 658 | indexTemplatePath = ""; 659 | }; 660 | 38BCD0D8106DBD81001322EE /* Options.h */ = { 661 | uiCtxt = { 662 | sepNavIntBoundsRect = "{{0, 0}, {965, 722}}"; 663 | sepNavSelRange = "{398, 0}"; 664 | sepNavVisRange = "{0, 404}"; 665 | }; 666 | }; 667 | 38BCD0D9106DBD81001322EE /* Options.m */ = { 668 | uiCtxt = { 669 | sepNavIntBoundsRect = "{{0, 0}, {965, 1053}}"; 670 | sepNavSelRange = "{996, 0}"; 671 | sepNavVisRange = "{0, 1513}"; 672 | }; 673 | }; 674 | 38F6277B10858F98003C8009 /* PBXTextBookmark */ = { 675 | isa = PBXTextBookmark; 676 | fRef = 38F6277C10858F98003C8009 /* QTMovie.h */; 677 | name = "QTMovie.h: 87"; 678 | rLen = 115; 679 | rLoc = 6761; 680 | rType = 0; 681 | vrLen = 3978; 682 | vrLoc = 5445; 683 | }; 684 | 38F6277C10858F98003C8009 /* QTMovie.h */ = { 685 | isa = PBXFileReference; 686 | lastKnownFileType = sourcecode.c.h; 687 | name = QTMovie.h; 688 | path = /Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/QTKit.framework/Versions/A/Headers/QTMovie.h; 689 | sourceTree = ""; 690 | }; 691 | 38F6277E10858F98003C8009 /* QTKitDefines.h */ = { 692 | isa = PBXFileReference; 693 | lastKnownFileType = sourcecode.c.h; 694 | name = QTKitDefines.h; 695 | path = /Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/QTKit.framework/Versions/A/Headers/QTKitDefines.h; 696 | sourceTree = ""; 697 | }; 698 | 38F627C51086E984003C8009 /* PBXTextBookmark */ = { 699 | isa = PBXTextBookmark; 700 | fRef = 08FB7796FE84155DC02AAC07 /* TimeLapse.m */; 701 | name = "TimeLapse.m: 43"; 702 | rLen = 0; 703 | rLoc = 2249; 704 | rType = 0; 705 | vrLen = 2536; 706 | vrLoc = 0; 707 | }; 708 | 8DD76F960486AA7600D96B5E /* TimeLapse */ = { 709 | activeExec = 0; 710 | executables = ( 711 | 38BCD0CA106DBB8A001322EE /* TimeLapse */, 712 | ); 713 | }; 714 | C6859EA3029092ED04C91782 /* TimeLapse.1 */ = { 715 | uiCtxt = { 716 | sepNavIntBoundsRect = "{{0, 0}, {959, 1027}}"; 717 | sepNavSelRange = "{0, 0}"; 718 | sepNavVisRange = "{0, 2540}"; 719 | }; 720 | }; 721 | } 722 | -------------------------------------------------------------------------------- /TimeLapse.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 54; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 38BCD0DA106DBD81001322EE /* Options.m in Sources */ = {isa = PBXBuildFile; fileRef = 38BCD0D9106DBD81001322EE /* Options.m */; }; 11 | 8DD76F9A0486AA7600D96B5E /* TimeLapse.m in Sources */ = {isa = PBXBuildFile; fileRef = 08FB7796FE84155DC02AAC07 /* TimeLapse.m */; settings = {ATTRIBUTES = (); }; }; 12 | 8DD76F9F0486AA7600D96B5E /* timelapse.1 in CopyFiles */ = {isa = PBXBuildFile; fileRef = C6859EA3029092ED04C91782 /* timelapse.1 */; }; 13 | /* End PBXBuildFile section */ 14 | 15 | /* Begin PBXContainerItemProxy section */ 16 | 383B0C9A18AB100A00C2883D /* PBXContainerItemProxy */ = { 17 | isa = PBXContainerItemProxy; 18 | containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */; 19 | proxyType = 1; 20 | remoteGlobalIDString = 8DD76F960486AA7600D96B5E; 21 | remoteInfo = timelapse; 22 | }; 23 | /* End PBXContainerItemProxy section */ 24 | 25 | /* Begin PBXCopyFilesBuildPhase section */ 26 | 8DD76F9E0486AA7600D96B5E /* CopyFiles */ = { 27 | isa = PBXCopyFilesBuildPhase; 28 | buildActionMask = 8; 29 | dstPath = /usr/share/man/man1/; 30 | dstSubfolderSpec = 0; 31 | files = ( 32 | 8DD76F9F0486AA7600D96B5E /* timelapse.1 in CopyFiles */, 33 | ); 34 | runOnlyForDeploymentPostprocessing = 1; 35 | }; 36 | /* End PBXCopyFilesBuildPhase section */ 37 | 38 | /* Begin PBXFileReference section */ 39 | 08FB7796FE84155DC02AAC07 /* TimeLapse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TimeLapse.m; sourceTree = ""; }; 40 | 383B0C9E18AB13A700C2883D /* build-package.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; name = "build-package.sh"; path = "Packaging/build-package.sh"; sourceTree = ""; }; 41 | 38A9A3AA1880C540002768BE /* Version.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Version.h; sourceTree = ""; }; 42 | 38BCD0D6106DBBD7001322EE /* NOTES.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = NOTES.rtf; sourceTree = ""; }; 43 | 38BCD0D8106DBD81001322EE /* Options.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Options.h; sourceTree = ""; }; 44 | 38BCD0D9106DBD81001322EE /* Options.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Options.m; sourceTree = ""; }; 45 | 38C168651880BEE600FA1225 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; 46 | 38C168661880BEE600FA1225 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README.md; sourceTree = ""; }; 47 | 38D8D59123B9555D003CC655 /* notarize.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; name = notarize.sh; path = Packaging/notarize.sh; sourceTree = ""; }; 48 | 38D8D59223B9588C003CC655 /* staple.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; name = staple.sh; path = Packaging/staple.sh; sourceTree = ""; }; 49 | 38D8D59323B967DB003CC655 /* timelapse.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = timelapse.pdf; sourceTree = ""; }; 50 | 8DD76FA10486AA7600D96B5E /* timelapse */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = timelapse; sourceTree = BUILT_PRODUCTS_DIR; }; 51 | C6859EA3029092ED04C91782 /* timelapse.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = timelapse.1; sourceTree = ""; }; 52 | /* End PBXFileReference section */ 53 | 54 | /* Begin PBXFrameworksBuildPhase section */ 55 | 8DD76F9B0486AA7600D96B5E /* Frameworks */ = { 56 | isa = PBXFrameworksBuildPhase; 57 | buildActionMask = 2147483647; 58 | files = ( 59 | ); 60 | runOnlyForDeploymentPostprocessing = 0; 61 | }; 62 | /* End PBXFrameworksBuildPhase section */ 63 | 64 | /* Begin PBXGroup section */ 65 | 08FB7794FE84155DC02AAC07 /* TimeLapse */ = { 66 | isa = PBXGroup; 67 | children = ( 68 | 383B0C9D18AB111B00C2883D /* Packaging */, 69 | 08FB7795FE84155DC02AAC07 /* Source */, 70 | C6859EA2029092E104C91782 /* Documentation */, 71 | 08FB779DFE84155DC02AAC07 /* External Frameworks and Libraries */, 72 | 1AB674ADFE9D54B511CA2CBB /* Products */, 73 | ); 74 | name = TimeLapse; 75 | sourceTree = ""; 76 | }; 77 | 08FB7795FE84155DC02AAC07 /* Source */ = { 78 | isa = PBXGroup; 79 | children = ( 80 | 08FB7796FE84155DC02AAC07 /* TimeLapse.m */, 81 | 38A9A3AA1880C540002768BE /* Version.h */, 82 | 38BCD0D8106DBD81001322EE /* Options.h */, 83 | 38BCD0D9106DBD81001322EE /* Options.m */, 84 | ); 85 | name = Source; 86 | sourceTree = ""; 87 | }; 88 | 08FB779DFE84155DC02AAC07 /* External Frameworks and Libraries */ = { 89 | isa = PBXGroup; 90 | children = ( 91 | ); 92 | name = "External Frameworks and Libraries"; 93 | sourceTree = ""; 94 | }; 95 | 1AB674ADFE9D54B511CA2CBB /* Products */ = { 96 | isa = PBXGroup; 97 | children = ( 98 | 8DD76FA10486AA7600D96B5E /* timelapse */, 99 | ); 100 | name = Products; 101 | sourceTree = ""; 102 | }; 103 | 383B0C9D18AB111B00C2883D /* Packaging */ = { 104 | isa = PBXGroup; 105 | children = ( 106 | 383B0C9E18AB13A700C2883D /* build-package.sh */, 107 | 38D8D59123B9555D003CC655 /* notarize.sh */, 108 | 38D8D59223B9588C003CC655 /* staple.sh */, 109 | ); 110 | name = Packaging; 111 | sourceTree = ""; 112 | }; 113 | C6859EA2029092E104C91782 /* Documentation */ = { 114 | isa = PBXGroup; 115 | children = ( 116 | 38C168651880BEE600FA1225 /* LICENSE */, 117 | 38C168661880BEE600FA1225 /* README.md */, 118 | C6859EA3029092ED04C91782 /* timelapse.1 */, 119 | 38D8D59323B967DB003CC655 /* timelapse.pdf */, 120 | 38BCD0D6106DBBD7001322EE /* NOTES.rtf */, 121 | ); 122 | name = Documentation; 123 | sourceTree = ""; 124 | }; 125 | /* End PBXGroup section */ 126 | 127 | /* Begin PBXLegacyTarget section */ 128 | 383B0C9618AB100000C2883D /* Installer Package */ = { 129 | isa = PBXLegacyTarget; 130 | buildArgumentsString = ""; 131 | buildConfigurationList = 383B0C9718AB100000C2883D /* Build configuration list for PBXLegacyTarget "Installer Package" */; 132 | buildPhases = ( 133 | ); 134 | buildToolPath = "${SOURCE_ROOT}/Packaging/build-package.sh"; 135 | buildWorkingDirectory = "${SOURCE_ROOT}/Packaging"; 136 | dependencies = ( 137 | 383B0C9B18AB100A00C2883D /* PBXTargetDependency */, 138 | ); 139 | name = "Installer Package"; 140 | passBuildSettingsInEnvironment = 1; 141 | productName = "Installer Package"; 142 | }; 143 | /* End PBXLegacyTarget section */ 144 | 145 | /* Begin PBXNativeTarget section */ 146 | 8DD76F960486AA7600D96B5E /* timelapse */ = { 147 | isa = PBXNativeTarget; 148 | buildConfigurationList = 1DEB927408733DD40010E9CD /* Build configuration list for PBXNativeTarget "timelapse" */; 149 | buildPhases = ( 150 | 8DD76F990486AA7600D96B5E /* Sources */, 151 | 8DD76F9B0486AA7600D96B5E /* Frameworks */, 152 | 8DD76F9E0486AA7600D96B5E /* CopyFiles */, 153 | ); 154 | buildRules = ( 155 | ); 156 | dependencies = ( 157 | ); 158 | name = timelapse; 159 | productInstallPath = "$(HOME)/bin"; 160 | productName = TimeLapse; 161 | productReference = 8DD76FA10486AA7600D96B5E /* timelapse */; 162 | productType = "com.apple.product-type.tool"; 163 | }; 164 | /* End PBXNativeTarget section */ 165 | 166 | /* Begin PBXProject section */ 167 | 08FB7793FE84155DC02AAC07 /* Project object */ = { 168 | isa = PBXProject; 169 | attributes = { 170 | BuildIndependentTargetsInParallel = YES; 171 | LastUpgradeCheck = 1540; 172 | ORGANIZATIONNAME = Lunarware; 173 | }; 174 | buildConfigurationList = 1DEB927808733DD40010E9CD /* Build configuration list for PBXProject "TimeLapse" */; 175 | compatibilityVersion = "Xcode 11.0"; 176 | developmentRegion = en; 177 | hasScannedForEncodings = 1; 178 | knownRegions = ( 179 | de, 180 | en, 181 | Base, 182 | fr, 183 | ja, 184 | ); 185 | mainGroup = 08FB7794FE84155DC02AAC07 /* TimeLapse */; 186 | projectDirPath = ""; 187 | projectRoot = ""; 188 | targets = ( 189 | 8DD76F960486AA7600D96B5E /* timelapse */, 190 | 383B0C9618AB100000C2883D /* Installer Package */, 191 | ); 192 | }; 193 | /* End PBXProject section */ 194 | 195 | /* Begin PBXSourcesBuildPhase section */ 196 | 8DD76F990486AA7600D96B5E /* Sources */ = { 197 | isa = PBXSourcesBuildPhase; 198 | buildActionMask = 2147483647; 199 | files = ( 200 | 8DD76F9A0486AA7600D96B5E /* TimeLapse.m in Sources */, 201 | 38BCD0DA106DBD81001322EE /* Options.m in Sources */, 202 | ); 203 | runOnlyForDeploymentPostprocessing = 0; 204 | }; 205 | /* End PBXSourcesBuildPhase section */ 206 | 207 | /* Begin PBXTargetDependency section */ 208 | 383B0C9B18AB100A00C2883D /* PBXTargetDependency */ = { 209 | isa = PBXTargetDependency; 210 | target = 8DD76F960486AA7600D96B5E /* timelapse */; 211 | targetProxy = 383B0C9A18AB100A00C2883D /* PBXContainerItemProxy */; 212 | }; 213 | /* End PBXTargetDependency section */ 214 | 215 | /* Begin XCBuildConfiguration section */ 216 | 1DEB927508733DD40010E9CD /* Debug */ = { 217 | isa = XCBuildConfiguration; 218 | buildSettings = { 219 | ALWAYS_SEARCH_USER_PATHS = NO; 220 | CLANG_ENABLE_OBJC_ARC = YES; 221 | CLANG_USE_OPTIMIZATION_PROFILE = NO; 222 | CODE_SIGN_IDENTITY = "Apple Development"; 223 | "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Developer ID Application"; 224 | CODE_SIGN_STYLE = Manual; 225 | COPY_PHASE_STRIP = NO; 226 | DEAD_CODE_STRIPPING = YES; 227 | DEVELOPMENT_TEAM = HJS98U3F75; 228 | "DEVELOPMENT_TEAM[sdk=macosx*]" = HJS98U3F75; 229 | DSTROOT = $SRCROOT/build/pkgroot; 230 | ENABLE_HARDENED_RUNTIME = YES; 231 | GCC_DYNAMIC_NO_PIC = NO; 232 | GCC_OPTIMIZATION_LEVEL = 0; 233 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 234 | GCC_PREFIX_HEADER = timelapse_Prefix.pch; 235 | INSTALL_PATH = /usr/local/bin; 236 | MACOSX_DEPLOYMENT_TARGET = 10.15; 237 | PRODUCT_BUNDLE_IDENTIFIER = com.lunarware.timelapse; 238 | PRODUCT_NAME = timelapse; 239 | PROVISIONING_PROFILE_SPECIFIER = ""; 240 | }; 241 | name = Debug; 242 | }; 243 | 1DEB927608733DD40010E9CD /* Release */ = { 244 | isa = XCBuildConfiguration; 245 | buildSettings = { 246 | ALWAYS_SEARCH_USER_PATHS = NO; 247 | CLANG_ENABLE_OBJC_ARC = YES; 248 | CLANG_USE_OPTIMIZATION_PROFILE = NO; 249 | CODE_SIGN_IDENTITY = "Apple Development"; 250 | "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Developer ID Application"; 251 | CODE_SIGN_STYLE = Manual; 252 | DEAD_CODE_STRIPPING = YES; 253 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 254 | DEVELOPMENT_TEAM = HJS98U3F75; 255 | "DEVELOPMENT_TEAM[sdk=macosx*]" = HJS98U3F75; 256 | DSTROOT = $SRCROOT/build/pkgroot; 257 | ENABLE_HARDENED_RUNTIME = YES; 258 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 259 | GCC_PREFIX_HEADER = timelapse_Prefix.pch; 260 | INSTALL_PATH = /usr/local/bin; 261 | MACOSX_DEPLOYMENT_TARGET = 10.15; 262 | PRODUCT_BUNDLE_IDENTIFIER = com.lunarware.timelapse; 263 | PRODUCT_NAME = timelapse; 264 | PROVISIONING_PROFILE_SPECIFIER = ""; 265 | }; 266 | name = Release; 267 | }; 268 | 1DEB927908733DD40010E9CD /* Debug */ = { 269 | isa = XCBuildConfiguration; 270 | buildSettings = { 271 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 272 | CLANG_ENABLE_MODULES = YES; 273 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 274 | CLANG_WARN_BOOL_CONVERSION = YES; 275 | CLANG_WARN_COMMA = YES; 276 | CLANG_WARN_CONSTANT_CONVERSION = YES; 277 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 278 | CLANG_WARN_EMPTY_BODY = YES; 279 | CLANG_WARN_ENUM_CONVERSION = YES; 280 | CLANG_WARN_INFINITE_RECURSION = YES; 281 | CLANG_WARN_INT_CONVERSION = YES; 282 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 283 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 284 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 285 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 286 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 287 | CLANG_WARN_STRICT_PROTOTYPES = YES; 288 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 289 | CLANG_WARN_UNREACHABLE_CODE = YES; 290 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 291 | DEAD_CODE_STRIPPING = YES; 292 | ENABLE_STRICT_OBJC_MSGSEND = YES; 293 | ENABLE_TESTABILITY = YES; 294 | ENABLE_USER_SCRIPT_SANDBOXING = YES; 295 | GCC_C_LANGUAGE_STANDARD = gnu99; 296 | GCC_NO_COMMON_BLOCKS = YES; 297 | GCC_OPTIMIZATION_LEVEL = 0; 298 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 299 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 300 | GCC_WARN_UNDECLARED_SELECTOR = YES; 301 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 302 | GCC_WARN_UNUSED_FUNCTION = YES; 303 | GCC_WARN_UNUSED_VARIABLE = YES; 304 | ONLY_ACTIVE_ARCH = YES; 305 | SDKROOT = macosx; 306 | }; 307 | name = Debug; 308 | }; 309 | 1DEB927A08733DD40010E9CD /* Release */ = { 310 | isa = XCBuildConfiguration; 311 | buildSettings = { 312 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 313 | CLANG_ENABLE_MODULES = YES; 314 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 315 | CLANG_WARN_BOOL_CONVERSION = YES; 316 | CLANG_WARN_COMMA = YES; 317 | CLANG_WARN_CONSTANT_CONVERSION = YES; 318 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 319 | CLANG_WARN_EMPTY_BODY = YES; 320 | CLANG_WARN_ENUM_CONVERSION = YES; 321 | CLANG_WARN_INFINITE_RECURSION = YES; 322 | CLANG_WARN_INT_CONVERSION = YES; 323 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 324 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 325 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 326 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 327 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 328 | CLANG_WARN_STRICT_PROTOTYPES = YES; 329 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 330 | CLANG_WARN_UNREACHABLE_CODE = YES; 331 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 332 | DEAD_CODE_STRIPPING = YES; 333 | ENABLE_STRICT_OBJC_MSGSEND = YES; 334 | ENABLE_USER_SCRIPT_SANDBOXING = YES; 335 | GCC_C_LANGUAGE_STANDARD = gnu99; 336 | GCC_NO_COMMON_BLOCKS = YES; 337 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 338 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 339 | GCC_WARN_UNDECLARED_SELECTOR = YES; 340 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 341 | GCC_WARN_UNUSED_FUNCTION = YES; 342 | GCC_WARN_UNUSED_VARIABLE = YES; 343 | SDKROOT = macosx; 344 | }; 345 | name = Release; 346 | }; 347 | 383B0C9818AB100000C2883D /* Debug */ = { 348 | isa = XCBuildConfiguration; 349 | buildSettings = { 350 | ALWAYS_SEARCH_USER_PATHS = NO; 351 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 352 | CLANG_CXX_LIBRARY = "libc++"; 353 | CLANG_ENABLE_OBJC_ARC = YES; 354 | CLANG_WARN_BOOL_CONVERSION = YES; 355 | CLANG_WARN_CONSTANT_CONVERSION = YES; 356 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 357 | CLANG_WARN_EMPTY_BODY = YES; 358 | CLANG_WARN_ENUM_CONVERSION = YES; 359 | CLANG_WARN_INT_CONVERSION = YES; 360 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 361 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 362 | COPY_PHASE_STRIP = NO; 363 | DEAD_CODE_STRIPPING = YES; 364 | DEBUGGING_SYMBOLS = YES; 365 | GCC_DYNAMIC_NO_PIC = NO; 366 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 367 | GCC_GENERATE_DEBUGGING_SYMBOLS = YES; 368 | GCC_OPTIMIZATION_LEVEL = 0; 369 | GCC_PREPROCESSOR_DEFINITIONS = ( 370 | "DEBUG=1", 371 | "$(inherited)", 372 | ); 373 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 374 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 375 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 376 | GCC_WARN_UNDECLARED_SELECTOR = YES; 377 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 378 | GCC_WARN_UNUSED_FUNCTION = YES; 379 | MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; 380 | OTHER_CFLAGS = ""; 381 | OTHER_LDFLAGS = ""; 382 | PRODUCT_NAME = "$(TARGET_NAME)"; 383 | }; 384 | name = Debug; 385 | }; 386 | 383B0C9918AB100000C2883D /* Release */ = { 387 | isa = XCBuildConfiguration; 388 | buildSettings = { 389 | ALWAYS_SEARCH_USER_PATHS = NO; 390 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 391 | CLANG_CXX_LIBRARY = "libc++"; 392 | CLANG_ENABLE_OBJC_ARC = YES; 393 | CLANG_WARN_BOOL_CONVERSION = YES; 394 | CLANG_WARN_CONSTANT_CONVERSION = YES; 395 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 396 | CLANG_WARN_EMPTY_BODY = YES; 397 | CLANG_WARN_ENUM_CONVERSION = YES; 398 | CLANG_WARN_INT_CONVERSION = YES; 399 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 400 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 401 | COPY_PHASE_STRIP = YES; 402 | DEAD_CODE_STRIPPING = YES; 403 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 404 | ENABLE_NS_ASSERTIONS = NO; 405 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 406 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 407 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 408 | GCC_WARN_UNDECLARED_SELECTOR = YES; 409 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 410 | GCC_WARN_UNUSED_FUNCTION = YES; 411 | MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; 412 | OTHER_CFLAGS = ""; 413 | OTHER_LDFLAGS = ""; 414 | PRODUCT_NAME = "$(TARGET_NAME)"; 415 | }; 416 | name = Release; 417 | }; 418 | /* End XCBuildConfiguration section */ 419 | 420 | /* Begin XCConfigurationList section */ 421 | 1DEB927408733DD40010E9CD /* Build configuration list for PBXNativeTarget "timelapse" */ = { 422 | isa = XCConfigurationList; 423 | buildConfigurations = ( 424 | 1DEB927508733DD40010E9CD /* Debug */, 425 | 1DEB927608733DD40010E9CD /* Release */, 426 | ); 427 | defaultConfigurationIsVisible = 0; 428 | defaultConfigurationName = Release; 429 | }; 430 | 1DEB927808733DD40010E9CD /* Build configuration list for PBXProject "TimeLapse" */ = { 431 | isa = XCConfigurationList; 432 | buildConfigurations = ( 433 | 1DEB927908733DD40010E9CD /* Debug */, 434 | 1DEB927A08733DD40010E9CD /* Release */, 435 | ); 436 | defaultConfigurationIsVisible = 0; 437 | defaultConfigurationName = Release; 438 | }; 439 | 383B0C9718AB100000C2883D /* Build configuration list for PBXLegacyTarget "Installer Package" */ = { 440 | isa = XCConfigurationList; 441 | buildConfigurations = ( 442 | 383B0C9818AB100000C2883D /* Debug */, 443 | 383B0C9918AB100000C2883D /* Release */, 444 | ); 445 | defaultConfigurationIsVisible = 0; 446 | defaultConfigurationName = Release; 447 | }; 448 | /* End XCConfigurationList section */ 449 | }; 450 | rootObject = 08FB7793FE84155DC02AAC07 /* Project object */; 451 | } 452 | -------------------------------------------------------------------------------- /Version.h: -------------------------------------------------------------------------------- 1 | // 2 | // Version.h 3 | // TimeLapse 4 | // 5 | // Created by Jim Studt on 1/10/14. 6 | // Copyright (c) 2014 Lunarware. All rights reserved. 7 | // 8 | 9 | #ifndef TimeLapse_Version_h 10 | #define TimeLapse_Version_h 11 | 12 | #define TIMELAPSE_VERSION "0.3.1" 13 | 14 | #endif 15 | -------------------------------------------------------------------------------- /timelapse.1: -------------------------------------------------------------------------------- 1 | .Dd 1/6/14 \" DATE 2 | .Dt timelapse 1 \" Program name and manual section number 3 | .Os Darwin 4 | .Sh NAME \" Section Header - required - don't modify 5 | .Nm timelapse 6 | .Nd Create a video from still images. 7 | .Sh SYNOPSIS \" Section Header - required - don't modify 8 | .Nm 9 | .Fl h 10 | .Nm 11 | .Op Fl vn \" [-vhn] 12 | .Fl o Ar output \" [-a path] 13 | .Op Fl c Ar h264 14 | .Op Fl p Ar h.264-profile 15 | .Op Fl l Ar h.264-level 16 | .Op Fl b Ar bitrate 17 | path ... \" arguments 18 | .Nm 19 | .Op Fl vn \" [-vhn] 20 | .Fl o Ar output \" [-a path] 21 | .Fl c Ar hevc 22 | .Op Fl b Ar bitrate 23 | path ... \" arguments 24 | .Nm 25 | .Op Fl vn \" [-vhn] 26 | .Fl o Ar output \" [-a path] 27 | .Fl c Ar jpeg 28 | .Op Fl q Ar jpeg-quality 29 | .Op Fl b Ar bitrate 30 | path ... \" arguments 31 | .Nm 32 | .Op Fl vn \" [-vhn] 33 | .Fl o Ar output \" [-a path] 34 | .Fl c Ar prores442 35 | path ... \" arguments 36 | .Nm 37 | .Op Fl vn \" [-vhn] 38 | .Fl o Ar output \" [-a path] 39 | .Fl c Ar prores4444 40 | path ... \" arguments 41 | .Sh DESCRIPTION \" Section Header - required - don't modify 42 | .Nm 43 | creates a video from a sequence of images using AV Foundation. The path arguments may be files or directories. 44 | Directories will be recursively traversed. All resulting images are sorted by full path into alphabetical 45 | order and then assembled into the video. 46 | .Pp 47 | Note: Not all codecs are compatible with all file types, e.g. some require a .mov file. 48 | .Pp 49 | .Bl -tag -width -indent \" Differs from above in tag removed 50 | .It Fl b Ar bitrate , Fl Fl bitrate Ns = Ns Ar bitrate \"-a flag as a list item 51 | Set the target bitrate, expressed in megabits per second. 52 | .It Fl c Ar name , Fl Fl codec Ns = Ns Ar name 53 | Select the codec for the video file. Supported codecs are h264, hevc, jpeg, prores4444, and prores422. 54 | .It Fl f Ar fps , Fl Fl framesPerSeconds Ns = Ns Ar fps 55 | Set the frames per second. Must be an integer. 30 is the default. 56 | .It Fl h , Fl Fl help 57 | Display help and version number then exit. 58 | .It Fl H Ar hgt , Fl Fl height Ns = Ns Ar hgt 59 | Set the output height. Width will be calculated to preserve aspect ratio if omitted. 60 | .It Fl l Ar num , Fl Fl level Ns = Ns Ar num 61 | Set the h.264 level. Valid choices are 3.0, 3.1, 3.2, 4.0, 4.1 and auto. The default is auto. 62 | .It Fl n , Fl Fl nodup 63 | Ignore images which are identical to their predecessor. 64 | .It Fl o Ar filename , Fl Fl output Ns = Ns Ar filename 65 | The output filename. This is required. The filename suffix determines the format. Valid extensions are 66 | mp4, m4v, and mov. Unrecognized extensions use the MPEG4 filetype. 67 | .It Fl p Ar name , Fl Fl profile Ns = Ns Ar name 68 | Set the h.264 profile. Valid choices are baseline, main, and high. The default is main. 69 | .It Fl P Ar filename , Fl Fl poster Ns = Ns Ar filename 70 | The poster filename. The poster image is a JPEG taken from around the middle of the sequence. It will be 71 | resized to the same dimensions as the movie. It will not be written if there are no valid images 72 | after the midpoint. 73 | .It Fl q Ar num , Fl Fl quality Ns = Ns Ar num 74 | Set the JPEG quality. e.g. --quality=0.8 75 | .It Fl v , Fl Fl verbose 76 | Print verbose messages while operating. 77 | .It Fl W Ar wid , Fl Fl width Ns = Ns Ar wid 78 | Set the output width. Height will be calculated to preserve aspect ratio if omitted. 79 | .El 80 | .Pp 81 | If there is a fatal error, a partially written file may be produced. 82 | .\" .Sh ENVIRONMENT \" May not be needed 83 | .\" .Sh FILES \" File used or created by the topic of the man page 84 | .\" .Sh DIAGNOSTICS \" May not be needed 85 | .Sh WWW 86 | The timelapse sources are managed at https://github.com/jimstudt/timelapse 87 | .\" .Sh SEE ALSO 88 | .\" .Sh BUGS \" Document known, unremedied bugs 89 | .\" .Sh HISTORY \" Document history if command behaves in a unique manner 90 | -------------------------------------------------------------------------------- /timelapse.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jimstudt/timelapse/7187c131cfdcc10bdf8765fb68156b7c97b698cc/timelapse.pdf -------------------------------------------------------------------------------- /timelapse_Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'TimeLapse' target in the 'TimeLapse' project. 3 | // 4 | 5 | #ifdef __OBJC__ 6 | #import 7 | #endif 8 | --------------------------------------------------------------------------------