[FFmpeg-user] How to correctly free a double-linked list
Ulf Zibis
Ulf.Zibis at gmx.de
Sun Jul 7 14:46:47 EEST 2019
Am 07.07.19 um 12:42 schrieb Ulf Zibis:
> 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));
> }
> }
> }
Now I have added an additional log here:
for (int l = 0; l <= s->lines; l++) {
av_log(ctx, AV_LOG_WARNING, "freeing line %d ...\n", l);
av_freep(&(s->shifts_sums[l]));
}
Sometimes I now get (there are 10 lines existing):
[Parsed_lineshiftrecover_0 @ 0x560c176b6e80] start freeing memory ...
[Parsed_lineshiftrecover_0 @ 0x560c176b6e80] filler and shifts freed!
[Parsed_lineshiftrecover_0 @ 0x560c176b6e80] now start freeing
shifts_sums ...
[Parsed_lineshiftrecover_0 @ 0x560c176b6e80] freeing line 0 ...
[Parsed_lineshiftrecover_0 @ 0x560c176b6e80] freeing line 1 ...
[Parsed_lineshiftrecover_0 @ 0x560c176b6e80] freeing line 2 ...
[Parsed_lineshiftrecover_0 @ 0x560c176b6e80] freeing line 3 ...
corrupted double-linked list
debug/lineshiftrecover.sh: Zeile 99: 16389 Abgebrochen
(Speicherabzug geschrieben) ./ffmpeg -y -v warning -i debug/$sample -vf
lineshiftrecover${options[o]} -q 5 $output
... but sometimes only:
[Parsed_lineshiftrecover_0 @ 0x560c176b6e80] start freeing memory ...
corrupted double-linked list
debug/lineshiftrecover.sh: Zeile 99: 16389 Abgebrochen
(Speicherabzug geschrieben) ./ffmpeg -y -v warning -i debug/$sample -vf
lineshiftrecover${options[o]} -q 5 $output
Weird random result! I don't get a clue whats the cause for the error.
Please help,
-Ulf
More information about the ffmpeg-user
mailing list