(原)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的话,建 ...
随机推荐
- Echo团队Beta冲刺随笔集合
班级:软件工程1916|W 作业:项目Beta冲刺(团队) 团队名称:Echo 作业目标:完成项目Beta冲刺 凡事预则立 Day 0: 凡事预则立 冲刺随笔 Day 1: Beta冲刺第一天 Day ...
- NameValueCollectionValueProvider
NameValueCollectionValueProvider provider = new NameValueCollectionValueProvider(nameValueCollection ...
- Gym - 100962F: Frank Sinatra (树上莫队+bitset)
题意:给定一棵树,带边权.然后Q次询问,每次给出(u,v),求这个路径上最小的未出现的边权. 思路:树上莫队,求mex可以用分块或者bitset,前者可能会快一点. 莫队过程:求出欧拉序,即记录d ...
- 教你如何解决WIN 10系统睡眠无法唤醒
1.右击“开始菜单”,选择“电源选项”. 2.选择“更改计算机睡眠时间”. 3.选择“更改高级电源设置”. 4.选择“还原计划默认值”. 5.在弹出的对话框中选择“是 ”. 6.最后选 ...
- 在IAR平台建立STC8ASK64S4A12单片机工程
转载:http://www.51hei.com/bbs/forum.php?mod=viewthread&tid=168481&page=1#pid737250 一般我们使用STC单 ...
- 什么是JSP?它和Servlet有什么区别?
21 什么是JSP?它和Servlet有什么区别?答:你可以将JSP当做一个可扩充的HTML来对待.虽然在本质上JSP文件会被服务器自动翻译为相应的Servlet来执行.可以说Servlet是面向Ja ...
- HDU6704 K-th occurrence
[传送门] 先求出SA和height.然后找到 rank[l] 的 height 值.能成为相同子串的就是和rank[l]的lcp不小于 $len$ 的.二分出左右端点之后,主席树求第k小即可. #i ...
- Trie Service
Description Build tries from a list of <word, freq> pairs. Save top 10 for each node. Example ...
- 用插件maven-surefire-report-plugin生成html格式测试报告
在默认情况下,执行maven test/maven package/maven install命令时会在target/surefire-reports目录下生成txt和xml格式的输出信息. 其实ma ...
- Longest Common Substring II SPOJ - LCS2 (后缀自动机)
Longest Common Substring II \[ Time Limit: 236ms\quad Memory Limit: 1572864 kB \] 题意 给出\(n\)个子串,要求这\ ...