apedec: fix signed integer overflows
authorMans Rullgard <mans@mansr.com>
Fri, 25 Nov 2011 18:46:35 +0000 (18:46 +0000)
committerMans Rullgard <mans@mansr.com>
Sat, 26 Nov 2011 11:38:41 +0000 (11:38 +0000)
This bit manipulation is equivalent but avoids undefined
shifts and overflows.

Signed-off-by: Mans Rullgard <mans@mansr.com>
libavcodec/apedec.c

index 6c3d29e..7702b29 100644 (file)
@@ -690,7 +690,7 @@ static void do_apply_filter(APEContext *ctx, int version, APEFilter *f,
             /* Update the adaption coefficients */
             absres = FFABS(res);
             if (absres)
-                *f->adaptcoeffs = ((res & (1<<31)) - (1<<30)) >>
+                *f->adaptcoeffs = ((res & (-1<<31)) ^ (-1<<30)) >>
                                   (25 + (absres <= f->avg*3) + (absres <= f->avg*4/3));
             else
                 *f->adaptcoeffs = 0;