Re: FxPlug using CIImage with CIFilter behave differently between Motion and Final Cut
Re: FxPlug using CIImage with CIFilter behave differently between Motion and Final Cut
- Subject: Re: FxPlug using CIImage with CIFilter behave differently between Motion and Final Cut
- From: Darrin Cardani <email@hidden>
- Date: Wed, 1 Oct 2008 10:28:18 -0700
On Oct 1, 2008, at 12:22 AM, Jim George wrote:
I've run into a discrepancy between the behavior of using Core Image
filters between Final Cut and Motion in an FxPlug and wonder if anyone
would have any insight into the problem.
I have a filter that takes a number of contiguous frames and runs some
processing over them. I am using the temporalImageAPI to get the
frames as FxTextures.
In Final Cut the filter comes out correctly, but in Motion only the
*last* frame gets drawn. I'm thinking somehow that Motion uses a
shared context or texture where final cut allocates new ones, but my
understanding of these under the hood is a bit of guesswork.
Jim,
Yes there are cases where Motion reuses textures. You could check
whether we're giving you the same texture by printing out the texture
ID in the loop. I would think that since you aren't releasing the
textures (at least in the code below) that we wouldn't be reusing the
texture ID.
If this is a cut-down version of the code and you actually are
releasing the textures after each loop iteration, that may be the
issue. Try not releasing them until after the draw command. Remember
that CI filters don't actually execute until you call the drawImage:
command because they can concatenate for improved speed, so if you're
releasing them in the loop, they might not be there when the drawing
happens.
Below is the basics of what I'm doing in the Render method for FxPlug.
glPushAttrib(GL_CURRENT_BIT);
CIContext *ciContext = [CIContext
contextWithCGLContext:CGLGetCurrentContext()
pixelFormat:CGLGetPixelFormat(CGLGetCurrentContext())
options:NULL];
CGColorSpaceRef cspace = CGColorSpaceCreateDeviceRGB();
FxTexture* inputTex;
[temporalImageAPI getInputTexture:&inputTex withInfo: renderInfo
atTime: renderInfo.frame - width/2];
CIImage* imageBase = [CIImage imageWithTexture:[inputTex textureId]
size:CGSizeMake([inputTex width],[inputTex height]) flipped:NO
colorSpace:cspace];
UInt32 frameStep = 0;
double i;
for(i = renderInfo.frame - width/2; i <= renderInfo.frame + width/
2; i++){
[_filter setValue:imageBase forKey: @"inputBase"];
[temporalImageAPI getInputTexture:&inputTex withInfo: renderInfo
atTime:i];
CIImage* inputImage = [CIImage imageWithTexture:[inputTex
textureId] size:CGSizeMake([inputTex width],[inputTex height])
flipped:NO colorSpace:cspace];
[_filter setValue:inputImage forKey:@"inputImage"];
imageBase = [_filter valueForKey:@"outputImage"];
}
[ciContext drawImage:imageBase
inRect:CGRectMake(left,bottom,right-left,top-bottom)
fromRect:CGRectMake(tLeft,tBottom,tRight-tLeft,tTop-tBottom)];
glPopAttrib();
Darrin
--
Darrin Cardani
email@hidden
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Pro-apps-dev mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden