And make sure to check INTER_BLOCK as had been fixed by Michael
Niedermayer.
Reported-By: Andreas Cadhalpun
CC: libav-stable@libav.org
... | ... |
@@ -944,15 +944,32 @@ static int binkb_decode_plane(BinkContext *c, AVFrame *frame, GetBitContext *gb, |
944 | 944 |
return 0; |
945 | 945 |
} |
946 | 946 |
|
947 |
+static int bink_put_pixels(BinkContext *c, |
|
948 |
+ uint8_t *dst, uint8_t *prev, int stride, |
|
949 |
+ uint8_t *ref_start, |
|
950 |
+ uint8_t *ref_end) |
|
951 |
+{ |
|
952 |
+ int xoff = get_value(c, BINK_SRC_X_OFF); |
|
953 |
+ int yoff = get_value(c, BINK_SRC_Y_OFF); |
|
954 |
+ uint8_t *ref = prev + xoff + yoff * stride; |
|
955 |
+ if (ref < ref_start || ref > ref_end) { |
|
956 |
+ av_log(c->avctx, AV_LOG_ERROR, "Copy out of bounds @%d, %d\n", |
|
957 |
+ xoff, yoff); |
|
958 |
+ return AVERROR_INVALIDDATA; |
|
959 |
+ } |
|
960 |
+ c->hdsp.put_pixels_tab[1][0](dst, ref, stride, 8); |
|
961 |
+ |
|
962 |
+ return 0; |
|
963 |
+} |
|
964 |
+ |
|
947 | 965 |
static int bink_decode_plane(BinkContext *c, AVFrame *frame, GetBitContext *gb, |
948 | 966 |
int plane_idx, int is_chroma) |
949 | 967 |
{ |
950 | 968 |
int blk, ret; |
951 | 969 |
int i, j, bx, by; |
952 |
- uint8_t *dst, *prev, *ref, *ref_start, *ref_end; |
|
970 |
+ uint8_t *dst, *prev, *ref_start, *ref_end; |
|
953 | 971 |
int v, col[2]; |
954 | 972 |
const uint8_t *scan; |
955 |
- int xoff, yoff; |
|
956 | 973 |
LOCAL_ALIGNED_16(int16_t, block, [64]); |
957 | 974 |
LOCAL_ALIGNED_16(uint8_t, ublock, [64]); |
958 | 975 |
LOCAL_ALIGNED_16(int32_t, dctblock, [64]); |
... | ... |
@@ -1074,15 +1091,10 @@ static int bink_decode_plane(BinkContext *c, AVFrame *frame, GetBitContext *gb, |
1074 | 1074 |
prev += 8; |
1075 | 1075 |
break; |
1076 | 1076 |
case MOTION_BLOCK: |
1077 |
- xoff = get_value(c, BINK_SRC_X_OFF); |
|
1078 |
- yoff = get_value(c, BINK_SRC_Y_OFF); |
|
1079 |
- ref = prev + xoff + yoff * stride; |
|
1080 |
- if (ref < ref_start || ref > ref_end) { |
|
1081 |
- av_log(c->avctx, AV_LOG_ERROR, "Copy out of bounds @%d, %d\n", |
|
1082 |
- bx*8 + xoff, by*8 + yoff); |
|
1083 |
- return AVERROR_INVALIDDATA; |
|
1084 |
- } |
|
1085 |
- c->hdsp.put_pixels_tab[1][0](dst, ref, stride, 8); |
|
1077 |
+ ret = bink_put_pixels(c, dst, prev, stride, |
|
1078 |
+ ref_start, ref_end); |
|
1079 |
+ if (ret < 0) |
|
1080 |
+ return ret; |
|
1086 | 1081 |
break; |
1087 | 1082 |
case RUN_BLOCK: |
1088 | 1083 |
scan = bink_patterns[get_bits(gb, 4)]; |
... | ... |
@@ -1108,15 +1120,10 @@ static int bink_decode_plane(BinkContext *c, AVFrame *frame, GetBitContext *gb, |
1108 | 1108 |
dst[coordmap[*scan++]] = get_value(c, BINK_SRC_COLORS); |
1109 | 1109 |
break; |
1110 | 1110 |
case RESIDUE_BLOCK: |
1111 |
- xoff = get_value(c, BINK_SRC_X_OFF); |
|
1112 |
- yoff = get_value(c, BINK_SRC_Y_OFF); |
|
1113 |
- ref = prev + xoff + yoff * stride; |
|
1114 |
- if (ref < ref_start || ref > ref_end) { |
|
1115 |
- av_log(c->avctx, AV_LOG_ERROR, "Copy out of bounds @%d, %d\n", |
|
1116 |
- bx*8 + xoff, by*8 + yoff); |
|
1117 |
- return AVERROR_INVALIDDATA; |
|
1118 |
- } |
|
1119 |
- c->hdsp.put_pixels_tab[1][0](dst, ref, stride, 8); |
|
1111 |
+ ret = bink_put_pixels(c, dst, prev, stride, |
|
1112 |
+ ref_start, ref_end); |
|
1113 |
+ if (ret < 0) |
|
1114 |
+ return ret; |
|
1120 | 1115 |
c->bdsp.clear_block(block); |
1121 | 1116 |
v = get_bits(gb, 7); |
1122 | 1117 |
read_residue(gb, block, v); |
... | ... |
@@ -1133,10 +1140,10 @@ static int bink_decode_plane(BinkContext *c, AVFrame *frame, GetBitContext *gb, |
1133 | 1133 |
c->bdsp.fill_block_tab[1](dst, v, stride, 8); |
1134 | 1134 |
break; |
1135 | 1135 |
case INTER_BLOCK: |
1136 |
- xoff = get_value(c, BINK_SRC_X_OFF); |
|
1137 |
- yoff = get_value(c, BINK_SRC_Y_OFF); |
|
1138 |
- ref = prev + xoff + yoff * stride; |
|
1139 |
- c->hdsp.put_pixels_tab[1][0](dst, ref, stride, 8); |
|
1136 |
+ ret = bink_put_pixels(c, dst, prev, stride, |
|
1137 |
+ ref_start, ref_end); |
|
1138 |
+ if (ret < 0) |
|
1139 |
+ return ret; |
|
1140 | 1140 |
memset(dctblock, 0, sizeof(*dctblock) * 64); |
1141 | 1141 |
dctblock[0] = get_value(c, BINK_SRC_INTER_DC); |
1142 | 1142 |
read_dct_coeffs(gb, dctblock, bink_scan, bink_inter_quant, -1); |