Java教程

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

本文主要是介绍【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工具源码分析(三):分配过滤器内存(宏GROW_ARRAY)详解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!