diff --git a/xcode/CVF0rLayerController.mm b/xcode/CVF0rLayerController.mm index fde2fa16..e6ed73bd 100644 --- a/xcode/CVF0rLayerController.mm +++ b/xcode/CVF0rLayerController.mm @@ -23,7 +23,7 @@ - (void)reset { - CVLayer *toDelete; + CVCocoaLayer *toDelete; if (layer) { [self deactivate]; [lock lock]; @@ -32,7 +32,7 @@ CVPixelBufferRelease(currentFrame); currentFrame = NULL; } - toDelete = (CVLayer *)layer; + toDelete = (CVCocoaLayer *)layer; layer = NULL; [lock unlock]; delete toDelete; diff --git a/xcode/CVLayerController.h b/xcode/CVLayerController.h index 0691a5e4..0d54e565 100644 --- a/xcode/CVLayerController.h +++ b/xcode/CVLayerController.h @@ -62,6 +62,7 @@ class CVCocoaLayer; CVCocoaLayer *layer; IBOutlet CVLayerView *layerView; bool doFilters; + bool filtersInitialized; } @property (readwrite) CVCocoaLayer *layer; @@ -71,7 +72,6 @@ class CVCocoaLayer; - (char *)name; - (void)feedFrame:(CVPixelBufferRef)frame; - (CVReturn)renderFrame; - - (id)initWithOpenGLContext:(CGLContextObj)context pixelFormat:(CGLPixelFormatObj)pixelFormat Context:(CFreej *)ctx; - (id)initWithContext:(CFreej *)context; - (void)startPreview; // enable preview rendering - (void)stopPreview; // disable preview rendering @@ -86,6 +86,7 @@ class CVCocoaLayer; - (bool)needPreview; - (NSString *)filterName; - (NSDictionary *)filterParams; + - (void)setContext:(CFreej *)ctx; - (void)setPreviewTarget:(CVPreview *)targetView; - (void)lock; /// accessor to the internal mutex - (void)unlock; /// accessor to the internal mutex @@ -100,6 +101,7 @@ class CVCocoaLayer; - (bool)doPreview; - (IBAction)setFilterParameter:(id)sender; /// tags from 0 to 10 - (void)setBlendMode:(NSString *)mode; + - (void)initFilters; @end #endif \ No newline at end of file diff --git a/xcode/CVLayerController.mm b/xcode/CVLayerController.mm index 2b831988..5fca4c8e 100644 --- a/xcode/CVLayerController.mm +++ b/xcode/CVLayerController.mm @@ -75,52 +75,13 @@ static OSStatus SetNumberValue(CFMutableDictionaryRef inDict, currentPreviewTexture = NULL; doPreview = YES; filterParams = [[NSMutableDictionary dictionary] retain]; - // Create CGColorSpaceRef - CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); - CGColorSpaceRelease(colorSpace); - - // Create CIFilters used for both preview and main frame - colorCorrectionFilter = [[CIFilter filterWithName:@"CIColorControls"] retain]; // Color filter - [colorCorrectionFilter setDefaults]; // set the filter to its default values - exposureAdjustFilter = [[CIFilter filterWithName:@"CIExposureAdjust"] retain]; - [exposureAdjustFilter setDefaults]; - // adjust exposure - [exposureAdjustFilter setValue:[NSNumber numberWithFloat:0.0] forKey:@"inputEV"]; - - // rotate - NSAffineTransform *rotateTransform = [NSAffineTransform transform]; - [rotateTransform rotateByDegrees:0.0]; - rotateFilter = [[CIFilter filterWithName:@"CIAffineTransform"] retain]; - [rotateFilter setValue:rotateTransform forKey:@"inputTransform"]; - translateFilter = [[CIFilter filterWithName:@"CIAffineTransform"] retain]; - NSAffineTransform *translateTransform = [NSAffineTransform transform]; - [translateTransform translateXBy:0.0 yBy:0.0]; - [translateFilter setValue:translateTransform forKey:@"inputTransform"]; - scaleFilter = [[CIFilter filterWithName:@"CIAffineTransform"] retain]; - //CIFilter *scaleFilter = [CIFilter filterWithName:@"CILanczosScaleTransform"]; - [scaleFilter setDefaults]; // set the filter to its default values - //[scaleFilter setValue:[NSNumber numberWithFloat:scaleFactor] forKey:@"inputScale"]; - - effectFilter = [[CIFilter filterWithName:@"CIZoomBlur"] retain]; // Effect filter - [effectFilter setName:@"ZoomBlur"]; - [effectFilter setDefaults]; // set the filter to its default values - [effectFilter setValue:[NSNumber numberWithFloat:0.0] forKey:@"inputAmount"]; // don't apply effects at startup - compositeFilter = [[CIFilter filterWithName:@"CISourceOverCompositing"] retain]; // Composite filter - [CIAlphaFade class]; - alphaFilter = [[CIFilter filterWithName:@"CIAlphaFade"] retain]; // AlphaFade filter - [alphaFilter setDefaults]; // XXX - setDefaults doesn't work properly -#if MAC_OS_X_VERSION_10_6 - [alphaFilter setValue:[NSNumber numberWithFloat:1.0] forKey:@"outputOpacity"]; // set default value -#else - [alphaFilter setValue:[NSNumber numberWithFloat:0.5] forKey:@"outputOpacity"]; // set default value -#endif return self; } -- (id) initWithOpenGLContext:(CGLContextObj)context pixelFormat:(CGLPixelFormatObj)pixelFormat Context:(CFreej *)ctx +- (void)setContext:(CFreej *)ctx { - return [self initWithContext:ctx]; + freej = ctx; } - (void)dealloc @@ -150,44 +111,6 @@ static OSStatus SetNumberValue(CFMutableDictionaryRef inDict, NSAutoreleasePool *pool; pool = [[NSAutoreleasePool alloc] init]; - - // Create CGColorSpaceRef - CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); - - CGColorSpaceRelease(colorSpace); - - // Create CIFilters used for both preview and main frame - colorCorrectionFilter = [[CIFilter filterWithName:@"CIColorControls"] retain]; // Color filter - [colorCorrectionFilter setDefaults]; // set the filter to its default values - exposureAdjustFilter = [[CIFilter filterWithName:@"CIExposureAdjust"] retain]; - [exposureAdjustFilter setDefaults]; - // adjust exposure - [exposureAdjustFilter setValue:[NSNumber numberWithFloat:0.0] forKey:@"inputEV"]; - - // rotate - NSAffineTransform *rotateTransform = [NSAffineTransform transform]; - [rotateTransform rotateByDegrees:0.0]; - rotateFilter = [[CIFilter filterWithName:@"CIAffineTransform"] retain]; - [rotateFilter setValue:rotateTransform forKey:@"inputTransform"]; - translateFilter = [[CIFilter filterWithName:@"CIAffineTransform"] retain]; - NSAffineTransform *translateTransform = [NSAffineTransform transform]; - [translateTransform translateXBy:0.0 yBy:0.0]; - [translateFilter setValue:translateTransform forKey:@"inputTransform"]; - scaleFilter = [[CIFilter filterWithName:@"CIAffineTransform"] retain]; - //CIFilter *scaleFilter = [CIFilter filterWithName:@"CILanczosScaleTransform"]; - [scaleFilter setDefaults]; // set the filter to its default values - //[scaleFilter setValue:[NSNumber numberWithFloat:scaleFactor] forKey:@"inputScale"]; - - effectFilter = [[CIFilter filterWithName:@"CIZoomBlur"] retain]; // Effect filter - [effectFilter setName:@"ZoomBlur"]; - [effectFilter setDefaults]; // set the filter to its default values - [effectFilter setValue:[NSNumber numberWithFloat:0.0] forKey:@"inputAmount"]; // don't apply effects at startup - compositeFilter = [[CIFilter filterWithName:@"CISourceOverCompositing"] retain]; // Composite filter - [CIAlphaFade class]; - alphaFilter = [[CIFilter filterWithName:@"CIAlphaFade"] retain]; // AlphaFade filter - [alphaFilter setDefaults]; // XXX - setDefaults doesn't work properly - [alphaFilter setValue:[NSNumber numberWithFloat:0.5] forKey:@"outputOpacity"]; // set default value - // Create display link if (layerView) { NSOpenGLPixelFormat *openGLPixelFormat = [layerView pixelFormat]; @@ -343,10 +266,10 @@ static OSStatus SetNumberValue(CFMutableDictionaryRef inDict, NSString *filterName = [NSString stringWithFormat:@"CI%@", [[sender selectedItem] title]]; //NSLog(filterName); [effectFilter release]; - effectFilter = [[CIFilter filterWithName:filterName] retain]; + effectFilter = [[CIFilter filterWithName:filterName] retain]; + [effectFilter setDefaults]; [effectFilter setName:[[sender selectedItem] title]]; FilterParams *pdescr = [[layerView filterPanel] getFilterParamsDescriptorAtIndex:[sender indexOfSelectedItem]]; - [effectFilter setDefaults]; NSView *cView = (NSView *)sender; for (int i = 0; i < 4; i++) { NSTextField *label = (NSTextField *)[cView nextKeyView]; @@ -464,6 +387,61 @@ static OSStatus SetNumberValue(CFMutableDictionaryRef inDict, [pool release]; } +- (void)initFilters { + // Create CIFilters used for both preview and main frame + if (!colorCorrectionFilter) { + colorCorrectionFilter = [[CIFilter filterWithName:@"CIColorControls"] retain]; // Color filter + [colorCorrectionFilter setDefaults]; // set the filter to its default values + } + if (!exposureAdjustFilter) { + exposureAdjustFilter = [[CIFilter filterWithName:@"CIExposureAdjust"] retain]; + [exposureAdjustFilter setDefaults]; + // adjust exposure + [exposureAdjustFilter setValue:[NSNumber numberWithFloat:0.0] forKey:@"inputEV"]; + } + + // rotate + if (!rotateFilter) { + NSAffineTransform *rotateTransform = [NSAffineTransform transform]; + rotateFilter = [[CIFilter filterWithName:@"CIAffineTransform"] retain]; + [rotateTransform rotateByDegrees:0.0]; + [rotateFilter setValue:rotateTransform forKey:@"inputTransform"]; + } + + if (!translateFilter) { + translateFilter = [[CIFilter filterWithName:@"CIAffineTransform"] retain]; + NSAffineTransform *translateTransform = [NSAffineTransform transform]; + [translateTransform translateXBy:0.0 yBy:0.0]; + [translateFilter setValue:translateTransform forKey:@"inputTransform"]; + } + if (!scaleFilter) { + scaleFilter = [[CIFilter filterWithName:@"CIAffineTransform"] retain]; + //CIFilter *scaleFilter = [CIFilter filterWithName:@"CILanczosScaleTransform"]; + [scaleFilter setDefaults]; // set the filter to its default values + } + //[scaleFilter setValue:[NSNumber numberWithFloat:scaleFactor] forKey:@"inputScale"]; + if (!effectFilter) { + effectFilter = [[CIFilter filterWithName:@"CIZoomBlur"] retain]; // Effect filter + [effectFilter setDefaults]; // set the filter to its default values + [effectFilter setName:@"ZoomBlur"]; + [effectFilter setValue:[NSNumber numberWithFloat:0.0] forKey:@"inputAmount"]; // don't apply effects at startup + } + if (!compositeFilter) { + compositeFilter = [[CIFilter filterWithName:@"CISourceOverCompositing"] retain]; // Composite filter + [compositeFilter setDefaults]; + } + //[CIAlphaFade class]; + if (!alphaFilter) { + alphaFilter = [[CIFilter filterWithName:@"CIAlphaFade"] retain]; // AlphaFade filter + [alphaFilter setDefaults]; // XXX - setDefaults doesn't work properly +#if MAC_OS_X_VERSION_10_6 + [alphaFilter setValue:[NSNumber numberWithFloat:1.0] forKey:@"outputOpacity"]; // set default value +#else + [alphaFilter setValue:[NSNumber numberWithFloat:0.5] forKey:@"outputOpacity"]; // set default value +#endif + } + filtersInitialized = true; +} - (CVTexture *)getTexture { @@ -476,6 +454,8 @@ static OSStatus SetNumberValue(CFMutableDictionaryRef inDict, if (layer) fjLayer = layer->fj_layer(); + if (!filtersInitialized) + [self initFilters]; [lock lock]; if (newFrame) { inputImage = [CIImage imageWithCVImageBuffer:currentFrame]; @@ -583,8 +563,7 @@ static OSStatus SetNumberValue(CFMutableDictionaryRef inDict, } - (void)activate -{ - if (layer) { +{ if (layer) { layer->activate(); if (freej) { Layer *fjLayer = layer->fj_layer(); diff --git a/xcode/CVLayerView.mm b/xcode/CVLayerView.mm index 1754ca8f..2658017d 100644 --- a/xcode/CVLayerView.mm +++ b/xcode/CVLayerView.mm @@ -78,8 +78,7 @@ #endif CGColorSpaceRelease(colorSpace); [lock lock]; - [layerController initWithOpenGLContext:(CGLContextObj)[[self openGLContext] CGLContextObj] - pixelFormat:(CGLPixelFormatObj)[[self pixelFormat] CGLPixelFormatObj] Context:freej]; + [layerController setContext:freej]; [lock unlock]; GLint params[] = { 1 }; CGLSetParameter( CGLGetCurrentContext(), kCGLCPSwapInterval, params ); diff --git a/xcode/CVQtLayerController.mm b/xcode/CVQtLayerController.mm index 169e46f9..f61172cd 100644 --- a/xcode/CVQtLayerController.mm +++ b/xcode/CVQtLayerController.mm @@ -191,10 +191,8 @@ static OSStatus SetNumberValue(CFMutableDictionaryRef inDict, QTTime posterTime = [qtMovie duration]; posterTime.timeValue /= 2; NSImage *poster = [qtMovie frameImageAtTime:posterTime]; - if (layerView) [layerView setPosterImage:poster]; - //[lock unlock]; // register the layer within the freej context if (!layer) { diff --git a/xcode/CVScreenView.mm b/xcode/CVScreenView.mm index c55c7ac1..b7a42100 100644 --- a/xcode/CVScreenView.mm +++ b/xcode/CVScreenView.mm @@ -453,7 +453,7 @@ static CVReturn renderCallback(CVDisplayLinkRef displayLink, texture = cvLayer->gl_texture(); NSString *blendMode = cvLayer->blendMode; if (blendMode) - blendFilter = [CIFilter filterWithName:[[NSString alloc] initWithFormat:@"CI%@BlendMode", blendMode]]; + blendFilter = [CIFilter filterWithName:[NSString stringWithFormat:@"CI%@BlendMode", blendMode]]; else blendFilter = [CIFilter filterWithName:@"CIOverlayBlendMode"]; } else { // freej 'not-cocoa' layer type diff --git a/xcode/freej.xcodeproj/project.pbxproj b/xcode/freej.xcodeproj/project.pbxproj index be4fb2a3..c42560ef 100644 --- a/xcode/freej.xcodeproj/project.pbxproj +++ b/xcode/freej.xcodeproj/project.pbxproj @@ -1190,6 +1190,7 @@ GCC_ENABLE_SSE3_EXTENSIONS = YES; GCC_ENABLE_SYMBOL_SEPARATION = NO; GCC_MODEL_TUNING = ""; + GCC_OPTIMIZATION_LEVEL = s; GCC_UNROLL_LOOPS = NO; GCC_WARN_ABOUT_RETURN_TYPE = YES; HEADER_SEARCH_PATHS = ( @@ -1249,11 +1250,12 @@ GCC_CW_ASM_SYNTAX = NO; GCC_ENABLE_CPP_EXCEPTIONS = NO; GCC_ENABLE_CPP_RTTI = NO; + GCC_ENABLE_OBJC_GC = unsupported; GCC_ENABLE_SSE3_EXTENSIONS = YES; GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS = YES; GCC_ENABLE_SYMBOL_SEPARATION = NO; GCC_MODEL_TUNING = ""; - GCC_OPTIMIZATION_LEVEL = 3; + GCC_OPTIMIZATION_LEVEL = s; GCC_UNROLL_LOOPS = YES; HEADER_SEARCH_PATHS = ( ../lib,