mirror of https://git.ffmpeg.org/ffmpeg.git
lavfi: replace passthrough_filter_frame with a flag.
With the introduction of AVFilterContext->is_disabled, we can simplify the custom passthrough mode in filters. This commit is technically a small compat break, but the timeline was introduced very recently. Doxy by Stefano Sabatini.
This commit is contained in:
parent
60f0e30431
commit
1776177b7f
|
@ -15,6 +15,9 @@ libavutil: 2012-10-22
|
||||||
|
|
||||||
API changes, most recent first:
|
API changes, most recent first:
|
||||||
|
|
||||||
|
2013-05-12 - xxxxxxx - lavfi 3.65.100
|
||||||
|
Add AVFILTER_FLAG_SUPPORT_TIMELINE* filter flags.
|
||||||
|
|
||||||
2013-04-19 - xxxxxxx - lavc 55.4.100
|
2013-04-19 - xxxxxxx - lavc 55.4.100
|
||||||
Add AV_CODEC_PROP_TEXT_SUB property for text based subtitles codec.
|
Add AV_CODEC_PROP_TEXT_SUB property for text based subtitles codec.
|
||||||
|
|
||||||
|
|
|
@ -131,7 +131,6 @@ static const AVFilterPad apad_inputs[] = {
|
||||||
.name = "default",
|
.name = "default",
|
||||||
.type = AVMEDIA_TYPE_AUDIO,
|
.type = AVMEDIA_TYPE_AUDIO,
|
||||||
.filter_frame = filter_frame,
|
.filter_frame = filter_frame,
|
||||||
.passthrough_filter_frame = filter_frame,
|
|
||||||
},
|
},
|
||||||
{ NULL },
|
{ NULL },
|
||||||
};
|
};
|
||||||
|
@ -153,5 +152,5 @@ AVFilter avfilter_af_apad = {
|
||||||
.inputs = apad_inputs,
|
.inputs = apad_inputs,
|
||||||
.outputs = apad_outputs,
|
.outputs = apad_outputs,
|
||||||
.priv_class = &apad_class,
|
.priv_class = &apad_class,
|
||||||
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE,
|
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL,
|
||||||
};
|
};
|
||||||
|
|
|
@ -296,5 +296,5 @@ AVFilter avfilter_af_volume = {
|
||||||
.init = init,
|
.init = init,
|
||||||
.inputs = avfilter_af_volume_inputs,
|
.inputs = avfilter_af_volume_inputs,
|
||||||
.outputs = avfilter_af_volume_outputs,
|
.outputs = avfilter_af_volume_outputs,
|
||||||
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE,
|
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
|
||||||
};
|
};
|
||||||
|
|
|
@ -453,6 +453,9 @@ int avfilter_register(AVFilter *filter)
|
||||||
AVFilter **f = &first_filter;
|
AVFilter **f = &first_filter;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
/* the filter must select generic or internal exclusively */
|
||||||
|
av_assert0((filter->flags & AVFILTER_FLAG_SUPPORT_TIMELINE) != AVFILTER_FLAG_SUPPORT_TIMELINE);
|
||||||
|
|
||||||
for(i=0; filter->inputs && filter->inputs[i].name; i++) {
|
for(i=0; filter->inputs && filter->inputs[i].name; i++) {
|
||||||
const AVFilterPad *input = &filter->inputs[i];
|
const AVFilterPad *input = &filter->inputs[i];
|
||||||
av_assert0( !input->filter_frame
|
av_assert0( !input->filter_frame
|
||||||
|
@ -995,9 +998,9 @@ static int ff_filter_frame_framed(AVFilterLink *link, AVFrame *frame)
|
||||||
dstctx->var_values[VAR_POS] = pos == -1 ? NAN : pos;
|
dstctx->var_values[VAR_POS] = pos == -1 ? NAN : pos;
|
||||||
|
|
||||||
dstctx->is_disabled = !av_expr_eval(dstctx->enable, dstctx->var_values, NULL);
|
dstctx->is_disabled = !av_expr_eval(dstctx->enable, dstctx->var_values, NULL);
|
||||||
if (dstctx->is_disabled)
|
if (dstctx->is_disabled &&
|
||||||
filter_frame = dst->passthrough_filter_frame ? dst->passthrough_filter_frame
|
(dstctx->filter->flags & AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC))
|
||||||
: default_filter_frame;
|
filter_frame = default_filter_frame;
|
||||||
}
|
}
|
||||||
ret = filter_frame(link, out);
|
ret = filter_frame(link, out);
|
||||||
link->frame_count++;
|
link->frame_count++;
|
||||||
|
|
|
@ -385,19 +385,6 @@ struct AVFilterPad {
|
||||||
int needs_fifo;
|
int needs_fifo;
|
||||||
|
|
||||||
int needs_writable;
|
int needs_writable;
|
||||||
|
|
||||||
/**
|
|
||||||
* Passthrough filtering callback.
|
|
||||||
*
|
|
||||||
* If a filter supports timeline editing (in case
|
|
||||||
* AVFILTER_FLAG_SUPPORT_TIMELINE is enabled) then it can implement a
|
|
||||||
* custom passthrough callback to update its local context (for example to
|
|
||||||
* keep a frame reference, or simply send the filter to a custom outlink).
|
|
||||||
* The filter must not do any change to the frame in this callback.
|
|
||||||
*
|
|
||||||
* Input pads only.
|
|
||||||
*/
|
|
||||||
int (*passthrough_filter_frame)(AVFilterLink *link, AVFrame *frame);
|
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -444,9 +431,25 @@ enum AVMediaType avfilter_pad_get_type(const AVFilterPad *pads, int pad_idx);
|
||||||
/**
|
/**
|
||||||
* Some filters support a generic "enable" expression option that can be used
|
* Some filters support a generic "enable" expression option that can be used
|
||||||
* to enable or disable a filter in the timeline. Filters supporting this
|
* to enable or disable a filter in the timeline. Filters supporting this
|
||||||
* option have this flag set.
|
* option have this flag set. When the enable expression is false, the default
|
||||||
|
* no-op filter_frame() function is called in place of the filter_frame()
|
||||||
|
* callback defined on each input pad, thus the frame is passed unchanged to
|
||||||
|
* the next filters.
|
||||||
*/
|
*/
|
||||||
#define AVFILTER_FLAG_SUPPORT_TIMELINE (1 << 16)
|
#define AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC (1 << 16)
|
||||||
|
/**
|
||||||
|
* Same as AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC, except that the filter will
|
||||||
|
* have its filter_frame() callback(s) called as usual even when the enable
|
||||||
|
* expression is false. The filter will disable filtering within the
|
||||||
|
* filter_frame() callback(s) itself, for example executing code depending on
|
||||||
|
* the AVFilterContext->is_disabled value.
|
||||||
|
*/
|
||||||
|
#define AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL (1 << 17)
|
||||||
|
/**
|
||||||
|
* Handy mask to test whether the filter supports or no the timeline feature
|
||||||
|
* (internally or generically).
|
||||||
|
*/
|
||||||
|
#define AVFILTER_FLAG_SUPPORT_TIMELINE (AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Filter definition. This defines the pads a filter contains, and all the
|
* Filter definition. This defines the pads a filter contains, and all the
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
#include "libavutil/avutil.h"
|
#include "libavutil/avutil.h"
|
||||||
|
|
||||||
#define LIBAVFILTER_VERSION_MAJOR 3
|
#define LIBAVFILTER_VERSION_MAJOR 3
|
||||||
#define LIBAVFILTER_VERSION_MINOR 64
|
#define LIBAVFILTER_VERSION_MINOR 65
|
||||||
#define LIBAVFILTER_VERSION_MICRO 100
|
#define LIBAVFILTER_VERSION_MICRO 100
|
||||||
|
|
||||||
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
|
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
|
||||||
|
|
|
@ -383,5 +383,5 @@ AVFilter avfilter_vf_boxblur = {
|
||||||
|
|
||||||
.inputs = avfilter_vf_boxblur_inputs,
|
.inputs = avfilter_vf_boxblur_inputs,
|
||||||
.outputs = avfilter_vf_boxblur_outputs,
|
.outputs = avfilter_vf_boxblur_outputs,
|
||||||
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE,
|
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
|
||||||
};
|
};
|
||||||
|
|
|
@ -209,5 +209,5 @@ AVFilter avfilter_vf_colorbalance = {
|
||||||
.query_formats = query_formats,
|
.query_formats = query_formats,
|
||||||
.inputs = colorbalance_inputs,
|
.inputs = colorbalance_inputs,
|
||||||
.outputs = colorbalance_outputs,
|
.outputs = colorbalance_outputs,
|
||||||
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE,
|
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
|
||||||
};
|
};
|
||||||
|
|
|
@ -356,5 +356,5 @@ AVFilter avfilter_vf_colorchannelmixer = {
|
||||||
.query_formats = query_formats,
|
.query_formats = query_formats,
|
||||||
.inputs = colorchannelmixer_inputs,
|
.inputs = colorchannelmixer_inputs,
|
||||||
.outputs = colorchannelmixer_outputs,
|
.outputs = colorchannelmixer_outputs,
|
||||||
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE,
|
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
|
||||||
};
|
};
|
||||||
|
|
|
@ -385,5 +385,5 @@ AVFilter avfilter_vf_colormatrix = {
|
||||||
.inputs = colormatrix_inputs,
|
.inputs = colormatrix_inputs,
|
||||||
.outputs = colormatrix_outputs,
|
.outputs = colormatrix_outputs,
|
||||||
.priv_class = &colormatrix_class,
|
.priv_class = &colormatrix_class,
|
||||||
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE,
|
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
|
||||||
};
|
};
|
||||||
|
|
|
@ -233,5 +233,5 @@ AVFilter avfilter_vf_cropdetect = {
|
||||||
.query_formats = query_formats,
|
.query_formats = query_formats,
|
||||||
.inputs = avfilter_vf_cropdetect_inputs,
|
.inputs = avfilter_vf_cropdetect_inputs,
|
||||||
.outputs = avfilter_vf_cropdetect_outputs,
|
.outputs = avfilter_vf_cropdetect_outputs,
|
||||||
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE,
|
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
|
||||||
};
|
};
|
||||||
|
|
|
@ -548,5 +548,5 @@ AVFilter avfilter_vf_curves = {
|
||||||
.inputs = curves_inputs,
|
.inputs = curves_inputs,
|
||||||
.outputs = curves_outputs,
|
.outputs = curves_outputs,
|
||||||
.priv_class = &curves_class,
|
.priv_class = &curves_class,
|
||||||
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE,
|
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
|
||||||
};
|
};
|
||||||
|
|
|
@ -271,5 +271,5 @@ AVFilter avfilter_vf_delogo = {
|
||||||
|
|
||||||
.inputs = avfilter_vf_delogo_inputs,
|
.inputs = avfilter_vf_delogo_inputs,
|
||||||
.outputs = avfilter_vf_delogo_outputs,
|
.outputs = avfilter_vf_delogo_outputs,
|
||||||
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE,
|
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
|
||||||
};
|
};
|
||||||
|
|
|
@ -181,5 +181,5 @@ AVFilter avfilter_vf_drawbox = {
|
||||||
.query_formats = query_formats,
|
.query_formats = query_formats,
|
||||||
.inputs = avfilter_vf_drawbox_inputs,
|
.inputs = avfilter_vf_drawbox_inputs,
|
||||||
.outputs = avfilter_vf_drawbox_outputs,
|
.outputs = avfilter_vf_drawbox_outputs,
|
||||||
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE,
|
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
|
||||||
};
|
};
|
||||||
|
|
|
@ -327,5 +327,5 @@ AVFilter avfilter_vf_edgedetect = {
|
||||||
.inputs = edgedetect_inputs,
|
.inputs = edgedetect_inputs,
|
||||||
.outputs = edgedetect_outputs,
|
.outputs = edgedetect_outputs,
|
||||||
.priv_class = &edgedetect_class,
|
.priv_class = &edgedetect_class,
|
||||||
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE,
|
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
|
||||||
};
|
};
|
||||||
|
|
|
@ -260,5 +260,5 @@ AVFilter avfilter_vf_gradfun = {
|
||||||
.query_formats = query_formats,
|
.query_formats = query_formats,
|
||||||
.inputs = avfilter_vf_gradfun_inputs,
|
.inputs = avfilter_vf_gradfun_inputs,
|
||||||
.outputs = avfilter_vf_gradfun_outputs,
|
.outputs = avfilter_vf_gradfun_outputs,
|
||||||
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE,
|
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
|
||||||
};
|
};
|
||||||
|
|
|
@ -279,5 +279,5 @@ AVFilter avfilter_vf_histeq = {
|
||||||
.inputs = histeq_inputs,
|
.inputs = histeq_inputs,
|
||||||
.outputs = histeq_outputs,
|
.outputs = histeq_outputs,
|
||||||
.priv_class = &histeq_class,
|
.priv_class = &histeq_class,
|
||||||
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE,
|
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
|
||||||
};
|
};
|
||||||
|
|
|
@ -373,5 +373,5 @@ AVFilter avfilter_vf_hue = {
|
||||||
.inputs = hue_inputs,
|
.inputs = hue_inputs,
|
||||||
.outputs = hue_outputs,
|
.outputs = hue_outputs,
|
||||||
.priv_class = &hue_class,
|
.priv_class = &hue_class,
|
||||||
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE,
|
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
|
||||||
};
|
};
|
||||||
|
|
|
@ -354,7 +354,7 @@ static const AVFilterPad outputs[] = {
|
||||||
\
|
\
|
||||||
.inputs = inputs, \
|
.inputs = inputs, \
|
||||||
.outputs = outputs, \
|
.outputs = outputs, \
|
||||||
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE, \
|
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC, \
|
||||||
}
|
}
|
||||||
|
|
||||||
#if CONFIG_LUT_FILTER
|
#if CONFIG_LUT_FILTER
|
||||||
|
|
|
@ -471,5 +471,5 @@ AVFilter avfilter_vf_noise = {
|
||||||
.inputs = noise_inputs,
|
.inputs = noise_inputs,
|
||||||
.outputs = noise_outputs,
|
.outputs = noise_outputs,
|
||||||
.priv_class = &noise_class,
|
.priv_class = &noise_class,
|
||||||
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE,
|
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
|
||||||
};
|
};
|
||||||
|
|
|
@ -88,7 +88,6 @@ enum var_name {
|
||||||
typedef struct {
|
typedef struct {
|
||||||
const AVClass *class;
|
const AVClass *class;
|
||||||
int x, y; ///< position of overlayed picture
|
int x, y; ///< position of overlayed picture
|
||||||
int enable; ///< tells if blending is enabled
|
|
||||||
|
|
||||||
int allow_packed_rgb;
|
int allow_packed_rgb;
|
||||||
uint8_t frame_requested;
|
uint8_t frame_requested;
|
||||||
|
@ -597,7 +596,7 @@ static int try_filter_frame(AVFilterContext *ctx, AVFrame *mainpic)
|
||||||
over->var_values[VAR_X], over->x,
|
over->var_values[VAR_X], over->x,
|
||||||
over->var_values[VAR_Y], over->y);
|
over->var_values[VAR_Y], over->y);
|
||||||
}
|
}
|
||||||
if (over->enable)
|
if (!ctx->is_disabled)
|
||||||
blend_image(ctx, mainpic, over->overpicref, over->x, over->y);
|
blend_image(ctx, mainpic, over->overpicref, over->x, over->y);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -663,20 +662,6 @@ static int filter_frame_over(AVFilterLink *inlink, AVFrame *inpicref)
|
||||||
return ret == AVERROR(EAGAIN) ? 0 : ret;
|
return ret == AVERROR(EAGAIN) ? 0 : ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define DEF_FILTER_FRAME(name, mode, enable_value) \
|
|
||||||
static int filter_frame_##name##_##mode(AVFilterLink *inlink, AVFrame *frame) \
|
|
||||||
{ \
|
|
||||||
AVFilterContext *ctx = inlink->dst; \
|
|
||||||
OverlayContext *over = ctx->priv; \
|
|
||||||
over->enable = enable_value; \
|
|
||||||
return filter_frame_##name(inlink, frame); \
|
|
||||||
}
|
|
||||||
|
|
||||||
DEF_FILTER_FRAME(main, enabled, 1);
|
|
||||||
DEF_FILTER_FRAME(main, disabled, 0);
|
|
||||||
DEF_FILTER_FRAME(over, enabled, 1);
|
|
||||||
DEF_FILTER_FRAME(over, disabled, 0);
|
|
||||||
|
|
||||||
static int request_frame(AVFilterLink *outlink)
|
static int request_frame(AVFilterLink *outlink)
|
||||||
{
|
{
|
||||||
AVFilterContext *ctx = outlink->src;
|
AVFilterContext *ctx = outlink->src;
|
||||||
|
@ -734,16 +719,14 @@ static const AVFilterPad avfilter_vf_overlay_inputs[] = {
|
||||||
.type = AVMEDIA_TYPE_VIDEO,
|
.type = AVMEDIA_TYPE_VIDEO,
|
||||||
.get_video_buffer = ff_null_get_video_buffer,
|
.get_video_buffer = ff_null_get_video_buffer,
|
||||||
.config_props = config_input_main,
|
.config_props = config_input_main,
|
||||||
.filter_frame = filter_frame_main_enabled,
|
.filter_frame = filter_frame_main,
|
||||||
.passthrough_filter_frame = filter_frame_main_disabled,
|
|
||||||
.needs_writable = 1,
|
.needs_writable = 1,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "overlay",
|
.name = "overlay",
|
||||||
.type = AVMEDIA_TYPE_VIDEO,
|
.type = AVMEDIA_TYPE_VIDEO,
|
||||||
.config_props = config_input_overlay,
|
.config_props = config_input_overlay,
|
||||||
.filter_frame = filter_frame_over_enabled,
|
.filter_frame = filter_frame_over,
|
||||||
.passthrough_filter_frame = filter_frame_over_disabled,
|
|
||||||
},
|
},
|
||||||
{ NULL }
|
{ NULL }
|
||||||
};
|
};
|
||||||
|
@ -773,5 +756,5 @@ AVFilter avfilter_vf_overlay = {
|
||||||
|
|
||||||
.inputs = avfilter_vf_overlay_inputs,
|
.inputs = avfilter_vf_overlay_inputs,
|
||||||
.outputs = avfilter_vf_overlay_outputs,
|
.outputs = avfilter_vf_overlay_outputs,
|
||||||
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE,
|
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL,
|
||||||
};
|
};
|
||||||
|
|
|
@ -180,5 +180,5 @@ AVFilter avfilter_vf_pp = {
|
||||||
.outputs = pp_outputs,
|
.outputs = pp_outputs,
|
||||||
.process_command = pp_process_command,
|
.process_command = pp_process_command,
|
||||||
.priv_class = &pp_class,
|
.priv_class = &pp_class,
|
||||||
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE,
|
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
|
||||||
};
|
};
|
||||||
|
|
|
@ -578,5 +578,5 @@ AVFilter avfilter_vf_removelogo = {
|
||||||
.inputs = removelogo_inputs,
|
.inputs = removelogo_inputs,
|
||||||
.outputs = removelogo_outputs,
|
.outputs = removelogo_outputs,
|
||||||
.priv_class = &removelogo_class,
|
.priv_class = &removelogo_class,
|
||||||
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE,
|
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
|
||||||
};
|
};
|
||||||
|
|
|
@ -302,5 +302,5 @@ AVFilter avfilter_vf_smartblur = {
|
||||||
.inputs = smartblur_inputs,
|
.inputs = smartblur_inputs,
|
||||||
.outputs = smartblur_outputs,
|
.outputs = smartblur_outputs,
|
||||||
.priv_class = &smartblur_class,
|
.priv_class = &smartblur_class,
|
||||||
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE,
|
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
|
||||||
};
|
};
|
||||||
|
|
|
@ -316,5 +316,5 @@ AVFilter avfilter_vf_unsharp = {
|
||||||
|
|
||||||
.inputs = avfilter_vf_unsharp_inputs,
|
.inputs = avfilter_vf_unsharp_inputs,
|
||||||
.outputs = avfilter_vf_unsharp_outputs,
|
.outputs = avfilter_vf_unsharp_outputs,
|
||||||
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE,
|
.flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue