关于GPUImage 两路输入 其中一路为 GPUImagePicture 的 问题的详细解析



关于GPUImage 两路输入 其中一路为 GPUImagePicture 问题的详细解析


情况1:

GPUImagePicture -> 添加到1

                                                ->GPUImageTwoInputFilter 此时调用不会crash

GPUImageMovie -> 添加到0


GPUImageTwoInputFilter


由于纹理1GPUImagePicture

- (void)setInputFramebuffer:(GPUImageFramebuffer *)newInputFramebuffer atIndex:(NSInteger)textureIndex;

{

    if (textureIndex == 0)

    {

        firstInputFramebuffer = newInputFramebuffer;

        hasSetFirstTexture = YES;

        [firstInputFramebuffer lock];

    }

    else

    {

        secondInputFramebuffer = newInputFramebuffer;

        [secondInputFramebuffer lock];

    }

}

因此此方法对于的secondInputFramebuffer只会在GPUImagePicture调用processImage时调用一次,因此在GPUImageMovie调用setInputFramebuffer方法时

textureIndex始终为0,既[secondInputFramebuffer lock];一直没有调用的机会。


在调用- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates;方法时

有:

    [firstInputFramebuffer unlock];

    [secondInputFramebuffer unlock];//此时由于secondInputFramebufferGPUImagePicturesecondInputFramebuffer,而GPUImagePicturesecondInputFramebuffer已经调用了

[outputFramebuffer disableReferenceCounting];取消了outputFramebuffer的引用计数


在调用 [secondInputFramebuffer unlock];时有 此时不会crash

- (void)unlock;

{

    if (referenceCountingDisabled)

    {

        return;

    }

}



情况2:

GPUImagePicture -> GPUImageFilter ->(各种滤镜组合) … ->添加到1

                                                                                                  ->GPUImageTwoInputFilter 此时调用会crash

GPUImageMovie -> 添加到0


GPUImageTwoInputFilter


由于纹理1GPUImagePicture

- (void)setInputFramebuffer:(GPUImageFramebuffer *)newInputFramebuffer atIndex:(NSInteger)textureIndex;

{

    if (textureIndex == 0)

    {

        firstInputFramebuffer = newInputFramebuffer;

        hasSetFirstTexture = YES;

        [firstInputFramebuffer lock];

    }

    else

    {

        secondInputFramebuffer = newInputFramebuffer;

        [secondInputFramebuffer lock];

    }

}

因此此方法对于的secondInputFramebuffer只会在GPUImagePicture调用processImage时调用一次,因此在GPUImageMovie调用setInputFramebuffer方法时

textureIndex始终为0,既[secondInputFramebuffer lock];一直没有调用的机会。


在调用- (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates;方法时

此处的secondInputFramebuffer已经不是GPUImagePicturesecondInputFramebuffer,此处的secondInputFramebufferGPUImagePicture后面添加的

GPUImageFiltersecondInputFramebuffer,而GPUImageFiltersecondInputFramebuffer的引用计数并没有调用[outputFramebuffer disableReferenceCounting]方法。

导致 在调用[secondInputFramebuffer unlock];方法时 触发framebufferReferenceCount 小于0 条件

NSAssert(framebufferReferenceCount > 0, @"Tried to overrelease a framebuffer, did you forget to call -useNextFrameForImageCapture before using -imageFromCurrentFramebuffer?");

此时 framebufferReferenceCount 会小于0,调试状态下直接crash

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值