(原)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的话,建 ...
随机推荐
- kuangbin专题专题四 Til the Cows Come Home POJ - 2387
题目链接:https://vjudge.net/problem/POJ-2387 题意:从编号为n的城市到编号为1的城市的最短路. 思路:dijkstra模板题,直接套板子,代码中我会带点注释给初学者 ...
- python测试开发django-67.templates模板变量取值
前言 django 的模板里面变量取值是通过句点语法来取值,就是一个点(.)符号.取值的对象也可以是字符串,int类型,list列表,字典键值对,也可以是一个类的实例对象. views视图 比如我在 ...
- python应用-解决应用题
应用题: 30个人出海去玩,船瓦特了,要弄死15个人,其他人才能活下来,围成一圈,报数1,2,3...,谁报到9就弄死谁,以此类推. 直到剩下15个人为止.其中15个人是基督徒,其他15个不是基 ...
- Gamification and Game-Based Learning
https://uwaterloo.ca/centre-for-teaching-excellence/teaching-resources/teaching-tips/educational-tec ...
- D触发器的使用小结
请查看我的博客园文章,比较详细. https://www.cnblogs.com/CodeWorkerLiMing/p/11964046.html
- linux下如何完全删除用户
1.首先进入系统创建一个用户 [root@localhost /]# useradd haha #创建用户 haha是用户名 [root@localhost /]# passwd haha ...
- C和C++的不同点
一.返回值 C中:如果函数未指定返回值类型,则默认为int c++中:如果一个函数没有返回值,返回值类型必须指定为void 二.参数列表 C中:如果函数没有指定参数列表,则默认可以接受任意多个参数 C ...
- 在服务器搭建git仓库
使用root登录服务器 添加一个新用户(git仓库的所有者) useradd gituser # gituser---> 用户名字 设置密码 passwd gituser 配置sshd服务参数 ...
- cronicle 任务调度一主多从安装试用
cronicle 对于一主多从的安装还是很简单的,对于slave 就是少了setup一步,同时在master 界面,添加下slave 就可以了 就会加入集群中了 项目使用docker-compose ...
- C++后端工程师需要看的书籍
C++基础书籍<C++ primer><深度探索C++对象模型><Effective C++><more effective C++><STL源码 ...