FFmpeg 头文件完美翻译之 libavfilter 模块

embedded/2025/2/6 11:38:51/
cle class="baidu_pl">
cle_content" class="article_content clearfix">
content_views" class="markdown_views prism-atom-one-dark">cap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">

前言

众所周知࿰c;FFmpeg 的代码开发上手难度较高࿰c;源于官方提供的文档很少有包含代码教程相关的。要想熟练掌握 FFmpeg 的代码库开发࿰c;需要借助它的头文件࿰c;FFmpeg 把很多代码库教程都写在头文件里面。因此࿰c;熟读头文件的内容很重要࿰c;为此࿰c;我对 FFmpeg 6.x 版本的头文件进行了翻译࿰c;方便大家阅读理解。相信我࿰c;通读一遍头文件的注释后࿰c;你的 FFmpeg 的代码库开发技能将更上一层。

本文适用于有 FFmpeg 代码库开发基础࿰c;但想深入熟练使用的同学。

同时也可以参考我的Github 仓库࿰c;下载到本地慢慢品读~

c="https://i-blog.csdnimg.cn/img_convert/5515939778162ebb3500777a4bf7d08e.gif" alt="frantic-studying.gif" />

class="tags" href="/LIBAVFILTER.html" title=libavfilter>libavfilter 模块用于给未编码的帧使用各种过滤器࿰c;主要有如下头文件:

  • avfilter.h
  • buffersink.h
  • buffersrc.h

avfilter.h

