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。