[FFmpeg-user] How to correctly free a double-linked list

Ulf Zibis Ulf.Zibis at gmx.de
Sun Jul 7 13:42:29 EEST 2019


Hi,

when running my code, at the end I irregularly get messages like this:
[.....]
[Parsed_lineshiftrecover_0 @ 0x55e5afb83e80] start freeing memory ...
[Parsed_lineshiftrecover_0 @ 0x55e5afb83e80] filler and shifts freed!
[Parsed_lineshiftrecover_0 @ 0x55e5afb83e80] now start freeing
shifts_sums ...
corrupted double-linked list
debug/lineshiftrecover.sh: Zeile 99: 13359 Abgebrochen            
(Speicherabzug geschrieben) ./ffmpeg -y -v warning -i debug/$sample -vf
lineshiftrecover${options[o]} -q 5 $output

debug/lineshiftrecover.sh: Zeile 99: 10524 Abgebrochen            
(Speicherabzug geschrieben) ./ffmpeg -y -v warning -i debug/$sample -vf
lineshiftrecover${options[o]} -q 5 $output


As you can see I'm running my code from the script debug/lineshiftrecover.sh
lineshiftrecover is a new filter I'm working on. It's purpose is to
repair shifted line glitches in videos recoded from VHS tape.

The code runs fine until I'm coming to free the allocated memory in
function "uninit". The code is:
static av_cold void uninit(AVFilterContext *ctx)
{
    LineShiftContext *s = ctx->priv;
    av_log(ctx, s->report >= R_SHIFTS ? AV_LOG_WARNING : AV_LOG_INFO,
"start freeing memory ...\n");
    for (int p = 0; p < s->nb_planes; p++)
        av_freep(&s->filler[p]);
    av_freep(&s->shifts);
/*
    printf("printf(): filler and shifts freed!\n");
*/
    av_log(ctx, s->report >= R_SHIFTS ? AV_LOG_WARNING : AV_LOG_INFO,
"filler and shifts freed!\n");
    if (s->report >= R_SHIFTS) {
/*
        printf("do printf() before statistic of found shifts!\n");
        av_log(ctx, AV_LOG_WARNING, "statistic of found shifts ...\n");
        av_log(NULL, AV_LOG_WARNING, "shift:    "); // * increment);
        for (int shift = 0; shift <= s->span_r -  s->span_l; shift++)
            av_log(NULL, AV_LOG_WARNING, "%6d", s->span_l + shift);
        for (int l = 0; l <= s->lines; l++) {
            av_log(NULL, AV_LOG_WARNING, "\nline %4d:", s->start + l);
            for (int shift = 0; shift <= s->span_r -  s->span_l; shift++)
                av_log(NULL, AV_LOG_WARNING, "%6d",
s->shifts_sums[l][shift]);
            av_log(NULL, AV_LOG_WARNING, "\n");
        }
*/
/*
        printf("printf(): now start freeing shifts_sums ...\n");
*/
        av_log(ctx, AV_LOG_WARNING, "now start freeing shifts_sums ...\n");
        for (int l = 0; l <= s->lines; l++) {
            av_freep(&(s->shifts_sums[l]));
        }
        av_log(ctx, AV_LOG_WARNING, "lines of shifts_sums freed!\n");
        av_freep(&(s->shifts_sums));
/*
        printf("printf(): shifts_sums freed!\n");
*/
        av_log(ctx, AV_LOG_WARNING, "shifts_sums freed!\n");
    }
}

The out-commented printf() lines are to check if there is a problem if
the av_log print buffer is not flushed already, but this seems not the case.

The definition is:
    int16_t **shifts_sums;
The initialization is:
static int config_props(AVFilterLink *inlink)
{
    [.....]
    if (s->report >= R_SHIFTS) {
        s->shifts_sums = av_malloc((s->lines + 1) *
sizeof(*s->shifts_sums));
        for (int l = s->lines; l >= 0; l--) {
            s->shifts_sums[l] = av_malloc((s->span_r - s->span_l + 1) *
sizeof(**s->shifts_sums));
            memset(s->shifts_sums[l], 0, (s->span_r - s->span_l + 1) *
sizeof(**s->shifts_sums));
        }
    }
}


--
Von meinem Seibert gesendet



More information about the ffmpeg-user mailing list