aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2020-09-23 06:42:24 +0200
committerAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2020-09-26 20:38:30 +0200
commitbf31b451559323776daa59003edbe9cbeed5bd91 (patch)
treefc066a1de3790d899be1138b5fc6044ca93004bd
parent3c172a2fb91a758d9e15f09f96879e6e9b5a37ec (diff)
downloadffmpeg-bf31b451559323776daa59003edbe9cbeed5bd91.tar.gz
avcodec/magicyuv: Don't use GetBit API for byte-aligned reads
Reviewed-by: Paul B Mahol <onemda@gmail.com> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
-rw-r--r--libavcodec/magicyuv.c45
1 files changed, 22 insertions, 23 deletions
diff --git a/libavcodec/magicyuv.c b/libavcodec/magicyuv.c
index 6c29efc9f4..f7dfef0eb8 100644
--- a/libavcodec/magicyuv.c
+++ b/libavcodec/magicyuv.c
@@ -270,27 +270,26 @@ static int magy_decode_slice(AVCodecContext *avctx, void *tdata,
int sheight = AV_CEIL_RSHIFT(s->slice_height, s->vshift[i]);
ptrdiff_t fake_stride = p->linesize[i] * (1 + interlaced);
ptrdiff_t stride = p->linesize[i];
+ const uint8_t *slice = s->buf + s->slices[i][j].start;
int flags, pred;
- int ret = init_get_bits8(&gb, s->buf + s->slices[i][j].start,
- s->slices[i][j].size);
-
- if (ret < 0)
- return ret;
- flags = get_bits(&gb, 8);
- pred = get_bits(&gb, 8);
+ flags = bytestream_get_byte(&slice);
+ pred = bytestream_get_byte(&slice);
dst = p->data[i] + j * sheight * stride;
if (flags & 1) {
- if (get_bits_left(&gb) < 8* width * height)
+ if (s->slices[i][j].size - 2 < width * height)
return AVERROR_INVALIDDATA;
for (k = 0; k < height; k++) {
- for (x = 0; x < width; x++)
- dst[x] = get_bits(&gb, 8);
-
+ bytestream_get_buffer(&slice, dst, width);
dst += stride;
}
} else {
+ int ret = init_get_bits8(&gb, slice, s->slices[i][j].size - 2);
+
+ if (ret < 0)
+ return ret;
+
for (k = 0; k < height; k++) {
for (x = 0; x < width; x++) {
int pix;
@@ -385,21 +384,25 @@ static int magy_decode_slice(AVCodecContext *avctx, void *tdata,
return 0;
}
-static int build_huffman(AVCodecContext *avctx, GetBitContext *gbit, int max)
+static int build_huffman(AVCodecContext *avctx, const uint8_t *table,
+ int table_size, int max)
{
MagicYUVContext *s = avctx->priv_data;
+ GetByteContext gb;
HuffEntry he[4096];
int i = 0, j = 0, k;
- while (get_bits_left(gbit) >= 8) {
- int b = get_bits(gbit, 1);
- int x = get_bits(gbit, 7);
+ bytestream2_init(&gb, table, table_size);
+
+ while (bytestream2_get_bytes_left(&gb) > 0) {
+ int b = bytestream2_peek_byteu(&gb) & 0x80;
+ int x = bytestream2_get_byteu(&gb) & ~0x80;
int l = 1;
if (b) {
- if (get_bits_left(gbit) < 8)
+ if (bytestream2_get_bytes_left(&gb) <= 0)
break;
- l += get_bits(gbit, 8);
+ l += bytestream2_get_byteu(&gb);
}
k = j + l;
if (k > max || x == 0 || x > 32) {
@@ -440,7 +443,6 @@ static int magy_decode_frame(AVCodecContext *avctx, void *data,
ThreadFrame frame = { .f = data };
AVFrame *p = data;
GetByteContext gbyte;
- GetBitContext gbit;
uint32_t first_offset, offset, next_offset, header_size, slice_width;
int width, height, format, version, table_size;
int ret, i, j;
@@ -632,11 +634,8 @@ static int magy_decode_frame(AVCodecContext *avctx, void *data,
if (table_size < 2)
return AVERROR_INVALIDDATA;
- ret = init_get_bits8(&gbit, avpkt->data + bytestream2_tell(&gbyte), table_size);
- if (ret < 0)
- return ret;
-
- ret = build_huffman(avctx, &gbit, s->max);
+ ret = build_huffman(avctx, avpkt->data + bytestream2_tell(&gbyte),
+ table_size, s->max);
if (ret < 0)
return ret;