LUT8(4), LUT8(5), LUT8(6), LUT8(7),
};
-#define LUT32(plane) { \
- 0, 0, 0, 0, \
- 0, 0, 0, 1 << plane, \
- 0, 0, 1 << plane, 0, \
- 0, 0, 1 << plane, 1 << plane, \
- 0, 1 << plane, 0, 0, \
- 0, 1 << plane, 0, 1 << plane, \
- 0, 1 << plane, 1 << plane, 0, \
- 0, 1 << plane, 1 << plane, 1 << plane, \
- 1 << plane, 0, 0, 0, \
- 1 << plane, 0, 0, 1 << plane, \
- 1 << plane, 0, 1 << plane, 0, \
- 1 << plane, 0, 1 << plane, 1 << plane, \
- 1 << plane, 1 << plane, 0, 0, \
- 1 << plane, 1 << plane, 0, 1 << plane, \
- 1 << plane, 1 << plane, 1 << plane, 0, \
- 1 << plane, 1 << plane, 1 << plane, 1 << plane, \
+#define LUT32(plane) { \
+ 0, 0, 0, 0, \
+ 0, 0, 0, 1U << plane, \
+ 0, 0, 1U << plane, 0, \
+ 0, 0, 1U << plane, 1U << plane, \
+ 0, 1U << plane, 0, 0, \
+ 0, 1U << plane, 0, 1U << plane, \
+ 0, 1U << plane, 1U << plane, 0, \
+ 0, 1U << plane, 1U << plane, 1U << plane, \
+ 1U << plane, 0, 0, 0, \
+ 1U << plane, 0, 0, 1U << plane, \
+ 1U << plane, 0, 1U << plane, 0, \
+ 1U << plane, 0, 1U << plane, 1U << plane, \
+ 1U << plane, 1U << plane, 0, 0, \
+ 1U << plane, 1U << plane, 0, 1U << plane, \
+ 1U << plane, 1U << plane, 1U << plane, 0, \
+ 1U << plane, 1U << plane, 1U << plane, 1U << plane, \
}
// 32 planes * 4-bit mask * 4 lookup tables each
pal[i] = 0xFF000000 | gray2rgb((i * 255) >> avctx->bits_per_coded_sample);
}
if (s->masking == MASK_HAS_MASK) {
+ if ((1 << avctx->bits_per_coded_sample) < count) {
+ avpriv_request_sample(avctx, "overlapping mask");
+ return AVERROR_PATCHWELCOME;
+ }
memcpy(pal + (1 << avctx->bits_per_coded_sample), pal, count * 4);
for (i = 0; i < count; i++)
pal[i] &= 0xFFFFFF;
for (i = 0; i < 16; i++)
s->tvdc[i] = bytestream_get_be16(&buf);
+ if (s->ham) {
+ if (s->bpp > 8) {
+ av_log(avctx, AV_LOG_ERROR, "Invalid number of hold bits for HAM: %u\n", s->ham);
+ return AVERROR_INVALIDDATA;
+ } else if (s->ham != (s->bpp > 6 ? 6 : 4)) {
+ av_log(avctx, AV_LOG_ERROR, "Invalid number of hold bits for HAM: %u, BPP: %u\n", s->ham, s->bpp);
+ return AVERROR_INVALIDDATA;
+ }
+ }
+
if (s->masking == MASK_HAS_MASK) {
if (s->bpp >= 8 && !s->ham) {
avctx->pix_fmt = AV_PIX_FMT_RGB32;
if (!s->bpp || s->bpp > 32) {
av_log(avctx, AV_LOG_ERROR, "Invalid number of bitplanes: %u\n", s->bpp);
return AVERROR_INVALIDDATA;
- } else if (s->ham >= 8) {
- av_log(avctx, AV_LOG_ERROR, "Invalid number of hold bits for HAM: %u\n", s->ham);
- return AVERROR_INVALIDDATA;
}
av_freep(&s->ham_buf);
av_freep(&s->planebuf);
av_freep(&s->ham_buf);
av_freep(&s->ham_palbuf);
+ av_freep(&s->mask_buf);
+ av_freep(&s->mask_palbuf);
av_freep(&s->video[0]);
av_freep(&s->video[1]);
av_freep(&s->pal);
buf_size -= bytestream2_tell(gb);
desc = av_pix_fmt_desc_get(avctx->pix_fmt);
- if (!s->init && avctx->bits_per_coded_sample <= 8 &&
+ if (!s->init && avctx->bits_per_coded_sample <= 8 - (s->masking == MASK_HAS_MASK) &&
avctx->pix_fmt == AV_PIX_FMT_PAL8) {
if ((res = cmap_read_palette(avctx, (uint32_t *)frame->data[1])) < 0)
return res;