提交 85dc006b 编写于 作者: V Vittorio Giovara

lavc: fix bitshifts amount bigger than the type

CC: libav-stable@libav.org
Bug-Id: CID 1194387 / CID 1194389 / CID 1194393 / CID 1206638
上级 771656bd
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include "golomb.h" #include "golomb.h"
#include "h264chroma.h" #include "h264chroma.h"
#include "idctdsp.h" #include "idctdsp.h"
#include "internal.h"
#include "mathops.h" #include "mathops.h"
#include "qpeldsp.h" #include "qpeldsp.h"
#include "cavs.h" #include "cavs.h"
...@@ -529,8 +530,8 @@ static inline void scale_mv(AVSContext *h, int *d_x, int *d_y, ...@@ -529,8 +530,8 @@ static inline void scale_mv(AVSContext *h, int *d_x, int *d_y,
{ {
int den = h->scale_den[src->ref]; int den = h->scale_den[src->ref];
*d_x = (src->x * distp * den + 256 + (src->x >> 31)) >> 9; *d_x = (src->x * distp * den + 256 + FF_SIGNBIT(src->x)) >> 9;
*d_y = (src->y * distp * den + 256 + (src->y >> 31)) >> 9; *d_y = (src->y * distp * den + 256 + FF_SIGNBIT(src->y)) >> 9;
} }
static inline void mv_pred_median(AVSContext *h, 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,7 +473,7 @@ static inline void mv_pred_direct(AVSContext *h, cavs_vector *pmv_fw,
{ {
cavs_vector *pmv_bw = pmv_fw + MV_BWD_OFFS; cavs_vector *pmv_bw = pmv_fw + MV_BWD_OFFS;
int den = h->direct_den[col_mv->ref]; int den = h->direct_den[col_mv->ref];
int m = col_mv->x >> 31; int m = FF_SIGNBIT(col_mv->x);
pmv_fw->dist = h->dist[1]; pmv_fw->dist = h->dist[1];
pmv_bw->dist = h->dist[0]; pmv_bw->dist = h->dist[0];
...@@ -482,7 +482,7 @@ static inline void mv_pred_direct(AVSContext *h, cavs_vector *pmv_fw, ...@@ -482,7 +482,7 @@ static inline void mv_pred_direct(AVSContext *h, cavs_vector *pmv_fw,
/* scale the co-located motion vector according to its temporal span */ /* scale the co-located motion vector according to its temporal span */
pmv_fw->x = (((den + (den * col_mv->x * pmv_fw->dist ^ m) - m - 1) >> 14) ^ m) - m; pmv_fw->x = (((den + (den * col_mv->x * pmv_fw->dist ^ m) - m - 1) >> 14) ^ m) - m;
pmv_bw->x = m - (((den + (den * col_mv->x * pmv_bw->dist ^ m) - m - 1) >> 14) ^ m); pmv_bw->x = m - (((den + (den * col_mv->x * pmv_bw->dist ^ m) - m - 1) >> 14) ^ m);
m = col_mv->y >> 31; m = FF_SIGNBIT(col_mv->y);
pmv_fw->y = (((den + (den * col_mv->y * pmv_fw->dist ^ m) - m - 1) >> 14) ^ m) - m; pmv_fw->y = (((den + (den * col_mv->y * pmv_fw->dist ^ m) - m - 1) >> 14) ^ m) - m;
pmv_bw->y = m - (((den + (den * col_mv->y * pmv_bw->dist ^ m) - m - 1) >> 14) ^ m); pmv_bw->y = m - (((den + (den * col_mv->y * pmv_bw->dist ^ m) - m - 1) >> 14) ^ m);
} }
......
...@@ -108,7 +108,7 @@ static int dnxhd_10bit_dct_quantize(MpegEncContext *ctx, int16_t *block, ...@@ -108,7 +108,7 @@ static int dnxhd_10bit_dct_quantize(MpegEncContext *ctx, int16_t *block,
for (i = 1; i < 64; ++i) { for (i = 1; i < 64; ++i) {
int j = scantable[i]; int j = scantable[i];
int sign = block[j] >> 31; int sign = FF_SIGNBIT(block[j]);
int level = (block[j] ^ sign) - sign; int level = (block[j] ^ sign) - sign;
level = level * qmat[j] >> DNX10BIT_QMAT_SHIFT; level = level * qmat[j] >> DNX10BIT_QMAT_SHIFT;
block[j] = (level ^ sign) - sign; block[j] = (level ^ sign) - sign;
......
...@@ -35,6 +35,8 @@ ...@@ -35,6 +35,8 @@
#define FF_SANE_NB_CHANNELS 63U #define FF_SANE_NB_CHANNELS 63U
#define FF_SIGNBIT(x) (x >> CHAR_BIT * sizeof(x) - 1)
typedef struct FramePool { typedef struct FramePool {
/** /**
* Pools for each data plane. For audio all the planes have the same size, * 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,8 +1883,8 @@ void inter_predict(VP8Context *s, VP8ThreadData *td, uint8_t *dst[3],
mb->bmv[2 * y * 4 + 2 * x + 1].y + mb->bmv[2 * y * 4 + 2 * x + 1].y +
mb->bmv[(2 * y + 1) * 4 + 2 * x ].y + mb->bmv[(2 * y + 1) * 4 + 2 * x ].y +
mb->bmv[(2 * y + 1) * 4 + 2 * x + 1].y; mb->bmv[(2 * y + 1) * 4 + 2 * x + 1].y;
uvmv.x = (uvmv.x + 2 + (uvmv.x >> (INT_BIT - 1))) >> 2; uvmv.x = (uvmv.x + 2 + FF_SIGNBIT(uvmv.x)) >> 2;
uvmv.y = (uvmv.y + 2 + (uvmv.y >> (INT_BIT - 1))) >> 2; uvmv.y = (uvmv.y + 2 + FF_SIGNBIT(uvmv.y)) >> 2;
if (s->profile == 3) { if (s->profile == 3) {
uvmv.x &= ~7; uvmv.x &= ~7;
uvmv.y &= ~7; uvmv.y &= ~7;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册