首页 > 其他分享 >关于GPUImage 两路输入 其中一路为 GPUImagePicture 的 问题的详细解析

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

时间:2023-05-24 12:33:04浏览次数:36  
标签:调用 secondInputFramebuffer lock unlock GPUImagePicture textureIndex GPUImage 解析




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


情况1:

GPUImagePicture -> 添加到1

此时调用不会crash

GPUImageMovie -> 添加到0


在GPUImageTwoInputFilter中


由于纹理1为GPUImagePicture

- (void)setInputFramebuffer:(GPUImageFramebuffer *)newInputFramebuffer atIndex:(NSInteger)textureIndex;
{
(textureIndex == 0)
    {
;
;
[firstInputFramebuffer lock];
    }
    else
    {
;
[secondInputFramebuffer lock];
    }
}

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

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


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

有:

[firstInputFramebuffer unlock];
[secondInputFramebuffer unlock];//此时由于secondInputFramebuffer为GPUImagePicture的secondInputFramebuffer,而GPUImagePicture的secondInputFramebuffer已经调用了
[outputFramebuffer disableReferenceCounting];取消了outputFramebuffer的引用计数

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

- (void)unlock;
{
(referenceCountingDisabled)
    {
;
    }
 …
}


情况2:

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

此时调用会crash

GPUImageMovie -> 添加到0


在GPUImageTwoInputFilter中


由于纹理1为GPUImagePicture

- (void)setInputFramebuffer:(GPUImageFramebuffer *)newInputFramebuffer atIndex:(NSInteger)textureIndex;
{
(textureIndex == 0)
    {
;
;
[firstInputFramebuffer lock];
    }
    else
    {
;
[secondInputFramebuffer lock];
    }
}

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

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


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

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

GPUImageFilter的secondInputFramebuffer,而GPUImageFilter的secondInputFramebuffer的引用计数并没有调用[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。

标签:调用,secondInputFramebuffer,lock,unlock,GPUImagePicture,textureIndex,GPUImage,解析
From: https://blog.51cto.com/u_16124099/6338518

相关文章

  • 深入解析Docker(2)Docker引擎
    分享一下最近正在b站上看动力节点的docker课程,整理了相关学习笔记,会按照学习进度慢慢更新的,加油2Docker引擎2.1Docker引擎发展历程2.1.1首发版本架构Docker在首次发布时,其引擎由两个核心组件构成:LXC(LinuxContainer)与DockerDaemon。不过,该架构依赖于LXC,使得Docker存在严重的......
  • SpringBoot中操作Redis解析JsonArray数据为对象List(ruoyi字典值sys_dict为例)
    场景若依前后端分离版手把手教你本地搭建环境并运行项目:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108465662在上面搭建系统的基础上,会将系统的字典值缓存进redis中。看数据格式存储的是Json数组,如何从redis中读取并解析成对象的list从而进行数据处理。注......
  • XML解析之DOM解析
    XML解析之DOM解析XML结构是一种树型结构,处理步骤都差不多,Java己经将它们封装成了现成的类库。目前流行的解析方法有三种,分别为DOM、SAX和DOM4j。本文将讲解DOM解析。DOM(DocumentObjectModel,文档对象模型)是W3C组织推荐的处理XML的一种方式。它是一种基于对象的API,......
  • 解析 Pinia 和 Vuex
     Pinia和Vuex一样都是是vue的全局状态管理器。其实Pinia就是Vuex5,只不过为了尊重原作者的贡献就沿用了这个看起来很甜的名字Pinia。本文将通过Vue3的形式对两者的不同实现方式进行对比,让你在以后工作中无论使用到Pinia还是Vuex的时候都能够游刃有余。既然我们要对比两者的实现......
  • 【linux基础】ftok函数解析
    前言最新项目代码有关信号量、共享内存,直接使用数值,不能得到预想的效果,调试发现不能直接使用数值,而是ftok函数获取键值,此前不了解,故记录之。原理共享内存、消息队列、信号量都是通过一个中间介质来进行通信的,这种介质多的是。就是怎么区分出来,就像唯一一个身份证来区分人一样。......
  • RAW8图像数据格式解析
    前言使用7yuv工具查看raw8图像数据,选择的格式是8bpp格式,大小是图像尺寸1280*720即可;RAW格式raw数据是sensor输出的原始数据,一般有raw8,raw10,raw12等,分别表示一个像素点有8bit、10bit、12bit数据。是sensor将光信号转化为电信号时的电平高低的原始记录,单纯地没有进行任何处......
  • python生成13位或16位时间戳以及反向解析时间戳
    importdatetimeimporttimedefget_float_time_stamp():datetime_now=datetime.datetime.now()returndatetime_now.timestamp()defget_time_stamp16():#生成16时间戳eg:1540281250399895-lndatetime_now=datetime.datetime.now()print(datetim......
  • Rails:从URL解析路由信息
    ###在Rails3中,您可以执行以下操作:Rails.application.routes.recognize_path"/accounts/1"#{:action=>"show",:controller=>"accounts",:id=>"1"}ActionController::Routing::Routes.recognize_path("/accounts/1&q......
  • 万字长文之HashMap源码解析(包含红黑树)
    〇、储备知识之红黑树0.1>2-3树红黑树是一种自平衡的二叉树,它可以避免二分搜索树在极端的情况下蜕化成链表的情况。那么什么是红黑树呢?要想便于了解红黑树,我们先了解一下跟它息息相关的2-3树。2-3树是一种绝对平衡的多叉树,在这棵树中,任意一个节点,它的左右子树的高度是相同的。如下......
  • (二)Spring源码解析:默认标签解析
    一、概述还记得我们在上一讲末尾提到的关于默认标签解析和自定义标签解析吧。本讲就来针对默认标签解析进行讲解。为了便于衔接上一讲的内容,我们将源码部分粘贴出来:从上图中的源码中,我们可以看出默认标签的解析是在parseDefaultElement(ele,delegate)方法中实现的。我们来看一下这......