1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-11-21 10:55:51 +02:00

avfilter/vf_lut2: add framesync options

Also stop leaking memory.

Signed-off-by: Paul B Mahol <onemda@gmail.com>
This commit is contained in:
Paul B Mahol 2017-08-30 12:06:47 +02:00
parent 9d99f0afbe
commit a4d18a3f54

View File

@ -52,6 +52,7 @@ enum var_name {
typedef struct LUT2Context { typedef struct LUT2Context {
const AVClass *class; const AVClass *class;
FFFrameSync fs;
char *comp_expr_str[4]; char *comp_expr_str[4];
@ -66,7 +67,6 @@ typedef struct LUT2Context {
void (*lut2)(struct LUT2Context *s, AVFrame *dst, AVFrame *srcx, AVFrame *srcy); void (*lut2)(struct LUT2Context *s, AVFrame *dst, AVFrame *srcx, AVFrame *srcy);
FFFrameSync fs;
} LUT2Context; } LUT2Context;
#define OFFSET(x) offsetof(LUT2Context, x) #define OFFSET(x) offsetof(LUT2Context, x)
@ -85,6 +85,7 @@ static av_cold void uninit(AVFilterContext *ctx)
LUT2Context *s = ctx->priv; LUT2Context *s = ctx->priv;
int i; int i;
ff_framesync2_uninit(&s->fs);
av_frame_free(&s->prev_frame); av_frame_free(&s->prev_frame);
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
@ -212,14 +213,14 @@ static int process_frame(FFFrameSync *fs)
AVFilterContext *ctx = fs->parent; AVFilterContext *ctx = fs->parent;
LUT2Context *s = fs->opaque; LUT2Context *s = fs->opaque;
AVFilterLink *outlink = ctx->outputs[0]; AVFilterLink *outlink = ctx->outputs[0];
AVFrame *out, *srcx, *srcy; AVFrame *out, *srcx = NULL, *srcy = NULL;
int ret; int ret;
if ((ret = ff_framesync2_get_frame(&s->fs, 0, &srcx, 0)) < 0 || if ((ret = ff_framesync2_get_frame(&s->fs, 0, &srcx, 0)) < 0 ||
(ret = ff_framesync2_get_frame(&s->fs, 1, &srcy, 0)) < 0) (ret = ff_framesync2_get_frame(&s->fs, 1, &srcy, 0)) < 0)
return ret; return ret;
if (ctx->is_disabled) { if (ctx->is_disabled || !srcy) {
out = av_frame_clone(srcx); out = av_frame_clone(srcx);
if (!out) if (!out)
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
@ -332,7 +333,7 @@ static int lut2_config_output(AVFilterLink *outlink)
in = s->fs.in; in = s->fs.in;
in[0].time_base = srcx->time_base; in[0].time_base = srcx->time_base;
in[1].time_base = srcy->time_base; in[1].time_base = srcy->time_base;
in[0].sync = 1; in[0].sync = 2;
in[0].before = EXT_STOP; in[0].before = EXT_STOP;
in[0].after = EXT_INFINITY; in[0].after = EXT_INFINITY;
in[1].sync = 1; in[1].sync = 1;
@ -378,11 +379,12 @@ static const AVFilterPad outputs[] = {
#define lut2_options options #define lut2_options options
AVFILTER_DEFINE_CLASS(lut2); FRAMESYNC_DEFINE_CLASS(lut2, LUT2Context, fs);
AVFilter ff_vf_lut2 = { AVFilter ff_vf_lut2 = {
.name = "lut2", .name = "lut2",
.description = NULL_IF_CONFIG_SMALL("Compute and apply a lookup table from two video inputs."), .description = NULL_IF_CONFIG_SMALL("Compute and apply a lookup table from two video inputs."),
.preinit = lut2_framesync_preinit,
.priv_size = sizeof(LUT2Context), .priv_size = sizeof(LUT2Context),
.priv_class = &lut2_class, .priv_class = &lut2_class,
.uninit = uninit, .uninit = uninit,