Browse code

lavc: fix bitshifts amount bigger than the type

CC: libav-stable@libav.org
Bug-Id: CID 1194387 / CID 1194389 / CID 1194393 / CID 1206638

Vittorio Giovara authored on 2014/11/17 08:22:27
Showing 5 changed files
... ...
@@ -30,6 +30,7 @@
30 30
 #include "golomb.h"
31 31
 #include "h264chroma.h"
32 32
 #include "idctdsp.h"
33
+#include "internal.h"
33 34
 #include "mathops.h"
34 35
 #include "qpeldsp.h"
35 36
 #include "cavs.h"
... ...
@@ -529,8 +530,8 @@ static inline void scale_mv(AVSContext *h, int *d_x, int *d_y,
529 529
 {
530 530
     int den = h->scale_den[src->ref];
531 531
 
532
-    *d_x = (src->x * distp * den + 256 + (src->x >> 31)) >> 9;
533
-    *d_y = (src->y * distp * den + 256 + (src->y >> 31)) >> 9;
532
+    *d_x = (src->x * distp * den + 256 + FF_SIGNBIT(src->x)) >> 9;
533
+    *d_y = (src->y * distp * den + 256 + FF_SIGNBIT(src->y)) >> 9;
534 534
 }
535 535
 
536 536
 static inline void mv_pred_median(AVSContext *h,
... ...
@@ -473,7 +473,7 @@ static inline void mv_pred_direct(AVSContext *h, cavs_vector *pmv_fw,
473 473
 {
474 474
     cavs_vector *pmv_bw = pmv_fw + MV_BWD_OFFS;
475 475
     int den = h->direct_den[col_mv->ref];
476
-    int m = col_mv->x >> 31;
476
+    int m = FF_SIGNBIT(col_mv->x);
477 477
 
478 478
     pmv_fw->dist = h->dist[1];
479 479
     pmv_bw->dist = h->dist[0];
... ...
@@ -482,7 +482,7 @@ static inline void mv_pred_direct(AVSContext *h, cavs_vector *pmv_fw,
482 482
     /* scale the co-located motion vector according to its temporal span */
483 483
     pmv_fw->x =     (((den + (den * col_mv->x * pmv_fw->dist ^ m) - m - 1) >> 14) ^ m) - m;
484 484
     pmv_bw->x = m - (((den + (den * col_mv->x * pmv_bw->dist ^ m) - m - 1) >> 14) ^ m);
485
-    m = col_mv->y >> 31;
485
+    m = FF_SIGNBIT(col_mv->y);
486 486
     pmv_fw->y =     (((den + (den * col_mv->y * pmv_fw->dist ^ m) - m - 1) >> 14) ^ m) - m;
487 487
     pmv_bw->y = m - (((den + (den * col_mv->y * pmv_bw->dist ^ m) - m - 1) >> 14) ^ m);
488 488
 }
... ...
@@ -108,7 +108,7 @@ static int dnxhd_10bit_dct_quantize(MpegEncContext *ctx, int16_t *block,
108 108
 
109 109
     for (i = 1; i < 64; ++i) {
110 110
         int j = scantable[i];
111
-        int sign = block[j] >> 31;
111
+        int sign = FF_SIGNBIT(block[j]);
112 112
         int level = (block[j] ^ sign) - sign;
113 113
         level = level * qmat[j] >> DNX10BIT_QMAT_SHIFT;
114 114
         block[j] = (level ^ sign) - sign;
... ...
@@ -35,6 +35,8 @@
35 35
 
36 36
 #define FF_SANE_NB_CHANNELS 63U
37 37
 
38
+#define FF_SIGNBIT(x) (x >> CHAR_BIT * sizeof(x) - 1)
39
+
38 40
 typedef struct FramePool {
39 41
     /**
40 42
      * Pools for each data plane. For audio all the planes have the same size,
... ...
@@ -1883,8 +1883,8 @@ void inter_predict(VP8Context *s, VP8ThreadData *td, uint8_t *dst[3],
1883 1883
                          mb->bmv[2 * y       * 4 + 2 * x + 1].y +
1884 1884
                          mb->bmv[(2 * y + 1) * 4 + 2 * x    ].y +
1885 1885
                          mb->bmv[(2 * y + 1) * 4 + 2 * x + 1].y;
1886
-                uvmv.x = (uvmv.x + 2 + (uvmv.x >> (INT_BIT - 1))) >> 2;
1887
-                uvmv.y = (uvmv.y + 2 + (uvmv.y >> (INT_BIT - 1))) >> 2;
1886
+                uvmv.x = (uvmv.x + 2 + FF_SIGNBIT(uvmv.x)) >> 2;
1887
+                uvmv.y = (uvmv.y + 2 + FF_SIGNBIT(uvmv.y)) >> 2;
1888 1888
                 if (s->profile == 3) {
1889 1889
                     uvmv.x &= ~7;
1890 1890
                     uvmv.y &= ~7;