首页 » 技术分享 » FFMPEG学习【libavfilter】(一)

FFMPEG学习【libavfilter】(一)

 

此模块用于获取流的属性。

一、Buffer sink accessors模块

一)、函数

enum AVMediaType  av_buffersink_get_type (const AVFilterContext *ctx)

AVRational  av_buffersink_get_time_base (const AVFilterContext *ctx)

int  av_buffersink_get_format (const AVFilterContext *ctx)

AVRational  av_buffersink_get_frame_rate (const AVFilterContext *ctx)

int  av_buffersink_get_w (const AVFilterContext *ctx)

int  av_buffersink_get_h (const AVFilterContext *ctx)

AVRational  av_buffersink_get_sample_aspect_ratio (const AVFilterContext *ctx)

int  av_buffersink_get_channels (const AVFilterContext *ctx)

uint64_t  av_buffersink_get_channel_layout (const AVFilterContext *ctx)

int  av_buffersink_get_sample_rate (const AVFilterContext *ctx)

AVBufferRef *  av_buffersink_get_hw_frames_ctx (const AVFilterContext *ctx)

二)、Buffer source API模块

1、头文件

buffersrc.h

2、数据结构

struct   AVBufferSrcParameters{
int format; //  视频:像素格式,值对应于枚举AVPixelFormat音频:采样格式,值对应于枚举AVSampleFormat
AVRational time_base;//  时间基准用于输入帧上的时间戳。
int width; //  仅视频,输入框的显示尺寸。
int height;
AVRational sample_aspect_ratio;//  仅视频,样本(像素)宽高比。
AVRational frame_rate;//  仅视频,输入视频的帧速率。
AVBufferRef * hw_frames_ctx;//  只有hwaccel像素格式的视频。
int sample_rate;//  仅音频,每秒钟采样的音频采样率。
uint64_t channel_layout;//  仅音频,音频通道布局。
}

此结构包含描述将传递到此过滤器的帧的参数。

3、枚举

enum   AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT = 1, AV_BUFFERSRC_FLAG_PUSH = 4, AV_BUFFERSRC_FLAG_KEEP_REF = 8 }

4、函数

unsigned  av_buffersrc_get_nb_failed_requests (AVFilterContext *buffer_src)

获取失败的请求数。

失败的请求是在调用request_frame方法时,而缓冲区中没有帧。 添加帧时,该号码将重置。

AVBufferSrcParameters *  av_buffersrc_parameters_alloc (void)

分配一个新的AVBufferSrcParameters实例。

它应该由av_free()的调用者释放。

int  av_buffersrc_parameters_set (AVFilterContext *ctxAVBufferSrcParameters *param)

使用提供的参数初始化buffersrc或abuffersrc过滤器。

此函数可能会被多次调用,后面的调用将覆盖以前的调用。 一些参数也可以通过AVOptions进行设置,然后使用最后使用的方法优先。

参数:ctx:bufferrc或abuffersrc过滤器的一个实例

    param:流参数。 后来传递给此过滤器的帧必须符合这些参数。 param中的所有分配的字段仍然由调用者拥有,libavfilter将在必要时进行内部副本或引用。

返回:0成功,失败时出现负ERROR代码。

av_warn_unused_result int  av_buffersrc_write_frame (AVFilterContext *ctx, const AVFrame *frame)

将一个帧添加到缓冲区源。

参数:ctx:bufferrc过滤器的一个实例

    frame:帧被添加。 如果帧被引用计数,则此函数将对其进行新的引用。 否则将复制帧数据。

返回:0成功,失败时出现负ERROR代码。

av_warn_unused_result int  av_buffersrc_add_frame (AVFilterContext *ctxAVFrame *frame)

将一个帧添加到缓冲区源。

参数:ctx:bufferrc过滤器的一个实例

    frame:帧被添加。 如果帧被引用计数,则此函数将获取参考的所有权并重置帧。 否则将复制帧数据。 如果此函数返回错误,则不会触摸输入框。

返回:0成功,失败时出现负ERROR代码。

av_warn_unused_result int  av_buffersrc_add_frame_flags (AVFilterContext *buffer_src, AVFrame *frameint flags)

将一个帧添加到缓冲区源。

默认情况下,如果帧被引用计数,则该函数将获取引用的所有权并重置帧。 这可以使用标志来控制。

如果此函数返回错误,则不会触摸输入框。

