【FFmpeg】ffmpeg工具源码分析(三):分配过滤器内存(宏GROW_ARRAY)详解

0、引言

在ffmpeg.c源码的核心函数transcode() 中,先执行初始化操作transcode_init()
首先初始化过滤器
filtergraphs
,在寻找过滤器在哪分配时,发现它使用宏GROW_ARRAY以增长的方式来分配内存。

1、GROW_ARRAY原型

#define GROW_ARRAY(array, nb_elems)\
    array = grow_array(array, sizeof(*array), &nb_elems, nb_elems + 1)

2、GROW_ARRAY用法

以过滤器为例,使用宏GROW_ARRAY分配过滤器的方法如下:

GROW_ARRAY(filtergraphs, nb_filtergraphs);

分配过滤器的有三处,分别在:
源码文件 ffmpeg_filter.c 的 init_simple_filtergraph() 函数中;
源码文件 ffmpeg_opt.c 的 opt_filter_complex()和opt_filter_complex_script()函数中;

3、分配过滤器过程

1)在ffmpeg主函数中调用解析参数ffmpeg_parse_options()
2)解析参数过程:open_files() --> parse_optgroup() --> write_option();
3)有三处分配过滤器:

当解析参数,有 filter_complex 或者 lavfi 时,调用 opt_filter_complex() 函数;
当解析参数,有 filter_complex_script 时,调用 opt_filter_complex_script() 函数;
默认还会执行:open_output_file() --> init_simple_filtergraph()

4、GROW_ARRAY实现

GROW_ARRAY最终调用realloc()函数,
调用过程:grow_array() --> av_realloc_array() --> av_realloc() --> realloc()。
通过 grow_array(array, sizeof(*array), &nb_elems, nb_elems + 1) 可知 每调用一次 GROW_ARRAY ,数组长度增加1。

上一篇:使用FFmpeg将音视频合并


下一篇:FFmpeg打开rtsp流