[FFmpeg-cvslog] Do not try to read residue if ave_mean <= 1

Mashiat Sarker Shakkhar git at videolan.org
Thu Feb 16 04:17:05 CET 2012


ffmpeg | branch: master | Mashiat Sarker Shakkhar <shahriman_ams at yahoo.com> | Thu Feb 16 02:11:17 2012 +0600| [d1ea26f6407e8bf52da1e36a99c4d9bbb14fb1fb] | committer: Mashiat Sarker Shakkhar

Do not try to read residue if ave_mean <= 1

Otherwise, we end up with with log(0) or log(1). av_ceil_log2 simply
assumes the argument is non-zero and returns wrong result when it is.
(Not that there is a proper way of returning an undefined value.)

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=d1ea26f6407e8bf52da1e36a99c4d9bbb14fb1fb
---

 libavcodec/wmalosslessdec.c |   11 ++++++++---
 1 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/libavcodec/wmalosslessdec.c b/libavcodec/wmalosslessdec.c
index 9b32e7e..9b54abf 100644
--- a/libavcodec/wmalosslessdec.c
+++ b/libavcodec/wmalosslessdec.c
@@ -715,9 +715,14 @@ static int decode_channel_residues(WmallDecodeCtx *s, int ch, int tile_size)
 	    quo += get_bits_long(&s->gb, get_bits(&s->gb, 5) + 1);
 
        	ave_mean = (s->ave_sum[ch] + (1 << s->movave_scaling)) >> (s->movave_scaling + 1);
-	rem_bits = av_ceil_log2(ave_mean);
-	rem = rem_bits ? get_bits(&s->gb, rem_bits) : 0;
-	residue = (quo << rem_bits) + rem;
+    if (ave_mean <= 1)
+        residue = quo;
+    else
+    {
+        rem_bits = av_ceil_log2(ave_mean);
+        rem = rem_bits ? get_bits(&s->gb, rem_bits) : 0;
+        residue = (quo << rem_bits) + rem;
+    }
 
 	s->ave_sum[ch] = residue + s->ave_sum[ch] - (s->ave_sum[ch] >> s->movave_scaling);
 



More information about the ffmpeg-cvslog mailing list