参数:buffer_src:指向缓冲区源上下文的指针

    frame:一个帧,或者为NULL标记EOF

    flags:AV_BUFFERSRC_FLAG_ *的一个组合

返回:0成功,失败时出现负ERROR代码。

二、头文件

1、avfilter.h

2、version.h

三、数据结构

1、struct   AVFilter{
const char * name;//过滤器名称。
const char * description;//过滤器说明。
const AVFilterPad * inputs;//输入列表,由零元素终止。
const AVFilterPad * outputs;//输出列表,由零元素终止。
const AVClass * priv_class;//私有数据类,用于声明过滤器私有AVOptions。
int flags; //AVFILTER_FLAG_ *的组合。
int(* init )(AVFilterContext *ctx);//过滤初始化函数。
int(* init_dict )(AVFilterContext *ctx, AVDictionary **options);//应该通过想要将AVOptions的字典传递给在init中分配的嵌套上下文的过滤器来设置而不是init。
void(* uninit )(AVFilterContext *ctx);//过滤器在其输入和输出上支持的查询格式。
int priv_size;//要为过滤器分配的私有数据的大小
int flags_internal;//avfilter的附加标志仅供内部使用。
struct AVFilter * next;// 由过滤器注册系统使用。
int(* process_command )(AVFilterContext *, const char *cmd, const char *arg, char *res, int res_len, int flags);// 使过滤器实例处理一个命令。
int(* init_opaque )(AVFilterContext *ctx, void *opaque);//过滤初始化函数,替代init()回调。
int(* activate )(AVFilterContext *ctx);//过滤器激活函数。
}

过滤器定义。

2、struct   AVFilterContext{
const AVClass * av_class;//需要av_log()和过滤常用选项
const AVFilter * filter;// AVFilter的一个实例
char * name; //此过滤器实例的名称
AVFilterPad * input_pads;//数组输入板
AVFilterLink ** inputs;//指向输入链接的指针数组
unsigned nb_inputs;//输入板数
AVFilterPad * output_pads;//输出板阵列
unsigned nb_outputs;//输出板数量
void * priv; //过滤器使用的私人数据
struct AVFilterGraph * graph;//filtergraph this filter belongs to
int thread_type;//允许/使用的多线程类型。
AVFilterInternal * internal;//libavfilter内部使用的不透明结构。
struct AVFilterCommand * command_queue;
char * enable_str;//启用表达式字符串
void * enable;// 解析的表达式(AVExpr *)
double * var_values;//启用表达式的变量值
int is_disabled;//从最后的表达式评估启用状态
AVBufferRef * hw_device_ctx;//对于将创建硬件框架的过滤器,设置过滤器应在其中创建的设备。
int nb_threads;//此过滤器实例允许的最大线程数。
unsigned ready;//过滤器的就绪状态
}

一个过滤器的实例。

3、struct   AVFilterLink{
AVFilterContext * src;//源滤镜
AVFilterPad * srcpad;//源过滤器上的输出垫
AVFilterContext * dst;//目的过滤器
AVFilterPad * dstpad;//目标过滤器上的输入板
enum AVMediaType type;//过滤介质类型
int w; //建议图像宽度
int h; //建议图像高度
AVRational sample_aspect_ratio;// 建议采样宽高比
uint64_t channel_layout;//当前缓冲区的通道布局(请参阅libavutil / channel_layout.h)
int sample_rate;//每秒钟的采样
int format; //建议媒体格式
AVRational time_base;//定义通过此链接的帧/样本的PTS使用的时基。
AVFilterFormats * in_formats;//分别由输入和输出过滤器支持的格式和通道布局列表。
AVFilterFormats * out_formats;
AVFilterFormats * in_samplerates;// 用于自动协商的频道布局和采样率列表。
AVFilterFormats * out_samplerates;
struct AVFilterChannelLayouts * in_channel_layouts;
struct AVFilterChannelLayouts * out_channel_layouts;
int request_samples;//仅音频,目的地过滤器将其设置为非零值,以请求具有给定数量样本的缓冲区应发送给它。
enum AVFilterLink:: { ... }   init_state;//链接属性(维度等)的初始化阶段
struct AVFilterGraph * graph;//图表所属的过滤器。
int64_t current_pts;// 链接的当前时间戳,由链接time_base单位的最新帧定义。
int64_t current_pts_us;//由AV_TIME_BASE单位的最新帧定义的链接的当前时间戳。
int age_index;//年龄数组中的索引
AVRational frame_rate;// 链路上流的帧速率,如果未知或变量,则为1/0;如果保留为0/0,将自动从源过滤器的第一个输入复制(如果存在)。
AVFrame * partial_buf;//缓冲液部分填充样品以实现固定/最小尺寸。
int partial_buf_size;//要分配的部分缓冲区的大小。
int min_samples;// 一次过滤的最小样品数量。
int max_samples;// 一次过滤的最大样本数。
int channels; //频道数量
unsigned flags;// 链接处理标志
int64_t frame_count_in;//通过链接发送的过去帧数。
int64_t frame_count_out;
void * frame_pool;// 指向FFFramePool结构体的指针。
int frame_wanted_out;// 如果此过滤器的输出上当前需要一个帧,则为真。
AVBufferRef * hw_frames_ctx;// 对于hwaccel像素格式,这应该是对描述帧的AVHWFramesContext的引用。
char reserved [0xF000];//内部结构成员
}

