(原)ffmpeg中filter开发过程遇到的坑<一>
最近在使用ffmpeg开发了一些滤镜filter功能,中间出现一些问题,今天想把这部分的内容整理为笔记,方便以后遇到同样问题的时候,方便翻阅。
author:lihaiping1603@aliyun.com
date:2019-12-20
如何生成dump core文件?
当我们在linux下将ffmpeg编译好之后,进入运行调试阶段,突然ffmpeg就cash了,提示出现了一个莫名其妙的"segment fault(段错误)"。然后我们想找出他崩溃时候出现的堆栈信息,这时候我们想到了dump core文件,但ls一看,当前目录下是空的,并没有任何的core文件生成,这时候如何是好呢?
一般来说程序cash了,都会生成一个core文件的,但为什么生成不了呢?是不是被系统限制了啥?网上一查,果然如此。我们要判断是不是系统限制,可以通过命令 ulimit -a 查看当前系统core文件的大小限制。
例如:
这种情况,说明core文件被限制,因为他限制生成core文件的大小为0,那也就是生成不了core文件。
如何解除这种限制呢?办法是通过ulimit -a unlimited 来解除,运行这条命令以后,我们再ulimit -a查看一下:
这个时候,我们再运行ffmpeg,如果崩溃的话,就会在当前命令生成相应的core文件了。
通过gdb和core查看堆栈信息,堆栈信息中全是??,并不能找到代码对应的堆栈函数信息
通过上一步,我们能生成cash当时的core文件了,但当gdb 该core文件的时候,堆栈信息却是一堆??,这个是什么原因导致的?我们如何解决这个问题?
这个问题的主要原因是因为我们的ffmpeg在编译的时候没有开启调试选项信息,如果我们需要生成的core文件能有效的话,我们需要在编译ffmpeg的时候,不能去掉strip符号信息,而ffmpeg默认是去掉strip符号 信息的,所以我们编译配置的时候,需要加上./configure --enable-debug --disable-optimizations --disable-asm --disable-stripping 。
这时候生成的core文件堆栈信息就能显示相关详细函数了。
例如:
ffmpeg filter中,关于frame的释放出现的一个bug
最近在开发filter的时候,出现了一个frame释放的bug,其实这个是一个个人人为造成的bug,但还是在这里记录一下。
在filter中,我们经常从prev filter拿到帧数据以后,可能在current filter中直接对帧数据进行修改,也可能需要对这个帧数据需要进行先拷贝,然后再修改的过程(可参考writing_filter.txt或者我翻译的writing_filter_zh.md )。
而我在自己开发的这个filter中,我是先从缓冲器中获取到一个src frame之后,先对他进行一个scale,然后scale以后,我就把src frame给free了,因为我觉得这个frame,我后续用不到了,所以选择释放掉,防止内存释放,但就因为我这个释放,导致ffmpeg在用到这个filter的时候,就崩溃了,你说尴尬不,一开始我还莫名其妙。
后面再阅读了一次writing_filter.txt中的内容,我就知道我犯了啥错误,我这个地方从缓冲器中获取到的frame,不应该由我释放,因为他被其他地方引用了,所以这里有两个方式,
1,修改之前先拷贝一次,然后去scale
2,不拷贝,那也就不用释放
这个过程可以多参考几个源码中的filter写法。
一般来说,如果我们获取到的这个frame,先抛弃掉我们自己的处理过程(假如我们啥都不做的话),如果这个frame是直接被传递到next filter当中的话,那么我们就需要对这个frame释放,我们有它的所有管理权限,例如crop中的frame。如果不是直接被传递到next filter的话,那我们就需要更加谨慎处理了,需要判断我们可以释放the frame,例如overlay滤镜当中的do blend函数,通过ff_framesync_dualinput_get_writable 函数获取到的mainpic 和second 两个frame,因为mainpic ,我们是直接后续会传递给next filter的,所以我们在当前filter中进行释放,他是没有问题的,但second 这个frame,我们是不能进行释放的,他被缓存了,所以如果选择释放的话,就会出现崩溃cash的可能。
diff 生成补丁文件
在开发一个filter之后,我们需要通过diff 命令:diff -Naru file_old file_new > differences.patch
来生成补丁文件,后续再其他的场景下,我们直接用这个补丁文件,进行打补丁就OK,防止人为的二次修改导致出现的bug。
转载请注明出处:https://www.cnblogs.com/lihaiping/p/12072323.html
(原)ffmpeg中filter开发过程遇到的坑<一>的更多相关文章
- (原)ffmpeg中的writing_filter翻译
本文的主要目的是梳理,记录自己在学习开发ffmpeg视频滤镜的笔记.参考的主要内容是根据ffmpeg中doc下的writing_filter.txt文件以及ffmpeg的源码. author:liha ...
- [原]零基础学习视频解码之FFMpeg中比较重要的函数以及数据结构
在正式开始解码练习前先了解下关于FFmpeg中比较重要的函数以及数据结构. 1. 数据结构: (1) AVFormatContext AVFormatContext是一个贯穿始终的数据结构,很多函 ...
- (原)ffmpeg过滤器开发和理解
最近学习了ffmpeg关于filter过滤器的开发,关于中间的几个相关概念,我们先放在简单介绍一下: AVFilterGraph:几乎完全等同与directShow中的fitlerGraph,代表一串 ...
- (转)ffmpeg 中 av_read_frame_internal分析
作者: chenwei1983 时间: 2012-3-5 04:21 PM标题: ffmpeg 中 av_read_frame_internal分析 ...
- FFmpeg 'scale' filter not present, cannot convert pixel formats.
/*************************************************************************** * FFmpeg 'scale' filter ...
- ffmpeg中关于EAGAIN的理解及非阻塞IO
ffmpeg为在linux下开发的开源音视频框架,所以经常会碰到很多错误(设置errno),其中EAGAIN是其中比较常见的一个错误(比如用在非阻塞操作中). try again,从字面上来看,是提 ...
- FFmpeg 中AVPacket的使用
AVPacket保存的是解码前的数据,也就是压缩后的数据.该结构本身不直接包含数据,其有一个指向数据域的指针,FFmpeg中很多的数据结构都使用这种方法来管理数据. AVPacket的使用通常离不开下 ...
- 【Fine原创】JMeter分布式测试中踩过的那些坑
最近因为项目需要,研究了性能测试的相关内容,并且最终选用了jmeter这一轻量级开源工具.因为一直使用jmeter的GUI模式进行脚本设计,到测试执行阶段工具本身对资源的过量消耗给性能测试带来了瓶颈, ...
- FFmpeg中HLS文件解析源码
不少人都在找FFmpeg中是否有hls(m3u8)解析的源码,其实是有的.就是ffmpeg/libavformat/hlsproto.c,它依赖的文件也在那个目录中. 如果要是单纯想解析HLS的话,建 ...
随机推荐
- PTA 树的遍历(根据后序中序遍历输出层序遍历)
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式:输入第一行给出一个正整数N(≤30),是二叉树中结点的个数.第二行给出其后序遍历序列.第 ...
- ‘cmake' 不是内部或外部命令 也不是可运行的程序 或批处理文
在 Win7下的命令行模式下,输入cmake相关命令,出现如下错误: ’cmake' 不是内部或外部命令 也不是可运行的程序 或批处理文件 解决方法: 在环境变量中添加cmake的文件路径. 计算机( ...
- javascript学习5、JS面向对象
创建对象的几种常用方式 1.使用Object或对象字面量创建对象 2.工厂模式创建对象 3.构造函数模式创建对象 4.原型模式创建对象 1.使用Object或对象字面量创建对象 JS中最基本创建对象的 ...
- 项目Beta冲刺(团队)--5/7
课程名称:软件工程1916|W(福州大学) 作业要求:项目Beta冲刺 团队名称:葫芦娃队 作业目标:进行新一轮的项目冲刺,尽力完成并完善项目 团队博客 队员学号 队员昵称 博客地址 04160242 ...
- JQuery系列(8) - JQuery插件开发
所谓“插件”,就是用户自己新增的jQuery实例对象的方法.由于该方法要被所有实例共享,所以只能定义在jQuery构造函数的原型对象(prototype)之上.对于用户来说,把一些常用的操作封装成插件 ...
- Hbase扩展
1 HBase在商业项目中的能力 每天: 1) 消息量:发送和接收的消息数超过60亿 2) 将近1000亿条数据的读写 3) 高峰期每秒150万左右操作 4) 整体读取数据占有约55%,写入占有45% ...
- linux 打印当前工作目录
pwd
- graphql-compose graphql schema 生成工具集
graphql-compose 是一个强大的graphql schema 生成工具集 包含以下特性 快速便捷的复杂类型生成 类型仓库,类型可以存储在schemacomposer 存储中 包含flowt ...
- [RN] React Native 再按一次退出
实现 React Native 再按一次退出 单页面: ... componentWillMount() { BackHandler.addEventListener('hardwareBackPre ...
- cogs 999. [東方S2]雾雨魔理沙
二次联通门 : cogs 999. [東方S2]雾雨魔理沙 摸你傻赛高!! /* cogs 999. [東方S2]雾雨魔理沙 原来以为是一道计算几何的题 可是细细一想发现.. 这就是一道dp 由于给定 ...