[FFmpeg-devel] [PATCH] avcodec/dolby_e: Add error recovery when parse_mantissas run out of bits
Nicolas Gaullier
nicolas.gaullier at cji.paris
Wed Sep 14 00:31:27 EEST 2022
Mantissas are the last data in the channel subsegment and it appears it is
sometimes missing a very few bits for the parsing to complete.
This should not be confused with data corruption.
For 5.1+2 at 25fps, the occurence of this issue is pretty steady and about once every 2 hours.
The truncation is at about 950 out of the 1024 values (never seen below 923 so far).
The current code raises a severe 'Read past end' error and all data is lost resulting in
20ms(@25fps) of silence for the affected channel.
This patch introduces a tolerance: if 800 out of the 1024 mantissas have been parsed,
a simple warning is raised and the data is preserved.
Signed-off-by: Nicolas Gaullier <nicolas.gaullier at cji.paris>
---
libavcodec/dolby_e.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/libavcodec/dolby_e.c b/libavcodec/dolby_e.c
index 06f4fdd44f..0ec7b5e318 100644
--- a/libavcodec/dolby_e.c
+++ b/libavcodec/dolby_e.c
@@ -844,6 +844,7 @@ static int parse_indices(DBEContext *s, DBEChannel *c)
return 0;
}
+#define MIN_MANTISSAS 800
static int parse_mantissas(DBEContext *s, DBEChannel *c)
{
DBEGroup *g;
@@ -884,6 +885,13 @@ static int parse_mantissas(DBEContext *s, DBEChannel *c)
}
}
} else {
+ if (i == c->nb_groups - 1
+ && count * size1 > get_bits_left(&s->gb)
+ && get_bits_left(&s->gb) >= 0
+ && (int)(mnt - c->mantissas) >= MIN_MANTISSAS) {
+ av_log(s->avctx, AV_LOG_WARNING, "Truncated mantissas @%d, highest frequencies not recoverable\n", (int)(mnt - c->mantissas));
+ break;
+ }
for (k = 0; k < count; k++)
mnt[k] = get_sbits(&s->gb, size1) * scale;
}
--
2.11.0
More information about the ffmpeg-devel
mailing list