├── streamOutput ├── en.lproj │ └── InfoPlist.strings ├── streamOutput-Prefix.pch ├── streamOutput-Info.plist ├── FFMpegTask.h ├── FFMpegTask.m └── streamOutput.xib ├── CTUtil.h ├── streamOutput.h ├── CTContext.h ├── CTEffect.h ├── streamOutput.m └── streamOutput.xcodeproj └── project.pbxproj /streamOutput/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /streamOutput/streamOutput-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'streamOutput' target in the 'streamOutput' project 3 | // 4 | 5 | #ifdef __OBJC__ 6 | #import 7 | #endif 8 | -------------------------------------------------------------------------------- /CTUtil.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #ifndef CTClass 4 | #define CTClass(x) x 5 | #endif 6 | 7 | @interface CTClass(CTUtil) : NSObject 8 | { 9 | } 10 | 11 | + (CGImageRef) loadImage:(NSString *) path; 12 | + (CGImageRef) loadPNGImage:(NSString *) path; 13 | 14 | // Create an xRGB offscreen bitmap 15 | + (CGContextRef) CreateBitmapContextWithData:(void *) bitmapData 16 | pixelsWide:(int) pixelsWide 17 | pixelsHigh:(int) pixelsHigh; 18 | 19 | // NOTE: You must free the bytes as well as releasing the context! 20 | // Create an xRGB offscreen bitmap 21 | + (CGContextRef) CreateBitmapContextPixelsWide:(int) pixelsWide 22 | pixelsHigh:(int) pixelsHigh; 23 | 24 | + (CGRect) fitRect:(CGSize) imageSize 25 | inContainer:(CGSize) container; 26 | 27 | + (CIImage *) coreImageFromNSImage:(NSImage *) xx; 28 | 29 | @end 30 | -------------------------------------------------------------------------------- /streamOutput/streamOutput-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | zakk.lol.${PRODUCT_NAME:rfc1034identifier} 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | BNDL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | NSHumanReadableCopyright 26 | Copyright © 2013 Zakk. All rights reserved. 27 | NSPrincipalClass 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /streamOutput/FFMpegTask.h: -------------------------------------------------------------------------------- 1 | // 2 | // FFMpegTask.h 3 | // H264Streamer 4 | // 5 | // Created by Zakk on 9/4/12. 6 | // Copyright (c) 2012 Zakk. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | #import "libavformat/avformat.h" 12 | 13 | 14 | #define AUDIO_BUFFER_SIZE 1000 15 | @interface FFMpegTask : NSObject 16 | { 17 | 18 | 19 | 20 | 21 | dispatch_queue_t _stream_dispatch; 22 | 23 | AVFormatContext *_av_fmt_ctx; 24 | AVStream *_av_video_stream; 25 | AVStream *_av_audio_stream; 26 | 27 | char *_audio_extradata; 28 | size_t _audio_extradata_size; 29 | 30 | } 31 | 32 | 33 | -(void) writeVideoSampleBuffer:(CMSampleBufferRef)theBuffer; 34 | -(void) writeAudioSampleBuffer:(CMSampleBufferRef)theBuffer presentationTimeStamp:(CMTime)pts; 35 | 36 | 37 | -(bool) stopProcess; 38 | -(bool) restartProcess; 39 | 40 | @property (strong) NSString *stream_output; 41 | @property (strong) NSString *stream_format; 42 | @property (assign) int framerate; 43 | @property (assign) int width; 44 | @property (assign) int height; 45 | @property (assign) int samplerate; 46 | 47 | 48 | 49 | 50 | @end 51 | -------------------------------------------------------------------------------- /streamOutput.h: -------------------------------------------------------------------------------- 1 | // 2 | // streamOutput.h 3 | // streamOutput 4 | // 5 | // Created by Zakk on 3/5/13. 6 | // Copyright (c) 2013 Zakk. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "CTEffect.h" 11 | #import "FFMpegTask.h" 12 | #import 13 | #import 14 | 15 | 16 | 17 | 18 | void VideoCompressorReceiveFrame(void *, void *, OSStatus , VTEncodeInfoFlags , CMSampleBufferRef ); 19 | 20 | 21 | 22 | @interface streamOutput : CTEffect 23 | { 24 | VTCompressionSessionRef _compression_session; 25 | AVCaptureSession *_audio_session; 26 | dispatch_queue_t _audio_capture_queue; 27 | 28 | AVCaptureAudioDataOutput *_audio_capture_output; 29 | 30 | 31 | 32 | 33 | } 34 | 35 | @property (assign) int captureHeight; 36 | @property (assign) int captureWidth; 37 | @property (assign) int captureVideoMaxKeyframeInterval; 38 | @property (assign) int captureVideoMaxBitrate; 39 | @property (assign) int captureVideoAverageBitrate; 40 | @property (assign) int videoCaptureFPS; 41 | @property (strong) FFMpegTask *streamDestination; 42 | @property (strong) NSViewController *viewController; 43 | @property (strong) NSString *destinationValue; 44 | @property (assign) BOOL connected; 45 | @property (assign) BOOL startEnabled; 46 | @property (strong) AVCaptureDevice *selectedAudioCapture; 47 | @property (strong) NSArray *audioCaptureDevices; 48 | @property (assign) int audioBitrate; 49 | 50 | 51 | 52 | 53 | 54 | @end 55 | -------------------------------------------------------------------------------- /CTContext.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | #import 4 | 5 | ////////////////////////////////////////////////////////////////////////// 6 | // 7 | // NOTE: This is a work in progress. Expect this interface to change. 8 | // 9 | ////////////////////////////////////////////////////////////////////////// 10 | 11 | @class CTOffscreenContext; 12 | @class SimpleQCRenderer; 13 | 14 | @interface CTContext : NSObject 15 | { 16 | CGSize size; 17 | NSOpenGLContext *oglCtx; 18 | NSOpenGLPixelFormat *oglFmt; 19 | CVOpenGLBufferRef oglPBuff; 20 | 21 | CIContext *ciCtx; 22 | 23 | SimpleQCRenderer *renderer; 24 | 25 | double frameTime; 26 | } 27 | 28 | + (void) clearContext:(NSOpenGLContext *) oglCtx 29 | toRed:(GLfloat) red 30 | green:(GLfloat) green 31 | blue:(GLfloat) blue 32 | alpha:(GLfloat) alpha; 33 | 34 | + (void) drawPBuffer:(CVOpenGLBufferRef) theBuffer 35 | toContext:(NSOpenGLContext *) otherContext 36 | flipped:(BOOL) flipped 37 | mirrored:(BOOL) mirrored; 38 | 39 | + (void) drawCVTexture:(CVOpenGLTextureRef) texture 40 | toContext:(NSOpenGLContext *) otherContext 41 | flipped:(BOOL) flipped 42 | mirrored:(BOOL) mirrored; 43 | 44 | + (void) drawTexture:(GLuint) tname 45 | fromRect:(CGRect) fromRect 46 | toContext:(NSOpenGLContext *) otherContext 47 | inRect:(CGRect) inRect 48 | flipped:(BOOL) flipped 49 | mirrored:(BOOL) mirrored; 50 | 51 | - (void) setFrameTime:(double) time; 52 | - (double) frameTime; 53 | 54 | // Reset back to a known state 55 | - (void) reset:(BOOL) clearAlpha; 56 | 57 | - (CGSize) size; 58 | 59 | - (CGColorSpaceRef) colorSpace; 60 | 61 | - (NSOpenGLContext *) oglCtx; 62 | - (NSOpenGLPixelFormat *) oglFmt; 63 | - (CVOpenGLBufferRef) oglPBuff; 64 | - (CIContext *) ciCtx; 65 | 66 | - (CVOpenGLTextureRef) texture; // You must release 67 | 68 | - (void) setQCRenderer:(SimpleQCRenderer *) rend; 69 | - (SimpleQCRenderer *) qcRenderer; 70 | 71 | - (void) drawTexture:(GLuint) texture 72 | inRect:(CGRect) inRect 73 | fromRect:(CGRect) fromRect; 74 | 75 | - (void) renderToContext:(NSOpenGLContext *) otherContext; 76 | 77 | - (void) flush; 78 | 79 | - (void) fetchOpenGLPixels:(void *) data 80 | rowBytes:(GLint) rowBytes; 81 | 82 | @end 83 | -------------------------------------------------------------------------------- /CTEffect.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "CTContext.h" 3 | 4 | @class CamTwist; 5 | 6 | typedef enum 7 | { 8 | CTEffectIdle, 9 | CTEffectInProgram, 10 | CTEffectInPreview, 11 | CTEffectInTransition 12 | } CTEffectMode; 13 | 14 | @interface CTEffect : NSObject 15 | { 16 | CTContext *context; 17 | CTEffectMode ctemode; 18 | NSView *inspector; 19 | NSView *miniInspector; 20 | BOOL enabled; 21 | BOOL dirty; 22 | NSString *name; 23 | NSString *savedSetupName; 24 | NSString *savedName; 25 | } 26 | 27 | // Determine the effect class from an encoded effect 28 | + (Class) effectClassWithCoder:(NSCoder *) coder; 29 | 30 | // Factory method for creating effects from archives 31 | + (CTEffect *) effectWithCoder:(NSCoder *) coder; 32 | 33 | // Implement this method to return YES if the effect is a video source 34 | + (BOOL) isSource; 35 | 36 | // Implement this method to return YES if the effect is a video transition 37 | + (BOOL) isTransition; 38 | 39 | // This method must be implemented for each effect 40 | + (NSString *) name; 41 | 42 | // Both initializers must be implemented 43 | - (id) initWithContext:(CTContext *) ctContext; 44 | - (id) initWithCoder:(NSCoder *) coder; 45 | 46 | // CTContext associated with this instance 47 | - (CTContext *) context; 48 | 49 | // Return a view to display in the settings pane 50 | - (NSView *) inspectorView; 51 | 52 | // Return a view to display under the Studio monitors 53 | - (NSView *) miniInspector; 54 | 55 | - (void) setNeedsPersist:(BOOL) b; 56 | - (BOOL) isNeedsPersist; 57 | 58 | // Convenience method for determining if a given instance is a video source 59 | - (BOOL) isSource; 60 | 61 | // Convenience method for determining if a given instance is a video transition 62 | - (BOOL) isTransition; 63 | 64 | // Convenience method for getting the effect name, which is overridable with setName 65 | - (NSString *) name; 66 | - (void) setName:(NSString *) name; 67 | 68 | // Saved setup name. Use for displayName 69 | - (NSString *) savedSetupName; 70 | - (void) setSavedSetupName:(NSString *) ssname; 71 | 72 | // The display name. Pretty much just the name + the saved setup (if any) 73 | - (NSString *) displayName; 74 | 75 | // Is the effect enabled 76 | - (BOOL) isEnabled; 77 | 78 | // If this effect produces audio, use this output device. 79 | - (void) setAudioDevice:(AudioDeviceID) devId; 80 | 81 | // Write the effect state into a coder 82 | - (void) encodeWithCoder:(NSCoder *) coder; 83 | 84 | // Wrapper around Defaults 85 | - (void) setDefault:(id)value forKey:(NSString *)defaultName; 86 | - (id) defaultForKey:(NSString *)defaultName; 87 | 88 | // This method is called before each video frame cycle. 89 | // You can assume the OpenGL frame is all yours. 90 | - (void) preDoit; 91 | 92 | // This method is called for each video frame 93 | - (void) doit; 94 | 95 | // Perform a transition 96 | - (void) doTransitionTo:(CVOpenGLBufferRef) pbuff 97 | percentage:(double) percentage; 98 | 99 | // Set the mode. Returns TRUE if the mode changed. 100 | - (BOOL) setMode:(CTEffectMode) newMode; 101 | - (CTEffectMode) mode; 102 | 103 | // Property management. (Experimental) 104 | // For use with Scripting. Name is display name and _not_ keypath. 105 | - (NSArray *) effectProperties; 106 | - (id) effectPropertyForName:(id) key; 107 | - (void) setEffectProperty:(id) val 108 | forName:(id) key; 109 | - (NSDictionary *) propertyInfoForName:(id) key; 110 | 111 | @end -------------------------------------------------------------------------------- /streamOutput/FFMpegTask.m: -------------------------------------------------------------------------------- 1 | // 2 | // FFMpegTask.m 3 | // H264Streamer 4 | // 5 | // Created by Zakk on 9/4/12. 6 | // Copyright (c) 2012 Zakk. All rights reserved. 7 | // 8 | 9 | #import "FFMpegTask.h" 10 | #import 11 | #import 12 | 13 | #import 14 | 15 | @implementation FFMpegTask 16 | 17 | 18 | #include "libavformat/avformat.h" 19 | 20 | @synthesize stream_output = _stream_output; 21 | 22 | 23 | 24 | int readAudioTagLength(char **buffer) 25 | { 26 | int length = 0; 27 | int cnt =4; 28 | 29 | while(cnt--) 30 | { 31 | int c = *(*buffer)++; 32 | 33 | length = (length << 7) | (c & 0x7f); 34 | if (!(c & 0x80)) 35 | break; 36 | } 37 | return length; 38 | } 39 | 40 | 41 | int readAudioTag(char **buffer, int *tag) 42 | { 43 | 44 | *tag = *(*buffer)++; 45 | return readAudioTagLength(buffer); 46 | 47 | } 48 | 49 | 50 | 51 | void getAudioExtradata(char *cookie, char **buffer, size_t *size) 52 | { 53 | char *esds = cookie; 54 | 55 | int tag, length; 56 | 57 | *size = 0; 58 | 59 | readAudioTag(&esds, &tag); 60 | esds += 2; 61 | if (tag == 0x03) 62 | esds++; 63 | 64 | readAudioTag(&esds, &tag); 65 | 66 | 67 | if (tag == 0x04) { 68 | esds++; 69 | esds++; 70 | esds += 3; 71 | esds += 4; 72 | esds += 4; 73 | 74 | length = readAudioTag(&esds, &tag); 75 | if (tag == 0x05) 76 | { 77 | *buffer = calloc(1, length + 8); 78 | if (*buffer) 79 | { 80 | memcpy(*buffer, esds, length); 81 | *size = length; 82 | 83 | } 84 | 85 | } 86 | } 87 | } 88 | 89 | 90 | 91 | 92 | 93 | -(void) writeAudioSampleBuffer:(CMSampleBufferRef)theBuffer presentationTimeStamp:(CMTime)pts; 94 | { 95 | CFRetain(theBuffer); 96 | 97 | 98 | if (_av_audio_stream) 99 | { 100 | dispatch_async(_stream_dispatch, ^{ 101 | 102 | CMBlockBufferRef blockBufferRef = CMSampleBufferGetDataBuffer(theBuffer); 103 | size_t buffer_length; 104 | size_t offset_length; 105 | char *sampledata; 106 | 107 | 108 | AVPacket pkt; 109 | 110 | av_init_packet(&pkt); 111 | 112 | 113 | pkt.stream_index = _av_audio_stream->index; 114 | 115 | CMBlockBufferGetDataPointer(blockBufferRef, 0, &offset_length, &buffer_length, &sampledata); 116 | 117 | pkt.data = (uint8_t *)sampledata; 118 | 119 | pkt.size = (int)buffer_length; 120 | 121 | 122 | pkt.pts = CMTimeGetSeconds(pts)*1000; 123 | 124 | if (av_interleaved_write_frame(_av_fmt_ctx, &pkt) < 0) 125 | { 126 | NSLog(@"AV WRITE AUDIO failed"); 127 | [self stopProcess]; 128 | } 129 | //CMSampleBufferInvalidate(theBuffer); 130 | CFRelease(theBuffer); 131 | }); 132 | } else if (!_audio_extradata) { 133 | 134 | CMAudioFormatDescriptionRef audio_fmt; 135 | audio_fmt = CMSampleBufferGetFormatDescription(theBuffer); 136 | void *audio_tmp; 137 | if (!audio_fmt) 138 | return; 139 | 140 | 141 | 142 | audio_tmp = (char *)CMAudioFormatDescriptionGetMagicCookie(audio_fmt, &_audio_extradata_size); 143 | 144 | if (audio_tmp) 145 | { 146 | getAudioExtradata(audio_tmp, &_audio_extradata, &_audio_extradata_size); 147 | } 148 | } 149 | } 150 | 151 | 152 | -(NSString *)stream_output 153 | { 154 | return _stream_output; 155 | 156 | } 157 | 158 | 159 | -(void) setStream_output:(NSString *)stream_output 160 | { 161 | _stream_output = stream_output; 162 | if ([_stream_output hasPrefix:@"rtmp://"]) 163 | { 164 | self.stream_format = @"FLV"; 165 | } 166 | 167 | 168 | } 169 | -(bool) createAVFormatOut:(CMSampleBufferRef)theBuffer 170 | { 171 | 172 | NSLog(@"Creating output format %@ DESTINATION %@", _stream_format, _stream_output); 173 | AVOutputFormat *av_out_fmt; 174 | 175 | 176 | if (_stream_format) { 177 | avformat_alloc_output_context2(&_av_fmt_ctx, NULL, [_stream_format UTF8String], [_stream_output UTF8String]); 178 | } else { 179 | avformat_alloc_output_context2(&_av_fmt_ctx, NULL, NULL, [_stream_output UTF8String]); 180 | } 181 | 182 | if (!_av_fmt_ctx) 183 | { 184 | NSLog(@"No av_fmt_ctx"); 185 | return NO; 186 | } 187 | 188 | 189 | av_out_fmt = _av_fmt_ctx->oformat; 190 | _av_video_stream = avformat_new_stream(_av_fmt_ctx, 0); 191 | 192 | if (!_av_video_stream) 193 | { 194 | NSLog(@"No av_video_stream"); 195 | return NO; 196 | } 197 | 198 | 199 | AVCodecContext *c_ctx = _av_video_stream->codec; 200 | 201 | c_ctx->codec_type = AVMEDIA_TYPE_VIDEO; 202 | c_ctx->codec_id = AV_CODEC_ID_H264; 203 | c_ctx->width = _width; 204 | c_ctx->height = _height; 205 | c_ctx->time_base.num = 1; 206 | c_ctx->time_base.den = _framerate; 207 | 208 | 209 | _av_audio_stream = avformat_new_stream(_av_fmt_ctx, 0); 210 | 211 | if (!_av_audio_stream) 212 | { 213 | NSLog(@"No av_audio_stream"); 214 | return NO; 215 | } 216 | 217 | AVCodecContext *a_ctx = _av_audio_stream->codec; 218 | 219 | a_ctx->codec_type = AVMEDIA_TYPE_AUDIO; 220 | a_ctx->codec_id = AV_CODEC_ID_AAC; 221 | a_ctx->time_base.num = 1; 222 | a_ctx->time_base.den = _framerate; 223 | a_ctx->sample_rate = _samplerate; 224 | a_ctx->channels = 2; 225 | a_ctx->extradata = (unsigned char *)_audio_extradata; 226 | a_ctx->extradata_size = (int)_audio_extradata_size; 227 | a_ctx->frame_size = (_samplerate * 2 * 2) / _framerate; 228 | 229 | CMFormatDescriptionRef fmt; 230 | CFDictionaryRef atoms; 231 | CFStringRef avccKey; 232 | CFDataRef avcc_data; 233 | CFIndex avcc_size; 234 | 235 | fmt = CMSampleBufferGetFormatDescription(theBuffer); 236 | atoms = CMFormatDescriptionGetExtension(fmt, kCMFormatDescriptionExtension_SampleDescriptionExtensionAtoms); 237 | avccKey = CFStringCreateWithCString(NULL, "avcC", kCFStringEncodingUTF8); 238 | avcc_data = CFDictionaryGetValue(atoms, avccKey); 239 | avcc_size = CFDataGetLength(avcc_data); 240 | c_ctx->extradata = malloc(avcc_size); 241 | 242 | CFDataGetBytes(avcc_data, CFRangeMake(0,avcc_size), c_ctx->extradata); 243 | 244 | c_ctx->extradata_size = (int)avcc_size; 245 | 246 | if (_av_fmt_ctx->oformat->flags & AVFMT_GLOBALHEADER) 247 | c_ctx->flags |= CODEC_FLAG_GLOBAL_HEADER; 248 | 249 | if (_av_fmt_ctx->oformat->flags & AVFMT_GLOBALHEADER) 250 | a_ctx->flags |= CODEC_FLAG_GLOBAL_HEADER; 251 | 252 | 253 | av_dump_format(_av_fmt_ctx, 0, [_stream_output UTF8String], 1); 254 | 255 | if (!(av_out_fmt->flags & AVFMT_NOFILE)) 256 | { 257 | NSLog(@"Doing AVIO_OPEN"); 258 | if (avio_open(&_av_fmt_ctx->pb, [_stream_output UTF8String], AVIO_FLAG_WRITE) < 0) 259 | { 260 | NSLog(@"AVIO_OPEN failed"); 261 | [self stopProcess]; 262 | } 263 | } 264 | 265 | if (avformat_write_header(_av_fmt_ctx, NULL) < 0) 266 | { 267 | NSLog(@"AVFORMAT_WRITE_HEADER failed"); 268 | [self stopProcess]; 269 | } 270 | return YES; 271 | } 272 | 273 | 274 | -(void) writeVideoSampleBuffer:(CMSampleBufferRef)theBuffer 275 | { 276 | 277 | 278 | CFRetain(theBuffer); 279 | 280 | if (!_stream_dispatch) 281 | { 282 | _stream_dispatch = dispatch_queue_create("FFMpeg Stream Dispatch", NULL); 283 | } 284 | 285 | 286 | dispatch_async(_stream_dispatch, ^{ 287 | 288 | if (!_av_video_stream) 289 | { 290 | if (_audio_extradata) 291 | { 292 | [self createAVFormatOut:theBuffer]; 293 | } else { 294 | return; 295 | } 296 | } 297 | CMBlockBufferRef my_buffer; 298 | char *sampledata; 299 | size_t offset_length; 300 | size_t buffer_length; 301 | 302 | my_buffer = CMSampleBufferGetDataBuffer(theBuffer); 303 | 304 | 305 | AVPacket pkt; 306 | 307 | av_init_packet(&pkt); 308 | 309 | 310 | pkt.stream_index = _av_video_stream->index; 311 | 312 | CMBlockBufferGetDataPointer(my_buffer, 0, &offset_length, &buffer_length, &sampledata); 313 | 314 | pkt.data = (uint8_t *)sampledata; 315 | 316 | pkt.size = (int)buffer_length; 317 | 318 | 319 | pkt.pts = CMTimeGetSeconds(CMSampleBufferGetPresentationTimeStamp(theBuffer))*1000; 320 | 321 | 322 | 323 | if ([self isBufferKeyframe:theBuffer]) 324 | { 325 | pkt.flags |= AV_PKT_FLAG_KEY; 326 | } 327 | 328 | 329 | 330 | if (av_interleaved_write_frame(_av_fmt_ctx, &pkt) < 0) 331 | { 332 | NSLog(@"VIDEO WRITE FRAME failed"); 333 | [self stopProcess]; 334 | } 335 | 336 | //CMSampleBufferInvalidate(theBuffer); 337 | CFRelease(theBuffer); 338 | 339 | }); 340 | 341 | return; 342 | 343 | } 344 | 345 | 346 | -(BOOL) isBufferKeyframe:(CMSampleBufferRef)theBuffer 347 | { 348 | 349 | CFArrayRef sample_attachments; 350 | BOOL result = NO; 351 | 352 | sample_attachments = CMSampleBufferGetSampleAttachmentsArray(theBuffer, NO); 353 | if (sample_attachments) 354 | { 355 | CFDictionaryRef attach; 356 | CFBooleanRef depends_on_others; 357 | 358 | attach = CFArrayGetValueAtIndex(sample_attachments, 0); 359 | depends_on_others = CFDictionaryGetValue(attach, kCMSampleAttachmentKey_DependsOnOthers); 360 | result = depends_on_others == kCFBooleanFalse; 361 | } 362 | 363 | return result; 364 | 365 | } 366 | 367 | 368 | 369 | -(id)init 370 | { 371 | 372 | self = [super init]; 373 | 374 | av_register_all(); 375 | avformat_network_init(); 376 | 377 | 378 | _stream_dispatch = dispatch_queue_create("FFMpeg Stream Dispatch", NULL); 379 | 380 | 381 | return self; 382 | 383 | } 384 | 385 | 386 | -(bool)stopProcess 387 | { 388 | if (_av_fmt_ctx) 389 | { 390 | av_write_trailer(_av_fmt_ctx); 391 | avio_close(_av_fmt_ctx->pb); 392 | av_free(_av_fmt_ctx); 393 | } 394 | 395 | if (_av_video_stream) 396 | av_free(_av_video_stream); 397 | if (_av_audio_stream) 398 | av_free(_av_audio_stream); 399 | 400 | _av_fmt_ctx = NULL; 401 | _av_video_stream = NULL; 402 | _av_audio_stream = NULL; 403 | 404 | 405 | _stream_dispatch = nil; 406 | return YES; 407 | } 408 | @end 409 | -------------------------------------------------------------------------------- /streamOutput.m: -------------------------------------------------------------------------------- 1 | // 2 | // streamOutput.m 3 | // streamOutput 4 | // 5 | // Created by Zakk on 3/5/13. 6 | // Copyright (c) 2013 Zakk. All rights reserved. 7 | // 8 | 9 | #import "streamOutput.h" 10 | 11 | 12 | 13 | @implementation streamOutput 14 | 15 | 16 | 17 | + (NSString *) name 18 | { 19 | return @"streamOutput"; 20 | } 21 | 22 | 23 | - (void) connectDestination 24 | { 25 | 26 | 27 | if (!self.destinationValue || self.captureHeight == 0 || 28 | self.captureWidth == 0 || self.videoCaptureFPS == 0 || 29 | self.captureVideoAverageBitrate == 0 30 | ) 31 | { 32 | self.connected = NO; 33 | } 34 | 35 | 36 | self.streamDestination = [[FFMpegTask alloc] init]; 37 | self.streamDestination.height = self.captureHeight; 38 | self.streamDestination.width = self.captureWidth; 39 | self.streamDestination.framerate = self.videoCaptureFPS; 40 | self.streamDestination.stream_output = self.destinationValue; 41 | self.streamDestination.samplerate = 44100; 42 | 43 | 44 | [self setupAudioCapture]; 45 | [self setupCompression]; 46 | 47 | } 48 | 49 | 50 | -(void) selectedAudioCaptureFromID:(NSString *)uniqueID 51 | { 52 | self.selectedAudioCapture = [AVCaptureDevice deviceWithUniqueID:uniqueID]; 53 | } 54 | 55 | 56 | 57 | - (void) initStreamer 58 | { 59 | 60 | //self.audioCaptureDevices = [[NSArray alloc] init]; 61 | 62 | self.startEnabled = YES; 63 | 64 | 65 | self.viewController = [[NSViewController alloc] initWithNibName:@"streamOutput" 66 | bundle:[NSBundle bundleForClass:[streamOutput class]]]; 67 | 68 | [self.viewController setRepresentedObject:self]; 69 | 70 | 71 | if (self.captureHeight == 0) 72 | self.captureHeight = [[self context] size].height; 73 | 74 | if (self.captureWidth == 0) 75 | self.captureWidth = [[self context] size].width; 76 | 77 | if (self.audioBitrate == 0) 78 | self.audioBitrate = 128; 79 | 80 | 81 | self.audioCaptureDevices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeAudio]; 82 | //[[self mutableArrayValueForKey:@"audioCaptureDevices"] setArray:[AVCaptureDevice devicesWithMediaType:AVMediaTypeAudio]]; 83 | 84 | 85 | 86 | 87 | } 88 | 89 | 90 | 91 | - (NSView *) inspectorView 92 | { 93 | 94 | return [self.viewController view]; 95 | } 96 | 97 | - (id) initWithContext:(CTContext *) ctContext 98 | { 99 | 100 | self = [super initWithContext:ctContext]; 101 | [self initStreamer]; 102 | return self; 103 | } 104 | 105 | 106 | - (id) initWithCoder:(NSCoder *) coder 107 | { 108 | self = [super initWithCoder:coder]; 109 | 110 | self.captureHeight = [coder decodeIntForKey:@"height"]; 111 | self.captureWidth = [coder decodeIntForKey:@"width"]; 112 | self.captureVideoAverageBitrate = [coder decodeIntForKey:@"avgbitrate"]; 113 | self.captureVideoMaxKeyframeInterval = [coder decodeIntForKey:@"keyframe"]; 114 | self.captureVideoMaxBitrate = [coder decodeIntForKey:@"maxbitrate"]; 115 | self.videoCaptureFPS = [coder decodeIntForKey:@"videoFPS"]; 116 | self.destinationValue = [coder decodeObjectForKey:@"destination"]; 117 | 118 | NSString *audioID = [coder decodeObjectForKey:@"audioCaptureID"]; 119 | 120 | [self selectedAudioCaptureFromID:audioID]; 121 | 122 | self.audioBitrate = [coder decodeIntForKey:@"audioBitrate"]; 123 | 124 | 125 | 126 | [self initStreamer]; 127 | return self; 128 | } 129 | 130 | 131 | - (void) encodeWithCoder:(NSCoder *) coder 132 | { 133 | [super encodeWithCoder:coder]; 134 | 135 | [coder encodeInt:self.captureHeight forKey:@"height"]; 136 | [coder encodeInt:self.captureWidth forKey:@"width"]; 137 | [coder encodeInt:self.captureVideoAverageBitrate forKey:@"avgbitrate"]; 138 | [coder encodeInt:self.captureVideoMaxKeyframeInterval forKey:@"keyframe"]; 139 | [coder encodeInt:self.captureVideoMaxBitrate forKey:@"maxbitrate"]; 140 | [coder encodeInt:self.videoCaptureFPS forKey:@"videoFPS"]; 141 | [coder encodeObject:self.destinationValue forKey:@"destination"]; 142 | if (self.selectedAudioCapture) 143 | { 144 | [coder encodeObject:self.selectedAudioCapture.uniqueID forKey:@"audioCaptureID"]; 145 | } 146 | 147 | [coder encodeInt:self.audioBitrate forKey:@"audioBitrate"]; 148 | 149 | 150 | 151 | } 152 | 153 | 154 | void PixelBufferRelease( void *releaseRefCon, const void *baseAddress ) 155 | { 156 | free((int *)baseAddress); 157 | } 158 | 159 | 160 | 161 | - (void) doit 162 | { 163 | 164 | if (self.mode != CTEffectInProgram) 165 | { 166 | return; 167 | } 168 | 169 | 170 | if (self.connected == NO) 171 | { 172 | if (self.streamDestination) 173 | { 174 | [self.streamDestination stopProcess]; 175 | [_audio_session stopRunning]; 176 | } 177 | 178 | self.streamDestination = nil; 179 | return; 180 | } else if (self.connected == YES) { 181 | if (!self.streamDestination) 182 | { 183 | [self connectDestination]; 184 | } 185 | } 186 | 187 | 188 | 189 | 190 | CVImageBufferRef newbuf = NULL; 191 | 192 | 193 | 194 | int *pdata = malloc(self.captureWidth * self.captureHeight * 4); 195 | 196 | [[self context] fetchOpenGLPixels:pdata rowBytes:self.captureWidth * 4]; 197 | 198 | 199 | CVPixelBufferCreateWithBytes(NULL, self.captureWidth, self.captureHeight, 200 | kCVPixelFormatType_32ARGB,pdata, self.captureWidth * 4, PixelBufferRelease, NULL, NULL, &newbuf); 201 | 202 | 203 | 204 | 205 | 206 | CFAbsoluteTime currentTime = CFAbsoluteTimeGetCurrent(); 207 | 208 | CMTime pts = CMTimeMake(currentTime*1000, 1000); 209 | 210 | CMTime duration = CMTimeMake(1, self.videoCaptureFPS); 211 | 212 | 213 | VTCompressionSessionEncodeFrame(_compression_session, newbuf, pts, duration, NULL, newbuf, NULL); 214 | } 215 | 216 | 217 | 218 | - (bool)setupAudioCapture 219 | { 220 | if (!_audio_session) 221 | { 222 | _audio_session = [[AVCaptureSession alloc] init]; 223 | 224 | } 225 | 226 | if (_audio_session && self.selectedAudioCapture) 227 | { 228 | AVCaptureDeviceInput *audio_capture_input = [AVCaptureDeviceInput deviceInputWithDevice:self.selectedAudioCapture error:nil]; 229 | 230 | if ([_audio_session canAddInput:audio_capture_input]) 231 | { 232 | [_audio_session addInput:audio_capture_input]; 233 | } else { 234 | return NO; 235 | } 236 | 237 | _audio_capture_output = [[AVCaptureAudioDataOutput alloc] init]; 238 | _audio_capture_output.audioSettings = @{AVFormatIDKey: [NSNumber numberWithInt:kAudioFormatMPEG4AAC], 239 | AVSampleRateKey: [NSNumber numberWithFloat:44100.0], 240 | AVEncoderBitRateKey: [NSNumber numberWithInt:self.audioBitrate*1000], 241 | AVNumberOfChannelsKey: @2 }; 242 | 243 | if ([_audio_session canAddOutput:_audio_capture_output]) 244 | { 245 | [_audio_session addOutput:_audio_capture_output]; 246 | } else { 247 | return NO; 248 | } 249 | 250 | } else { 251 | return NO; 252 | } 253 | 254 | _audio_capture_queue = dispatch_queue_create("CamTwist ffmpeg audio queue", NULL); 255 | [_audio_capture_output setSampleBufferDelegate:self queue:_audio_capture_queue]; 256 | [_audio_session startRunning]; 257 | 258 | return YES; 259 | } 260 | 261 | 262 | - (bool)setupCompression 263 | { 264 | OSStatus status; 265 | NSDictionary *encoder_spec = @{@"EnableHardwareAcceleratedVideoEncoder": @1}; 266 | 267 | 268 | if (!self.captureHeight || !self.captureHeight) 269 | { 270 | return NO; 271 | 272 | } 273 | 274 | status = VTCompressionSessionCreate(NULL, self.captureWidth, self.captureHeight, 'avc1', (__bridge CFDictionaryRef)encoder_spec, NULL, NULL, VideoCompressorReceiveFrame, (__bridge void *)self, &_compression_session); 275 | 276 | //If priority isn't set to -20 the framerate in the SPS/VUI section locks to 25. With -20 it takes on the value of 277 | //whatever ExpectedFrameRate is. I have no idea what the fuck, but it works. 278 | 279 | VTSessionSetProperty(_compression_session, (CFStringRef)@"Priority", (__bridge CFTypeRef)(@-20)); 280 | VTSessionSetProperty(_compression_session, kVTCompressionPropertyKey_AllowFrameReordering, kCFBooleanFalse); 281 | 282 | 283 | if (self.captureVideoMaxKeyframeInterval && self.captureVideoMaxKeyframeInterval > 0) 284 | { 285 | VTSessionSetProperty(_compression_session, kVTCompressionPropertyKey_MaxKeyFrameInterval, (__bridge CFTypeRef)(@(self.captureVideoMaxKeyframeInterval))); 286 | } 287 | 288 | if (self.captureVideoMaxBitrate && self.captureVideoMaxBitrate > 0) 289 | { 290 | 291 | int real_bitrate = self.captureVideoMaxBitrate*128; // In bytes (1024/8) 292 | VTSessionSetProperty(_compression_session, kVTCompressionPropertyKey_DataRateLimits, (__bridge CFTypeRef)(@[@(real_bitrate), @1.0])); 293 | 294 | } 295 | 296 | 297 | if (self.captureVideoAverageBitrate > 0) 298 | { 299 | int real_bitrate = self.captureVideoAverageBitrate*1024; 300 | 301 | NSLog(@"Setting bitrate to %d", real_bitrate); 302 | 303 | VTSessionSetProperty(_compression_session, kVTCompressionPropertyKey_AverageBitRate, CFNumberCreate(NULL, kCFNumberIntType, &real_bitrate)); 304 | 305 | } 306 | 307 | if (self.videoCaptureFPS && self.videoCaptureFPS > 0) 308 | { 309 | 310 | VTSessionSetProperty(_compression_session, kVTCompressionPropertyKey_ExpectedFrameRate, (__bridge CFTypeRef)(@(self.videoCaptureFPS))); 311 | 312 | } 313 | 314 | return YES; 315 | 316 | } 317 | 318 | 319 | void VideoCompressorReceiveFrame(void *VTref, void *VTFrameRef, OSStatus status, VTEncodeInfoFlags infoFlags, CMSampleBufferRef sampleBuffer) 320 | { 321 | if (VTFrameRef) 322 | { 323 | CVPixelBufferRelease(VTFrameRef); 324 | } 325 | 326 | @autoreleasepool { 327 | 328 | 329 | 330 | if(!sampleBuffer) 331 | return; 332 | 333 | 334 | 335 | CFRetain(sampleBuffer); 336 | 337 | streamOutput *selfobj = (__bridge streamOutput *)VTref; 338 | 339 | 340 | [selfobj.streamDestination writeVideoSampleBuffer:sampleBuffer]; 341 | 342 | CFRelease(sampleBuffer); 343 | } 344 | } 345 | 346 | - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection 347 | { 348 | 349 | CFAbsoluteTime currentTime = CFAbsoluteTimeGetCurrent(); 350 | CMTime pts = CMTimeMake(currentTime*1000, 1000); 351 | CMSampleBufferSetOutputPresentationTimeStamp(sampleBuffer, pts); 352 | [self.streamDestination writeAudioSampleBuffer:sampleBuffer presentationTimeStamp:pts]; 353 | 354 | } 355 | 356 | 357 | @end 358 | -------------------------------------------------------------------------------- /streamOutput.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 3400774C16E6E15A00097E8F /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3400774B16E6E15A00097E8F /* Cocoa.framework */; }; 11 | 3400775616E6E15A00097E8F /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 3400775416E6E15A00097E8F /* InfoPlist.strings */; }; 12 | 3400776316E6E1E800097E8F /* streamOutput.m in Sources */ = {isa = PBXBuildFile; fileRef = 3400776216E6E1E800097E8F /* streamOutput.m */; }; 13 | 3400776E16E6ED6F00097E8F /* FFMpegTask.m in Sources */ = {isa = PBXBuildFile; fileRef = 3400776D16E6ED6F00097E8F /* FFMpegTask.m */; }; 14 | 3400777216E70B3D00097E8F /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 3400777116E70B3D00097E8F /* libz.dylib */; }; 15 | 3400777416E70B4400097E8F /* libbz2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 3400777316E70B4400097E8F /* libbz2.dylib */; }; 16 | 3400777616E70B5100097E8F /* VideoToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3400777516E70B5100097E8F /* VideoToolbox.framework */; }; 17 | 3400777816E70B9000097E8F /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3400777716E70B9000097E8F /* CoreMedia.framework */; }; 18 | 3400777A16E70B9700097E8F /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3400777916E70B9700097E8F /* CoreVideo.framework */; }; 19 | 3400777C16E70BB900097E8F /* VideoDecodeAcceleration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3400777B16E70BB900097E8F /* VideoDecodeAcceleration.framework */; }; 20 | 34C363E816EB369A003CEFF1 /* streamOutput.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34C363E716EB369A003CEFF1 /* streamOutput.xib */; }; 21 | /* End PBXBuildFile section */ 22 | 23 | /* Begin PBXFileReference section */ 24 | 3400774816E6E15A00097E8F /* streamOutput.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = streamOutput.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 25 | 3400774B16E6E15A00097E8F /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 26 | 3400774E16E6E15A00097E8F /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; 27 | 3400774F16E6E15A00097E8F /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; 28 | 3400775016E6E15A00097E8F /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 29 | 3400775316E6E15A00097E8F /* streamOutput-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "streamOutput-Info.plist"; sourceTree = ""; }; 30 | 3400775516E6E15A00097E8F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 31 | 3400775716E6E15A00097E8F /* streamOutput-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "streamOutput-Prefix.pch"; sourceTree = ""; }; 32 | 3400775E16E6E1B700097E8F /* CTUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTUtil.h; sourceTree = ""; }; 33 | 3400775F16E6E1B700097E8F /* CTContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTContext.h; sourceTree = ""; }; 34 | 3400776016E6E1B700097E8F /* CTEffect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTEffect.h; sourceTree = ""; }; 35 | 3400776116E6E1E800097E8F /* streamOutput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = streamOutput.h; sourceTree = SOURCE_ROOT; }; 36 | 3400776216E6E1E800097E8F /* streamOutput.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = streamOutput.m; sourceTree = SOURCE_ROOT; }; 37 | 3400776C16E6ED6F00097E8F /* FFMpegTask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FFMpegTask.h; sourceTree = ""; }; 38 | 3400776D16E6ED6F00097E8F /* FFMpegTask.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FFMpegTask.m; sourceTree = ""; }; 39 | 3400777116E70B3D00097E8F /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; 40 | 3400777316E70B4400097E8F /* libbz2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libbz2.dylib; path = usr/lib/libbz2.dylib; sourceTree = SDKROOT; }; 41 | 3400777516E70B5100097E8F /* VideoToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = VideoToolbox.framework; path = System/Library/Frameworks/VideoToolbox.framework; sourceTree = SDKROOT; }; 42 | 3400777716E70B9000097E8F /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; 43 | 3400777916E70B9700097E8F /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; 44 | 3400777B16E70BB900097E8F /* VideoDecodeAcceleration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = VideoDecodeAcceleration.framework; path = System/Library/Frameworks/VideoDecodeAcceleration.framework; sourceTree = SDKROOT; }; 45 | 34C363E716EB369A003CEFF1 /* streamOutput.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = streamOutput.xib; sourceTree = ""; }; 46 | /* End PBXFileReference section */ 47 | 48 | /* Begin PBXFrameworksBuildPhase section */ 49 | 3400774516E6E15A00097E8F /* Frameworks */ = { 50 | isa = PBXFrameworksBuildPhase; 51 | buildActionMask = 2147483647; 52 | files = ( 53 | 3400777C16E70BB900097E8F /* VideoDecodeAcceleration.framework in Frameworks */, 54 | 3400777A16E70B9700097E8F /* CoreVideo.framework in Frameworks */, 55 | 3400777816E70B9000097E8F /* CoreMedia.framework in Frameworks */, 56 | 3400777616E70B5100097E8F /* VideoToolbox.framework in Frameworks */, 57 | 3400777416E70B4400097E8F /* libbz2.dylib in Frameworks */, 58 | 3400777216E70B3D00097E8F /* libz.dylib in Frameworks */, 59 | 3400774C16E6E15A00097E8F /* Cocoa.framework in Frameworks */, 60 | ); 61 | runOnlyForDeploymentPostprocessing = 0; 62 | }; 63 | /* End PBXFrameworksBuildPhase section */ 64 | 65 | /* Begin PBXGroup section */ 66 | 3400773D16E6E15A00097E8F = { 67 | isa = PBXGroup; 68 | children = ( 69 | 3400777B16E70BB900097E8F /* VideoDecodeAcceleration.framework */, 70 | 3400777916E70B9700097E8F /* CoreVideo.framework */, 71 | 3400777716E70B9000097E8F /* CoreMedia.framework */, 72 | 3400777516E70B5100097E8F /* VideoToolbox.framework */, 73 | 3400777316E70B4400097E8F /* libbz2.dylib */, 74 | 3400777116E70B3D00097E8F /* libz.dylib */, 75 | 3400775D16E6E19900097E8F /* CTHeaders */, 76 | 3400775116E6E15A00097E8F /* streamOutput */, 77 | 3400774A16E6E15A00097E8F /* Frameworks */, 78 | 3400774916E6E15A00097E8F /* Products */, 79 | ); 80 | sourceTree = ""; 81 | }; 82 | 3400774916E6E15A00097E8F /* Products */ = { 83 | isa = PBXGroup; 84 | children = ( 85 | 3400774816E6E15A00097E8F /* streamOutput.bundle */, 86 | ); 87 | name = Products; 88 | sourceTree = ""; 89 | }; 90 | 3400774A16E6E15A00097E8F /* Frameworks */ = { 91 | isa = PBXGroup; 92 | children = ( 93 | 3400774B16E6E15A00097E8F /* Cocoa.framework */, 94 | 3400774D16E6E15A00097E8F /* Other Frameworks */, 95 | ); 96 | name = Frameworks; 97 | sourceTree = ""; 98 | }; 99 | 3400774D16E6E15A00097E8F /* Other Frameworks */ = { 100 | isa = PBXGroup; 101 | children = ( 102 | 3400774E16E6E15A00097E8F /* AppKit.framework */, 103 | 3400774F16E6E15A00097E8F /* CoreData.framework */, 104 | 3400775016E6E15A00097E8F /* Foundation.framework */, 105 | ); 106 | name = "Other Frameworks"; 107 | sourceTree = ""; 108 | }; 109 | 3400775116E6E15A00097E8F /* streamOutput */ = { 110 | isa = PBXGroup; 111 | children = ( 112 | 34C363E716EB369A003CEFF1 /* streamOutput.xib */, 113 | 3400776C16E6ED6F00097E8F /* FFMpegTask.h */, 114 | 3400776D16E6ED6F00097E8F /* FFMpegTask.m */, 115 | 3400776116E6E1E800097E8F /* streamOutput.h */, 116 | 3400776216E6E1E800097E8F /* streamOutput.m */, 117 | 3400775216E6E15A00097E8F /* Supporting Files */, 118 | ); 119 | path = streamOutput; 120 | sourceTree = ""; 121 | }; 122 | 3400775216E6E15A00097E8F /* Supporting Files */ = { 123 | isa = PBXGroup; 124 | children = ( 125 | 3400775316E6E15A00097E8F /* streamOutput-Info.plist */, 126 | 3400775416E6E15A00097E8F /* InfoPlist.strings */, 127 | 3400775716E6E15A00097E8F /* streamOutput-Prefix.pch */, 128 | ); 129 | name = "Supporting Files"; 130 | sourceTree = ""; 131 | }; 132 | 3400775D16E6E19900097E8F /* CTHeaders */ = { 133 | isa = PBXGroup; 134 | children = ( 135 | 3400775E16E6E1B700097E8F /* CTUtil.h */, 136 | 3400775F16E6E1B700097E8F /* CTContext.h */, 137 | 3400776016E6E1B700097E8F /* CTEffect.h */, 138 | ); 139 | name = CTHeaders; 140 | sourceTree = ""; 141 | }; 142 | /* End PBXGroup section */ 143 | 144 | /* Begin PBXNativeTarget section */ 145 | 3400774716E6E15A00097E8F /* streamOutput */ = { 146 | isa = PBXNativeTarget; 147 | buildConfigurationList = 3400775A16E6E15A00097E8F /* Build configuration list for PBXNativeTarget "streamOutput" */; 148 | buildPhases = ( 149 | 3400774416E6E15A00097E8F /* Sources */, 150 | 3400774516E6E15A00097E8F /* Frameworks */, 151 | 3400774616E6E15A00097E8F /* Resources */, 152 | ); 153 | buildRules = ( 154 | ); 155 | dependencies = ( 156 | ); 157 | name = streamOutput; 158 | productName = streamOutput; 159 | productReference = 3400774816E6E15A00097E8F /* streamOutput.bundle */; 160 | productType = "com.apple.product-type.bundle"; 161 | }; 162 | /* End PBXNativeTarget section */ 163 | 164 | /* Begin PBXProject section */ 165 | 3400773F16E6E15A00097E8F /* Project object */ = { 166 | isa = PBXProject; 167 | attributes = { 168 | LastUpgradeCheck = 0450; 169 | ORGANIZATIONNAME = Zakk; 170 | }; 171 | buildConfigurationList = 3400774216E6E15A00097E8F /* Build configuration list for PBXProject "streamOutput" */; 172 | compatibilityVersion = "Xcode 3.2"; 173 | developmentRegion = English; 174 | hasScannedForEncodings = 0; 175 | knownRegions = ( 176 | en, 177 | ); 178 | mainGroup = 3400773D16E6E15A00097E8F; 179 | productRefGroup = 3400774916E6E15A00097E8F /* Products */; 180 | projectDirPath = ""; 181 | projectRoot = ""; 182 | targets = ( 183 | 3400774716E6E15A00097E8F /* streamOutput */, 184 | ); 185 | }; 186 | /* End PBXProject section */ 187 | 188 | /* Begin PBXResourcesBuildPhase section */ 189 | 3400774616E6E15A00097E8F /* Resources */ = { 190 | isa = PBXResourcesBuildPhase; 191 | buildActionMask = 2147483647; 192 | files = ( 193 | 3400775616E6E15A00097E8F /* InfoPlist.strings in Resources */, 194 | 34C363E816EB369A003CEFF1 /* streamOutput.xib in Resources */, 195 | ); 196 | runOnlyForDeploymentPostprocessing = 0; 197 | }; 198 | /* End PBXResourcesBuildPhase section */ 199 | 200 | /* Begin PBXSourcesBuildPhase section */ 201 | 3400774416E6E15A00097E8F /* Sources */ = { 202 | isa = PBXSourcesBuildPhase; 203 | buildActionMask = 2147483647; 204 | files = ( 205 | 3400776316E6E1E800097E8F /* streamOutput.m in Sources */, 206 | 3400776E16E6ED6F00097E8F /* FFMpegTask.m in Sources */, 207 | ); 208 | runOnlyForDeploymentPostprocessing = 0; 209 | }; 210 | /* End PBXSourcesBuildPhase section */ 211 | 212 | /* Begin PBXVariantGroup section */ 213 | 3400775416E6E15A00097E8F /* InfoPlist.strings */ = { 214 | isa = PBXVariantGroup; 215 | children = ( 216 | 3400775516E6E15A00097E8F /* en */, 217 | ); 218 | name = InfoPlist.strings; 219 | sourceTree = ""; 220 | }; 221 | /* End PBXVariantGroup section */ 222 | 223 | /* Begin XCBuildConfiguration section */ 224 | 3400775816E6E15A00097E8F /* Debug */ = { 225 | isa = XCBuildConfiguration; 226 | buildSettings = { 227 | ALWAYS_SEARCH_USER_PATHS = NO; 228 | ARCHS = "$(ARCHS_STANDARD_64_BIT)"; 229 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 230 | CLANG_CXX_LIBRARY = "libc++"; 231 | CLANG_ENABLE_OBJC_ARC = YES; 232 | CLANG_WARN_EMPTY_BODY = YES; 233 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 234 | COPY_PHASE_STRIP = NO; 235 | GCC_C_LANGUAGE_STANDARD = gnu99; 236 | GCC_DYNAMIC_NO_PIC = NO; 237 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 238 | GCC_OPTIMIZATION_LEVEL = 0; 239 | GCC_PREPROCESSOR_DEFINITIONS = ( 240 | "DEBUG=1", 241 | "$(inherited)", 242 | ); 243 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 244 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 245 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 246 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 247 | GCC_WARN_UNUSED_VARIABLE = YES; 248 | MACOSX_DEPLOYMENT_TARGET = 10.8; 249 | ONLY_ACTIVE_ARCH = YES; 250 | SDKROOT = macosx; 251 | }; 252 | name = Debug; 253 | }; 254 | 3400775916E6E15A00097E8F /* Release */ = { 255 | isa = XCBuildConfiguration; 256 | buildSettings = { 257 | ALWAYS_SEARCH_USER_PATHS = NO; 258 | ARCHS = "$(ARCHS_STANDARD_64_BIT)"; 259 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 260 | CLANG_CXX_LIBRARY = "libc++"; 261 | CLANG_ENABLE_OBJC_ARC = YES; 262 | CLANG_WARN_EMPTY_BODY = YES; 263 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 264 | COPY_PHASE_STRIP = YES; 265 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 266 | GCC_C_LANGUAGE_STANDARD = gnu99; 267 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 268 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 269 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 270 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 271 | GCC_WARN_UNUSED_VARIABLE = YES; 272 | MACOSX_DEPLOYMENT_TARGET = 10.8; 273 | SDKROOT = macosx; 274 | }; 275 | name = Release; 276 | }; 277 | 3400775B16E6E15A00097E8F /* Debug */ = { 278 | isa = XCBuildConfiguration; 279 | buildSettings = { 280 | COMBINE_HIDPI_IMAGES = YES; 281 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 282 | GCC_PREFIX_HEADER = "streamOutput/streamOutput-Prefix.pch"; 283 | HEADER_SEARCH_PATHS = /usr/local/include; 284 | INFOPLIST_FILE = "streamOutput/streamOutput-Info.plist"; 285 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; 286 | OTHER_LDFLAGS = ( 287 | /usr/local/lib/libmp3lame.a, 288 | /usr/local/lib/libavcodec.a, 289 | /usr/local/lib/libavformat.a, 290 | /usr/local/lib/libavutil.a, 291 | "-flat_namespace", 292 | "-undefined", 293 | suppress, 294 | ); 295 | PRODUCT_NAME = "$(TARGET_NAME)"; 296 | WRAPPER_EXTENSION = bundle; 297 | }; 298 | name = Debug; 299 | }; 300 | 3400775C16E6E15A00097E8F /* Release */ = { 301 | isa = XCBuildConfiguration; 302 | buildSettings = { 303 | COMBINE_HIDPI_IMAGES = YES; 304 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 305 | GCC_PREFIX_HEADER = "streamOutput/streamOutput-Prefix.pch"; 306 | HEADER_SEARCH_PATHS = /usr/local/include; 307 | INFOPLIST_FILE = "streamOutput/streamOutput-Info.plist"; 308 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; 309 | OTHER_LDFLAGS = ( 310 | /usr/local/lib/libmp3lame.a, 311 | /usr/local/lib/libavcodec.a, 312 | /usr/local/lib/libavformat.a, 313 | /usr/local/lib/libavutil.a, 314 | "-flat_namespace", 315 | "-undefined", 316 | suppress, 317 | ); 318 | PRODUCT_NAME = "$(TARGET_NAME)"; 319 | WRAPPER_EXTENSION = bundle; 320 | }; 321 | name = Release; 322 | }; 323 | /* End XCBuildConfiguration section */ 324 | 325 | /* Begin XCConfigurationList section */ 326 | 3400774216E6E15A00097E8F /* Build configuration list for PBXProject "streamOutput" */ = { 327 | isa = XCConfigurationList; 328 | buildConfigurations = ( 329 | 3400775816E6E15A00097E8F /* Debug */, 330 | 3400775916E6E15A00097E8F /* Release */, 331 | ); 332 | defaultConfigurationIsVisible = 0; 333 | defaultConfigurationName = Release; 334 | }; 335 | 3400775A16E6E15A00097E8F /* Build configuration list for PBXNativeTarget "streamOutput" */ = { 336 | isa = XCConfigurationList; 337 | buildConfigurations = ( 338 | 3400775B16E6E15A00097E8F /* Debug */, 339 | 3400775C16E6E15A00097E8F /* Release */, 340 | ); 341 | defaultConfigurationIsVisible = 0; 342 | defaultConfigurationName = Release; 343 | }; 344 | /* End XCConfigurationList section */ 345 | }; 346 | rootObject = 3400773F16E6E15A00097E8F /* Project object */; 347 | } 348 | -------------------------------------------------------------------------------- /streamOutput/streamOutput.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1080 5 | 12C3012 6 | 2840 7 | 1187.34 8 | 625.00 9 | 10 | com.apple.InterfaceBuilder.CocoaPlugin 11 | 2840 12 | 13 | 14 | IBNSLayoutConstraint 15 | NSArrayController 16 | NSButton 17 | NSButtonCell 18 | NSCustomObject 19 | NSCustomView 20 | NSMenu 21 | NSMenuItem 22 | NSPopUpButton 23 | NSPopUpButtonCell 24 | NSTextField 25 | NSTextFieldCell 26 | NSUserDefaultsController 27 | 28 | 29 | com.apple.InterfaceBuilder.CocoaPlugin 30 | 31 | 32 | PluginDependencyRecalculationVersion 33 | 34 | 35 | 36 | 37 | NSViewController 38 | 39 | 40 | FirstResponder 41 | 42 | 43 | NSApplication 44 | 45 | 46 | 47 | 268 48 | 49 | 50 | 51 | 268 52 | {{208, 491}, {87, 18}} 53 | 54 | 55 | 56 | _NS:1535 57 | YES 58 | 59 | 68157504 60 | 272630784 61 | (kilobits/sec) 62 | 63 | LucidaGrande 64 | 13 65 | 1044 66 | 67 | _NS:1535 68 | 69 | 70 | 6 71 | System 72 | controlColor 73 | 74 | 3 75 | MC42NjY2NjY2NjY3AA 76 | 77 | 78 | 79 | 6 80 | System 81 | controlTextColor 82 | 83 | 3 84 | MAA 85 | 86 | 87 | 88 | NO 89 | 90 | 91 | 92 | 268 93 | {{137, 489}, {66, 22}} 94 | 95 | 96 | 97 | _NS:9 98 | YES 99 | 100 | -1804599231 101 | 272630784 102 | 103 | 104 | _NS:9 105 | 106 | YES 107 | 108 | 6 109 | System 110 | textBackgroundColor 111 | 112 | 3 113 | MQA 114 | 115 | 116 | 117 | 6 118 | System 119 | textColor 120 | 121 | 122 | 123 | NO 124 | 125 | 126 | 127 | 268 128 | {{134, 513}, {100, 26}} 129 | 130 | 131 | 132 | _NS:9 133 | YES 134 | 135 | -2076180416 136 | 2048 137 | 138 | _NS:9 139 | 140 | 109199360 141 | 129 142 | 143 | 144 | 400 145 | 75 146 | 147 | 148 | Item 1 149 | 150 | 1048576 151 | 2147483647 152 | 1 153 | 154 | NSImage 155 | NSMenuCheckmark 156 | 157 | 158 | NSImage 159 | NSMenuMixedState 160 | 161 | _popUpItemAction: 162 | 163 | 164 | YES 165 | 166 | OtherViews 167 | 168 | 169 | 170 | 171 | Item 2 172 | 173 | 1048576 174 | 2147483647 175 | 176 | 177 | _popUpItemAction: 178 | 179 | 180 | 181 | 182 | Item 3 183 | 184 | 1048576 185 | 2147483647 186 | 187 | 188 | _popUpItemAction: 189 | 190 | 191 | 192 | 193 | 194 | 1 195 | YES 196 | YES 197 | 2 198 | 199 | NO 200 | 201 | 202 | 203 | 268 204 | {{17, 492}, {45, 17}} 205 | 206 | 207 | 208 | _NS:1535 209 | YES 210 | 211 | 68157504 212 | 272630784 213 | Bitrate 214 | 215 | _NS:1535 216 | 217 | 218 | 219 | 220 | NO 221 | 222 | 223 | 224 | 268 225 | {{17, 518}, {88, 17}} 226 | 227 | 228 | 229 | _NS:1535 230 | YES 231 | 232 | 68157504 233 | 272630784 234 | Audio Source 235 | 236 | _NS:1535 237 | 238 | 239 | 240 | 241 | NO 242 | 243 | 244 | 245 | 268 246 | {{208, 397}, {87, 17}} 247 | 248 | 249 | 250 | _NS:1535 251 | YES 252 | 253 | 68157504 254 | 272630784 255 | (kilobits/sec) 256 | 257 | _NS:1535 258 | 259 | 260 | 261 | 262 | NO 263 | 264 | 265 | 266 | 268 267 | {{208, 372}, {87, 17}} 268 | 269 | 270 | 271 | _NS:1535 272 | YES 273 | 274 | 68157504 275 | 272630784 276 | (kilobits/sec) 277 | 278 | _NS:1535 279 | 280 | 281 | 282 | 283 | NO 284 | 285 | 286 | 287 | 268 288 | {{189, 230}, {82, 32}} 289 | 290 | 291 | 292 | _NS:9 293 | YES 294 | 295 | 67108864 296 | 134217728 297 | Start 298 | 299 | _NS:9 300 | 301 | -930988032 302 | 129 303 | Stop 304 | 305 | 200 306 | 25 307 | 308 | NO 309 | 310 | 311 | 312 | 268 313 | {{137, 292}, {304, 22}} 314 | 315 | 316 | 317 | _NS:9 318 | YES 319 | 320 | -1804599231 321 | 272630784 322 | 323 | 324 | _NS:9 325 | 326 | YES 327 | 328 | 329 | 330 | NO 331 | 332 | 333 | 334 | 268 335 | {{17, 295}, {77, 17}} 336 | 337 | 338 | 339 | _NS:1535 340 | YES 341 | 342 | 68157504 343 | 272630784 344 | Destination 345 | 346 | _NS:1535 347 | 348 | 349 | 350 | 351 | NO 352 | 353 | 354 | 355 | 268 356 | {{17, 394}, {73, 17}} 357 | 358 | 359 | 360 | _NS:1535 361 | YES 362 | 363 | 68157504 364 | 272630784 365 | Avg Bitrate 366 | 367 | _NS:1535 368 | 369 | 370 | 371 | 372 | NO 373 | 374 | 375 | 376 | 268 377 | {{17, 369}, {76, 17}} 378 | 379 | 380 | 381 | _NS:1535 382 | YES 383 | 384 | 68157504 385 | 272630784 386 | Max Bitrate 387 | 388 | _NS:1535 389 | 390 | 391 | 392 | 393 | NO 394 | 395 | 396 | 397 | 268 398 | {{17, 344}, {115, 17}} 399 | 400 | 401 | 402 | _NS:1535 403 | YES 404 | 405 | 68157504 406 | 272630784 407 | Keyframe Interval 408 | 409 | _NS:1535 410 | 411 | 412 | 413 | 414 | NO 415 | 416 | 417 | 418 | 268 419 | {{17, 322}, {68, 17}} 420 | 421 | 422 | 423 | _NS:1535 424 | YES 425 | 426 | 68157504 427 | 272630784 428 | Framerate 429 | 430 | _NS:1535 431 | 432 | 433 | 434 | 435 | NO 436 | 437 | 438 | 439 | 268 440 | {{17, 419}, {46, 17}} 441 | 442 | 443 | 444 | _NS:1535 445 | YES 446 | 447 | 68157504 448 | 272630784 449 | Height 450 | 451 | _NS:1535 452 | 453 | 454 | 455 | 456 | NO 457 | 458 | 459 | 460 | 268 461 | {{17, 442}, {40, 17}} 462 | 463 | 464 | 465 | _NS:1535 466 | YES 467 | 468 | 68157504 469 | 272630784 470 | Width 471 | 472 | _NS:1535 473 | 474 | 475 | 476 | 477 | NO 478 | 479 | 480 | 481 | 268 482 | {{137, 319}, {66, 22}} 483 | 484 | 485 | 486 | _NS:9 487 | YES 488 | 489 | -1804599231 490 | 272630784 491 | 492 | 493 | _NS:9 494 | 495 | YES 496 | 497 | 498 | 499 | NO 500 | 501 | 502 | 503 | 268 504 | {{137, 439}, {66, 22}} 505 | 506 | 507 | 508 | _NS:9 509 | YES 510 | 511 | -1804599231 512 | 272630784 513 | 514 | 515 | _NS:9 516 | 517 | YES 518 | 519 | 520 | 521 | NO 522 | 523 | 524 | 525 | 268 526 | {{137, 344}, {66, 22}} 527 | 528 | 529 | 530 | _NS:9 531 | YES 532 | 533 | -1804599231 534 | 272630784 535 | 536 | 537 | _NS:9 538 | 539 | YES 540 | 541 | 542 | 543 | NO 544 | 545 | 546 | 547 | 268 548 | {{137, 369}, {66, 22}} 549 | 550 | 551 | 552 | _NS:9 553 | YES 554 | 555 | -1804599231 556 | 272630784 557 | 558 | 559 | _NS:9 560 | 561 | YES 562 | 563 | 564 | 565 | NO 566 | 567 | 568 | 569 | 268 570 | {{137, 394}, {66, 22}} 571 | 572 | 573 | 574 | _NS:9 575 | YES 576 | 577 | -1804599231 578 | 272630784 579 | 580 | 581 | _NS:9 582 | 583 | YES 584 | 585 | 586 | 587 | NO 588 | 589 | 590 | 591 | 268 592 | {{137, 416}, {66, 22}} 593 | 594 | 595 | 596 | _NS:9 597 | YES 598 | 599 | -1804599231 600 | 272630784 601 | 602 | 603 | _NS:9 604 | 605 | YES 606 | 607 | 608 | 609 | NO 610 | 611 | 612 | {461, 564} 613 | 614 | 615 | 616 | NSView 617 | 618 | 619 | YES 620 | 621 | 622 | YES 623 | 624 | YES 625 | YES 626 | YES 627 | YES 628 | YES 629 | 630 | 631 | 632 | 633 | 634 | 635 | view 636 | 637 | 638 | 639 | 147 640 | 641 | 642 | 643 | value: representedObject.captureHeight 644 | 645 | 646 | 647 | 648 | 649 | value: representedObject.captureHeight 650 | value 651 | representedObject.captureHeight 652 | 653 | NSContinuouslyUpdatesValue 654 | 655 | 656 | 2 657 | 658 | 659 | 392 660 | 661 | 662 | 663 | value: representedObject.captureVideoAverageBitrate 664 | 665 | 666 | 667 | 668 | 669 | value: representedObject.captureVideoAverageBitrate 670 | value 671 | representedObject.captureVideoAverageBitrate 672 | 673 | NSContinuouslyUpdatesValue 674 | 675 | 676 | 2 677 | 678 | 679 | 393 680 | 681 | 682 | 683 | value: representedObject.captureVideoMaxBitrate 684 | 685 | 686 | 687 | 688 | 689 | value: representedObject.captureVideoMaxBitrate 690 | value 691 | representedObject.captureVideoMaxBitrate 692 | 693 | NSContinuouslyUpdatesValue 694 | 695 | 696 | 2 697 | 698 | 699 | 394 700 | 701 | 702 | 703 | value: representedObject.captureVideoMaxKeyframeInterval 704 | 705 | 706 | 707 | 708 | 709 | value: representedObject.captureVideoMaxKeyframeInterval 710 | value 711 | representedObject.captureVideoMaxKeyframeInterval 712 | 713 | NSContinuouslyUpdatesValue 714 | 715 | 716 | 2 717 | 718 | 719 | 395 720 | 721 | 722 | 723 | value: representedObject.captureWidth 724 | 725 | 726 | 727 | 728 | 729 | value: representedObject.captureWidth 730 | value 731 | representedObject.captureWidth 732 | 733 | NSContinuouslyUpdatesValue 734 | 735 | 736 | 2 737 | 738 | 739 | 391 740 | 741 | 742 | 743 | value: representedObject.videoCaptureFPS 744 | 745 | 746 | 747 | 748 | 749 | value: representedObject.videoCaptureFPS 750 | value 751 | representedObject.videoCaptureFPS 752 | 753 | NSContinuouslyUpdatesValue 754 | 755 | 756 | 2 757 | 758 | 759 | 396 760 | 761 | 762 | 763 | value: representedObject.destinationValue 764 | 765 | 766 | 767 | 768 | 769 | value: representedObject.destinationValue 770 | value 771 | representedObject.destinationValue 772 | 773 | NSContinuouslyUpdatesValue 774 | 775 | 776 | 2 777 | 778 | 779 | 397 780 | 781 | 782 | 783 | value: representedObject.connected 784 | 785 | 786 | 787 | 788 | 789 | value: representedObject.connected 790 | value 791 | representedObject.connected 792 | 2 793 | 794 | 795 | 215 796 | 797 | 798 | 799 | enabled: representedObject.startEnabled 800 | 801 | 802 | 803 | 804 | 805 | enabled: representedObject.startEnabled 806 | enabled 807 | representedObject.startEnabled 808 | 2 809 | 810 | 811 | 220 812 | 813 | 814 | 815 | content: arrangedObjects 816 | 817 | 818 | 819 | 820 | 821 | content: arrangedObjects 822 | content 823 | arrangedObjects 824 | 2 825 | 826 | 827 | 435 828 | 829 | 830 | 831 | contentValues: arrangedObjects.localizedName 832 | 833 | 834 | 835 | 836 | 837 | contentValues: arrangedObjects.localizedName 838 | contentValues 839 | arrangedObjects.localizedName 840 | 841 | 2 842 | 843 | 844 | 436 845 | 846 | 847 | 848 | selectedObject: representedObject.selectedAudioCapture 849 | 850 | 851 | 852 | 853 | 854 | selectedObject: representedObject.selectedAudioCapture 855 | selectedObject 856 | representedObject.selectedAudioCapture 857 | 858 | 2 859 | 860 | 861 | 437 862 | 863 | 864 | 865 | value: representedObject.audioBitrate 866 | 867 | 868 | 869 | 870 | 871 | value: representedObject.audioBitrate 872 | value 873 | representedObject.audioBitrate 874 | 875 | NSContinuouslyUpdatesValue 876 | 877 | 878 | 2 879 | 880 | 881 | 390 882 | 883 | 884 | 885 | contentArray: representedObject.audioCaptureDevices 886 | 887 | 888 | 889 | 890 | 891 | contentArray: representedObject.audioCaptureDevices 892 | contentArray 893 | representedObject.audioCaptureDevices 894 | 2 895 | 896 | 897 | 438 898 | 899 | 900 | 901 | 902 | 903 | 0 904 | 905 | 906 | 907 | 908 | 909 | -2 910 | 911 | 912 | File's Owner 913 | 914 | 915 | -1 916 | 917 | 918 | First Responder 919 | 920 | 921 | -3 922 | 923 | 924 | Application 925 | 926 | 927 | 128 928 | 929 | 930 | 931 | 932 | 1 933 | 934 | 935 | 936 | 937 | 9 938 | 0 939 | 940 | 9 941 | 1 942 | 943 | 0.0 944 | 945 | 1000 946 | 947 | 5 948 | 22 949 | 2 950 | 951 | 952 | 953 | 4 954 | 0 955 | 956 | 4 957 | 1 958 | 959 | 237 960 | 961 | 1000 962 | 963 | 3 964 | 9 965 | 3 966 | 967 | 968 | 969 | 3 970 | 0 971 | 972 | 3 973 | 1 974 | 975 | 250 976 | 977 | 1000 978 | 979 | 3 980 | 9 981 | 3 982 | 983 | 984 | 985 | 6 986 | 0 987 | 988 | 6 989 | 1 990 | 991 | 20 992 | 993 | 1000 994 | 995 | 8 996 | 29 997 | 3 998 | 999 | 1000 | 1001 | 5 1002 | 0 1003 | 1004 | 5 1005 | 1 1006 | 1007 | 0.0 1008 | 1009 | 1000 1010 | 1011 | 6 1012 | 24 1013 | 2 1014 | 1015 | 1016 | 1017 | 5 1018 | 0 1019 | 1020 | 6 1021 | 1 1022 | 1023 | 8 1024 | 1025 | 1000 1026 | 1027 | 6 1028 | 24 1029 | 3 1030 | 1031 | 1032 | 1033 | 3 1034 | 0 1035 | 1036 | 4 1037 | 1 1038 | 1039 | 8 1040 | 1041 | 1000 1042 | 1043 | 6 1044 | 24 1045 | 3 1046 | 1047 | 1048 | 1049 | 3 1050 | 0 1051 | 1052 | 3 1053 | 1 1054 | 1055 | 223 1056 | 1057 | 1000 1058 | 1059 | 3 1060 | 9 1061 | 3 1062 | 1063 | 1064 | 1065 | 5 1066 | 0 1067 | 1068 | 5 1069 | 1 1070 | 1071 | 0.0 1072 | 1073 | 1000 1074 | 1075 | 6 1076 | 24 1077 | 2 1078 | 1079 | 1080 | 1081 | 5 1082 | 0 1083 | 1084 | 5 1085 | 1 1086 | 1087 | 0.0 1088 | 1089 | 1000 1090 | 1091 | 6 1092 | 24 1093 | 2 1094 | 1095 | 1096 | 1097 | 5 1098 | 0 1099 | 1100 | 6 1101 | 1 1102 | 1103 | 8 1104 | 1105 | 1000 1106 | 1107 | 6 1108 | 24 1109 | 3 1110 | 1111 | 1112 | 1113 | 10 1114 | 0 1115 | 1116 | 10 1117 | 1 1118 | 1119 | 0.0 1120 | 1121 | 1000 1122 | 1123 | 6 1124 | 24 1125 | 2 1126 | 1127 | 1128 | 1129 | 5 1130 | 0 1131 | 1132 | 5 1133 | 1 1134 | 1135 | 20 1136 | 1137 | 1000 1138 | 1139 | 8 1140 | 29 1141 | 3 1142 | 1143 | 1144 | 1145 | 10 1146 | 0 1147 | 1148 | 10 1149 | 1 1150 | 1151 | 0.0 1152 | 1153 | 1000 1154 | 1155 | 6 1156 | 24 1157 | 2 1158 | 1159 | 1160 | 1161 | 6 1162 | 0 1163 | 1164 | 6 1165 | 1 1166 | 1167 | 0.0 1168 | 1169 | 1000 1170 | 1171 | 6 1172 | 24 1173 | 2 1174 | 1175 | 1176 | 1177 | 6 1178 | 0 1179 | 1180 | 6 1181 | 1 1182 | 1183 | 0.0 1184 | 1185 | 1000 1186 | 1187 | 6 1188 | 24 1189 | 2 1190 | 1191 | 1192 | 1193 | 5 1194 | 0 1195 | 1196 | 5 1197 | 1 1198 | 1199 | 0.0 1200 | 1201 | 1000 1202 | 1203 | 6 1204 | 24 1205 | 2 1206 | 1207 | 1208 | 1209 | 4 1210 | 0 1211 | 1212 | 4 1213 | 1 1214 | 1215 | 0.0 1216 | 1217 | 1000 1218 | 1219 | 6 1220 | 24 1221 | 2 1222 | 1223 | 1224 | 1225 | 5 1226 | 0 1227 | 1228 | 6 1229 | 1 1230 | 1231 | 8 1232 | 1233 | 1000 1234 | 1235 | 6 1236 | 24 1237 | 3 1238 | 1239 | 1240 | 1241 | 10 1242 | 0 1243 | 1244 | 10 1245 | 1 1246 | 1247 | 0.0 1248 | 1249 | 1000 1250 | 1251 | 6 1252 | 24 1253 | 2 1254 | 1255 | 1256 | 1257 | 5 1258 | 0 1259 | 1260 | 5 1261 | 1 1262 | 1263 | 20 1264 | 1265 | 1000 1266 | 1267 | 8 1268 | 29 1269 | 3 1270 | 1271 | 1272 | 1273 | 5 1274 | 0 1275 | 1276 | 6 1277 | 1 1278 | 1279 | 8 1280 | 1281 | 1000 1282 | 1283 | 6 1284 | 24 1285 | 3 1286 | 1287 | 1288 | 1289 | 3 1290 | 0 1291 | 1292 | 3 1293 | 1 1294 | 1295 | 0.0 1296 | 1297 | 1000 1298 | 1299 | 6 1300 | 24 1301 | 2 1302 | 1303 | 1304 | 1305 | 11 1306 | 0 1307 | 1308 | 11 1309 | 1 1310 | 1311 | 0.0 1312 | 1313 | 1000 1314 | 1315 | 6 1316 | 24 1317 | 2 1318 | 1319 | 1320 | 1321 | 5 1322 | 0 1323 | 1324 | 5 1325 | 1 1326 | 1327 | 0.0 1328 | 1329 | 1000 1330 | 1331 | 6 1332 | 24 1333 | 2 1334 | 1335 | 1336 | 1337 | 3 1338 | 0 1339 | 1340 | 4 1341 | 1 1342 | 1343 | 8 1344 | 1345 | 1000 1346 | 1347 | 6 1348 | 24 1349 | 3 1350 | 1351 | 1352 | 1353 | 3 1354 | 0 1355 | 1356 | 4 1357 | 1 1358 | 1359 | 8 1360 | 1361 | 1000 1362 | 1363 | 6 1364 | 24 1365 | 3 1366 | 1367 | 1368 | 1369 | 5 1370 | 0 1371 | 1372 | 5 1373 | 1 1374 | 1375 | 20 1376 | 1377 | 1000 1378 | 1379 | 8 1380 | 29 1381 | 3 1382 | 1383 | 1384 | 1385 | 5 1386 | 0 1387 | 1388 | 5 1389 | 1 1390 | 1391 | 0.0 1392 | 1393 | 1000 1394 | 1395 | 6 1396 | 24 1397 | 2 1398 | 1399 | 1400 | 1401 | 4 1402 | 0 1403 | 1404 | 4 1405 | 1 1406 | 1407 | 0.0 1408 | 1409 | 1000 1410 | 1411 | 6 1412 | 24 1413 | 2 1414 | 1415 | 1416 | 1417 | 3 1418 | 0 1419 | 1420 | 3 1421 | 1 1422 | 1423 | 126 1424 | 1425 | 1000 1426 | 1427 | 3 1428 | 9 1429 | 3 1430 | 1431 | 1432 | 1433 | 6 1434 | 0 1435 | 1436 | 6 1437 | 1 1438 | 1439 | 0.0 1440 | 1441 | 1000 1442 | 1443 | 6 1444 | 24 1445 | 2 1446 | 1447 | 1448 | 1449 | 6 1450 | 0 1451 | 1452 | 6 1453 | 1 1454 | 1455 | 0.0 1456 | 1457 | 1000 1458 | 1459 | 6 1460 | 24 1461 | 2 1462 | 1463 | 1464 | 1465 | 5 1466 | 0 1467 | 1468 | 5 1469 | 1 1470 | 1471 | 0.0 1472 | 1473 | 1000 1474 | 1475 | 6 1476 | 24 1477 | 2 1478 | 1479 | 1480 | 1481 | 5 1482 | 0 1483 | 1484 | 5 1485 | 1 1486 | 1487 | 0.0 1488 | 1489 | 1000 1490 | 1491 | 6 1492 | 24 1493 | 2 1494 | 1495 | 1496 | 1497 | 3 1498 | 0 1499 | 1500 | 4 1501 | 1 1502 | 1503 | 8 1504 | 1505 | 1000 1506 | 1507 | 6 1508 | 24 1509 | 3 1510 | 1511 | 1512 | 1513 | 5 1514 | 0 1515 | 1516 | 5 1517 | 1 1518 | 1519 | 20 1520 | 1521 | 1000 1522 | 1523 | 8 1524 | 29 1525 | 3 1526 | 1527 | 1528 | 1529 | 3 1530 | 0 1531 | 1532 | 3 1533 | 1 1534 | 1535 | 103 1536 | 1537 | 1000 1538 | 1539 | 3 1540 | 9 1541 | 3 1542 | 1543 | 1544 | 1545 | 3 1546 | 0 1547 | 1548 | 4 1549 | 1 1550 | 1551 | 8 1552 | 1553 | 1000 1554 | 1555 | 6 1556 | 24 1557 | 3 1558 | 1559 | 1560 | 1561 | 5 1562 | 0 1563 | 1564 | 5 1565 | 1 1566 | 1567 | 20 1568 | 1569 | 1000 1570 | 1571 | 8 1572 | 29 1573 | 3 1574 | 1575 | 1576 | 1577 | 3 1578 | 0 1579 | 1580 | 3 1581 | 1 1582 | 1583 | 53 1584 | 1585 | 1000 1586 | 1587 | 3 1588 | 9 1589 | 3 1590 | 1591 | 1592 | 1593 | 5 1594 | 0 1595 | 1596 | 5 1597 | 1 1598 | 1599 | 0.0 1600 | 1601 | 1000 1602 | 1603 | 6 1604 | 24 1605 | 2 1606 | 1607 | 1608 | 1609 | 3 1610 | 0 1611 | 1612 | 3 1613 | 1 1614 | 1615 | 27 1616 | 1617 | 1000 1618 | 1619 | 3 1620 | 9 1621 | 3 1622 | 1623 | 1624 | 1625 | 5 1626 | 0 1627 | 1628 | 5 1629 | 1 1630 | 1631 | 0.0 1632 | 1633 | 1000 1634 | 1635 | 6 1636 | 24 1637 | 2 1638 | 1639 | 1640 | 1641 | 5 1642 | 0 1643 | 1644 | 5 1645 | 1 1646 | 1647 | 20 1648 | 1649 | 1000 1650 | 1651 | 8 1652 | 29 1653 | 3 1654 | 1655 | 1656 | 1657 | 10 1658 | 0 1659 | 1660 | 10 1661 | 1 1662 | 1663 | 0.0 1664 | 1665 | 1000 1666 | 1667 | 6 1668 | 24 1669 | 2 1670 | 1671 | 1672 | 1673 | 10 1674 | 0 1675 | 1676 | 10 1677 | 1 1678 | 1679 | 0.0 1680 | 1681 | 1000 1682 | 1683 | 6 1684 | 24 1685 | 2 1686 | 1687 | 1688 | 1689 | 5 1690 | 0 1691 | 1692 | 5 1693 | 1 1694 | 1695 | 20 1696 | 1697 | 1000 1698 | 1699 | 8 1700 | 29 1701 | 3 1702 | 1703 | 1704 | 1705 | 5 1706 | 0 1707 | 1708 | 5 1709 | 1 1710 | 1711 | 20 1712 | 1713 | 1000 1714 | 1715 | 8 1716 | 29 1717 | 3 1718 | 1719 | 1720 | 1721 | 10 1722 | 0 1723 | 1724 | 10 1725 | 1 1726 | 1727 | 0.0 1728 | 1729 | 1000 1730 | 1731 | 6 1732 | 24 1733 | 2 1734 | 1735 | 1736 | 1737 | 10 1738 | 0 1739 | 1740 | 10 1741 | 1 1742 | 1743 | 0.0 1744 | 1745 | 1000 1746 | 1747 | 6 1748 | 24 1749 | 2 1750 | 1751 | 1752 | 1753 | 5 1754 | 0 1755 | 1756 | 5 1757 | 1 1758 | 1759 | 20 1760 | 1761 | 1000 1762 | 1763 | 8 1764 | 29 1765 | 3 1766 | 1767 | 1768 | 1769 | 1770 | 1771 | 1772 | 1773 | 1774 | 1775 | 1776 | 1777 | 1778 | 1779 | 1780 | 1781 | 1782 | 1783 | 1784 | 1785 | 1786 | 1787 | 1788 | 1789 | 1790 | 1791 | 1792 | 1793 | 12 1794 | 1795 | 1796 | 1797 | 1798 | 1799 | 1800 | 1801 | 13 1802 | 1803 | 1804 | 1805 | 1806 | 2 1807 | 1808 | 1809 | 1810 | 1811 | 1812 | 1813 | 1814 | 3 1815 | 1816 | 1817 | 1818 | 1819 | 27 1820 | 1821 | 1822 | 1823 | 1824 | 1825 | 1826 | 1827 | 28 1828 | 1829 | 1830 | 1831 | 1832 | 17 1833 | 1834 | 1835 | 1836 | 1837 | 1838 | 1839 | 1840 | 18 1841 | 1842 | 1843 | 1844 | 1845 | 22 1846 | 1847 | 1848 | 1849 | 1850 | 1851 | 1852 | 1853 | 23 1854 | 1855 | 1856 | 1857 | 1858 | 51 1859 | 1860 | 1861 | 1862 | 1863 | 1864 | 1865 | 1866 | 52 1867 | 1868 | 1869 | 1870 | 1871 | 55 1872 | 1873 | 1874 | 1875 | 1876 | 1877 | 1878 | 1879 | 56 1880 | 1881 | 1882 | 1883 | 1884 | 59 1885 | 1886 | 1887 | 1888 | 1889 | 1890 | 1891 | 1892 | 60 1893 | 1894 | 1895 | 1896 | 1897 | 39 1898 | 1899 | 1900 | 1901 | 1902 | 1903 | 1904 | 1905 | 40 1906 | 1907 | 1908 | 1909 | 1910 | 43 1911 | 1912 | 1913 | 1914 | 1915 | 1916 | 1917 | 1918 | 44 1919 | 1920 | 1921 | 1922 | 1923 | 67 1924 | 1925 | 1926 | 1927 | 1928 | 78 1929 | 1930 | 1931 | 1932 | 1933 | 83 1934 | 1935 | 1936 | 1937 | 1938 | 84 1939 | 1940 | 1941 | 1942 | 1943 | 88 1944 | 1945 | 1946 | 1947 | 1948 | 89 1949 | 1950 | 1951 | 1952 | 1953 | 99 1954 | 1955 | 1956 | 1957 | 1958 | 81 1959 | 1960 | 1961 | 1962 | 1963 | 112 1964 | 1965 | 1966 | 1967 | 1968 | 91 1969 | 1970 | 1971 | 1972 | 1973 | 92 1974 | 1975 | 1976 | 1977 | 1978 | 110 1979 | 1980 | 1981 | 1982 | 1983 | 116 1984 | 1985 | 1986 | 1987 | 1988 | 169 1989 | 1990 | 1991 | 1992 | 1993 | 171 1994 | 1995 | 1996 | 1997 | 1998 | 172 1999 | 2000 | 2001 | 2002 | 2003 | 173 2004 | 2005 | 2006 | 2007 | 2008 | 178 2009 | 2010 | 2011 | 2012 | 2013 | 179 2014 | 2015 | 2016 | 2017 | 2018 | 180 2019 | 2020 | 2021 | 2022 | 2023 | 183 2024 | 2025 | 2026 | 2027 | 2028 | 34 2029 | 2030 | 2031 | 2032 | 2033 | 2034 | 2035 | 2036 | 35 2037 | 2038 | 2039 | 2040 | 2041 | 47 2042 | 2043 | 2044 | 2045 | 2046 | 2047 | 2048 | 2049 | 94 2050 | 2051 | 2052 | 2053 | 2054 | 48 2055 | 2056 | 2057 | 2058 | 2059 | 186 2060 | 2061 | 2062 | 2063 | 2064 | 187 2065 | 2066 | 2067 | 2068 | 2069 | 189 2070 | 2071 | 2072 | 2073 | 2074 | 193 2075 | 2076 | 2077 | 2078 | 2079 | 2080 | 2081 | 2082 | 194 2083 | 2084 | 2085 | 2086 | 2087 | 197 2088 | 2089 | 2090 | 2091 | 2092 | 2093 | 2094 | 2095 | 198 2096 | 2097 | 2098 | 2099 | 2100 | 199 2101 | 2102 | 2103 | 2104 | 2105 | 202 2106 | 2107 | 2108 | 2109 | 2110 | 203 2111 | 2112 | 2113 | 2114 | 2115 | 204 2116 | 2117 | 2118 | 2119 | 2120 | 208 2121 | 2122 | 2123 | 2124 | 2125 | 2126 | 7 2127 | 0 2128 | 2129 | 0 2130 | 1 2131 | 2132 | 70 2133 | 2134 | 1000 2135 | 2136 | 3 2137 | 9 2138 | 1 2139 | 2140 | 2141 | 2142 | 2143 | 2144 | 209 2145 | 2146 | 2147 | 2148 | 2149 | 212 2150 | 2151 | 2152 | 2153 | 2154 | 221 2155 | 2156 | 2157 | 2158 | 2159 | 2160 | 2161 | 2162 | 222 2163 | 2164 | 2165 | 2166 | 2167 | 226 2168 | 2169 | 2170 | 2171 | 2172 | 2173 | 2174 | 2175 | 227 2176 | 2177 | 2178 | 2179 | 2180 | 228 2181 | 2182 | 2183 | 2184 | 2185 | 230 2186 | 2187 | 2188 | 2189 | 2190 | 232 2191 | 2192 | 2193 | 2194 | 2195 | 236 2196 | 2197 | 2198 | 2199 | 2200 | 238 2201 | 2202 | 2203 | 2204 | 2205 | 329 2206 | 2207 | 2208 | 2209 | 2210 | 330 2211 | 2212 | 2213 | 2214 | 2215 | 332 2216 | 2217 | 2218 | 2219 | 2220 | 333 2221 | 2222 | 2223 | 2224 | 2225 | 334 2226 | 2227 | 2228 | 2229 | 2230 | 2231 | 2232 | 2233 | 335 2234 | 2235 | 2236 | 2237 | 2238 | 338 2239 | 2240 | 2241 | 2242 | 2243 | 2244 | 2245 | 2246 | 339 2247 | 2248 | 2249 | 2250 | 2251 | 342 2252 | 2253 | 2254 | 2255 | 2256 | 2257 | 7 2258 | 0 2259 | 2260 | 0 2261 | 1 2262 | 2263 | 94 2264 | 2265 | 1000 2266 | 2267 | 3 2268 | 9 2269 | 1 2270 | 2271 | 2272 | 2273 | 2274 | 2275 | 343 2276 | 2277 | 2278 | 2279 | 2280 | 2281 | 2282 | 2283 | 344 2284 | 2285 | 2286 | 2287 | 2288 | 2289 | 2290 | 2291 | 2292 | 2293 | 345 2294 | 2295 | 2296 | 2297 | 2298 | 346 2299 | 2300 | 2301 | 2302 | 2303 | 347 2304 | 2305 | 2306 | 2307 | 2308 | 350 2309 | 2310 | 2311 | 2312 | 2313 | 351 2314 | 2315 | 2316 | 2317 | 2318 | 2319 | 7 2320 | 0 2321 | 2322 | 0 2323 | 1 2324 | 2325 | 66 2326 | 2327 | 1000 2328 | 2329 | 3 2330 | 9 2331 | 1 2332 | 2333 | 2334 | 2335 | 2336 | 2337 | 352 2338 | 2339 | 2340 | 2341 | 2342 | 353 2343 | 2344 | 2345 | 2346 | 2347 | 356 2348 | 2349 | 2350 | 2351 | 2352 | 357 2353 | 2354 | 2355 | 2356 | 2357 | 358 2358 | 2359 | 2360 | 2361 | 2362 | 361 2363 | 2364 | 2365 | 2366 | 2367 | 362 2368 | 2369 | 2370 | 2371 | 2372 | 363 2373 | 2374 | 2375 | 2376 | 2377 | 364 2378 | 2379 | 2380 | 2381 | 2382 | 366 2383 | 2384 | 2385 | 2386 | 2387 | 367 2388 | 2389 | 2390 | 2391 | 2392 | 2393 | 2394 | 2395 | 368 2396 | 2397 | 2398 | 2399 | 2400 | 373 2401 | 2402 | 2403 | 2404 | 2405 | 374 2406 | 2407 | 2408 | 2409 | 2410 | 375 2411 | 2412 | 2413 | 2414 | 2415 | 376 2416 | 2417 | 2418 | 2419 | 2420 | 379 2421 | 2422 | 2423 | AudioDeviceArrayController 2424 | 2425 | 2426 | 398 2427 | 2428 | 2429 | 2430 | 2431 | 399 2432 | 2433 | 2434 | 2435 | 2436 | 2437 | 2438 | com.apple.InterfaceBuilder.CocoaPlugin 2439 | com.apple.InterfaceBuilder.CocoaPlugin 2440 | com.apple.InterfaceBuilder.CocoaPlugin 2441 | 2442 | 2443 | 2444 | 2445 | 2446 | 2447 | 2448 | 2449 | 2450 | 2451 | 2452 | 2453 | 2454 | 2455 | 2456 | 2457 | 2458 | 2459 | 2460 | 2461 | 2462 | 2463 | 2464 | 2465 | 2466 | 2467 | 2468 | 2469 | 2470 | 2471 | 2472 | 2473 | 2474 | 2475 | 2476 | 2477 | 2478 | 2479 | 2480 | 2481 | 2482 | 2483 | 2484 | 2485 | 2486 | 2487 | 2488 | 2489 | 2490 | 2491 | 2492 | 2493 | 2494 | 2495 | com.apple.InterfaceBuilder.CocoaPlugin 2496 | com.apple.InterfaceBuilder.CocoaPlugin 2497 | com.apple.InterfaceBuilder.CocoaPlugin 2498 | com.apple.InterfaceBuilder.CocoaPlugin 2499 | 2500 | com.apple.InterfaceBuilder.CocoaPlugin 2501 | com.apple.InterfaceBuilder.CocoaPlugin 2502 | com.apple.InterfaceBuilder.CocoaPlugin 2503 | com.apple.InterfaceBuilder.CocoaPlugin 2504 | 2505 | com.apple.InterfaceBuilder.CocoaPlugin 2506 | com.apple.InterfaceBuilder.CocoaPlugin 2507 | com.apple.InterfaceBuilder.CocoaPlugin 2508 | com.apple.InterfaceBuilder.CocoaPlugin 2509 | com.apple.InterfaceBuilder.CocoaPlugin 2510 | com.apple.InterfaceBuilder.CocoaPlugin 2511 | com.apple.InterfaceBuilder.CocoaPlugin 2512 | com.apple.InterfaceBuilder.CocoaPlugin 2513 | com.apple.InterfaceBuilder.CocoaPlugin 2514 | com.apple.InterfaceBuilder.CocoaPlugin 2515 | com.apple.InterfaceBuilder.CocoaPlugin 2516 | com.apple.InterfaceBuilder.CocoaPlugin 2517 | 2518 | com.apple.InterfaceBuilder.CocoaPlugin 2519 | com.apple.InterfaceBuilder.CocoaPlugin 2520 | 2521 | com.apple.InterfaceBuilder.CocoaPlugin 2522 | com.apple.InterfaceBuilder.CocoaPlugin 2523 | com.apple.InterfaceBuilder.CocoaPlugin 2524 | 2525 | com.apple.InterfaceBuilder.CocoaPlugin 2526 | com.apple.InterfaceBuilder.CocoaPlugin 2527 | com.apple.InterfaceBuilder.CocoaPlugin 2528 | com.apple.InterfaceBuilder.CocoaPlugin 2529 | 2530 | 2531 | 2532 | 2533 | com.apple.InterfaceBuilder.CocoaPlugin 2534 | com.apple.InterfaceBuilder.CocoaPlugin 2535 | com.apple.InterfaceBuilder.CocoaPlugin 2536 | 2537 | com.apple.InterfaceBuilder.CocoaPlugin 2538 | 2539 | com.apple.InterfaceBuilder.CocoaPlugin 2540 | com.apple.InterfaceBuilder.CocoaPlugin 2541 | 2542 | com.apple.InterfaceBuilder.CocoaPlugin 2543 | com.apple.InterfaceBuilder.CocoaPlugin 2544 | com.apple.InterfaceBuilder.CocoaPlugin 2545 | com.apple.InterfaceBuilder.CocoaPlugin 2546 | com.apple.InterfaceBuilder.CocoaPlugin 2547 | com.apple.InterfaceBuilder.CocoaPlugin 2548 | com.apple.InterfaceBuilder.CocoaPlugin 2549 | com.apple.InterfaceBuilder.CocoaPlugin 2550 | 2551 | com.apple.InterfaceBuilder.CocoaPlugin 2552 | com.apple.InterfaceBuilder.CocoaPlugin 2553 | com.apple.InterfaceBuilder.CocoaPlugin 2554 | com.apple.InterfaceBuilder.CocoaPlugin 2555 | com.apple.InterfaceBuilder.CocoaPlugin 2556 | com.apple.InterfaceBuilder.CocoaPlugin 2557 | com.apple.InterfaceBuilder.CocoaPlugin 2558 | 2559 | com.apple.InterfaceBuilder.CocoaPlugin 2560 | com.apple.InterfaceBuilder.CocoaPlugin 2561 | 2562 | com.apple.InterfaceBuilder.CocoaPlugin 2563 | com.apple.InterfaceBuilder.CocoaPlugin 2564 | 2565 | com.apple.InterfaceBuilder.CocoaPlugin 2566 | 2567 | 2568 | 2569 | 2570 | com.apple.InterfaceBuilder.CocoaPlugin 2571 | com.apple.InterfaceBuilder.CocoaPlugin 2572 | com.apple.InterfaceBuilder.CocoaPlugin 2573 | com.apple.InterfaceBuilder.CocoaPlugin 2574 | com.apple.InterfaceBuilder.CocoaPlugin 2575 | com.apple.InterfaceBuilder.CocoaPlugin 2576 | com.apple.InterfaceBuilder.CocoaPlugin 2577 | com.apple.InterfaceBuilder.CocoaPlugin 2578 | 2579 | 2580 | 2581 | 2582 | com.apple.InterfaceBuilder.CocoaPlugin 2583 | com.apple.InterfaceBuilder.CocoaPlugin 2584 | com.apple.InterfaceBuilder.CocoaPlugin 2585 | com.apple.InterfaceBuilder.CocoaPlugin 2586 | com.apple.InterfaceBuilder.CocoaPlugin 2587 | com.apple.InterfaceBuilder.CocoaPlugin 2588 | com.apple.InterfaceBuilder.CocoaPlugin 2589 | com.apple.InterfaceBuilder.CocoaPlugin 2590 | com.apple.InterfaceBuilder.CocoaPlugin 2591 | com.apple.InterfaceBuilder.CocoaPlugin 2592 | com.apple.InterfaceBuilder.CocoaPlugin 2593 | 2594 | com.apple.InterfaceBuilder.CocoaPlugin 2595 | com.apple.InterfaceBuilder.CocoaPlugin 2596 | com.apple.InterfaceBuilder.CocoaPlugin 2597 | com.apple.InterfaceBuilder.CocoaPlugin 2598 | com.apple.InterfaceBuilder.CocoaPlugin 2599 | com.apple.InterfaceBuilder.CocoaPlugin 2600 | com.apple.InterfaceBuilder.CocoaPlugin 2601 | 2602 | com.apple.InterfaceBuilder.CocoaPlugin 2603 | com.apple.InterfaceBuilder.CocoaPlugin 2604 | com.apple.InterfaceBuilder.CocoaPlugin 2605 | com.apple.InterfaceBuilder.CocoaPlugin 2606 | 2607 | com.apple.InterfaceBuilder.CocoaPlugin 2608 | com.apple.InterfaceBuilder.CocoaPlugin 2609 | 2610 | com.apple.InterfaceBuilder.CocoaPlugin 2611 | com.apple.InterfaceBuilder.CocoaPlugin 2612 | 2613 | com.apple.InterfaceBuilder.CocoaPlugin 2614 | com.apple.InterfaceBuilder.CocoaPlugin 2615 | 2616 | com.apple.InterfaceBuilder.CocoaPlugin 2617 | com.apple.InterfaceBuilder.CocoaPlugin 2618 | 2619 | com.apple.InterfaceBuilder.CocoaPlugin 2620 | com.apple.InterfaceBuilder.CocoaPlugin 2621 | com.apple.InterfaceBuilder.CocoaPlugin 2622 | com.apple.InterfaceBuilder.CocoaPlugin 2623 | com.apple.InterfaceBuilder.CocoaPlugin 2624 | com.apple.InterfaceBuilder.CocoaPlugin 2625 | com.apple.InterfaceBuilder.CocoaPlugin 2626 | com.apple.InterfaceBuilder.CocoaPlugin 2627 | com.apple.InterfaceBuilder.CocoaPlugin 2628 | com.apple.InterfaceBuilder.CocoaPlugin 2629 | com.apple.InterfaceBuilder.CocoaPlugin 2630 | com.apple.InterfaceBuilder.CocoaPlugin 2631 | com.apple.InterfaceBuilder.CocoaPlugin 2632 | 2633 | 2634 | 2635 | 2636 | 2637 | 438 2638 | 2639 | 2640 | 2641 | 2642 | NSLayoutConstraint 2643 | NSObject 2644 | 2645 | IBProjectSource 2646 | ./Classes/NSLayoutConstraint.h 2647 | 2648 | 2649 | 2650 | 2651 | 0 2652 | IBCocoaFramework 2653 | YES 2654 | 3 2655 | 2656 | {11, 11} 2657 | {10, 3} 2658 | 2659 | YES 2660 | 2661 | 2662 | --------------------------------------------------------------------------------