getTexture now returns an autoreleased object. Callers will retain it if necessary

refactoring the feedFrame/renderFrame/getTexture flow to make a more
clever use of memory and autorelease pools

started implementing CVFilter

(on the way of having CoreImage filters usable from javascript)
This commit is contained in:
xant
2010-05-22 11:11:23 +02:00
parent 267513a82c
commit f05ea9df4d
17 changed files with 184 additions and 157 deletions
+1 -1
View File
@@ -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);
+7 -5
View File
@@ -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;
}
+1 -1
View File
@@ -29,7 +29,7 @@ class CVF0rLayer : public CVLayer
void *currentFrame;
CVPixelBufferRef pixelBuffer;
public:
public:
CVF0rLayer(CVLayerController *controller);
~CVF0rLayer();
void register_generators(Linklist<Filter> *gens);
-8
View File
@@ -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;
}
}
-27
View File
@@ -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"
+58
View File
@@ -23,3 +23,61 @@
*
*/
/* FreeJ - Frei0r wrapper
* (c) Copyright 2007 Denis Rojo <jaromil@dyne.org>
*
* 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 <config.h>
#ifdef WITH_COCOA
#import <QuartzCore/CIFilter.h>
#include <filter.h>
#include <factory.h>
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
-10
View File
@@ -216,15 +216,5 @@ error:
[super dealloc];
}
- (CVReturn)renderFrame
{
[lock lock];
[self renderPreview];
if (layer)
layer->vbuffer = currentFrame;
[lock unlock];
return kCVReturnSuccess;
}
@end
+21 -20
View File
@@ -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
+13 -3
View File
@@ -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;
}
+57 -50
View File
@@ -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];
}
-1
View File
@@ -182,7 +182,6 @@
//if (textureToRelease)
// [textureToRelease release];
}
[texture release];
[pool release];
}
+1 -15
View File
@@ -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
+12 -8
View File
@@ -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];
+2 -3
View File
@@ -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
+1
View File
@@ -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
+6 -1
View File
@@ -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
+4 -4
View File
@@ -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 = "<group>"; };
AAE2C2B7103FE2AE00D62E4F /* factory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = factory.h; path = include/factory.h; sourceTree = "<group>"; };
AAEB37241190019500EE9961 /* CVFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CVFilter.h; sourceTree = "<group>"; };
AAEB37251190019500EE9961 /* CVFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CVFilter.cpp; sourceTree = "<group>"; };
AAEB37251190019500EE9961 /* CVFilter.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CVFilter.mm; sourceTree = "<group>"; };
AAEB376C11929F0000EE9961 /* filter_instance.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = filter_instance.cpp; sourceTree = "<group>"; };
AAEB376E11929F0E00EE9961 /* filter_instance.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = filter_instance.h; path = include/filter_instance.h; sourceTree = "<group>"; };
AAEE68930FC8906B007FB46B /* webcam.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = webcam.png; sourceTree = "<group>"; };
@@ -583,7 +583,7 @@
AAC9DB35103D2C7F00A0111E /* PreferencesPanel.h */,
AAC9DB36103D2C7F00A0111E /* PreferencesPanel.mm */,
AAEB37241190019500EE9961 /* CVFilter.h */,
AAEB37251190019500EE9961 /* CVFilter.cpp */,
AAEB37251190019500EE9961 /* CVFilter.mm */,
);
name = Cocoa;
sourceTree = "<group>";
@@ -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;