<code class="prism language-c">class="token macro property">class="token directive-hash">#class="token directive keyword">ifndef class="token expression">AVFILTER_AVFILTER_H
class="token macro property">class="token directive-hash">#class="token directive keyword">define class="token macro-name">AVFILTER_AVFILTER_Hclass="token comment">/*** @file* @ingroup lavfi* class="tags" href="/LIBAVFILTER.html" title=libavfilter>libavfilter主要公共API头文件*/class="token comment">/*** @defgroup lavfi class="tags" href="/LIBAVFILTER.html" title=libavfilter>libavfilter* 基于图的帧编辑库。** @{*/class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><stddef.h>class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"libavutil/attributes.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"libavutil/avutil.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"libavutil/buffer.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"libavutil/dict.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"libavutil/frame.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"libavutil/log.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"libavutil/samplefmt.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"libavutil/pixfmt.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"libavutil/rational.h"class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"class="tags" href="/LIBAVFILTER.html" title=libavfilter>libavfilter/version_major.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">ifndef class="token expression">HAVE_AV_CONFIG_H
class="token comment">/* 当作为class="tags" href="/FFMPEG.html" title=ffmpeg>ffmpeg构建的一部分时,仅包含主版本号* 以避免不必要的重新构建。当外部包含时,继续包含* 完整的版本信息。 */
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"class="tags" href="/LIBAVFILTER.html" title=libavfilter>libavfilter/version.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">endifclass="token comment">/*** 返回LIBAVFILTER_VERSION_INT常量。*/
class="token keyword">unsigned class="token function">avfilter_versionclass="token punctuation">(class="token keyword">voidclass="token punctuation">)class="token punctuation">;class="token comment">/*** 返回class="tags" href="/LIBAVFILTER.html" title=libavfilter>libavfilter的编译时配置。*/
class="token keyword">const class="token keyword">char class="token operator">*class="token function">avfilter_configurationclass="token punctuation">(class="token keyword">voidclass="token punctuation">)class="token punctuation">;class="token comment">/*** 返回class="tags" href="/LIBAVFILTER.html" title=libavfilter>libavfilter的许可证。*/
class="token keyword">const class="token keyword">char class="token operator">*class="token function">avfilter_licenseclass="token punctuation">(class="token keyword">voidclass="token punctuation">)class="token punctuation">;class="token keyword">typedef class="token keyword">struct class="token class-name">AVFilterContext AVFilterContextclass="token punctuation">;
class="token keyword">typedef class="token keyword">struct class="token class-name">AVFilterLink    AVFilterLinkclass="token punctuation">;
class="token keyword">typedef class="token keyword">struct class="token class-name">AVFilterPad     AVFilterPadclass="token punctuation">;
class="token keyword">typedef class="token keyword">struct class="token class-name">AVFilterFormats AVFilterFormatsclass="token punctuation">;
class="token keyword">typedef class="token keyword">struct class="token class-name">AVFilterChannelLayouts AVFilterChannelLayoutsclass="token punctuation">;class="token comment">/*** 获取AVFilterPad的名称。** @param pads AVFilterPad数组* @param pad_idx 数组中pad的索引;调用者负责*                确保索引有效** @return pads中第pad_idx个pad的名称*/
class="token keyword">const class="token keyword">char class="token operator">*class="token function">avfilter_pad_get_nameclass="token punctuation">(class="token keyword">const AVFilterPad class="token operator">*padsclass="token punctuation">, class="token keyword">int pad_idxclass="token punctuation">)class="token punctuation">;class="token comment">/*** 获取AVFilterPad的类型。** @param pads AVFilterPad数组* @param pad_idx 数组中pad的索引;调用者负责*                确保索引有效** @return pads中第pad_idx个pad的类型*/
class="token keyword">enum class="token class-name">AVMediaType class="token function">avfilter_pad_get_typeclass="token punctuation">(class="token keyword">const AVFilterPad class="token operator">*padsclass="token punctuation">, class="token keyword">int pad_idxclass="token punctuation">)class="token punctuation">;class="token comment">/*** 过滤器输入的数量不仅由AVFilter.inputs决定。* 过滤器可能会根据提供给它的选项在初始化期间添加额外的输入。*/
class="token macro property">class="token directive-hash">#class="token directive keyword">define class="token macro-name">AVFILTER_FLAG_DYNAMIC_INPUTS        class="token expression">class="token punctuation">(class="token number">1 class="token operator"><< class="token number">0class="token punctuation">)
class="token comment">/*** 过滤器输出的数量不仅由AVFilter.outputs决定。* 过滤器可能会根据提供给它的选项在初始化期间添加额外的输出。*/
class="token macro property">class="token directive-hash">#class="token directive keyword">define class="token macro-name">AVFILTER_FLAG_DYNAMIC_OUTPUTS       class="token expression">class="token punctuation">(class="token number">1 class="token operator"><< class="token number">1class="token punctuation">)
class="token comment">/*** 过滤器通过将帧分割成多个部分并并发处理它们来支持多线程。*/
class="token macro property">class="token directive-hash">#class="token directive keyword">define class="token macro-name">AVFILTER_FLAG_SLICE_THREADS         class="token expression">class="token punctuation">(class="token number">1 class="token operator"><< class="token number">2class="token punctuation">)
class="token comment">/*** 这是一个"元数据"过滤器 - 它不会以任何方式修改帧数据。* 它可能只会影响元数据(即那些由av_frame_copy_props()复制的字段)。** 更准确地说,这意味着:* - 视频:过滤器输出的任何帧的数据必须完全等于*   在其输入之一上接收的某个帧。此外,在给定输出上*   产生的所有帧必须对应于在同一输入上接收的帧,*   并且它们的顺序必须保持不变。注意过滤器仍然可能*   丢弃或复制帧。* - 音频:过滤器在其任何输出上产生的数据(例如,*   视为交错样本的数组)必须完全等于过滤器在其*   输入之一上接收的数据。*/
class="token macro property">class="token directive-hash">#class="token directive keyword">define class="token macro-name">AVFILTER_FLAG_METADATA_ONLY         class="token expression">class="token punctuation">(class="token number">1 class="token operator"><< class="token number">3class="token punctuation">)class="token comment">/*** 过滤器可以使用AVFilterContext.hw_device_ctx创建硬件帧。*/
class="token macro property">class="token directive-hash">#class="token directive keyword">define class="token macro-name">AVFILTER_FLAG_HWDEVICE              class="token expression">class="token punctuation">(class="token number">1 class="token operator"><< class="token number">4class="token punctuation">)
class="token comment">/*** 一些过滤器支持通用的"enable"表达式选项,可用于* 在时间线中启用或禁用过滤器。支持此选项的过滤器* 设置此标志。当enable表达式为false时,将调用默认的* 无操作filter_frame()函数,而不是在每个输入pad上定义的* filter_frame()回调,因此帧将不变地传递给下一个过滤器。*/
class="token macro property">class="token directive-hash">#class="token directive keyword">define class="token macro-name">AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC  class="token expression">class="token punctuation">(class="token number">1 class="token operator"><< class="token number">16class="token punctuation">)
class="token comment">/*** 与AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC相同,除了即使* enable表达式为false时,过滤器仍将像往常一样调用其* filter_frame()回调。过滤器将在filter_frame()回调内* 禁用过滤,例如执行依赖于AVFilterContext->is_disabled* 值的代码。*/
class="token macro property">class="token directive-hash">#class="token directive keyword">define class="token macro-name">AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL class="token expression">class="token punctuation">(class="token number">1 class="token operator"><< class="token number">17class="token punctuation">)
class="token comment">/*** 用于测试过滤器是否支持时间线功能的便捷掩码* (内部或通用)。*/
class="token macro property">class="token directive-hash">#class="token directive keyword">define class="token macro-name">AVFILTER_FLAG_SUPPORT_TIMELINE class="token expression">class="token punctuation">(AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC class="token operator">| AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNALclass="token punctuation">)class="token comment">/*** 过滤器定义。这定义了过滤器包含的pad,以及所有用于* 与过滤器交互的回调函数。*/
class="token keyword">typedef class="token keyword">struct class="token class-name">AVFilter class="token punctuation">{class="token comment">/*** 过滤器名称。必须非NULL且在过滤器中唯一。*/class="token keyword">const class="token keyword">char class="token operator">*nameclass="token punctuation">;class="token comment">/*** 过滤器的描述。可以为NULL。** 你应该使用NULL_IF_CONFIG_SMALL()宏来定义它。*/class="token keyword">const class="token keyword">char class="token operator">*descriptionclass="token punctuation">;class="token comment">/*** 静态输入列表。** 如果没有(静态)输入则为NULL。设置了AVFILTER_FLAG_DYNAMIC_INPUTS* 的过滤器实例可能有比此列表更多的输入。*/class="token keyword">const AVFilterPad class="token operator">*inputsclass="token punctuation">;class="token comment">/*** 静态输出列表。** 如果没有(静态)输出则为NULL。设置了AVFILTER_FLAG_DYNAMIC_OUTPUTS* 的过滤器实例可能有比此列表更多的输出。*/class="token keyword">const AVFilterPad class="token operator">*outputsclass="token punctuation">;class="token comment">/*** 用于私有数据的类,用于声明过滤器私有AVOptions。* 对于不声明任何选项的过滤器,此字段为NULL。** 如果此字段非NULL,过滤器私有数据的第一个成员* 必须是指向AVClass的指针,class="tags" href="/LIBAVFILTER.html" title=libavfilter>libavfilter通用代码* 将把它设置为这个类。*/class="token keyword">const AVClass class="token operator">*priv_classclass="token punctuation">;class="token comment">/*** AVFILTER_FLAG_*的组合*/class="token keyword">int flagsclass="token punctuation">;class="token comment">/****************************************************************** 此行以下的所有字段都不是公共API的一部分。它们* 不能在class="tags" href="/LIBAVFILTER.html" title=libavfilter>libavfilter外使用,并且可以随意更改和* 删除。* 新的公共字段应该添加在上面。******************************************************************/class="token comment">/*** 输入列表中的条目数。*/class="token class-name">uint8_t nb_inputsclass="token punctuation">;class="token comment">/*** 输出列表中的条目数。*/class="token class-name">uint8_t nb_outputsclass="token punctuation">;class="token comment">/*** 此字段确定formats联合的状态。* 它是一个FilterFormatsState枚举值。*/class="token class-name">uint8_t formats_stateclass="token punctuation">;class="token comment">/*** 过滤器预初始化函数** 此回调将在过滤器上下文分配后立即调用,* 以允许分配和初始化子对象。** 如果此回调非NULL,则在分配失败时将调用uninit回调。** @return 成功时返回0,*         失败时返回AVERROR代码(但调用代码会*           丢弃该代码并将其视为ENOMEM)*/class="token keyword">int class="token punctuation">(class="token operator">*preinitclass="token punctuation">)class="token punctuation">(AVFilterContext class="token operator">*ctxclass="token punctuation">)class="token punctuation">;class="token comment">/*** 过滤器初始化函数。** 此回调在过滤器生命周期内只会调用一次,在所有* 选项设置之后,但在建立过滤器之间的链接和* 进行格式协商之前。** 应该在这里完成基本的过滤器初始化。具有动态* 输入和/或输出的过滤器应该根据提供的选项在* 这里创建这些输入/输出。在此回调之后,不能* 对此过滤器的输入/输出进行更多更改。** 此回调不能假设过滤器链接存在或帧参数已知。** 即使初始化失败,也保证会调用@ref AVFilter.uninit "uninit",* 因此此回调不需要在失败时进行清理。** @return 成功时返回0,失败时返回负的AVERROR*/class="token keyword">int class="token punctuation">(class="token operator">*initclass="token punctuation">)class="token punctuation">(AVFilterContext class="token operator">*ctxclass="token punctuation">)class="token punctuation">;class="token comment">/*** 过滤器取消初始化函数。** 仅在过滤器释放之前调用一次。应该释放过滤器* 持有的任何内存,释放任何缓冲区引用等。它不* 需要释放AVFilterContext.priv内存本身。** 即使@ref AVFilter.init "init"未调用或失败,* 也可能调用此回调,因此它必须准备好处理这种* 情况。*/class="token keyword">void class="token punctuation">(class="token operator">*uninitclass="token punctuation">)class="token punctuation">(AVFilterContext class="token operator">*ctxclass="token punctuation">)class="token punctuation">;class="token comment">/*** 以下联合的状态由formats_state确定。* 请参阅internal.h中FilterFormatsState枚举的文档。*/class="token keyword">union class="token punctuation">{class="token comment">/*** 查询过滤器在其输入和输出上支持的格式。** 此回调在过滤器初始化后调用(因此输入和输出是固定的),* 在格式协商之前不久。此回调可能被调用多次。** 此回调必须在每个输入链接上设置::AVFilterLink的* @ref AVFilterFormatsConfig.formats "outcfg.formats"* 和在每个输出链接上设置* @ref AVFilterFormatsConfig.formats "incfg.formats"* 为过滤器在该链接上支持的像素/样本格式列表。* 对于音频链接,此过滤器还必须设置* @ref AVFilterFormatsConfig.samplerates "incfg.samplerates"*  /* @ref AVFilterFormatsConfig.samplerates "outcfg.samplerates"* 和@ref AVFilterFormatsConfig.channel_layouts "incfg.channel_layouts"*  /* @ref AVFilterFormatsConfig.channel_layouts "outcfg.channel_layouts"* 类似地。** 当联合处于此状态时,此回调决不能为NULL。** @return 成功时返回零,失败时返回对应于* AVERROR代码的负值*/class="token keyword">int class="token punctuation">(class="token operator">*query_funcclass="token punctuation">)class="token punctuation">(AVFilterContext class="token operator">*class="token punctuation">)class="token punctuation">;class="token comment">/*** 指向由AV_PIX_FMT_NONE分隔的可接受像素格式数组的指针。* 通用代码将使用此列表来表明此过滤器支持这些像素格式中的* 每一个,前提是所有输入和输出使用相同的像素格式。** 当联合处于此状态时,此列表决不能为NULL。* 使用此的所有过滤器的输入和输出的类型必须是* AVMEDIA_TYPE_VIDEO。*/class="token keyword">const class="token keyword">enum class="token class-name">AVPixelFormat class="token operator">*pixels_listclass="token punctuation">;class="token comment">/*** 类似于pixels,但由AV_SAMPLE_FMT_NONE分隔* 并限制为仅具有AVMEDIA_TYPE_AUDIO输入和输出的过滤器。** 除此之外,通用代码将标记所有输入和所有输出* 支持所有采样率和每个声道数和声道布局,只要所有* 输入和输出使用相同的采样率和声道数/布局。*/class="token keyword">const class="token keyword">enum class="token class-name">AVSampleFormat class="token operator">*samples_listclass="token punctuation">;class="token comment">/*** 等同于{ pix_fmt, AV_PIX_FMT_NONE }作为pixels_list。*/class="token keyword">enum class="token class-name">AVPixelFormat  pix_fmtclass="token punctuation">;class="token comment">/*** 等同于{ sample_fmt, AV_SAMPLE_FMT_NONE }作为samples_list。*/class="token keyword">enum class="token class-name">AVSampleFormat sample_fmtclass="token punctuation">;class="token punctuation">} formatsclass="token punctuation">;class="token keyword">int priv_sizeclass="token punctuation">;      class="token comment">///< 为过滤器分配的私有数据的大小class="token keyword">int flags_internalclass="token punctuation">; class="token comment">///< 仅供avfilter内部使用的附加标志。class="token comment">/*** 使过滤器实例处理命令。** @param cmd    要处理的命令,为了处理简单,所有命令必须只包含字母数字* @param arg    命令的参数* @param res    大小为res_size的缓冲区,过滤器可以在其中返回响应。当命令不支持时,这不能改变。* @param flags  如果设置了AVFILTER_CMD_FLAG_FAST且命令会*               耗时,则过滤器应将其视为不支持的命令** @returns 成功时返回>=0,否则返回错误代码。*          不支持的命令返回AVERROR(ENOSYS)*/class="token keyword">int class="token punctuation">(class="token operator">*process_commandclass="token punctuation">)class="token punctuation">(AVFilterContext class="token operator">*class="token punctuation">, class="token keyword">const class="token keyword">char class="token operator">*cmdclass="token punctuation">, class="token keyword">const class="token keyword">char class="token operator">*argclass="token punctuation">, class="token keyword">char class="token operator">*resclass="token punctuation">, class="token keyword">int res_lenclass="token punctuation">, class="token keyword">int flagsclass="token punctuation">)class="token punctuation">;class="token comment">/*** 过滤器激活函数。** 当需要从过滤器进行任何处理时调用,而不是在pad上* 调用任何filter_frame和request_frame。** 该函数必须检查输入链接和输出链接并执行单个* 处理步骤。如果没有要做的事情,该函数必须* 什么都不做且不返回错误。如果更多步骤是可能的* 或可能的,它必须使用ff_filter_set_ready()来* 安排另一次激活。*/class="token keyword">int class="token punctuation">(class="token operator">*activateclass="token punctuation">)class="token punctuation">(AVFilterContext class="token operator">*ctxclass="token punctuation">)class="token punctuation">;
class="token punctuation">} AVFilterclass="token punctuation">;class="token comment">/*** 获取AVFilter的输入或输出数组中的元素数量。*/
class="token keyword">unsigned class="token function">avfilter_filter_pad_countclass="token punctuation">(class="token keyword">const AVFilter class="token operator">*filterclass="token punctuation">, class="token keyword">int is_outputclass="token punctuation">)class="token punctuation">;class="token comment">/*** 并发处理帧的多个部分。*/
class="token macro property">class="token directive-hash">#class="token directive keyword">define class="token macro-name">AVFILTER_THREAD_SLICE class="token expression">class="token punctuation">(class="token number">1 class="token operator"><< class="token number">0class="token punctuation">)class="token keyword">typedef class="token keyword">struct class="token class-name">AVFilterInternal AVFilterInternalclass="token punctuation">;class="token comment">/** 过滤器的一个实例 */
class="token keyword">struct class="token class-name">AVFilterContext class="token punctuation">{class="token keyword">const AVClass class="token operator">*av_classclass="token punctuation">;        class="token comment">///< 用于av_log()和过滤器通用选项所需class="token keyword">const AVFilter class="token operator">*filterclass="token punctuation">;         class="token comment">///< 此实例所属的AVFilterclass="token keyword">char class="token operator">*nameclass="token punctuation">;                     class="token comment">///< 此过滤器实例的名称AVFilterPad   class="token operator">*input_padsclass="token punctuation">;      class="token comment">///< 输入pad数组AVFilterLink class="token operator">*class="token operator">*inputsclass="token punctuation">;          class="token comment">///< 指向输入链接的指针数组class="token keyword">unsigned    nb_inputsclass="token punctuation">;          class="token comment">///< 输入pad的数量AVFilterPad   class="token operator">*output_padsclass="token punctuation">;     class="token comment">///< 输出pad数组AVFilterLink class="token operator">*class="token operator">*outputsclass="token punctuation">;         class="token comment">///< 指向输出链接的指针数组class="token keyword">unsigned    nb_outputsclass="token punctuation">;         class="token comment">///< 输出pad的数量class="token keyword">void class="token operator">*privclass="token punctuation">;                     class="token comment">///< 供过滤器使用的私有数据class="token keyword">struct class="token class-name">AVFilterGraph class="token operator">*graphclass="token punctuation">;    class="token comment">///< 此过滤器所属的过滤器图class="token comment">/*** 允许/使用的多线程类型。AVFILTER_THREAD_* 标志的组合。** 在初始化过滤器之前,调用者可以设置此字段以禁止此过滤器的某些* 或所有类型的多线程。默认允许所有类型。** 当过滤器初始化时,此字段与AVFilterGraph.thread_type进行按位与运算* 以获得用于确定允许的线程类型的最终掩码。即一个线程类型需要在两处* 都设置才被允许。** 过滤器初始化后,class="tags" href="/LIBAVFILTER.html" title=libavfilter>libavfilter将此字段设置为实际使用的线程类型* (0表示无多线程)。*/class="token keyword">int thread_typeclass="token punctuation">;class="token comment">/*** 供class="tags" href="/LIBAVFILTER.html" title=libavfilter>libavfilter内部使用的不透明结构。*/AVFilterInternal class="token operator">*internalclass="token punctuation">;class="token keyword">struct class="token class-name">AVFilterCommand class="token operator">*command_queueclass="token punctuation">;class="token keyword">char class="token operator">*enable_strclass="token punctuation">;               class="token comment">///< 启用表达式字符串class="token keyword">void class="token operator">*enableclass="token punctuation">;                   class="token comment">///< 解析后的表达式(AVExpr*)class="token keyword">double class="token operator">*var_valuesclass="token punctuation">;             class="token comment">///< 启用表达式的变量值class="token keyword">int is_disabledclass="token punctuation">;                class="token comment">///< 上次表达式求值的启用状态class="token comment">/*** 对于将创建硬件帧的过滤器,设置过滤器应在其中创建帧的设备。* 所有其他过滤器将忽略此字段:特别是,消费或处理硬件帧的过滤器* 将使用AVFilterLink中的hw_frames_ctx字段来携带硬件上下文信息。** 在使用avfilter_init_str()或avfilter_init_dict()初始化过滤器之前,* 可由调用者在标记为AVFILTER_FLAG_HWDEVICE的过滤器上设置。*/AVBufferRef class="token operator">*hw_device_ctxclass="token punctuation">;class="token comment">/*** 此过滤器实例允许的最大线程数。* 如果 <= 0,则忽略其值。* 覆盖每个过滤器图设置的全局线程数。*/class="token keyword">int nb_threadsclass="token punctuation">;class="token comment">/*** 过滤器的就绪状态。* 非0值表示过滤器需要激活;* 更高的值表示更紧急的激活需求。*/class="token keyword">unsigned readyclass="token punctuation">;class="token comment">/*** 设置过滤器将在其输出链接上分配的额外硬件帧数量,* 供后续过滤器或调用者使用。** 某些硬件过滤器要求在开始过滤之前预先定义所有将用于* 输出的帧。对于这类过滤器,用于输出的任何硬件帧池* 必须是固定大小的。这里设置的额外帧数是在过滤器正常* 运行所需的帧数之外的。** 必须在配置包含此过滤器的图之前设置此字段。*/class="token keyword">int extra_hw_framesclass="token punctuation">;
class="token punctuation">}class="token punctuation">;class="token comment">/*** 链接一端支持的格式/等列表。** 此结构直接作为AVFilterLink的一部分,有两个副本:* 一个用于源过滤器,一个用于目标过滤器。** 这些列表用于协商实际要使用的格式,* 选定后将加载到AVFilterLink的format和channel_layout成员中。*/
class="token keyword">typedef class="token keyword">struct class="token class-name">AVFilterFormatsConfig class="token punctuation">{class="token comment">/*** 支持的格式列表(像素或采样)。*/AVFilterFormats class="token operator">*formatsclass="token punctuation">;class="token comment">/*** 支持的采样率列表,仅用于音频。*/AVFilterFormats  class="token operator">*sampleratesclass="token punctuation">;class="token comment">/*** 支持的声道布局列表,仅用于音频。*/AVFilterChannelLayouts  class="token operator">*channel_layoutsclass="token punctuation">;class="token punctuation">} AVFilterFormatsConfigclass="token punctuation">;class="token comment">/*** 两个过滤器之间的链接。包含此链接存在的源过滤器和* 目标过滤器之间的指针,以及涉及的pad索引。此外,* 此链接还包含在过滤器之间协商和约定的参数,如* 图像尺寸、格式等。** 应用程序通常不应直接访问链接结构。* 应使用buffersrc和buffersink API。* 将来,对头文件的访问可能仅限于过滤器实现。*/
class="token keyword">struct class="token class-name">AVFilterLink class="token punctuation">{AVFilterContext class="token operator">*srcclass="token punctuation">;       class="token comment">///< 源过滤器AVFilterPad class="token operator">*srcpadclass="token punctuation">;        class="token comment">///< 源过滤器上的输出padAVFilterContext class="token operator">*dstclass="token punctuation">;       class="token comment">///< 目标过滤器AVFilterPad class="token operator">*dstpadclass="token punctuation">;        class="token comment">///< 目标过滤器上的输入padclass="token keyword">enum class="token class-name">AVMediaType typeclass="token punctuation">;      class="token comment">///< 过滤器媒体类型class="token comment">/* 这些参数仅适用于视频 */class="token keyword">int wclass="token punctuation">;                      class="token comment">///< 约定的图像宽度class="token keyword">int hclass="token punctuation">;                      class="token comment">///< 约定的图像高度AVRational sample_aspect_ratioclass="token punctuation">; class="token comment">///< 约定的采样宽高比class="token comment">/* 这些参数仅适用于音频 */
class="token macro property">class="token directive-hash">#class="token directive keyword">if class="token expression">FF_API_OLD_CHANNEL_LAYOUTclass="token comment">/*** 当前缓冲区的声道布局(参见libavutil/channel_layout.h)* @deprecated 使用ch_layout*/attribute_deprecatedclass="token class-name">uint64_t channel_layoutclass="token punctuation">;
class="token macro property">class="token directive-hash">#class="token directive keyword">endifclass="token keyword">int sample_rateclass="token punctuation">;            class="token comment">///< 每秒采样数class="token keyword">int formatclass="token punctuation">;                 class="token comment">///< 约定的媒体格式class="token comment">/*** 定义将通过此链接传递的帧/样本的PTS使用的时基。* 在配置阶段,每个过滤器应该只改变输出时基,* 而输入链接的时基被认为是一个不可改变的属性。*/AVRational time_baseclass="token punctuation">;AVChannelLayout ch_layoutclass="token punctuation">;  class="token comment">///< 当前缓冲区的声道布局(参见libavutil/channel_layout.h)class="token comment">/****************************************************************** 此行以下的所有字段都不是公共API的一部分。它们* 不能在class="tags" href="/LIBAVFILTER.html" title=libavfilter>libavfilter外部使用,并且可以随意更改和* 删除。* 新的公共字段应该添加在上面。******************************************************************/class="token comment">/*** 输入过滤器支持的格式/等列表。*/AVFilterFormatsConfig incfgclass="token punctuation">;class="token comment">/*** 输出过滤器支持的格式/等列表。*/AVFilterFormatsConfig outcfgclass="token punctuation">;class="token comment">/** 链接属性(尺寸等)的初始化阶段 */class="token keyword">enum class="token punctuation">{AVLINK_UNINIT class="token operator">= class="token number">0class="token punctuation">,      class="token comment">///< 未开始AVLINK_STARTINITclass="token punctuation">,       class="token comment">///< 已开始,但不完整AVLINK_INIT             class="token comment">///< 完成class="token punctuation">} init_stateclass="token punctuation">;class="token comment">/*** 过滤器所属的图。*/class="token keyword">struct class="token class-name">AVFilterGraph class="token operator">*graphclass="token punctuation">;class="token comment">/*** 链接的当前时间戳,由最近的帧定义,* 以链接time_base为单位。*/class="token class-name">int64_t current_ptsclass="token punctuation">;class="token comment">/*** 链接的当前时间戳,由最近的帧定义,* 以AV_TIME_BASE为单位。*/class="token class-name">int64_t current_pts_usclass="token punctuation">;class="token comment">/*** 在age数组中的索引。*/class="token keyword">int age_indexclass="token punctuation">;class="token comment">/*** 链接上流的帧率,如果未知或可变则为1/0;* 如果保持为0/0,将自动从源过滤器的第一个输入复制* (如果存在)。** 源应该设置为实际帧率的最佳估计。* 如果源帧率未知或可变,设置为1/0。* 过滤器应根据其功能在必要时更新它。* 接收器可以使用它来设置默认输出帧率。* 它类似于AVStream中的r_frame_rate字段。*/AVRational frame_rateclass="token punctuation">;class="token comment">/*** 一次过滤的最小样本数。如果使用较少的样本调用* filter_frame(),它将在fifo中累积它们。* 过滤开始后不能更改此字段和相关字段。* 如果为0,则忽略所有相关字段。*/class="token keyword">int min_samplesclass="token punctuation">;class="token comment">/*** 一次过滤的最大样本数。如果使用更多样本调用* filter_frame(),它将分割它们。*/class="token keyword">int max_samplesclass="token punctuation">;class="token comment">/*** 通过链接发送的过去帧数。*/class="token class-name">int64_t frame_count_inclass="token punctuation">, frame_count_outclass="token punctuation">;class="token comment">/*** 通过链接发送的过去样本数。*/class="token class-name">int64_t sample_count_inclass="token punctuation">, sample_count_outclass="token punctuation">;class="token comment">/*** 指向FFFramePool结构的指针。*/class="token keyword">void class="token operator">*frame_poolclass="token punctuation">;class="token comment">/*** 如果当前在此过滤器的输出上需要一帧则为True。* 当输出调用ff_request_frame()时设置,* 当过滤一帧时清除。*/class="token keyword">int frame_wanted_outclass="token punctuation">;class="token comment">/*** 对于hwaccel像素格式,这应该是对描述帧的* AVHWFramesContext的引用。*/AVBufferRef class="token operator">*hw_frames_ctxclass="token punctuation">;class="token macro property">class="token directive-hash">#class="token directive keyword">ifndef class="token expression">FF_INTERNAL_FIELDSclass="token comment">/*** 内部结构成员。* 此限制以下的字段是供class="tags" href="/LIBAVFILTER.html" title=libavfilter>libavfilter内部使用的,* 在任何情况下都不能被应用程序访问。*/class="token keyword">char reservedclass="token punctuation">[class="token number">0xF000class="token punctuation">]class="token punctuation">;class="token macro property">class="token directive-hash">#class="token directive keyword">else class="token comment">/* FF_INTERNAL_FIELDS */class="token comment">/*** 等待过滤的帧队列。*/FFFrameQueue fifoclass="token punctuation">;class="token comment">/*** 如果设置,源过滤器目前无法生成帧。* 目的是避免在同一链接上重复调用request_frame()方法。*/class="token keyword">int frame_blocked_inclass="token punctuation">;class="token comment">/*** 链接输入状态。* 如果非零,所有filter_frame尝试都将以相应的代码失败。*/class="token keyword">int status_inclass="token punctuation">;class="token comment">/*** 输入状态更改的时间戳。*/class="token class-name">int64_t status_in_ptsclass="token punctuation">;class="token comment">/*** 链接输出状态。* 如果非零,所有request_frame尝试都将以相应的代码失败。*/class="token keyword">int status_outclass="token punctuation">;class="token macro property">class="token directive-hash">#class="token directive keyword">endif class="token comment">/* FF_INTERNAL_FIELDS */class="token punctuation">}class="token punctuation">;class="token comment">/*** 将两个过滤器链接在一起。** @param src    源过滤器* @param srcpad 源过滤器上输出pad的索引* @param dst    目标过滤器* @param dstpad 目标过滤器上输入pad的索引* @return       成功时返回零*/
class="token keyword">int class="token function">avfilter_linkclass="token punctuation">(AVFilterContext class="token operator">*srcclass="token punctuation">, class="token keyword">unsigned srcpadclass="token punctuation">,AVFilterContext class="token operator">*dstclass="token punctuation">, class="token keyword">unsigned dstpadclass="token punctuation">)class="token punctuation">;class="token comment">/*** 释放*link中的链接,并将其指针设置为NULL。*/
class="token keyword">void class="token function">avfilter_link_freeclass="token punctuation">(AVFilterLink class="token operator">*class="token operator">*linkclass="token punctuation">)class="token punctuation">;class="token comment">/*** 协商过滤器所有输入的媒体格式、尺寸等。** @param filter 要为其输入协商属性的过滤器* @return       成功协商时返回零*/
class="token keyword">int class="token function">avfilter_config_linksclass="token punctuation">(AVFilterContext class="token operator">*filterclass="token punctuation">)class="token punctuation">;class="token macro property">class="token directive-hash">#class="token directive keyword">define class="token macro-name">AVFILTER_CMD_FLAG_ONE   class="token expression">class="token number">1 class="token comment">///< 一旦过滤器理解了命令就停止(例如对于target=all),自动优先考虑快速过滤器
class="token macro property">class="token directive-hash">#class="token directive keyword">define class="token macro-name">AVFILTER_CMD_FLAG_FAST  class="token expression">class="token number">2 class="token comment">///< 仅在命令快速时执行(如支持硬件对比度调整的视频输出)class="token comment">/*** 使过滤器实例处理命令。* 建议使用avfilter_graph_send_command()。*/
class="token keyword">int class="token function">avfilter_process_commandclass="token punctuation">(AVFilterContext class="token operator">*filterclass="token punctuation">, class="token keyword">const class="token keyword">char class="token operator">*cmdclass="token punctuation">, class="token keyword">const class="token keyword">char class="token operator">*argclass="token punctuation">, class="token keyword">char class="token operator">*resclass="token punctuation">, class="token keyword">int res_lenclass="token punctuation">, class="token keyword">int flagsclass="token punctuation">)class="token punctuation">;class="token comment">/*** 遍历所有已注册的过滤器。** @param opaque 一个指针,class="tags" href="/LIBAVFILTER.html" title=libavfilter>libavfilter将在其中存储迭代状态。必须*               指向NULL以开始迭代。** @return 下一个已注册的过滤器,如果迭代结束则返回NULL*/
class="token keyword">const AVFilter class="token operator">*class="token function">av_filter_iterateclass="token punctuation">(class="token keyword">void class="token operator">*class="token operator">*opaqueclass="token punctuation">)class="token punctuation">;class="token comment">/*** 获取与给定名称匹配的过滤器定义。** @param name 要查找的过滤器名称* @return     如果有匹配的过滤器定义则返回该定义。*             如果未找到则返回NULL。*/
class="token keyword">const AVFilter class="token operator">*class="token function">avfilter_get_by_nameclass="token punctuation">(class="token keyword">const class="token keyword">char class="token operator">*nameclass="token punctuation">)class="token punctuation">;class="token comment">/*** 使用提供的参数初始化过滤器。** @param ctx  要初始化的未初始化的过滤器上下文* @param args 用于初始化过滤器的选项。这必须是一个*             以':'分隔的'key=value'形式的选项列表。*             如果选项已通过AVOptions API直接设置或*             没有需要设置的选项,则可以为NULL。* @return 成功时返回0,失败时返回负的AVERROR*/
class="token keyword">int class="token function">avfilter_init_strclass="token punctuation">(AVFilterContext class="token operator">*ctxclass="token punctuation">, class="token keyword">const class="token keyword">char class="token operator">*argsclass="token punctuation">)class="token punctuation">;class="token comment">/*** 使用提供的选项字典初始化过滤器。** @param ctx     要初始化的未初始化的过滤器上下文* @param options 一个填充了此过滤器选项的AVDictionary。在*                返回时,此参数将被销毁并替换为包含未找到*                选项的字典。调用者必须释放此字典。*                可以为NULL,则此函数等同于将第二个参数*                设置为NULL的avfilter_init_str()。* @return 成功时返回0,失败时返回负的AVERROR** @note 此函数和avfilter_init_str()本质上做相同的事情,* 区别在于传递选项的方式。由调用代码选择更合适的方式。* 当过滤器不支持某些提供的选项时,这两个函数的行为也不同。* 在这种情况下,avfilter_init_str()将失败,但此函数会将这些* 额外选项保留在options AVDictionary中并继续正常执行。*/
class="token keyword">int class="token function">avfilter_init_dictclass="token punctuation">(AVFilterContext class="token operator">*ctxclass="token punctuation">, AVDictionary class="token operator">*class="token operator">*optionsclass="token punctuation">)class="token punctuation">;class="token comment">/*** 释放过滤器上下文。这也会从其过滤器图的过滤器列表中* 移除该过滤器。** @param filter 要释放的过滤器*/
class="token keyword">void class="token function">avfilter_freeclass="token punctuation">(AVFilterContext class="token operator">*filterclass="token punctuation">)class="token punctuation">;class="token comment">/*** 在现有链接中间插入过滤器。** @param link 要插入过滤器的链接* @param filt 要插入的过滤器* @param filt_srcpad_idx 要连接的过滤器输入pad* @param filt_dstpad_idx 要连接的过滤器输出pad* @return     成功时返回零*/
class="token keyword">int class="token function">avfilter_insert_filterclass="token punctuation">(AVFilterLink class="token operator">*linkclass="token punctuation">, AVFilterContext class="token operator">*filtclass="token punctuation">,class="token keyword">unsigned filt_srcpad_idxclass="token punctuation">, class="token keyword">unsigned filt_dstpad_idxclass="token punctuation">)class="token punctuation">;class="token comment">/*** @return AVFilterContext的AVClass。** @see av_opt_find()。*/
class="token keyword">const AVClass class="token operator">*class="token function">avfilter_get_classclass="token punctuation">(class="token keyword">voidclass="token punctuation">)class="token punctuation">;class="token keyword">typedef class="token keyword">struct class="token class-name">AVFilterGraphInternal AVFilterGraphInternalclass="token punctuation">;class="token comment">/*** 传递给@ref AVFilterGraph.execute回调的函数指针,* 用于多次执行,可能并行执行。** @param ctx 作业所属的过滤器上下文* @param arg 从@ref AVFilterGraph.execute传递的不透明参数* @param jobnr 正在执行的作业索引* @param nb_jobs 作业总数** @return 成功时返回0,错误时返回负的AVERROR*/
class="token keyword">typedef class="token keyword">int class="token punctuation">(avfilter_action_funcclass="token punctuation">)class="token punctuation">(AVFilterContext class="token operator">*ctxclass="token punctuation">, class="token keyword">void class="token operator">*argclass="token punctuation">, class="token keyword">int jobnrclass="token punctuation">, class="token keyword">int nb_jobsclass="token punctuation">)class="token punctuation">;class="token comment">/*** 执行多个作业的函数,可能并行执行。** @param ctx 作业所属的过滤器上下文* @param func 要多次调用的函数* @param arg 要传递给func的参数* @param ret 大小为nb_jobs的数组,用于填充每次调用func的返回值* @param nb_jobs 要执行的作业数** @return 成功时返回0,错误时返回负的AVERROR*/
class="token keyword">typedef class="token keyword">int class="token punctuation">(avfilter_execute_funcclass="token punctuation">)class="token punctuation">(AVFilterContext class="token operator">*ctxclass="token punctuation">, avfilter_action_func class="token operator">*funcclass="token punctuation">,class="token keyword">void class="token operator">*argclass="token punctuation">, class="token keyword">int class="token operator">*retclass="token punctuation">, class="token keyword">int nb_jobsclass="token punctuation">)class="token punctuation">;class="token keyword">typedef class="token keyword">struct class="token class-name">AVFilterGraph class="token punctuation">{class="token keyword">const AVClass class="token operator">*av_classclass="token punctuation">;AVFilterContext class="token operator">*class="token operator">*filtersclass="token punctuation">;class="token keyword">unsigned nb_filtersclass="token punctuation">;class="token keyword">char class="token operator">*scale_sws_optsclass="token punctuation">; class="token comment">///< 用于自动插入的scale过滤器的sws选项class="token comment">/*** 此图中过滤器允许的多线程类型。AVFILTER_THREAD_*标志的组合。** 调用者可以在任何时候设置,该设置将应用于之后初始化的所有过滤器。* 默认允许所有类型。** 当此图中的过滤器被初始化时,此字段与AVFilterContext.thread_type* 进行按位与运算以获得用于确定允许线程类型的最终掩码。即线程类型* 需要在两处都设置才被允许。*/class="token keyword">int thread_typeclass="token punctuation">;class="token comment">/*** 此图中过滤器使用的最大线程数。调用者可以在向过滤器图添加任何* 过滤器之前设置。零(默认值)表示线程数自动确定。*/class="token keyword">int nb_threadsclass="token punctuation">;class="token comment">/*** class="tags" href="/LIBAVFILTER.html" title=libavfilter>libavfilter内部使用的不透明对象。*/AVFilterGraphInternal class="token operator">*internalclass="token punctuation">;class="token comment">/*** 不透明的用户数据。调用者可以设置为任意值,例如从@ref AVFilterGraph.execute* 等回调中使用。class="tags" href="/LIBAVFILTER.html" title=libavfilter>libavfilter不会以任何方式触及此字段。*/class="token keyword">void class="token operator">*opaqueclass="token punctuation">;class="token comment">/*** 调用者可以在分配图后立即设置此回调,并在添加任何过滤器之前,* 以提供自定义的多线程实现。** 如果设置,具有切片线程能力的过滤器将调用此回调以并行执行多个作业。** 如果此字段未设置,class="tags" href="/LIBAVFILTER.html" title=libavfilter>libavfilter将使用其内部实现,根据平台和构建选项,* 该实现可能是多线程的也可能不是。*/avfilter_execute_func class="token operator">*executeclass="token punctuation">;class="token keyword">char class="token operator">*aresample_swr_optsclass="token punctuation">; class="token comment">///< 用于自动插入的aresample过滤器的swr选项,仅通过AVOptions访问class="token comment">/*** 私有字段** 以下字段仅供内部使用。* 它们的类型、偏移量、数量和语义可能在没有通知的情况下更改。*/AVFilterLink class="token operator">*class="token operator">*sink_linksclass="token punctuation">;class="token keyword">int sink_links_countclass="token punctuation">;class="token keyword">unsigned disable_auto_convertclass="token punctuation">;
class="token punctuation">} AVFilterGraphclass="token punctuation">;class="token comment">/*** 分配一个过滤器图。** @return 成功时返回分配的过滤器图,否则返回NULL。*/
AVFilterGraph class="token operator">*class="token function">avfilter_graph_allocclass="token punctuation">(class="token keyword">voidclass="token punctuation">)class="token punctuation">;class="token comment">/*** 在过滤器图中创建新的过滤器实例。** @param graph 新过滤器将使用的图* @param filter 要创建实例的过滤器* @param name 给新实例的名称(将被复制到AVFilterContext.name)。*             调用者可以使用此参数来识别不同的过滤器,class="tags" href="/LIBAVFILTER.html" title=libavfilter>libavfilter本身*             不为此参数分配语义。可以为NULL。** @return 新创建的过滤器实例的上下文(注意它也可以直接通过*         AVFilterGraph.filters或avfilter_graph_get_filter()获取)*         成功时返回,失败时返回NULL。*/
AVFilterContext class="token operator">*class="token function">avfilter_graph_alloc_filterclass="token punctuation">(AVFilterGraph class="token operator">*graphclass="token punctuation">,class="token keyword">const AVFilter class="token operator">*filterclass="token punctuation">,class="token keyword">const class="token keyword">char class="token operator">*nameclass="token punctuation">)class="token punctuation">;class="token comment">/*** 从图中获取由实例名称标识的过滤器实例。** @param graph 要搜索的过滤器图。* @param name 过滤器实例名称(在图中应该是唯一的)。* @return 找到的过滤器实例的指针,如果找不到则返回NULL。*/
AVFilterContext class="token operator">*class="token function">avfilter_graph_get_filterclass="token punctuation">(AVFilterGraph class="token operator">*graphclass="token punctuation">, class="token keyword">const class="token keyword">char class="token operator">*nameclass="token punctuation">)class="token punctuation">;class="token comment">/*** 在现有图中创建并添加过滤器实例。* 过滤器实例从过滤器filt创建并使用参数args初始化。* opaque当前被忽略。** 如果成功,将在*filt_ctx中放入创建的过滤器实例的指针,* 否则将*filt_ctx设置为NULL。** @param name 给创建的过滤器实例的实例名称* @param graph_ctx 过滤器图* @return 失败时返回负的AVERROR错误代码,否则返回非负值*/
class="token keyword">int class="token function">avfilter_graph_create_filterclass="token punctuation">(AVFilterContext class="token operator">*class="token operator">*filt_ctxclass="token punctuation">, class="token keyword">const AVFilter class="token operator">*filtclass="token punctuation">,class="token keyword">const class="token keyword">char class="token operator">*nameclass="token punctuation">, class="token keyword">const class="token keyword">char class="token operator">*argsclass="token punctuation">, class="token keyword">void class="token operator">*opaqueclass="token punctuation">,AVFilterGraph class="token operator">*graph_ctxclass="token punctuation">)class="token punctuation">;class="token comment">/*** 启用或禁用图内的自动格式转换。** 注意格式转换仍然可能发生在显式插入的scale和aresample过滤器中。** @param flags AVFILTER_AUTO_CONVERT_*常量中的任何一个*/
class="token keyword">void class="token function">avfilter_graph_set_auto_convertclass="token punctuation">(AVFilterGraph class="token operator">*graphclass="token punctuation">, class="token keyword">unsigned flagsclass="token punctuation">)class="token punctuation">;class="token keyword">enum class="token punctuation">{AVFILTER_AUTO_CONVERT_ALL  class="token operator">=  class="token number">0class="token punctuation">, class="token comment">/**< 启用所有自动转换 */AVFILTER_AUTO_CONVERT_NONE class="token operator">= class="token operator">-class="token number">1class="token punctuation">, class="token comment">/**< 禁用所有自动转换 */
class="token punctuation">}class="token punctuation">;class="token comment">/*** 检查有效性并配置图中的所有链接和格式。** @param graphctx 过滤器图* @param log_ctx 用于日志记录的上下文* @return 成功时返回 >= 0,否则返回负的AVERROR代码*/
class="token keyword">int class="token function">avfilter_graph_configclass="token punctuation">(AVFilterGraph class="token operator">*graphctxclass="token punctuation">, class="token keyword">void class="token operator">*log_ctxclass="token punctuation">)class="token punctuation">;class="token comment">/*** 释放图,销毁其链接,并将*graph设置为NULL。* 如果*graph为NULL,则不执行任何操作。*/
class="token keyword">void class="token function">avfilter_graph_freeclass="token punctuation">(AVFilterGraph class="token operator">*class="token operator">*graphclass="token punctuation">)class="token punctuation">;class="token comment">/*** 过滤器链的输入/输出的链表。** 这主要用于avfilter_graph_parse() / avfilter_graph_parse2(),* 在那里它用于在调用者之间通信图中包含的开放(未链接)输入和输出。* 此结构为图中每个未连接的pad指定建立链接所需的过滤器上下文和pad索引。*/
class="token keyword">typedef class="token keyword">struct class="token class-name">AVFilterInOut class="token punctuation">{class="token comment">/** 列表中此输入/输出的唯一名称 */class="token keyword">char class="token operator">*nameclass="token punctuation">;class="token comment">/** 与此输入/输出关联的过滤器上下文 */AVFilterContext class="token operator">*filter_ctxclass="token punctuation">;class="token comment">/** 用于链接的filt_ctx pad的索引 */class="token keyword">int pad_idxclass="token punctuation">;class="token comment">/** 列表中的下一个输入/输入,如果这是最后一个则为NULL */class="token keyword">struct class="token class-name">AVFilterInOut class="token operator">*nextclass="token punctuation">;
class="token punctuation">} AVFilterInOutclass="token punctuation">;class="token comment">/*** 分配单个AVFilterInOut条目。* 必须使用avfilter_inout_free()释放。* @return 成功时返回分配的AVFilterInOut,失败时返回NULL。*/
AVFilterInOut class="token operator">*class="token function">avfilter_inout_allocclass="token punctuation">(class="token keyword">voidclass="token punctuation">)class="token punctuation">;class="token comment">/*** 释放提供的AVFilterInOut列表并将*inout设置为NULL。* 如果*inout为NULL,则不执行任何操作。*/
class="token keyword">void class="token function">avfilter_inout_freeclass="token punctuation">(AVFilterInOut class="token operator">*class="token operator">*inoutclass="token punctuation">)class="token punctuation">;class="token comment">/*** 将由字符串描述的图添加到图中。** @note 调用者必须提供输入和输出列表,* 因此必须在调用函数之前知道这些列表。** @note inputs参数描述已存在图部分的输入;* 即从新创建部分的角度来看,它们是输出。* 类似地,outputs参数描述现有过滤器的输出,* 这些输出作为输入提供给解析的过滤器。** @param graph   要链接解析的图上下文的过滤器图* @param filters 要解析的字符串* @param inputs  图的输入的链表* @param outputs 图的输出的链表* @return 成功时返回零,错误时返回负的AVERROR代码*/
class="token keyword">int class="token function">avfilter_graph_parseclass="token punctuation">(AVFilterGraph class="token operator">*graphclass="token punctuation">, class="token keyword">const class="token keyword">char class="token operator">*filtersclass="token punctuation">,AVFilterInOut class="token operator">*inputsclass="token punctuation">, AVFilterInOut class="token operator">*outputsclass="token punctuation">,class="token keyword">void class="token operator">*log_ctxclass="token punctuation">)class="token punctuation">;class="token comment">/*** 将由字符串描述的图添加到图中。** 在图过滤器描述中,如果未指定第一个过滤器的输入标签,* 则假定为"in";如果未指定最后一个过滤器的输出标签,* 则假定为"out"。** @param graph   要链接解析的图上下文的过滤器图* @param filters 要解析的字符串* @param inputs  指向图输入链表的指针,可以为NULL。*                如果非NULL,*inputs将更新为包含解析后的开放输入列表,*                应使用avfilter_inout_free()释放。* @param outputs 指向图输出链表的指针,可以为NULL。*                如果非NULL,*outputs将更新为包含解析后的开放输出列表,*                应使用avfilter_inout_free()释放。* @return 成功时返回非负值,错误时返回负的AVERROR代码*/
class="token keyword">int class="token function">avfilter_graph_parse_ptrclass="token punctuation">(AVFilterGraph class="token operator">*graphclass="token punctuation">, class="token keyword">const class="token keyword">char class="token operator">*filtersclass="token punctuation">,AVFilterInOut class="token operator">*class="token operator">*inputsclass="token punctuation">, AVFilterInOut class="token operator">*class="token operator">*outputsclass="token punctuation">,class="token keyword">void class="token operator">*log_ctxclass="token punctuation">)class="token punctuation">;class="token comment">/*** 将由字符串描述的图添加到图中。** @param[in]  graph   要链接解析的图上下文的过滤器图* @param[in]  filters 要解析的字符串* @param[out] inputs  解析的图的所有空闲(未链接)输入的链表将在此返回。*                     调用者必须使用avfilter_inout_free()释放它。* @param[out] outputs 解析的图的所有空闲(未链接)输出的链表将在此返回。*                     调用者必须使用avfilter_inout_free()释放它。* @return 成功时返回零,错误时返回负的AVERROR代码** @note 此函数返回解析图后剩余未链接的输入和输出,* 然后由调用者处理它们。* @note 此函数完全不引用图的已存在部分,返回的inputs* 参数将包含新解析的图部分的输入。类似地,outputs* 参数将包含新创建过滤器的输出。*/
class="token keyword">int class="token function">avfilter_graph_parse2class="token punctuation">(AVFilterGraph class="token operator">*graphclass="token punctuation">, class="token keyword">const class="token keyword">char class="token operator">*filtersclass="token punctuation">,AVFilterInOut class="token operator">*class="token operator">*inputsclass="token punctuation">,AVFilterInOut class="token operator">*class="token operator">*outputsclass="token punctuation">)class="token punctuation">;class="token comment">/*** 过滤器输入或输出pad的参数。** 由avfilter_graph_segment_parse()创建为AVFilterParams的子项。* 在avfilter_graph_segment_free()中释放。*/
class="token keyword">typedef class="token keyword">struct class="token class-name">AVFilterPadParams class="token punctuation">{class="token comment">/*** 一个av_malloc()分配的包含pad标签的字符串。** 调用者可以av_free()并设置为NULL,在这种情况下,此pad* 在链接时将被视为未标记。* 也可以替换为另一个av_malloc()分配的字符串。*/class="token keyword">char class="token operator">*labelclass="token punctuation">;
class="token punctuation">} AVFilterPadParamsclass="token punctuation">;class="token comment">/*** 描述过滤器图中要创建的过滤器的参数。** 由avfilter_graph_segment_parse()创建为AVFilterGraphSegment的子项。* 在avfilter_graph_segment_free()中释放。*/
class="token keyword">typedef class="token keyword">struct class="token class-name">AVFilterParams class="token punctuation">{class="token comment">/*** 过滤器上下文。** 由avfilter_graph_segment_create_filters()基于* AVFilterParams.filter_name和instance_name创建。** 调用者也可以手动创建过滤器上下文,然后他们应该* av_free() filter_name并设置为NULL。这样的AVFilterParams实例* 将被avfilter_graph_segment_create_filters()跳过。*/AVFilterContext     class="token operator">*filterclass="token punctuation">;class="token comment">/*** 要使用的AVFilter的名称。** 一个由av_malloc()分配的字符串,由avfilter_graph_segment_parse()设置。将被* avfilter_graph_segment_create_filters()传递给avfilter_get_by_name()。** 调用者可以av_free()此字符串并替换为另一个或NULL。如果调用者手动创建* 过滤器实例,此字符串必须设置为NULL。** 当AVFilterParams.filter和AVFilterParams.filter_name都为NULL时,* 此AVFilterParams实例将被avfilter_graph_segment_*()函数跳过。*/class="token keyword">char                class="token operator">*filter_nameclass="token punctuation">;class="token comment">/*** 用于此过滤器实例的名称。** 一个由av_malloc()分配的字符串,可能由avfilter_graph_segment_parse()设置* 或保留为NULL。调用者可以av_free()此字符串并替换为另一个或NULL。** 将被avfilter_graph_segment_create_filters()使用 - 作为第三个参数* 传递给avfilter_graph_alloc_filter(),然后释放并设置为NULL。*/class="token keyword">char                class="token operator">*instance_nameclass="token punctuation">;class="token comment">/*** 要应用于过滤器的选项。** 由avfilter_graph_segment_parse()填充。之后可以由调用者自由修改。** 将由avfilter_graph_segment_apply_opts()应用到过滤器,* 等效于av_opt_set_dict2(filter, &opts, AV_OPT_SEARCH_CHILDREN),* 即任何未应用的选项将保留在此字典中。*/AVDictionary        class="token operator">*optsclass="token punctuation">;AVFilterPadParams  class="token operator">*class="token operator">*inputsclass="token punctuation">;class="token keyword">unsigned          nb_inputsclass="token punctuation">;AVFilterPadParams  class="token operator">*class="token operator">*outputsclass="token punctuation">;class="token keyword">unsigned          nb_outputsclass="token punctuation">;
class="token punctuation">} AVFilterParamsclass="token punctuation">;class="token comment">/*** 过滤器链是过滤器规格的列表。** 由avfilter_graph_segment_parse()创建为AVFilterGraphSegment的子项。* 在avfilter_graph_segment_free()中释放。*/
class="token keyword">typedef class="token keyword">struct class="token class-name">AVFilterChain class="token punctuation">{AVFilterParams  class="token operator">*class="token operator">*filtersclass="token punctuation">;class="token class-name">size_t         nb_filtersclass="token punctuation">;
class="token punctuation">} AVFilterChainclass="token punctuation">;class="token comment">/*** 过滤器图段的解析表示。** 过滤器图段在概念上是过滤器链的列表,带有一些* 补充信息(例如格式转换标志)。** 由avfilter_graph_segment_parse()创建。必须使用* avfilter_graph_segment_free()释放。*/
class="token keyword">typedef class="token keyword">struct class="token class-name">AVFilterGraphSegment class="token punctuation">{class="token comment">/*** 此段关联的过滤器图。* 由avfilter_graph_segment_parse()设置。*/AVFilterGraph class="token operator">*graphclass="token punctuation">;class="token comment">/*** 此段包含的过滤器链列表。* 在avfilter_graph_segment_parse()中设置。*/AVFilterChain class="token operator">*class="token operator">*chainsclass="token punctuation">;class="token class-name">size_t       nb_chainsclass="token punctuation">;class="token comment">/*** 包含冒号分隔的键=值选项列表的字符串,* 应用于此段中的所有scale过滤器。** 可能由avfilter_graph_segment_parse()设置。* 调用者可以使用av_free()释放此字符串,并用不同的* av_malloc()分配的字符串替换它。*/class="token keyword">char class="token operator">*scale_sws_optsclass="token punctuation">;
class="token punctuation">} AVFilterGraphSegmentclass="token punctuation">;class="token comment">/*** 将文本过滤器图描述解析为中间形式。** 此中间表示旨在由调用者按照AVFilterGraphSegment及其子项的* 文档中所述进行修改,然后手动或使用其他avfilter_graph_segment_*()* 函数应用到图中。有关应用AVFilterGraphSegment的规范方式,* 请参见avfilter_graph_segment_apply()的文档。** @param graph 解析段关联的过滤器图。仅用于日志和类似的辅助目的。*              此函数不会实际修改图 - 解析结果会存储在seg中供进一步处理。* @param graph_str 描述过滤器图段的字符串* @param flags 保留供将来使用,调用者现在必须设置为0* @param seg 成功时在此处写入新创建的AVFilterGraphSegment的指针。*            图段由调用者拥有,必须在释放graph本身之前使用*            avfilter_graph_segment_free()释放。** @retval "非负数" 成功* @retval "负错误代码" 失败*/
class="token keyword">int class="token function">avfilter_graph_segment_parseclass="token punctuation">(AVFilterGraph class="token operator">*graphclass="token punctuation">, class="token keyword">const class="token keyword">char class="token operator">*graph_strclass="token punctuation">,class="token keyword">int flagsclass="token punctuation">, AVFilterGraphSegment class="token operator">*class="token operator">*segclass="token punctuation">)class="token punctuation">;class="token comment">/*** 创建图段中指定的过滤器。** 遍历段中待创建的AVFilterParams并为它们创建新的过滤器实例。* 待创建的参数是那些AVFilterParams.filter_name非NULL的参数* (因此AVFilterParams.filter为NULL)。忽略所有其他AVFilterParams实例。** 对于此函数创建的任何过滤器,相应的AVFilterParams.filter设置为* 新创建的过滤器上下文,AVFilterParams.filter_name和* AVFilterParams.instance_name被释放并设置为NULL。** @param seg 要处理的过滤器图段* @param flags 保留供将来使用,调用者现在必须设置为0** @retval "非负数" 成功,所有待创建的过滤器都已成功创建* @retval AVERROR_FILTER_NOT_FOUND 某些过滤器的名称不对应已知过滤器* @retval "其他负错误代码" 其他失败** @note 多次调用此函数是安全的,因为它是幂等的。*/
class="token keyword">int class="token function">avfilter_graph_segment_create_filtersclass="token punctuation">(AVFilterGraphSegment class="token operator">*segclass="token punctuation">, class="token keyword">int flagsclass="token punctuation">)class="token punctuation">;class="token comment">/*** 将解析的选项应用于图段中的过滤器实例。** 遍历图段中所有具有关联选项字典的过滤器实例,并使用* av_opt_set_dict2(..., AV_OPT_SEARCH_CHILDREN)应用这些选项。* AVFilterParams.opts被av_opt_set_dict2()输出的字典替换,* 如果所有选项都成功应用,该字典应为空(NULL)。** 如果任何选项未找到,此函数将继续处理所有其他过滤器,* 最后返回AVERROR_OPTION_NOT_FOUND(除非发生其他错误)。* 调用程序可以根据需要处理未应用的选项。** 段中存在的任何待创建过滤器(参见avfilter_graph_segment_create_filters())* 都将导致此函数失败。简单跳过没有关联过滤器上下文的AVFilterParams。** @param seg 要处理的过滤器图段* @param flags 保留供将来使用,调用者现在必须设置为0** @retval "非负数" 成功,所有选项都已成功应用。* @retval AVERROR_OPTION_NOT_FOUND 在过滤器中未找到某些选项* @retval "其他负错误代码" 其他失败** @note 多次调用此函数是安全的,因为它是幂等的。*/
class="token keyword">int class="token function">avfilter_graph_segment_apply_optsclass="token punctuation">(AVFilterGraphSegment class="token operator">*segclass="token punctuation">, class="token keyword">int flagsclass="token punctuation">)class="token punctuation">;class="token comment">/*** 初始化图段中的所有过滤器实例。** 遍历图段中的所有过滤器实例,对尚未初始化的过滤器调用* avfilter_init_dict(..., NULL)。** 段中存在的任何待创建过滤器(参见avfilter_graph_segment_create_filters())* 都将导致此函数失败。简单跳过没有关联过滤器上下文或其过滤器上下文* 已初始化的AVFilterParams。** @param seg 要处理的过滤器图段* @param flags 保留供将来使用,调用者现在必须设置为0** @retval "非负数" 成功,所有过滤器实例都已成功初始化* @retval "负错误代码" 失败** @note 多次调用此函数是安全的,因为它是幂等的。*/
class="token keyword">int class="token function">avfilter_graph_segment_initclass="token punctuation">(AVFilterGraphSegment class="token operator">*segclass="token punctuation">, class="token keyword">int flagsclass="token punctuation">)class="token punctuation">;class="token comment">/*** 链接图段中的过滤器。** 遍历图段中的所有过滤器实例,并尝试链接所有未链接的输入和输出pad。* 段中存在的任何待创建过滤器(参见avfilter_graph_segment_create_filters())* 都将导致此函数失败。跳过禁用的过滤器和已链接的pad。** 每个具有非NULL标签的相应AVFilterPadParams的过滤器输出pad都会:* - 如果存在匹配标签的输入,则链接到该输入;* - 否则导出到outputs链表中,保留标签。* 未标记的输出会:* - 如果存在,则链接到链中下一个未禁用过滤器中的第一个未链接未标记输入* - 否则导出到outputs链表中,标签为NULL** 类似地,未链接的输入pad会导出到inputs链表中。** @param seg 要处理的过滤器图段* @param flags 保留供将来使用,调用者现在必须设置为0* @param[out] inputs  此图段中过滤器的所有空闲(未链接)输入的链表将在此返回。*                     调用者必须使用avfilter_inout_free()释放它。* @param[out] outputs 此图段中过滤器的所有空闲(未链接)输出的链表将在此返回。*                     调用者必须使用avfilter_inout_free()释放它。** @retval "非负数" 成功* @retval "负错误代码" 失败** @note 多次调用此函数是安全的,因为它是幂等的。*/
class="token keyword">int class="token function">avfilter_graph_segment_linkclass="token punctuation">(AVFilterGraphSegment class="token operator">*segclass="token punctuation">, class="token keyword">int flagsclass="token punctuation">,AVFilterInOut class="token operator">*class="token operator">*inputsclass="token punctuation">,AVFilterInOut class="token operator">*class="token operator">*outputsclass="token punctuation">)class="token punctuation">;class="token comment">/*** 将图段中的所有过滤器/链接描述应用到关联的过滤器图。** 此函数当前等效于按顺序调用以下函数:* - avfilter_graph_segment_create_filters();* - avfilter_graph_segment_apply_opts();* - avfilter_graph_segment_init();* - avfilter_graph_segment_link();* 如果其中任何一个失败则失败。此列表将来可能会扩展。** 由于上述函数是幂等的,调用者可以手动调用其中一些函数,* 然后对过滤器图进行一些自定义处理,然后调用此函数完成其余工作。** @param seg 要处理的过滤器图段* @param flags 保留供将来使用,调用者现在必须设置为0* @param[out] inputs 传递给avfilter_graph_segment_link()* @param[out] outputs 传递给avfilter_graph_segment_link()** @retval "非负数" 成功* @retval "负错误代码" 失败** @note 多次调用此函数是安全的,因为它是幂等的。*/
class="token keyword">int class="token function">avfilter_graph_segment_applyclass="token punctuation">(AVFilterGraphSegment class="token operator">*segclass="token punctuation">, class="token keyword">int flagsclass="token punctuation">,AVFilterInOut class="token operator">*class="token operator">*inputsclass="token punctuation">,AVFilterInOut class="token operator">*class="token operator">*outputsclass="token punctuation">)class="token punctuation">;class="token comment">/*** 释放提供的AVFilterGraphSegment及其关联的所有内容。** @param seg 指向要释放的AVFilterGraphSegment的双重指针。退出此函数时* 将向此指针写入NULL。** @note* 过滤器上下文(AVFilterParams.filter)由AVFilterGraph而不是* AVFilterGraphSegment拥有,因此不会被释放。*/
class="token keyword">void class="token function">avfilter_graph_segment_freeclass="token punctuation">(AVFilterGraphSegment class="token operator">*class="token operator">*segclass="token punctuation">)class="token punctuation">;class="token comment">/*** 向一个或多个过滤器实例发送命令。** @param graph  过滤器图* @param target 应该接收命令的过滤器*               "all"发送到所有过滤器*               否则可以是过滤器或过滤器实例名称*               这将把命令发送到所有匹配的过滤器。* @param cmd    要发送的命令,为了处理简单所有命令必须只包含字母数字* @param arg    命令的参数* @param res    大小为res_size的缓冲区,过滤器可以在其中返回响应。** @returns >=0表示成功,否则返回错误代码。*              对于不支持的命令返回AVERROR(ENOSYS)*/
class="token keyword">int class="token function">avfilter_graph_send_commandclass="token punctuation">(AVFilterGraph class="token operator">*graphclass="token punctuation">, class="token keyword">const class="token keyword">char class="token operator">*targetclass="token punctuation">, class="token keyword">const class="token keyword">char class="token operator">*cmdclass="token punctuation">, class="token keyword">const class="token keyword">char class="token operator">*argclass="token punctuation">, class="token keyword">char class="token operator">*resclass="token punctuation">, class="token keyword">int res_lenclass="token punctuation">, class="token keyword">int flagsclass="token punctuation">)class="token punctuation">;class="token comment">/*** 为一个或多个过滤器实例排队命令。** @param graph  过滤器图* @param target 应该接收命令的过滤器*               "all"发送到所有过滤器*               否则可以是过滤器或过滤器实例名称*               这将把命令发送到所有匹配的过滤器。* @param cmd    要发送的命令,为了处理简单所有命令必须只包含字母数字* @param arg    命令的参数* @param ts     应该向过滤器发送命令的时间** @note 由于这在函数返回后执行命令,因此不提供来自过滤器的返回代码,*       也不支持AVFILTER_CMD_FLAG_ONE。*/
class="token keyword">int class="token function">avfilter_graph_queue_commandclass="token punctuation">(AVFilterGraph class="token operator">*graphclass="token punctuation">, class="token keyword">const class="token keyword">char class="token operator">*targetclass="token punctuation">, class="token keyword">const class="token keyword">char class="token operator">*cmdclass="token punctuation">, class="token keyword">const class="token keyword">char class="token operator">*argclass="token punctuation">, class="token keyword">int flagsclass="token punctuation">, class="token keyword">double tsclass="token punctuation">)class="token punctuation">;class="token comment">/*** 将图转储为人类可读的字符串表示。** @param graph    要转储的图* @param options  格式化选项;当前被忽略* @return  一个字符串,或在内存分配失败的情况下为NULL;*          必须使用av_free释放该字符串*/
class="token keyword">char class="token operator">*class="token function">avfilter_graph_dumpclass="token punctuation">(AVFilterGraph class="token operator">*graphclass="token punctuation">, class="token keyword">const class="token keyword">char class="token operator">*optionsclass="token punctuation">)class="token punctuation">;class="token comment">/*** 在最旧的接收链接上请求一帧。** 如果请求返回AVERROR_EOF,则尝试下一个。** 注意此函数不是要作为过滤器图的唯一调度机制,* 只是一个帮助在正常情况下以平衡方式耗尽过滤器图的便利函数。** 还要注意AVERROR_EOF并不意味着在此过程中某些接收器上没有收到帧。* 当有多个接收链接时,如果请求的链接返回EOF,这可能导致过滤器* 刷新待处理帧,这些帧被发送到另一个接收链接,尽管未被请求。** @return  ff_request_frame()的返回值,*          或如果所有链接都返回AVERROR_EOF则返回AVERROR_EOF*/
class="token keyword">int class="token function">avfilter_graph_request_oldestclass="token punctuation">(AVFilterGraph class="token operator">*graphclass="token punctuation">)class="token punctuation">;class="token comment">/*** @}*/class="token macro property">class="token directive-hash">#class="token directive keyword">endif class="token comment">/* AVFILTER_AVFILTER_H */code>

buffersink.h

<code class="prism language-c">class="token macro property">class="token directive-hash">#class="token directive keyword">ifndef class="token expression">AVFILTER_BUFFERSINK_H
class="token macro property">class="token directive-hash">#class="token directive keyword">define class="token macro-name">AVFILTER_BUFFERSINK_Hclass="token comment">/*** @file* @ingroup lavfi_buffersink* class="tags" href="/YinShiPin.html" title=音视频>音视频内存缓冲区接收器API*/class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"avfilter.h"class="token comment">/*** @defgroup lavfi_buffersink 缓冲区接收器API* @ingroup lavfi* @{** buffersink和abuffersink过滤器用于将过滤器图连接到应用程序。* 它们有一个连接到图的单一输入,没有输出。* 必须使用av_buffersink_get_frame()或av_buffersink_get_samples()来提取帧。** 在配置期间由图协商的格式可以使用以下访问器函数获取:* - av_buffersink_get_time_base(),* - av_buffersink_get_format(),* - av_buffersink_get_frame_rate(),* - av_buffersink_get_w(),* - av_buffersink_get_h(),* - av_buffersink_get_sample_aspect_ratio(),* - av_buffersink_get_channels(),* - av_buffersink_get_ch_layout(),* - av_buffersink_get_sample_rate().** av_buffersink_get_ch_layout()返回的布局必须由调用者取消初始化。** 可以通过使用带有AV_OPT_SEARCH_CHILDREN标志的av_opt_set()和相关函数来设置选项来约束格式。*  - pix_fmts (整数列表),*  - sample_fmts (整数列表),*  - sample_rates (整数列表),*  - ch_layouts (字符串),*  - channel_counts (整数列表),*  - all_channel_counts (布尔值)。* 这些选项大多数是二进制类型,应该使用av_opt_set_int_list()或av_opt_set_bin()来设置。* 如果未设置,则接受所有相应的格式。** 作为特殊情况,如果未设置ch_layouts,则接受所有有效的通道布局,* 除了UNSPEC布局(除非设置了all_channel_counts)。*/class="token comment">/*** 从接收器获取经过过滤的数据帧并将其放入frame中。** @param ctx    指向buffersink或abuffersink过滤器上下文的指针。* @param frame  指向将填充数据的已分配帧的指针。*               必须使用av_frame_unref() / av_frame_free()释放数据* @param flags  AV_BUFFERSINK_FLAG_*标志的组合** @return  成功时返回 >= 0,失败时返回负的AVERROR代码。*/
class="token keyword">int class="token function">av_buffersink_get_frame_flagsclass="token punctuation">(AVFilterContext class="token operator">*ctxclass="token punctuation">, AVFrame class="token operator">*frameclass="token punctuation">, class="token keyword">int flagsclass="token punctuation">)class="token punctuation">;class="token comment">/*** 告诉av_buffersink_get_buffer_ref()读取视频/样本缓冲区引用,* 但不从缓冲区中移除它。如果你只需要读取视频/样本缓冲区而不需要获取它,这很有用。*/
class="token macro property">class="token directive-hash">#class="token directive keyword">define class="token macro-name">AV_BUFFERSINK_FLAG_PEEK class="token expression">class="token number">1class="token comment">/*** 告诉av_buffersink_get_buffer_ref()不要从其输入请求帧。* 如果已经缓冲了一帧,则读取它(并从缓冲区中移除),* 但如果没有帧存在,则返回AVERROR(EAGAIN)。*/
class="token macro property">class="token directive-hash">#class="token directive keyword">define class="token macro-name">AV_BUFFERSINK_FLAG_NO_REQUEST class="token expression">class="token number">2class="token comment">/*** 为音频缓冲区接收器设置帧大小。** 所有对av_buffersink_get_buffer_ref的调用将返回一个具有* 指定数量样本的缓冲区,如果没有足够的样本则返回AVERROR(EAGAIN)。* EOF时的最后一个缓冲区将用0填充。*/
class="token keyword">void class="token function">av_buffersink_set_frame_sizeclass="token punctuation">(AVFilterContext class="token operator">*ctxclass="token punctuation">, class="token keyword">unsigned frame_sizeclass="token punctuation">)class="token punctuation">;class="token comment">/*** @defgroup lavfi_buffersink_accessors 缓冲区接收器访问器* 获取流的属性* @{*/class="token keyword">enum class="token class-name">AVMediaType class="token function">av_buffersink_get_type                class="token punctuation">(class="token keyword">const AVFilterContext class="token operator">*ctxclass="token punctuation">)class="token punctuation">;
AVRational       class="token function">av_buffersink_get_time_base           class="token punctuation">(class="token keyword">const AVFilterContext class="token operator">*ctxclass="token punctuation">)class="token punctuation">;
class="token keyword">int              class="token function">av_buffersink_get_format              class="token punctuation">(class="token keyword">const AVFilterContext class="token operator">*ctxclass="token punctuation">)class="token punctuation">;AVRational       class="token function">av_buffersink_get_frame_rate          class="token punctuation">(class="token keyword">const AVFilterContext class="token operator">*ctxclass="token punctuation">)class="token punctuation">;
class="token keyword">int              class="token function">av_buffersink_get_w                   class="token punctuation">(class="token keyword">const AVFilterContext class="token operator">*ctxclass="token punctuation">)class="token punctuation">;
class="token keyword">int              class="token function">av_buffersink_get_h                   class="token punctuation">(class="token keyword">const AVFilterContext class="token operator">*ctxclass="token punctuation">)class="token punctuation">;
AVRational       class="token function">av_buffersink_get_sample_aspect_ratio class="token punctuation">(class="token keyword">const AVFilterContext class="token operator">*ctxclass="token punctuation">)class="token punctuation">;class="token keyword">int              class="token function">av_buffersink_get_channels            class="token punctuation">(class="token keyword">const AVFilterContext class="token operator">*ctxclass="token punctuation">)class="token punctuation">;
class="token macro property">class="token directive-hash">#class="token directive keyword">if class="token expression">FF_API_OLD_CHANNEL_LAYOUT
attribute_deprecated
class="token class-name">uint64_t         class="token function">av_buffersink_get_channel_layout      class="token punctuation">(class="token keyword">const AVFilterContext class="token operator">*ctxclass="token punctuation">)class="token punctuation">;
class="token macro property">class="token directive-hash">#class="token directive keyword">endif
class="token keyword">int              class="token function">av_buffersink_get_ch_layout           class="token punctuation">(class="token keyword">const AVFilterContext class="token operator">*ctxclass="token punctuation">,AVChannelLayout class="token operator">*ch_layoutclass="token punctuation">)class="token punctuation">;
class="token keyword">int              class="token function">av_buffersink_get_sample_rate         class="token punctuation">(class="token keyword">const AVFilterContext class="token operator">*ctxclass="token punctuation">)class="token punctuation">;AVBufferRef class="token operator">*    class="token function">av_buffersink_get_hw_frames_ctx       class="token punctuation">(class="token keyword">const AVFilterContext class="token operator">*ctxclass="token punctuation">)class="token punctuation">;class="token comment">/** @} */class="token comment">/*** 从接收器获取经过过滤的数据帧并将其放入frame中。** @param ctx 指向buffersink或abuffersink AVFilter上下文的指针。* @param frame 指向将填充数据的已分配帧的指针。*              必须使用av_frame_unref() / av_frame_free()释放数据** @return*         - >= 0 如果成功返回一帧。*         - AVERROR(EAGAIN) 如果此时没有可用帧;必须向过滤器图添加更多输入帧以获得更多输出。*         - AVERROR_EOF 如果此接收器将不再有更多输出帧。*         - 其他失败情况下的不同负AVERROR代码。*/
class="token keyword">int class="token function">av_buffersink_get_frameclass="token punctuation">(AVFilterContext class="token operator">*ctxclass="token punctuation">, AVFrame class="token operator">*frameclass="token punctuation">)class="token punctuation">;class="token comment">/*** 与av_buffersink_get_frame()相同,但可以指定读取的样本数。* 这个函数比av_buffersink_get_frame()效率低,因为它会复制数据。** @param ctx 指向abuffersink AVFilter上下文的指针。* @param frame 指向将填充数据的已分配帧的指针。*              必须使用av_frame_unref() / av_frame_free()释放数据*              frame将包含恰好nb_samples个音频样本,除了在流结束时,*              它可能包含少于nb_samples个样本。** @return 返回代码与av_buffersink_get_frame()的含义相同。** @warning 不要将此函数与av_buffersink_get_frame()混用。* 对单个接收器只使用其中之一,不要同时使用两者。*/
class="token keyword">int class="token function">av_buffersink_get_samplesclass="token punctuation">(AVFilterContext class="token operator">*ctxclass="token punctuation">, AVFrame class="token operator">*frameclass="token punctuation">, class="token keyword">int nb_samplesclass="token punctuation">)class="token punctuation">;class="token comment">/*** @}*/class="token macro property">class="token directive-hash">#class="token directive keyword">endif class="token comment">/* AVFILTER_BUFFERSINK_H */code>

ch_1564">buffersrc.h

<code class="prism language-c">class="token macro property">class="token directive-hash">#class="token directive keyword">ifndef class="token expression">AVFILTER_BUFFERSRC_H
class="token macro property">class="token directive-hash">#class="token directive keyword">define class="token macro-name">AVFILTER_BUFFERSRC_Hclass="token comment">/*** @file* @ingroup lavfi_buffersrc* 内存缓冲区源API。*/class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"avfilter.h"class="token comment">/*** @defgroup lavfi_buffersrc 缓冲区源API* @ingroup lavfi* @{*/class="token keyword">enum class="token punctuation">{class="token comment">/*** 不检查格式变化。*/AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT class="token operator">= class="token number">1class="token punctuation">,class="token comment">/*** 立即将帧推送到输出。*/AV_BUFFERSRC_FLAG_PUSH class="token operator">= class="token number">4class="token punctuation">,class="token comment">/*** 保持对帧的引用。* 如果帧是引用计数的,则创建一个新的引用;* 否则复制帧数据。*/AV_BUFFERSRC_FLAG_KEEP_REF class="token operator">= class="token number">8class="token punctuation">,class="token punctuation">}class="token punctuation">;class="token comment">/*** 获取失败请求的数量。** 失败请求是指在缓冲区中没有帧时调用request_frame方法。* 当添加一帧时,该数量会重置。*/
class="token keyword">unsigned class="token function">av_buffersrc_get_nb_failed_requestsclass="token punctuation">(AVFilterContext class="token operator">*buffer_srcclass="token punctuation">)class="token punctuation">;class="token comment">/*** 此结构包含描述将传递给此过滤器的帧的参数。** 应使用av_buffersrc_parameters_alloc()分配,并使用av_free()释放。* 其中所有已分配的字段仍归调用者所有。*/
class="token keyword">typedef class="token keyword">struct class="token class-name">AVBufferSrcParameters class="token punctuation">{class="token comment">/*** 视频:像素格式,值对应于枚举AVPixelFormat* 音频:采样格式,值对应于枚举AVSampleFormat*/class="token keyword">int formatclass="token punctuation">;class="token comment">/*** 用于输入帧时间戳的时基。*/AVRational time_baseclass="token punctuation">;class="token comment">/*** 仅视频,输入帧的显示尺寸。*/class="token keyword">int widthclass="token punctuation">, heightclass="token punctuation">;class="token comment">/*** 仅视频,采样(像素)宽高比。*/AVRational sample_aspect_ratioclass="token punctuation">;class="token comment">/*** 仅视频,输入视频的帧率。此字段仅在输入流具有已知的恒定帧率时* 才应设置为非零值,如果帧率是可变的或未知的,则应保持其初始值。*/AVRational frame_rateclass="token punctuation">;class="token comment">/*** 仅适用于具有hwaccel像素格式的视频。这应该是对描述输入帧的* AVHWFramesContext实例的引用。*/AVBufferRef class="token operator">*hw_frames_ctxclass="token punctuation">;class="token comment">/*** 仅音频,音频采样率(每秒采样数)。*/class="token keyword">int sample_rateclass="token punctuation">;class="token macro property">class="token directive-hash">#class="token directive keyword">if class="token expression">FF_API_OLD_CHANNEL_LAYOUTclass="token comment">/*** 仅音频,音频通道布局* @deprecated 使用ch_layout*/attribute_deprecatedclass="token class-name">uint64_t channel_layoutclass="token punctuation">;
class="token macro property">class="token directive-hash">#class="token directive keyword">endifclass="token comment">/*** 仅音频,音频通道布局*/AVChannelLayout ch_layoutclass="token punctuation">;
class="token punctuation">} AVBufferSrcParametersclass="token punctuation">;class="token comment">/*** 分配一个新的AVBufferSrcParameters实例。应由调用者使用av_free()释放。*/
AVBufferSrcParameters class="token operator">*class="token function">av_buffersrc_parameters_allocclass="token punctuation">(class="token keyword">voidclass="token punctuation">)class="token punctuation">;class="token comment">/*** 使用提供的参数初始化buffersrc或abuffersrc过滤器。* 此函数可以多次调用,后面的调用会覆盖前面的调用。* 某些参数也可以通过AVOptions设置,然后无论使用哪种方法,* 最后使用的方法优先。** @param ctx buffersrc或abuffersrc过滤器的实例* @param param 流参数。稍后传递给此过滤器的帧必须符合这些参数。*             param中所有已分配的字段仍归调用者所有,class="tags" href="/LIBAVFILTER.html" title=libavfilter>libavfilter将在*             必要时进行内部复制或引用。* @return 成功返回0,失败返回负的AVERROR代码。*/
class="token keyword">int class="token function">av_buffersrc_parameters_setclass="token punctuation">(AVFilterContext class="token operator">*ctxclass="token punctuation">, AVBufferSrcParameters class="token operator">*paramclass="token punctuation">)class="token punctuation">;class="token comment">/*** 向缓冲区源添加一帧。** @param ctx   buffersrc过滤器的实例* @param frame 要添加的帧。如果帧是引用计数的,此函数将创建一个新的引用。*             否则将复制帧数据。** @return 成功返回0,错误返回负的AVERROR** 此函数等同于带有AV_BUFFERSRC_FLAG_KEEP_REF标志的av_buffersrc_add_frame_flags()。*/
av_warn_unused_result
class="token keyword">int class="token function">av_buffersrc_write_frameclass="token punctuation">(AVFilterContext class="token operator">*ctxclass="token punctuation">, class="token keyword">const AVFrame class="token operator">*frameclass="token punctuation">)class="token punctuation">;class="token comment">/*** 向缓冲区源添加一帧。** @param ctx   buffersrc过滤器的实例* @param frame 要添加的帧。如果帧是引用计数的,此函数将获取引用的所有权*             并重置帧。否则将复制帧数据。如果此函数返回错误,*             输入帧不会被修改。** @return 成功返回0,错误返回负的AVERROR。** @note 此函数与av_buffersrc_write_frame()的区别在于* av_buffersrc_write_frame()创建对输入帧的新引用,* 而此函数获取传递给它的引用的所有权。** 此函数等同于不带AV_BUFFERSRC_FLAG_KEEP_REF标志的av_buffersrc_add_frame_flags()。*/
av_warn_unused_result
class="token keyword">int class="token function">av_buffersrc_add_frameclass="token punctuation">(AVFilterContext class="token operator">*ctxclass="token punctuation">, AVFrame class="token operator">*frameclass="token punctuation">)class="token punctuation">;class="token comment">/*** 向缓冲区源添加一帧。** 默认情况下,如果帧是引用计数的,此函数将获取引用的所有权并重置帧。* 这可以使用标志来控制。** 如果此函数返回错误,输入帧不会被修改。** @param buffer_src  指向缓冲区源上下文的指针* @param frame       一帧,或NULL表示EOF* @param flags       AV_BUFFERSRC_FLAG_*的组合* @return           成功时返回 >= 0,失败时返回负的AVERROR代码*/
av_warn_unused_result
class="token keyword">int class="token function">av_buffersrc_add_frame_flagsclass="token punctuation">(AVFilterContext class="token operator">*buffer_srcclass="token punctuation">,AVFrame class="token operator">*frameclass="token punctuation">, class="token keyword">int flagsclass="token punctuation">)class="token punctuation">;class="token comment">/*** EOF后关闭缓冲区源。** 这类似于向av_buffersrc_add_frame_flags()传递NULL,* 不同之处在于它接受EOF的时间戳,即最后一帧结束的时间戳。*/
class="token keyword">int class="token function">av_buffersrc_closeclass="token punctuation">(AVFilterContext class="token operator">*ctxclass="token punctuation">, class="token class-name">int64_t ptsclass="token punctuation">, class="token keyword">unsigned flagsclass="token punctuation">)class="token punctuation">;class="token comment">/*** @}*/class="token macro property">class="token directive-hash">#class="token directive keyword">endif class="token comment">/* AVFILTER_BUFFERSRC_H */code>

http://www.ppmy.cn/embedded/160011.html

相关文章

【Rust自学】18.3. 模式(匹配)的语法

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 18.3.1. 匹配字面值 模式可以直接匹配字面值。看个例子&#xff1a; let x 1;match x {1…

在Mapbox GL JS中“line-pattern”的使用详解

在Mapbox GL JS中&#xff0c;line-pattern 是一种用于在地图上绘制带有图案的线条的样式属性。通过 line-pattern&#xff0c;你可以使用自定义的图像作为线条的图案&#xff0c;而不是使用纯色或渐变。 1. 基本概念 line-pattern: 该属性允许你指定一个图像作为线条的图案。…

WordPress自定义.js文件排序实现方法

在WordPress中&#xff0c;要将插件引用的.js文件放到所有.js文件之后加载&#xff0c;可以通过以下方法实现&#xff1a; 方法一&#xff1a;调整wp_enqueue_script的加载顺序 在插件的主文件中&#xff0c;使用wp_enqueue_script函数加载.js文件时&#xff0c;将$in_footer…

Spring Boot 2 快速教程:WebFlux 集成 Mongodb(三)

一、前言 上一讲用 Map 数据结构内存式存储了数据。这样数据就不会持久化&#xff0c;本文我们用 MongoDB 来实现 WebFlux 对数据源的操作。 什么是 MongoDB ? 官网&#xff1a;https://www.mongodb.com/ MongoDB 是一个基于分布式文件存储的数据库&#xff0c;由 C 语言编…

《redis4.0 通信模块源码分析(一)》

【redis导读】redis作为一款高性能的内存数据库&#xff0c;面试服务端开发&#xff0c;redis是绕不开的话题&#xff0c;如果想提升自己的网络编程的水平和技巧&#xff0c;redis这款优秀的开源软件是很值得大家去分析和研究的。 笔者从大学毕业一直有分析redis源码的想法&…

vue2+vue3 HMCXY基础入门

vue2vue3 HMCXY基础入门 一、Vue2.x技术精讲1.Vue快速上手&#xff08;1&#xff09;Vue概念&#xff08;2&#xff09;创建实例&#xff08;3&#xff09;插值表达式&#xff08;4&#xff09;响应式特性&#xff08;5&#xff09;开发者工具 2.Vue指令二、Vue3.x技术精讲 一、…

【JavaEE】Spring(6):Mybatis(下)

一、Mybatis XML配置文件 Mybatis开发有两种方式&#xff1a; 注解XML 之前讲解了注解的方式&#xff0c;接下来学习XML的方式 1.1 配置数据库连接和Mybatis 直接在配置文件中配置即可&#xff1a; spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mybatis_test?cha…

基于单片机的智能感控杆设计(论文+源码)

2.1功能设计 本次以智能感控杆设计为题&#xff0c;智能感控杆是一种可以应用在多种场合的设备&#xff0c;可以极大的节约人类的精力和时间。在此将其主要功能设计如下&#xff1a; 1.LCD1602液晶显示当前感控杆状态开启/关闭&#xff0c;显示当前模式手动/自动&#xff1b…