HapContext *ctx = avctx->priv_data;
ThreadFrame tframe;
int ret, i;
+ int tex_size;
bytestream2_init(&ctx->gbc, avpkt->data, avpkt->size);
if (hap_can_use_tex_in_place(ctx)) {
/* Only DXTC texture compression in a contiguous block */
ctx->tex_data = ctx->gbc.buffer;
+ tex_size = bytestream2_get_bytes_left(&ctx->gbc);
} else {
/* Perform the second-stage decompression */
ret = av_reallocp(&ctx->tex_buf, ctx->tex_size);
}
ctx->tex_data = ctx->tex_buf;
+ tex_size = ctx->tex_size;
+ }
+
+ if (tex_size < (avctx->coded_width / TEXTURE_BLOCK_W)
+ *(avctx->coded_height / TEXTURE_BLOCK_H)
+ *ctx->tex_rat) {
+ av_log(avctx, AV_LOG_ERROR, "Insufficient data\n");
+ return AVERROR_INVALIDDATA;
}
/* Use the decompress function on the texture, one block per thread */
.decode = hap_decode,
.close = hap_close,
.priv_data_size = sizeof(HapContext),
- .capabilities = CODEC_CAP_FRAME_THREADS | CODEC_CAP_SLICE_THREADS |
- CODEC_CAP_DR1,
+ .capabilities = AV_CODEC_CAP_FRAME_THREADS | AV_CODEC_CAP_SLICE_THREADS |
+ AV_CODEC_CAP_DR1,
.caps_internal = FF_CODEC_CAP_INIT_THREADSAFE |
FF_CODEC_CAP_INIT_CLEANUP,
};