diff --git a/xcode/CVCocoaLayer.h b/xcode/CVCocoaLayer.h index a27a45e9..d804882f 100644 --- a/xcode/CVCocoaLayer.h +++ b/xcode/CVCocoaLayer.h @@ -37,13 +37,13 @@ class CVCocoaLayer int height, width; Context *freej; int bufsize; + CVPixelBufferRef pixelBuffer; void set_controller(CVLayerController *vin); public: CVLayerController *input; NSString *blendMode; - void *vbuffer; CVCocoaLayer(Layer *lay, CVLayerController *vin = NULL); diff --git a/xcode/CVCocoaLayer.mm b/xcode/CVCocoaLayer.mm index 604804f6..c454a4c5 100644 --- a/xcode/CVCocoaLayer.mm +++ b/xcode/CVCocoaLayer.mm @@ -24,7 +24,9 @@ CVCocoaLayer::CVCocoaLayer(Layer *lay, CVLayerController *vin) { input = vin; bufsize = 0; - blendMode = NULL; + blendMode = nil; + pixelBuffer = nil; + layer = lay; if (input) [input setLayer:this]; @@ -39,6 +41,8 @@ CVCocoaLayer::~CVCocoaLayer() deactivate(); if (input) [input setLayer:nil]; + if (pixelBuffer) + CVPixelBufferRelease(pixelBuffer); } void @@ -70,11 +74,9 @@ CVTexture * CVCocoaLayer::gl_texture() { CVTexture *texture = NULL; - if (input) { + if (input) texture = [input getTexture]; - if (texture) - [input renderPreview]; - } + return texture; } diff --git a/xcode/CVF0rLayer.h b/xcode/CVF0rLayer.h index e2f764e8..78c1ede4 100644 --- a/xcode/CVF0rLayer.h +++ b/xcode/CVF0rLayer.h @@ -29,7 +29,7 @@ class CVF0rLayer : public CVLayer void *currentFrame; CVPixelBufferRef pixelBuffer; - public: + public: CVF0rLayer(CVLayerController *controller); ~CVF0rLayer(); void register_generators(Linklist *gens); diff --git a/xcode/CVFFmpegLayerController.mm b/xcode/CVFFmpegLayerController.mm index c4906981..f0919e3f 100644 --- a/xcode/CVFFmpegLayerController.mm +++ b/xcode/CVFFmpegLayerController.mm @@ -84,13 +84,6 @@ [super deactivate]; } -- (CVTexture *)getTexture -{ - CVTexture *ret; - ret = [super getTexture]; - return ret; -} - - (void)freeFrame { if (currentFrame) { @@ -184,7 +177,6 @@ } else { skipCount++; } - layer->vbuffer = currentFrame; newFrame = YES; } } diff --git a/xcode/CVFilter.cpp b/xcode/CVFilter.cpp deleted file mode 100644 index fecfe497..00000000 --- a/xcode/CVFilter.cpp +++ /dev/null @@ -1,27 +0,0 @@ -/* - * CVFilter.cpp - * freej - * - * Created by xant on 5/4/10. - * Copyright 2010 dyne.org. All rights reserved. - * - * This source code is free software; you can redistribute it and/or - * modify it under the terms of the GNU Public License as published - * by the Free Software Foundation; either version 2 of the License, - * or (at your option) any later version. - * - * This source code is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * Please refer to the GNU Public License for more details. - * - * You should have received a copy of the GNU Public License along with - * this source code; if not, write to: - * Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * "$Id:$" - * - */ - -#include "CVFilter.h" - diff --git a/xcode/CVFilter.h b/xcode/CVFilter.h index d4c16d3d..cff2c67d 100644 --- a/xcode/CVFilter.h +++ b/xcode/CVFilter.h @@ -23,3 +23,61 @@ * */ +/* FreeJ - Frei0r wrapper + * (c) Copyright 2007 Denis Rojo + * + * This source code is free software; you can redistribute it and/or + * modify it under the terms of the GNU Public License as published + * by the Free Software Foundation; either version 2 of the License, + * or (at your option) any later version. + * + * This source code is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * Please refer to the GNU Public License for more details. + * + * You should have received a copy of the GNU Public License along with + * this source code; if not, write to: + * Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#ifndef __CVFILTER_H__ +#define __CVFILTER_H__ + +#include +#ifdef WITH_COCOA +#import +#include +#include + +class CVFilter: public Filter { + +public: + + CVFilter(); + virtual ~CVFilter(); + + int type(); + int open(char *name); + bool apply(Layer *lay, FilterInstance *instance); + const char *description(); + void print_info(); + char *get_parameter_description(int i); + + bool opened; + +protected: + void destruct(FilterInstance *inst); + void update(FilterInstance *inst, double time, uint32_t *inframe, uint32_t *outframe); + +private: + CIFilter *ciFilter; + NSString *filterName; + NSString *filterDescr; + FACTORY_ALLOWED +}; + +#endif // WITH_COCOA + +#endif diff --git a/xcode/CVGrabber.mm b/xcode/CVGrabber.mm index e804a49d..59bceef2 100644 --- a/xcode/CVGrabber.mm +++ b/xcode/CVGrabber.mm @@ -216,15 +216,5 @@ error: [super dealloc]; } -- (CVReturn)renderFrame -{ - [lock lock]; - [self renderPreview]; - if (layer) - layer->vbuffer = currentFrame; - [lock unlock]; - return kCVReturnSuccess; -} - @end diff --git a/xcode/CVLayer.h b/xcode/CVLayer.h index 48d226e1..843cc3b0 100644 --- a/xcode/CVLayer.h +++ b/xcode/CVLayer.h @@ -31,27 +31,28 @@ class CVLayer: public Layer, public CVCocoaLayer { - private: - virtual bool _init(); - virtual void *feed(); - public: - CVLayer(); - CVLayer(CVLayerController *vin); +public: + CVLayer(); + CVLayer(CVLayerController *vin); + + virtual ~CVLayer(); + virtual bool open(const char *path); + virtual void close(); + virtual bool forward(); + virtual bool backward(); + virtual bool backward_one_keyframe(); + + virtual bool relative_seek(double increment); + + virtual bool set_mark_in(); + virtual bool set_mark_out(); + + virtual void pause(); + +private: + virtual bool _init(); + virtual void *feed(); - virtual ~CVLayer(); - virtual bool open(const char *path); - virtual void close(); - //void run(); - virtual bool forward(); - virtual bool backward(); - virtual bool backward_one_keyframe(); - - virtual bool relative_seek(double increment); - - virtual bool set_mark_in(); - virtual bool set_mark_out(); - - virtual void pause(); }; #endif diff --git a/xcode/CVLayer.mm b/xcode/CVLayer.mm index 202c67dd..ff5492fc 100644 --- a/xcode/CVLayer.mm +++ b/xcode/CVLayer.mm @@ -108,9 +108,19 @@ CVLayer::relative_seek(double increment) void * CVLayer::feed() { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; lock(); - if ([input isVisible] || [input needPreview]) - [input renderFrame]; + //if ([input isVisible] || [input needPreview]) + [input renderFrame]; + CVTexture *texture = [input getTexture]; + if (pixelBuffer) + CVPixelBufferRelease(pixelBuffer); + pixelBuffer = CVPixelBufferRetain([texture pixelBuffer]); + CVPixelBufferLockBaseAddress(pixelBuffer, 0); + void *buf = CVPixelBufferGetBaseAddress(pixelBuffer); + CVPixelBufferUnlockBaseAddress(pixelBuffer, 0); unlock(); - return (void *)vbuffer; + + [pool release]; + return buf; } diff --git a/xcode/CVLayerController.mm b/xcode/CVLayerController.mm index 86ddd51d..b6d4994b 100644 --- a/xcode/CVLayerController.mm +++ b/xcode/CVLayerController.mm @@ -42,10 +42,10 @@ static FilterParams fParams[FILTERS_MAX] = { 3, { { (char*)"CenterX", 0.0, 100.0 }, { (char*)"CenterY", 0.0, 100.0 }, { (char*)"inputRadius", 0.01, 1000.0 } } }, // HoleDistortion //{ 4, { { "CenterX", 0.0, 100.0 }, { "CenterY", 0.0, 100.0 }, { "inputRadius", 0.00, 600.0 }, { "inputScale", -1.0, 1.0 } } }, // BumpDistortion { 3, { { (char*)"CenterX", 0.0, 100.0 }, { (char*)"CenterY", 0.0, 100.0 }, { (char*)"inputRadius", 0.00, 1000.0 } } }, // CircleSplashDistortion - { 4, { { (char*)"CenterX", 0.0, 100.0 }, { (char*)"CenterY", 0.0, 100.0 }, { (char*)"inputRadius", 0.00, 600 }, { (char*)"inputAngle", -3.14, 3.14 } } }, // CircularWrap + { 4, { { (char*)"CenterX", 0.0, 100.0 }, { (char*)"CenterY", 0.0, 100.0 }, { (char*)"inputRadius", 0.00, 600.0 }, { (char*)"inputAngle", -3.14, 3.14 } } }, // CircularWrap { 4, { { (char*)"CenterX", 0.0, 100.0 }, { (char*)"CenterY", 0.0, 100.0 }, { (char*)"inputRadius", 0.00, 1000.0 }, { (char*)"inputScale", 0.0, 1.0 } } }, // PinchDistortion - { 4, { { (char*)"CenterX", 0.0, 100.0 }, { (char*)"CenterY", 0.0, 100.0 }, { (char*)"inputRadius", 0.00, 500 }, { (char*)"inputAngle", -12.57, 12.57 } } }, // TwirlDistortion - { 4, { { (char*)"CenterX", 0.0, 100.0 }, { (char*)"CenterY", 0.0, 100.0 }, { (char*)"inputRadius", 0.00, 800 }, { (char*)"inputAngle", -94.25, 94.25 } } }, // VortexDistortion + { 4, { { (char*)"CenterX", 0.0, 100.0 }, { (char*)"CenterY", 0.0, 100.0 }, { (char*)"inputRadius", 0.00, 500.0 }, { (char*)"inputAngle", -12.57, 12.57 } } }, // TwirlDistortion + { 4, { { (char*)"CenterX", 0.0, 100.0 }, { (char*)"CenterY", 0.0, 100.0 }, { (char*)"inputRadius", 0.00, 800.0 }, { (char*)"inputAngle", -94.25, 94.25 } } }, // VortexDistortion }; /* Utility to set a SInt32 value in a CFDictionary @@ -169,12 +169,58 @@ static OSStatus SetNumberValue(CFMutableDictionaryRef inDict, currentFrame = CVPixelBufferRetain(frame); newFrame = YES; [lock unlock]; + [self renderFrame]; } - (CVReturn)renderFrame { - NSLog(@"renderFrame MUST be overridden"); - return kCVReturnError; + CIImage *inputImage = nil; + CIImage *renderedImage = nil; + Layer *fjLayer = NULL; + + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + if (layer) + fjLayer = layer->fj_layer(); + else + return kCVReturnError; + + if (!filtersInitialized) + [self initFilters]; // initialize on first use + + if (newFrame) { + [lock lock]; + inputImage = [CIImage imageWithCVImageBuffer:currentFrame]; + if (doFilters) { + [colorCorrectionFilter setValue:inputImage forKey:@"inputImage"]; + [exposureAdjustFilter setValue:[colorCorrectionFilter valueForKey:@"outputImage"] forKey:@"inputImage"]; + [effectFilter setValue:[exposureAdjustFilter valueForKey:@"outputImage"] + forKey:@"inputImage"]; + [alphaFilter setValue:[effectFilter valueForKey:@"outputImage"] + forKey:@"inputImage"]; + [rotateFilter setValue:[alphaFilter valueForKey:@"outputImage"] forKey:@"inputImage"]; + if (fjLayer && (fjLayer->geo.x || fjLayer->geo.y)) { + NSAffineTransform *translateTransform = [NSAffineTransform transform]; + [translateTransform translateXBy:fjLayer->geo.x yBy:fjLayer->geo.y]; + [translateFilter setValue:translateTransform forKey:@"inputTransform"]; + + [translateFilter setValue:[rotateFilter valueForKey:@"outputImage"] forKey:@"inputImage"]; + renderedImage = [translateFilter valueForKey:@"outputImage"]; + } else { + renderedImage = [rotateFilter valueForKey:@"outputImage"]; + } + } else { + renderedImage = inputImage; + } + if (lastFrame) + [lastFrame release]; + lastFrame = [[CVTexture alloc] initWithCIImage:renderedImage pixelBuffer:currentFrame]; + newFrame = NO; + [lock unlock]; + [self renderPreview]; + } + [pool release]; + return kCVReturnSuccess; } - (IBAction)toggleFilters:(id)sender @@ -232,6 +278,8 @@ static OSStatus SetNumberValue(CFMutableDictionaryRef inDict, pool = [[NSAutoreleasePool alloc] init]; if (layer) fjLayer = layer->fj_layer(); + else + return; // TODO - optimize the logic in this routine ... it's becoming huge!! // to prevent its run() method to try rendering @@ -469,54 +517,13 @@ static OSStatus SetNumberValue(CFMutableDictionaryRef inDict, } - (CVTexture *)getTexture -{ - CIImage *inputImage = nil; +{ CVTexture *texture = nil; - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - CIImage *renderedImage = nil; - Layer *fjLayer = NULL; - - if (layer) - fjLayer = layer->fj_layer(); - - if (!filtersInitialized) - [self initFilters]; [lock lock]; - if (newFrame) { - inputImage = [CIImage imageWithCVImageBuffer:currentFrame]; - newFrame = NO; - if (doFilters) { - [colorCorrectionFilter setValue:inputImage forKey:@"inputImage"]; - [exposureAdjustFilter setValue:[colorCorrectionFilter valueForKey:@"outputImage"] forKey:@"inputImage"]; - [effectFilter setValue:[exposureAdjustFilter valueForKey:@"outputImage"] - forKey:@"inputImage"]; - [alphaFilter setValue:[effectFilter valueForKey:@"outputImage"] - forKey:@"inputImage"]; - [rotateFilter setValue:[alphaFilter valueForKey:@"outputImage"] forKey:@"inputImage"]; - if (fjLayer && (fjLayer->geo.x || fjLayer->geo.y)) { - NSAffineTransform *translateTransform = [NSAffineTransform transform]; - [translateTransform translateXBy:fjLayer->geo.x yBy:fjLayer->geo.y]; - [translateFilter setValue:translateTransform forKey:@"inputTransform"]; - - [translateFilter setValue:[rotateFilter valueForKey:@"outputImage"] forKey:@"inputImage"]; - renderedImage = [translateFilter valueForKey:@"outputImage"]; - } else { - renderedImage = [rotateFilter valueForKey:@"outputImage"]; - } - } else { - renderedImage = inputImage; - } - texture = [[CVTexture alloc] initWithCIImage:renderedImage pixelBuffer:currentFrame]; - - if (lastFrame) - [lastFrame release]; - lastFrame = [texture retain]; - } else { - texture = [lastFrame retain]; - } + texture = [lastFrame retain]; [lock unlock]; - [pool release]; - return texture; + + return [texture autorelease]; } diff --git a/xcode/CVPreview.mm b/xcode/CVPreview.mm index 8a66ca93..5079633b 100644 --- a/xcode/CVPreview.mm +++ b/xcode/CVPreview.mm @@ -182,7 +182,6 @@ //if (textureToRelease) // [textureToRelease release]; } - [texture release]; [pool release]; } diff --git a/xcode/CVQtLayerController.mm b/xcode/CVQtLayerController.mm index d0570e6b..54e5f889 100644 --- a/xcode/CVQtLayerController.mm +++ b/xcode/CVQtLayerController.mm @@ -254,18 +254,6 @@ static OSStatus SetNumberValue(CFMutableDictionaryRef inDict, return isPlaying; } -- (CVTexture *)getTexture -{ - CVTexture *ret; - bool gotNewFrame = newFrame; - ret = [super getTexture]; - /* - if (gotNewFrame) // task the qtvisualcontext if we got a new frame - [(CVQtLayerController *)self task]; - */ - return ret; -} - - (BOOL)getFrameForTime:(const CVTimeStamp *)timeStamp { Context *ctx = [freej getContext]; @@ -371,10 +359,8 @@ static OSStatus SetNumberValue(CFMutableDictionaryRef inDict, } else { rv = kCVReturnError; } - if (layer) - layer->vbuffer = currentFrame; [pool release]; - return rv; + return [super renderFrame]; } - (void)task diff --git a/xcode/CVScreenView.mm b/xcode/CVScreenView.mm index 7da7bd9f..af324b0d 100644 --- a/xcode/CVScreenView.mm +++ b/xcode/CVScreenView.mm @@ -437,7 +437,9 @@ static CVReturn renderCallback(CVDisplayLinkRef displayLink, while ([lastTextures count]) { CVTexture *texture = [lastTextures objectAtIndex:0]; [lastTextures removeObjectAtIndex:0]; - [texture release]; + // removing the texture from the array makes its refcnt reach 0 + // so it will be automagically released + //[texture release]; } } else { needsReshape = YES; @@ -460,7 +462,7 @@ static CVReturn renderCallback(CVDisplayLinkRef displayLink, - (void)drawLayer:(Layer *)layer { - //NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; CIFilter *blendFilter = nil; CVTexture *texture = nil; if (layer->type == Layer::GL_COCOA) { @@ -491,7 +493,7 @@ static CVReturn renderCallback(CVDisplayLinkRef displayLink, // TODO - Error Messages } CIImage *inputImage = [CIImage imageWithCVImageBuffer:pixelBufferOut]; - texture = [[CVTexture alloc] initWithCIImage:inputImage pixelBuffer:pixelBufferOut]; + texture = [CVTexture textureWithCIImage:inputImage pixelBuffer:pixelBufferOut]; // we can release our reference to the pixelBuffer now. // The CVTexture will retain it as long as it is needed CVPixelBufferRelease(pixelBufferOut); @@ -509,9 +511,11 @@ static CVReturn renderCallback(CVDisplayLinkRef displayLink, [outFrame release]; outFrame = [temp retain]; } - [lastTextures addObject:texture]; + [lastTextures addObject:texture]; // Note: we use this to keep the texture refcnt'd until necessary + // once removed from the array it will be free'd } [lock unlock]; + [pool release]; } #define MYCGL @@ -916,7 +920,7 @@ static CVReturn renderCallback(CVDisplayLinkRef displayLink, { if (aTableView != layerList) return nil; - return [NSArray arrayWithObjects:@"CVLayer", @"CVLayerIndex", nil]; + return [NSArray arrayWithObjects:@"CVCocoaLayer", @"CVLayerIndex", nil]; } - (BOOL)tableView:(NSTableView *)aTableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard @@ -927,8 +931,8 @@ static CVReturn renderCallback(CVDisplayLinkRef displayLink, NSUInteger row = [rowIndexes firstIndex]; Layer *lay = fjScreen->layers.pick(row+1); if (lay) { - [pboard addTypes:[NSArray arrayWithObjects:@"CVLayer", @"CVLayerIndex", nil] owner:(id)self]; - [pboard setData:[NSData dataWithBytes:(void *)&lay length:sizeof(Layer *)] forType:@"CVLayer"]; + [pboard addTypes:[NSArray arrayWithObjects:@"CVCocoaLayer", @"CVLayerIndex", nil] owner:(id)self]; + [pboard setData:[NSData dataWithBytes:(void *)&lay length:sizeof(CVCocoaLayer *)] forType:@"CVCocoaLayer"]; [pboard setData:[NSData dataWithBytes:(void *)&row length:sizeof(NSUInteger)] forType:@"CVLayerIndex"]; return YES; } @@ -967,7 +971,7 @@ static CVReturn renderCallback(CVDisplayLinkRef displayLink, NSUInteger srcRow; [[[info draggingPasteboard] dataForType:@"CVLayerIndex"] getBytes:&srcRow length:sizeof(NSUInteger)]; - [[[info draggingPasteboard] dataForType:@"CVLayer"] getBytes:&lay length:sizeof(Layer *)]; + [[[info draggingPasteboard] dataForType:@"CVCocoaLayer"] getBytes:&lay length:sizeof(CVCocoaLayer *)]; if (lay) { lay->move((srcRow > row)?(row+1):row); [layerList reloadData]; diff --git a/xcode/CVTextLayerController.mm b/xcode/CVTextLayerController.mm index 01f61691..6e55c4b4 100644 --- a/xcode/CVTextLayerController.mm +++ b/xcode/CVTextLayerController.mm @@ -56,14 +56,13 @@ //NSFont * font =[NSFont fontWithName:@"Helvetica" size:32.0]; [theString initWithString:text withAttributes:stanStringAttrib]; [theString drawOnBuffer:currentFrame]; - layer->vbuffer = currentFrame; needsNewFrame = NO; } newFrame = YES; [lock unlock]; - [self renderPreview]; + //[self renderPreview]; [pool release]; - return 0; + return [super renderFrame]; } - (IBAction)setText:(NSString *)theText withAttributes:(NSDictionary *)attributes diff --git a/xcode/CVTexture.h b/xcode/CVTexture.h index e1243c39..9708d21b 100644 --- a/xcode/CVTexture.h +++ b/xcode/CVTexture.h @@ -29,5 +29,6 @@ + (id)textureWithCIImage:(CIImage *)image pixelBuffer:(CVPixelBufferRef)pixelBuffer; - (id)initWithCIImage:(CIImage *)image pixelBuffer:(CVPixelBufferRef)pixelBuffer; - (CIImage *)image; +- (CVPixelBufferRef)pixelBuffer; - (void)dealloc; @end diff --git a/xcode/CVTexture.m b/xcode/CVTexture.m index 06eccd15..88a46c87 100644 --- a/xcode/CVTexture.m +++ b/xcode/CVTexture.m @@ -29,7 +29,7 @@ + (id)textureWithCIImage:(CIImage *)image pixelBuffer:(CVPixelBufferRef)pixelBuffer { - id obj = [super alloc]; + id obj = [self alloc]; [obj autorelease]; return [obj initWithCIImage:image pixelBuffer:pixelBuffer]; } @@ -56,4 +56,9 @@ return _image; } +- (CVPixelBufferRef)pixelBuffer +{ + return _pixelBuffer; +} + @end diff --git a/xcode/freej.xcodeproj/project.pbxproj b/xcode/freej.xcodeproj/project.pbxproj index 4c7485fa..9bdf52fc 100644 --- a/xcode/freej.xcodeproj/project.pbxproj +++ b/xcode/freej.xcodeproj/project.pbxproj @@ -158,7 +158,7 @@ AAD9EF6B10487BC400A3E51A /* sdl_controller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AAD9EF6A10487BC400A3E51A /* sdl_controller.cpp */; }; AADF7A000FD7F84500167F57 /* ipernav.icns in Resources */ = {isa = PBXBuildFile; fileRef = AADF79FF0FD7F84500167F57 /* ipernav.icns */; }; AAE2C270103FDCDC00D62E4F /* kbd_ctrl_js.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AAE2C26F103FDCDC00D62E4F /* kbd_ctrl_js.cpp */; }; - AAEB37261190019500EE9961 /* CVFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AAEB37251190019500EE9961 /* CVFilter.cpp */; }; + AAEB37261190019500EE9961 /* CVFilter.mm in Sources */ = {isa = PBXBuildFile; fileRef = AAEB37251190019500EE9961 /* CVFilter.mm */; }; AAEB376D11929F0000EE9961 /* filter_instance.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AAEB376C11929F0000EE9961 /* filter_instance.cpp */; }; AAEE68940FC8906B007FB46B /* webcam.png in Resources */ = {isa = PBXBuildFile; fileRef = AAEE68930FC8906B007FB46B /* webcam.png */; }; AAEE689F0FC893BC007FB46B /* frei0r.png in Resources */ = {isa = PBXBuildFile; fileRef = AAEE689E0FC893BC007FB46B /* frei0r.png */; }; @@ -443,7 +443,7 @@ AAE2C26F103FDCDC00D62E4F /* kbd_ctrl_js.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = kbd_ctrl_js.cpp; sourceTree = ""; }; AAE2C2B7103FE2AE00D62E4F /* factory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = factory.h; path = include/factory.h; sourceTree = ""; }; AAEB37241190019500EE9961 /* CVFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CVFilter.h; sourceTree = ""; }; - AAEB37251190019500EE9961 /* CVFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CVFilter.cpp; sourceTree = ""; }; + AAEB37251190019500EE9961 /* CVFilter.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CVFilter.mm; sourceTree = ""; }; AAEB376C11929F0000EE9961 /* filter_instance.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = filter_instance.cpp; sourceTree = ""; }; AAEB376E11929F0E00EE9961 /* filter_instance.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = filter_instance.h; path = include/filter_instance.h; sourceTree = ""; }; AAEE68930FC8906B007FB46B /* webcam.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = webcam.png; sourceTree = ""; }; @@ -583,7 +583,7 @@ AAC9DB35103D2C7F00A0111E /* PreferencesPanel.h */, AAC9DB36103D2C7F00A0111E /* PreferencesPanel.mm */, AAEB37241190019500EE9961 /* CVFilter.h */, - AAEB37251190019500EE9961 /* CVFilter.cpp */, + AAEB37251190019500EE9961 /* CVFilter.mm */, ); name = Cocoa; sourceTree = ""; @@ -1135,7 +1135,7 @@ AA9D8A7D118D6E7E00B227B0 /* cairo_layer_js.cpp in Sources */, AA9D8A7E118D6E7E00B227B0 /* cairo_layer.cpp in Sources */, AA9D8ACE118D7AED00B227B0 /* color.cpp in Sources */, - AAEB37261190019500EE9961 /* CVFilter.cpp in Sources */, + AAEB37261190019500EE9961 /* CVFilter.mm in Sources */, AAEB376D11929F0000EE9961 /* filter_instance.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0;