两个过滤器之间的链接。

4、struct   AVFilterGraph{
const AVClass * av_class;
AVFilterContext ** filters;
unsigned nb_filters;
char * scale_sws_opts;// 用于自动插入缩放滤镜的sws选项
int thread_type;// 此图中允许使用过滤器的多线程类型。
int nb_threads;//  该图中过滤器使用的最大线程数。
AVFilterGraphInternal * internal;// libavfilter内部使用不透明对象。
void * opaque;//  不透明的用户数据。
avfilter_execute_func * execute;// 调用者可以在分配图形之后并在添加任何过滤器之前立即设置此回调,以提供自定义多线程实现。
char * aresample_swr_opts;//  用于自动插入的样本过滤器的swr选项,仅通过AVOptions访问
AVFilterLink ** sink_links;// 私人领域。
int sink_links_count;
unsigned disable_auto_convert;
}

5、struct   AVFilterInOut{
char * name; //列表中该输入/输出的唯一名称
AVFilterContext * filter_ctx;// 与此输入/输出相关联的过滤器上下文
int pad_idx; //  用于连接的filt_ctx垫的索引
struct AVFilterInOut * next;//  列表中的下一个输入/输入,如果是最后一个则为NULL
}

过滤器链的输入/输出的链表。

四、宏

#define  AVFILTER_FLAG_DYNAMIC_INPUTS   (1 << 0)

滤波器输入的数量不是仅由AVFilter.inputs决定的。

#define  AVFILTER_FLAG_DYNAMIC_OUTPUTS   (1 << 1)

滤波器输出的数量不是仅由AVFilter.inputs决定的。

#define  AVFILTER_FLAG_SLICE_THREADS   (1 << 2)

该过滤器通过将帧分割成多个部分并同时处理来支持多线程。

#define  AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC   (1 << 16)

一些过滤器支持通用的“启用”表达式选项,可用于在时间轴中启用或禁用过滤器。

#define  AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL   (1 << 17)

与AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC相同,只是当启用表达式为假时,过滤器将会像往常一样调用其filter_frame()回调函数。

#define  AVFILTER_FLAG_SUPPORT_TIMELINE   (AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL)

用于测试滤镜是否支持或没有时间轴功能(内部或一般)的方便面罩。

 
#define  AVFILTER_THREAD_SLICE   (1 << 0)

同时处理帧的多个部分。

#define  AVFILTER_CMD_FLAG_ONE   1

停止一次过滤器了解命令(例如对于target = all),快速过滤器将自动受益。

#define  AVFILTER_CMD_FLAG_FAST   2

只有当它的快速执行命令(像在hw中支持对比度调整的视频输出)

五、类型定义

typedef int avfilter_action_func )(AVFilterContext *ctxvoid *argint jobnr, int nb_jobs)

传递给AVFilterGraph :: execute回调的函数指针可以多次执行,可能并行执行。

typedef int avfilter_execute_func )(AVFilterContext *ctxavfilter_action_func *funcvoid *argint *ret, int nb_jobs)

执行多个作业的功能,可能并行。

六、枚举

enum   AVFILTER_AUTO_CONVERT_ALL = 0, AVFILTER_AUTO_CONVERT_NONE = -1 }

转载自原文链接, 如需删除请联系管理员。

原文链接:FFMPEG学习【libavfilter】(一),转载请注明来源!

0