You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-10 06:10:52 +02:00
vf_select: switch to an AVOptions-based system.
This commit is contained in:
@@ -1742,9 +1742,16 @@ scale=w='min(500\, iw*3/2):h=-1'
|
|||||||
@section select
|
@section select
|
||||||
Select frames to pass in output.
|
Select frames to pass in output.
|
||||||
|
|
||||||
It accepts in input an expression, which is evaluated for each input
|
This filter accepts the following options:
|
||||||
frame. If the expression is evaluated to a non-zero value, the frame
|
|
||||||
is selected and passed to the output, otherwise it is discarded.
|
@table @option
|
||||||
|
|
||||||
|
@item expr
|
||||||
|
An expression, which is evaluated for each input frame. If the expression is
|
||||||
|
evaluated to a non-zero value, the frame is selected and passed to the output,
|
||||||
|
otherwise it is discarded.
|
||||||
|
|
||||||
|
@end table
|
||||||
|
|
||||||
The expression can contain the following constants:
|
The expression can contain the following constants:
|
||||||
|
|
||||||
@@ -1831,13 +1838,13 @@ Some examples follow:
|
|||||||
select
|
select
|
||||||
|
|
||||||
# the above is the same as:
|
# the above is the same as:
|
||||||
select=1
|
select=expr=1
|
||||||
|
|
||||||
# skip all frames:
|
# skip all frames:
|
||||||
select=0
|
select=expr=0
|
||||||
|
|
||||||
# select only I-frames
|
# select only I-frames
|
||||||
select='eq(pict_type\,I)'
|
select='expr=eq(pict_type\,I)'
|
||||||
|
|
||||||
# select one frame every 100
|
# select one frame every 100
|
||||||
select='not(mod(n\,100))'
|
select='not(mod(n\,100))'
|
||||||
|
@@ -27,6 +27,7 @@
|
|||||||
#include "libavutil/fifo.h"
|
#include "libavutil/fifo.h"
|
||||||
#include "libavutil/internal.h"
|
#include "libavutil/internal.h"
|
||||||
#include "libavutil/mathematics.h"
|
#include "libavutil/mathematics.h"
|
||||||
|
#include "libavutil/opt.h"
|
||||||
#include "avfilter.h"
|
#include "avfilter.h"
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
#include "video.h"
|
#include "video.h"
|
||||||
@@ -115,6 +116,8 @@ enum var_name {
|
|||||||
#define FIFO_SIZE 8
|
#define FIFO_SIZE 8
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
const AVClass *class;
|
||||||
|
char *expr_str;
|
||||||
AVExpr *expr;
|
AVExpr *expr;
|
||||||
double var_values[VAR_VARS_NB];
|
double var_values[VAR_VARS_NB];
|
||||||
double select;
|
double select;
|
||||||
@@ -127,9 +130,10 @@ static av_cold int init(AVFilterContext *ctx, const char *args)
|
|||||||
SelectContext *select = ctx->priv;
|
SelectContext *select = ctx->priv;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if ((ret = av_expr_parse(&select->expr, args ? args : "1",
|
if ((ret = av_expr_parse(&select->expr, select->expr_str,
|
||||||
var_names, NULL, NULL, NULL, NULL, 0, ctx)) < 0) {
|
var_names, NULL, NULL, NULL, NULL, 0, ctx)) < 0) {
|
||||||
av_log(ctx, AV_LOG_ERROR, "Error while parsing expression '%s'\n", args);
|
av_log(ctx, AV_LOG_ERROR, "Error while parsing expression '%s'\n",
|
||||||
|
select->expr_str);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -309,6 +313,20 @@ static av_cold void uninit(AVFilterContext *ctx)
|
|||||||
select->pending_frames = NULL;
|
select->pending_frames = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define OFFSET(x) offsetof(SelectContext, x)
|
||||||
|
#define FLAGS AV_OPT_FLAG_VIDEO_PARAM
|
||||||
|
static const AVOption options[] = {
|
||||||
|
{ "expr", "An expression to use for selecting frames", OFFSET(expr_str), AV_OPT_TYPE_STRING, { .str = "1" }, .flags = FLAGS },
|
||||||
|
{ NULL },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const AVClass select_class = {
|
||||||
|
.class_name = "select",
|
||||||
|
.item_name = av_default_item_name,
|
||||||
|
.option = options,
|
||||||
|
.version = LIBAVUTIL_VERSION_INT,
|
||||||
|
};
|
||||||
|
|
||||||
static const AVFilterPad avfilter_vf_select_inputs[] = {
|
static const AVFilterPad avfilter_vf_select_inputs[] = {
|
||||||
{
|
{
|
||||||
.name = "default",
|
.name = "default",
|
||||||
@@ -337,6 +355,7 @@ AVFilter avfilter_vf_select = {
|
|||||||
.uninit = uninit,
|
.uninit = uninit,
|
||||||
|
|
||||||
.priv_size = sizeof(SelectContext),
|
.priv_size = sizeof(SelectContext),
|
||||||
|
.priv_class = &select_class,
|
||||||
|
|
||||||
.inputs = avfilter_vf_select_inputs,
|
.inputs = avfilter_vf_select_inputs,
|
||||||
.outputs = avfilter_vf_select_outputs,
|
.outputs = avfilter_vf_select_outputs,
|
||||||
|
Reference in New Issue
Block a user