swifferina
swifferina

Reputation: 293

Add a GPUImagePicture on a video

I'm trying to add a GPUImagePicture and a GPUImageUIElement on a video. GPUImageUIElement is working, but I've a problem with the GPUImagePicture because I only see it on the first frame and then it disappears.

Here's my code:

filter = [[GPUImageBrightnessFilter alloc] init];
[(GPUImageBrightnessFilter *)filter setBrightness:0];

GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init];
blendFilter.mix = 1.0;

        GPUImagePicture *overlay = [[GPUImagePicture alloc] initWithImage:[UIImage imageNamed:@"Logo.png"] smoothlyScaleOutput:YES];
        GPUImageTransformFilter *transformFilter = [GPUImageTransformFilter new];
        [transformFilter forceProcessingAtSize:CGSizeMake(73, 83)];
        [transformFilter setAffineTransform:CGAffineTransformMakeScale(0.7, 0.7)];
        [overlay addTarget:transformFilter];
        [overlay processImage];

UIView *subview1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 400)];
        UILabel *temperaturaText = [[UILabel alloc]initWithFrame:CGRectMake(77, 100, 105, 60)];
        temperaturaText.text = @"test";
        [subview1 addSubview:temperaturaText];
 uiElementInput = [[GPUImageUIElement alloc] initWithView:subview1];

[filter addTarget:blendFilter];
[uiElementInput addTarget:blendFilter];
[blendFilter addTarget:filterView];
[overlay addTarget:filterView];

__unsafe_unretained GPUImageUIElement *weakUIElementInput = uiElementInput;

[filter setFrameProcessingCompletionBlock:^(GPUImageOutput *filter, CMTime frameTime) {
     [weakUIElementInput update];
 }];

[blendFilter addTarget:movieWriter];

Upvotes: 1

Views: 766

Answers (1)

Brad Larson
Brad Larson

Reputation: 170317

Your problem is that you define your input picture of overlay as a local variable within your setup method. You aren't holding onto a strong reference to it, so it will be deallocated the instant you finish this method, which also will remove the image texture and its output from your processing pipeline.

If you want to hold on to an input image, you need to make overlay an instance variable of your class, like you did for your camera or movie input in the above. Then it will persist to be used by the framework as input.

Upvotes: 2

Related Questions