summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libavcodec/av1dec.c40
1 files changed, 20 insertions, 20 deletions
diff --git a/libavcodec/av1dec.c b/libavcodec/av1dec.c
index cb46801202..0bb04a3e44 100644
--- a/libavcodec/av1dec.c
+++ b/libavcodec/av1dec.c
@@ -21,7 +21,7 @@
#include "libavutil/pixdesc.h"
#include "avcodec.h"
#include "av1dec.h"
-#include "get_bits.h"
+#include "bytestream.h"
#include "hwconfig.h"
#include "internal.h"
#include "profiles.h"
@@ -205,18 +205,12 @@ static int init_tile_data(AV1DecContext *s)
static int get_tiles_info(AVCodecContext *avctx, const AV1RawTileGroup *tile_group)
{
AV1DecContext *s = avctx->priv_data;
- GetBitContext gb;
+ GetByteContext gb;
uint16_t tile_num, tile_row, tile_col;
- uint32_t size = 0, size_bytes = 0, offset = 0;
- int ret;
-
- if ((ret = init_get_bits8(&gb,
- tile_group->tile_data.data,
- tile_group->tile_data.data_size)) < 0) {
- av_log(avctx, AV_LOG_ERROR, "Failed to initialize bitstream reader.\n");
- return ret;
- }
+ uint32_t size = 0, size_bytes = 0;
+ bytestream2_init(&gb, tile_group->tile_data.data,
+ tile_group->tile_data.data_size);
s->tg_start = tile_group->tg_start;
s->tg_end = tile_group->tg_end;
@@ -225,24 +219,28 @@ static int get_tiles_info(AVCodecContext *avctx, const AV1RawTileGroup *tile_gro
tile_col = tile_num % s->raw_frame_header->tile_cols;
if (tile_num == tile_group->tg_end) {
- s->tile_group_info[tile_num].tile_size = get_bits_left(&gb) / 8;
- s->tile_group_info[tile_num].tile_offset = offset;
+ s->tile_group_info[tile_num].tile_size = bytestream2_get_bytes_left(&gb);
+ s->tile_group_info[tile_num].tile_offset = bytestream2_tell(&gb);
s->tile_group_info[tile_num].tile_row = tile_row;
s->tile_group_info[tile_num].tile_column = tile_col;
return 0;
}
size_bytes = s->raw_frame_header->tile_size_bytes_minus1 + 1;
- size = get_bits_le(&gb, size_bytes * 8) + 1;
- skip_bits(&gb, size * 8);
-
- offset += size_bytes;
+ if (bytestream2_get_bytes_left(&gb) < size_bytes)
+ return AVERROR_INVALIDDATA;
+ size = 0;
+ for (int i = 0; i < size_bytes; i++)
+ size |= bytestream2_get_byteu(&gb) << 8 * i;
+ if (bytestream2_get_bytes_left(&gb) <= size)
+ return AVERROR_INVALIDDATA;
+ size++;
s->tile_group_info[tile_num].tile_size = size;
- s->tile_group_info[tile_num].tile_offset = offset;
+ s->tile_group_info[tile_num].tile_offset = bytestream2_tell(&gb);
s->tile_group_info[tile_num].tile_row = tile_row;
s->tile_group_info[tile_num].tile_column = tile_col;
- offset += size;
+ bytestream2_skipu(&gb, size);
}
return 0;
@@ -778,7 +776,9 @@ static int av1_decode_frame(AVCodecContext *avctx, void *frame,
else
raw_tile_group = &obu->obu.tile_group;
- get_tiles_info(avctx, raw_tile_group);
+ ret = get_tiles_info(avctx, raw_tile_group);
+ if (ret < 0)
+ goto end;
if (avctx->hwaccel) {
ret = avctx->hwaccel->decode_slice(avctx,