if (avctx->extradata_size < 4)
return -1;
- method = ((uint8_t *) avctx->extradata)[0];
+ method = avctx->extradata[0];
s->decorrelate = method & 64 ? 1 : 0;
s->predictor = method & 63;
- s->bitstream_bpp = avctx->extradata[1];
- if (s->bitstream_bpp == 0)
- s->bitstream_bpp = avctx->bits_per_coded_sample & ~7;
+ if (s->version == 2) {
- s->bitstream_bpp = ((uint8_t *) avctx->extradata)[1];
++ s->bitstream_bpp = avctx->extradata[1];
+ if (s->bitstream_bpp == 0)
+ s->bitstream_bpp = avctx->bits_per_coded_sample & ~7;
+ } else {
+ s->bps = (avctx->extradata[1] >> 4) + 1;
+ s->n = 1<<s->bps;
+ s->vlc_n = FFMIN(s->n, MAX_VLC_N);
+ s->chroma_h_shift = avctx->extradata[1] & 3;
+ s->chroma_v_shift = (avctx->extradata[1] >> 2) & 3;
- s->yuv = !!(((uint8_t *) avctx->extradata)[2] & 1);
- s->chroma= !!(((uint8_t *) avctx->extradata)[2] & 3);
- s->alpha = !!(((uint8_t *) avctx->extradata)[2] & 4);
++ s->yuv = !!(avctx->extradata[2] & 1);
++ s->chroma= !!(avctx->extradata[2] & 3);
++ s->alpha = !!(avctx->extradata[2] & 4);
+ }
- interlace = (((uint8_t *) avctx->extradata)[2] & 0x30) >> 4;
+ interlace = (avctx->extradata[2] & 0x30) >> 4;
s->interlaced = (interlace == 1) ? 1 : (interlace == 2) ? 0 : s->interlaced;
- s->context = ((uint8_t *) avctx->extradata)[2] & 0x40 ? 1 : 0;
+ s->context = avctx->extradata[2] & 0x40 ? 1 : 0;
- if (read_huffman_tables(s, ((uint8_t *) avctx->extradata) + 4,
+ if (read_huffman_tables(s, avctx->extradata + 4,
avctx->extradata_size - 4) < 0)
- return -1;
+ return AVERROR_INVALIDDATA;
} else {
switch (avctx->bits_per_coded_sample & 7) {
case 1:
HYuvContext *s = avctx->priv_data;
int i;
- ff_huffyuv_alloc_temp(s);
+ if (ff_huffyuv_alloc_temp(s)) {
+ ff_huffyuv_common_end(s);
+ return AVERROR(ENOMEM);
+ }
- for (i = 0; i < 6; i++)
+ for (i = 0; i < 8; i++)
s->vlc[i].table = NULL;
- if (s->version == 2) {
+ if (s->version >= 2) {
- if (read_huffman_tables(s, ((uint8_t *) avctx->extradata) + 4,
+ if (read_huffman_tables(s, avctx->extradata + 4,
avctx->extradata_size) < 0)
- return -1;
+ return AVERROR_INVALIDDATA;
} else {
if (read_old_huffman_tables(s) < 0)
- return -1;
+ return AVERROR_INVALIDDATA;
}
return 0;