(原)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的话,建 ...
随机推荐
- SpringCloud2.0 Hystrix Dashboard 断路器指标看板
原文:https://www.cnblogs.com/songlu/p/9973856.html 1.启动基础工程 1.1.启动[服务中心]集群,工程名称:springcloud-eureka-ser ...
- Mysql 日常
Mysql 日常总结 做报表的时候经常会使用 if 来帮助统计 select count(if(key=1,1,NULL)) from atable where ... 当然,也支持选择 select ...
- 项目Beta冲刺(团队)——05.24(2/7)
项目Beta冲刺(团队)--05.24(2/7) 格式描述 课程名称:软件工程1916|W(福州大学) 作业要求:项目Beta冲刺(团队) 团队名称:为了交项目干杯 作业目标:记录Beta敏捷冲刺第2 ...
- Beta冲刺——用户使用调查报告
项目Beta冲刺(团队) --用户使用调查报告 一.项目概述 1.1项目名称 卡战三国 1.2项目简介 一款休闲娱乐益智卡牌游戏 1.3 项目预期目标 开发一款基于三国题材的卡牌通关对战手机游戏 二. ...
- C语言中一个语句太长用什么换行?
C语言中一个语句太长用什么换行? 5 C语言中一个语句太长用什么换行?比如我有一个printf语句很长很长,问了美观,我不想写在这一行了,要换到下一行,是不是在这行结尾的时候,要用个什么标识来表 ...
- Spring启动,constructor,@PostConstruct,afterPropertiesSet,onApplicationEvent执行顺序
package com.xx; import javax.annotation.PostConstruct; import javax.annotation.Resource; import org. ...
- Aizu2249-Road Construction-(Dijkstra)
https://vjudge.net/problem/Aizu-2249 题意:计划图中有n个城市m条路,首都是1号城市,要选一些路去修,让各个城市到首都的路径最短,在路径最短的情况下修路费用最小. ...
- vim命令(转)
1.Linux下创建文件 vi test.txt 或者 vim test.txt 或者 touch test.txt 2.vi/vim 使用 基本上 vi/vim 共分为三种模式,分别是命令模式(Co ...
- 超实用文件监控多线程FTP上传工具
这是自己很久以前写的一个多线程FTP 上传工具,支持多账户,自定义线程数,自定义文件监控目录,可用做文件发布使用,非常实用,今天有小伙伴问起,现分享出来: using System; using Sy ...
- 洛谷P1107 [BJWC2008]雷涛的小猫 题解
题面 以下是luogu给的标签 但字符串是什么鬼.... 玄学... 哦吼~ #include<cstdio> #include<iostream> using namespa ...