diff options
author | Luca Barbato <lu_zero@gentoo.org> | 2013-07-09 14:59:33 +0200 |
---|---|---|
committer | Luca Barbato <lu_zero@gentoo.org> | 2013-07-09 15:57:46 +0200 |
commit | 4ecdb5ed44591aba8a0ddb7d443cace836f761f6 (patch) | |
tree | d86aca15118210cda375807e21d6758cd6462c5a | |
parent | adadc3f2443d25b375e21e801516ccfd78e0b080 (diff) | |
download | ffmpeg-4ecdb5ed44591aba8a0ddb7d443cace836f761f6.tar.gz |
qdm2: Conceal broken samples
Reported-by: Mateusz "j00ru" Jurczyk and Gynvael Coldwind
CC: libav-stable@libav.org
-rw-r--r-- | libavcodec/qdm2.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/libavcodec/qdm2.c b/libavcodec/qdm2.c index dcfe621e2b..8d33e26bcc 100644 --- a/libavcodec/qdm2.c +++ b/libavcodec/qdm2.c @@ -525,8 +525,8 @@ static void build_sb_samples_from_noise(QDM2Context *q, int sb) * @param channels number of channels * @param coding_method q->coding_method[0][0][0] */ -static void fix_coding_method_array(int sb, int channels, - sb_int8_array coding_method) +static int fix_coding_method_array(int sb, int channels, + sb_int8_array coding_method) { int j, k; int ch; @@ -534,6 +534,8 @@ static void fix_coding_method_array(int sb, int channels, for (ch = 0; ch < channels; ch++) { for (j = 0; j < 64; ) { + if (coding_method[ch][sb][j] < 8) + return -1; if ((coding_method[ch][sb][j] - 8) > 22) { run = 1; case_val = 8; @@ -579,6 +581,7 @@ static void fix_coding_method_array(int sb, int channels, j += run; } } + return 0; } /** @@ -840,7 +843,11 @@ static void synthfilt_build_sb_samples(QDM2Context *q, GetBitContext *gb, if (q->coding_method[1][sb][j] > q->coding_method[0][sb][j]) q->coding_method[0][sb][j] = q->coding_method[1][sb][j]; - fix_coding_method_array(sb, q->nb_channels, q->coding_method); + if (fix_coding_method_array(sb, q->nb_channels, + q->coding_method)) { + build_sb_samples_from_noise(q, sb); + continue; + } channels = 1; } |