Edit AllPages

I’m currently trying to create a real-time CIImage-based filter for a captured video-stream. The basic task is this: take a CIImage of size (sx, sy) and apply a mapping that yields an CIImage of size (dx, dy), where dx > sx, dy > sy.

The mapping is basically an array of coordinates with dimension (dx, dy). At each point, the source-pixel is stored. This is the inner loop of my mapping, just to make you grasp the idea:

for(int dy = 0; dy < _dest.height; dy++) { coord *mappingRow = _mappingRows[dy]; unsigned int *pixelRow = _dest.rowtab[dy]; for(int dx = 0; dx < _dest.width; dx++) { int sx = mappingRow[dx].x; int sy = mappingRow[dx].y; *(pixelRow++) = _source.rowtab[sy][sx]; } }

So far, so good. The _source and _dest-variables are structs that contain all information necessary to deal with CIContext and look like this:

typedef struct { CGContextRef port; CIContext* context; int width; int height; int bytesPerRow; int byteCount; CIFormat picelFormat; void * data; int **rowtab; } ContextInfo;

They are initialized in the init-method of my filter-object, as well as the mapping-table.

Everything works just fine when using the filter once. This is the whole map-method, containing the above loop. I draw the image to _source, map it to and create an CIImage out of that.

As you might see, the raw pixel buffers and are allocated once and are supposed to be worked on as long as the filter exists.

Now when using this filter in my sequence-grabbing application that captures an NSImage from my i-Fire camera, I do this in an extra method:

-(NSImage) mapWithNSImage: (NSImage) image { NSBitmapImageRep *bitmap = image representations] objectAtIndex: 0]; [[CIImage *im = [[[CIImage alloc] initWithBitmapImageRep: bitmap] autorelease];

im = [self map: im];

bitmap = [NSCIImageRep imageRepWithCIImage: im]; CGRect extent = [im extent]; image = [[[NSImage alloc] initWithSize: NSMakeSize(extent.size.width, extent.size.height)] autorelease]; [image addRepresentation: bitmap]; return image ;


See also (