#define CHECKPOINT(x) \
do { \
if (state == 0) { \
+ if (bytestream2_get_bytes_left(gbc) < 4) \
+ return AVERROR_INVALIDDATA; \
value = bytestream2_get_le32(gbc); \
state = 16; \
} \
static int get_opcodes(GetByteContext *gb, uint32_t *table, uint8_t *dst, int op_size, int nb_elements)
{
OpcodeTable optable[1024];
- int sum, x, val, lshift, rshift, ret, size_in_bits, i, idx;
+ int sum, x, val, lshift, rshift, ret, i, idx;
+ int64_t size_in_bits;
unsigned endoffset, newoffset, offset;
unsigned next;
uint8_t *src = (uint8_t *)gb->buffer;
int skip0, skip1, oi0 = 0, oi1 = 0;
int ret, state0 = 0, state1 = 0;
+ if (op_offset < 12 || op_offset - 12 > bytestream2_get_bytes_left(gb))
+ return AVERROR_INVALIDDATA;
+
dst = tex_data;
bytestream2_skip(gb, op_offset - 12);
if (op_size0 > max_op_size0)
skip0 = dxv_decompress_opcodes(gb, op_data0, op_size0);
if (skip0 < 0)
return skip0;
- bytestream2_seek(gb, data_start + op_offset + skip0 - 12, SEEK_SET);
if (op_size1 > max_op_size1)
return AVERROR_INVALIDDATA;
skip1 = dxv_decompress_opcodes(gb, op_data1, op_size1);
return ret;
}
- bytestream2_seek(gb, data_start + op_offset + skip0 + skip1 - 12, SEEK_SET);
+ bytestream2_seek(gb, data_start - 12 + op_offset + skip0 + skip1, SEEK_SET);
return 0;
}
uint8_t *dst, *table0[256] = { 0 }, *table1[256] = { 0 };
int ret, state = 0, skip, oi = 0, v, vv;
+ if (op_offset < 8 || op_offset - 8 > bytestream2_get_bytes_left(gb))
+ return AVERROR_INVALIDDATA;
+
dst = tex_data;
bytestream2_skip(gb, op_offset - 8);
if (op_size > max_op_size)
{
DXVContext *ctx = avctx->priv_data;
GetByteContext *gbc = &ctx->gbc;
- uint32_t value, op;
- int idx, prev, state = 0;
+ uint32_t value, op, prev;
+ int idx, state = 0;
int pos = 4;
int run = 0;
int probe, check;
avctx->pix_fmt = AV_PIX_FMT_RGBA;
avctx->colorspace = AVCOL_SPC_RGB;
+ ctx->tex_funct = NULL;
+ ctx->tex_funct_planar[0] = NULL;
+ ctx->tex_funct_planar[1] = NULL;
+
tag = bytestream2_get_le32(gbc);
switch (tag) {
case MKBETAG('D', 'X', 'T', '1'):
return 0;
}
-AVCodec ff_dxv_decoder = {
+const AVCodec ff_dxv_decoder = {
.name = "dxv",
.long_name = NULL_IF_CONFIG_SMALL("Resolume DXV"),
.type = AVMEDIA_TYPE_VIDEO,