[FFmpeg-cvslog] r25724 - trunk/libavcodec/vorbis_dec.c

alexc subversion
Fri Nov 12 05:33:26 CET 2010


Author: alexc
Date: Fri Nov 12 05:33:26 2010
New Revision: 25724

Log:
vorbisdec: Fix floor1 decoding

An intermediate value in the floor 1 linear interpolation was 
overflowing
resulting in obvious artifacts on some files.

e.g. 
http://upload.wikimedia.org/wikipedia/commons/7/79/Big_Buck_Bunny_small.ogv

Prior to this fix 87 out of 128 64kbit/s mono files decoded with ffmpeg 
have
lower PEAQ ODG values than the same files decoded with libvorbis. With 
this
fix none of that set have significantly worse ODG values than libvorbis.

Fixes issue 2352

Patch by Gregory Maxwell <greg at xiph.org>

Modified:
   trunk/libavcodec/vorbis_dec.c

Modified: trunk/libavcodec/vorbis_dec.c
==============================================================================
--- trunk/libavcodec/vorbis_dec.c	Thu Nov 11 23:41:22 2010	(r25723)
+++ trunk/libavcodec/vorbis_dec.c	Fri Nov 12 05:33:26 2010	(r25724)
@@ -1146,8 +1146,8 @@ static int vorbis_floor1_decode(vorbis_c
     int_fast16_t book;
     uint_fast16_t offset;
     uint_fast16_t i,j;
-    /*u*/int_fast16_t adx, ady, off, predicted; // WTF ? dy/adx =  (unsigned)dy/adx ?
-    int_fast16_t dy, err;
+    int_fast16_t adx, ady, dx, off, predicted;
+    int_fast32_t err;
 
 
     if (!get_bits1(gb)) // silence
@@ -1210,7 +1210,7 @@ static int vorbis_floor1_decode(vorbis_c
         adx = vf->list[high_neigh_offs].x - vf->list[low_neigh_offs].x;
         ady = FFABS(dy);
         err = ady * (vf->list[i].x - vf->list[low_neigh_offs].x);
-        off = (int16_t)err / (int16_t)adx;
+        off = err / adx;
         if (dy < 0) {
             predicted = floor1_Y_final[low_neigh_offs] - off;
         } else {



More information about the ffmpeg-cvslog mailing list