diff --git a/libavfilter/vf_fieldmatch.c b/libavfilter/vf_fieldmatch.c index 5a73eb43b8..af118c4f8e 100644 --- a/libavfilter/vf_fieldmatch.c +++ b/libavfilter/vf_fieldmatch.c @@ -679,7 +679,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) AVFilterLink *outlink = ctx->outputs[0]; FieldMatchContext *fm = ctx->priv; int combs[] = { -1, -1, -1, -1, -1 }; - int order, field, i, match, sc = 0; + int order, field, i, match, sc = 0, ret = 0; const int *fxo; AVFrame *gen_frames[] = { NULL, NULL, NULL, NULL, NULL }; AVFrame *dst; @@ -725,16 +725,20 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) if (i > mN && fm->combdbg == COMBDBG_PCN) break; gen_frames[i] = create_weave_frame(ctx, i, field, fm->prv, fm->src, fm->nxt); - if (!gen_frames[i]) - return AVERROR(ENOMEM); + if (!gen_frames[i]) { + ret = AVERROR(ENOMEM); + goto fail; + } combs[i] = calc_combed_score(fm, gen_frames[i]); } av_log(ctx, AV_LOG_INFO, "COMBS: %3d %3d %3d %3d %3d\n", combs[0], combs[1], combs[2], combs[3], combs[4]); } else { gen_frames[mC] = av_frame_clone(fm->src); - if (!gen_frames[mC]) - return AVERROR(ENOMEM); + if (!gen_frames[mC]) { + ret = AVERROR(ENOMEM); + goto fail; + } } /* p/c selection and optional 3-way p/c/n matches */ @@ -801,10 +805,10 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) gen_frames[match] = NULL; } } - if (!dst) - return AVERROR(ENOMEM); - for (i = 0; i < FF_ARRAY_ELEMS(gen_frames); i++) - av_frame_free(&gen_frames[i]); + if (!dst) { + ret = AVERROR(ENOMEM); + goto fail; + } /* mark the frame we are unable to match properly as interlaced so a proper * de-interlacer can take the relay */ @@ -819,7 +823,13 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) " match=%d combed=%s\n", sc, combs[0], combs[1], combs[2], combs[3], combs[4], fm->combpel, match, dst->interlaced_frame ? "YES" : "NO"); - return ff_filter_frame(outlink, dst); +fail: + for (i = 0; i < FF_ARRAY_ELEMS(gen_frames); i++) + av_frame_free(&gen_frames[i]); + + if (ret >= 0) + return ff_filter_frame(outlink, dst); + return ret; } static int activate(AVFilterContext *ctx)