关于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

猜你喜欢

转载自blog.csdn.net/jeffasd/article/details/79476666