mirror of
https://github.com/xenia-project/FFmpeg.git
synced 2024-12-04 01:21:09 +00:00
lavfi/decimate: use named options
This commit is contained in:
parent
49c8fe304f
commit
a2a1e20fa2
@ -2069,11 +2069,14 @@ for very-low-bitrate encoding (e.g. streaming over dialup modem), but
|
|||||||
it could in theory be used for fixing movies that were
|
it could in theory be used for fixing movies that were
|
||||||
inverse-telecined incorrectly.
|
inverse-telecined incorrectly.
|
||||||
|
|
||||||
It accepts the following parameters:
|
The filter accepts parameters as a list of @var{key}=@var{value}
|
||||||
@var{max}:@var{hi}:@var{lo}:@var{frac}.
|
pairs, separated by ":". If the key of the first options is omitted,
|
||||||
|
the arguments are interpreted according to the syntax:
|
||||||
|
@option{max}:@option{hi}:@option{lo}:@option{frac}.
|
||||||
|
|
||||||
|
A description of the accepted options follows.
|
||||||
|
|
||||||
@table @option
|
@table @option
|
||||||
|
|
||||||
@item max
|
@item max
|
||||||
Set the maximum number of consecutive frames which can be dropped (if
|
Set the maximum number of consecutive frames which can be dropped (if
|
||||||
positive), or the minimum interval between dropped frames (if
|
positive), or the minimum interval between dropped frames (if
|
||||||
@ -2082,20 +2085,22 @@ number of previous sequentially dropped frames.
|
|||||||
|
|
||||||
Default value is 0.
|
Default value is 0.
|
||||||
|
|
||||||
@item hi, lo, frac
|
@item hi
|
||||||
|
@item lo
|
||||||
|
@item frac
|
||||||
Set the dropping threshold values.
|
Set the dropping threshold values.
|
||||||
|
|
||||||
Values for @var{hi} and @var{lo} are for 8x8 pixel blocks and
|
Values for @option{hi} and @option{lo} are for 8x8 pixel blocks and
|
||||||
represent actual pixel value differences, so a threshold of 64
|
represent actual pixel value differences, so a threshold of 64
|
||||||
corresponds to 1 unit of difference for each pixel, or the same spread
|
corresponds to 1 unit of difference for each pixel, or the same spread
|
||||||
out differently over the block.
|
out differently over the block.
|
||||||
|
|
||||||
A frame is a candidate for dropping if no 8x8 blocks differ by more
|
A frame is a candidate for dropping if no 8x8 blocks differ by more
|
||||||
than a threshold of @var{hi}, and if no more than @var{frac} blocks (1
|
than a threshold of @option{hi}, and if no more than @option{frac} blocks (1
|
||||||
meaning the whole image) differ by more than a threshold of @var{lo}.
|
meaning the whole image) differ by more than a threshold of @option{lo}.
|
||||||
|
|
||||||
Default value for @var{hi} is 64*12, default value for @var{lo} is
|
Default value for @option{hi} is 64*12, default value for @option{lo} is
|
||||||
64*5, and default value for @var{frac} is 0.33.
|
64*5, and default value for @option{frac} is 0.33.
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@section delogo
|
@section delogo
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
|
|
||||||
#define LIBAVFILTER_VERSION_MAJOR 3
|
#define LIBAVFILTER_VERSION_MAJOR 3
|
||||||
#define LIBAVFILTER_VERSION_MINOR 38
|
#define LIBAVFILTER_VERSION_MINOR 38
|
||||||
#define LIBAVFILTER_VERSION_MICRO 103
|
#define LIBAVFILTER_VERSION_MICRO 104
|
||||||
|
|
||||||
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
|
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
|
||||||
LIBAVFILTER_VERSION_MINOR, \
|
LIBAVFILTER_VERSION_MINOR, \
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
* Rich Felker.
|
* Rich Felker.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "libavutil/opt.h"
|
||||||
#include "libavutil/pixdesc.h"
|
#include "libavutil/pixdesc.h"
|
||||||
#include "libavutil/timestamp.h"
|
#include "libavutil/timestamp.h"
|
||||||
#include "libavcodec/dsputil.h"
|
#include "libavcodec/dsputil.h"
|
||||||
@ -33,6 +34,7 @@
|
|||||||
#include "video.h"
|
#include "video.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
const AVClass *class;
|
||||||
int lo, hi; ///< lower and higher threshold number of differences
|
int lo, hi; ///< lower and higher threshold number of differences
|
||||||
///< values for 8x8 blocks
|
///< values for 8x8 blocks
|
||||||
|
|
||||||
@ -50,6 +52,20 @@ typedef struct {
|
|||||||
AVCodecContext *avctx; ///< codec context required for the DSPContext
|
AVCodecContext *avctx; ///< codec context required for the DSPContext
|
||||||
} DecimateContext;
|
} DecimateContext;
|
||||||
|
|
||||||
|
#define OFFSET(x) offsetof(DecimateContext, x)
|
||||||
|
#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
|
||||||
|
|
||||||
|
static const AVOption decimate_options[] = {
|
||||||
|
{ "max", "set the maximum number of consecutive dropped frames (positive), or the minimum interval between dropped frames (negative)",
|
||||||
|
OFFSET(max_drop_count), AV_OPT_TYPE_INT, {.i64=0}, INT_MIN, INT_MAX, FLAGS },
|
||||||
|
{ "hi", "set high dropping threshold", OFFSET(hi), AV_OPT_TYPE_INT, {.i64=64*12}, INT_MIN, INT_MAX, FLAGS },
|
||||||
|
{ "lo", "set low dropping threshold", OFFSET(lo), AV_OPT_TYPE_INT, {.i64=64*5}, INT_MIN, INT_MAX, FLAGS },
|
||||||
|
{ "frac", "set fraction dropping threshold", OFFSET(frac), AV_OPT_TYPE_FLOAT, {.dbl=0.33}, 0, 1, FLAGS },
|
||||||
|
{ NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
AVFILTER_DEFINE_CLASS(decimate);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return 1 if the two planes are different, 0 otherwise.
|
* Return 1 if the two planes are different, 0 otherwise.
|
||||||
*/
|
*/
|
||||||
@ -116,29 +132,14 @@ static int decimate_frame(AVFilterContext *ctx,
|
|||||||
static av_cold int init(AVFilterContext *ctx, const char *args)
|
static av_cold int init(AVFilterContext *ctx, const char *args)
|
||||||
{
|
{
|
||||||
DecimateContext *decimate = ctx->priv;
|
DecimateContext *decimate = ctx->priv;
|
||||||
|
static const char *shorthand[] = { "max", "hi", "lo", "frac", NULL };
|
||||||
|
int ret;
|
||||||
|
|
||||||
/* set default values */
|
decimate->class = &decimate_class;
|
||||||
decimate->drop_count = decimate->max_drop_count = 0;
|
av_opt_set_defaults(decimate);
|
||||||
decimate->lo = 64*5;
|
|
||||||
decimate->hi = 64*12;
|
|
||||||
decimate->frac = 0.33;
|
|
||||||
|
|
||||||
if (args) {
|
if ((ret = av_opt_set_from_string(decimate, args, shorthand, "=", ":")) < 0)
|
||||||
char c1, c2, c3, c4;
|
return ret;
|
||||||
int n = sscanf(args, "%d%c%d%c%d%c%f%c",
|
|
||||||
&decimate->max_drop_count, &c1,
|
|
||||||
&decimate->hi, &c2, &decimate->lo, &c3,
|
|
||||||
&decimate->frac, &c4);
|
|
||||||
if (n != 1 &&
|
|
||||||
(n != 3 || c1 != ':') &&
|
|
||||||
(n != 5 || c1 != ':' || c2 != ':') &&
|
|
||||||
(n != 7 || c1 != ':' || c2 != ':' || c3 != ':')) {
|
|
||||||
av_log(ctx, AV_LOG_ERROR,
|
|
||||||
"Invalid syntax for argument '%s': "
|
|
||||||
"must be in the form 'max:hi:lo:frac'\n", args);
|
|
||||||
return AVERROR(EINVAL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
av_log(ctx, AV_LOG_VERBOSE, "max_drop_count:%d hi:%d lo:%d frac:%f\n",
|
av_log(ctx, AV_LOG_VERBOSE, "max_drop_count:%d hi:%d lo:%d frac:%f\n",
|
||||||
decimate->max_drop_count, decimate->hi, decimate->lo, decimate->frac);
|
decimate->max_drop_count, decimate->hi, decimate->lo, decimate->frac);
|
||||||
@ -156,6 +157,7 @@ static av_cold void uninit(AVFilterContext *ctx)
|
|||||||
DecimateContext *decimate = ctx->priv;
|
DecimateContext *decimate = ctx->priv;
|
||||||
avfilter_unref_bufferp(&decimate->ref);
|
avfilter_unref_bufferp(&decimate->ref);
|
||||||
avcodec_close(decimate->avctx);
|
avcodec_close(decimate->avctx);
|
||||||
|
av_opt_free(decimate);
|
||||||
av_freep(&decimate->avctx);
|
av_freep(&decimate->avctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -260,4 +262,5 @@ AVFilter avfilter_vf_decimate = {
|
|||||||
.query_formats = query_formats,
|
.query_formats = query_formats,
|
||||||
.inputs = decimate_inputs,
|
.inputs = decimate_inputs,
|
||||||
.outputs = decimate_outputs,
|
.outputs = decimate_outputs,
|
||||||
|
.priv_class = &decimate_class,
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user