* http://www.pcisys.net/~melanson/codecs/
*
* The MS RLE decoder outputs PAL8 colorspace data.
- *
- * Note that this decoder expects the palette colors from the end of the
- * BITMAPINFO header passed through palctrl.
*/
#include <stdio.h>
const unsigned char *buf;
int size;
+ uint32_t pal[256];
} MsrleContext;
static av_cold int msrle_decode_init(AVCodecContext *avctx)
return -1;
}
- if (s->avctx->palctrl) {
- /* make the palette available */
- memcpy(s->frame.data[1], s->avctx->palctrl->palette, AVPALETTE_SIZE);
- if (s->avctx->palctrl->palette_changed) {
+ if (avctx->bits_per_coded_sample <= 8) {
+ const uint8_t *pal = av_packet_get_side_data(avpkt, AV_PKT_DATA_PALETTE, NULL);
+
+ if (pal) {
s->frame.palette_has_changed = 1;
- s->avctx->palctrl->palette_changed = 0;
+ memcpy(s->pal, pal, AVPALETTE_SIZE);
}
+
+ /* make the palette available */
+ memcpy(s->frame.data[1], s->pal, AVPALETTE_SIZE);
}
/* FIXME how to correctly detect RLE ??? */
}
AVCodec ff_msrle_decoder = {
- "msrle",
- AVMEDIA_TYPE_VIDEO,
- CODEC_ID_MSRLE,
- sizeof(MsrleContext),
- msrle_decode_init,
- NULL,
- msrle_decode_end,
- msrle_decode_frame,
- CODEC_CAP_DR1,
+ .name = "msrle",
+ .type = AVMEDIA_TYPE_VIDEO,
+ .id = CODEC_ID_MSRLE,
+ .priv_data_size = sizeof(MsrleContext),
+ .init = msrle_decode_init,
+ .close = msrle_decode_end,
+ .decode = msrle_decode_frame,
+ .capabilities = CODEC_CAP_DR1,
.long_name= NULL_IF_CONFIG_SMALL("Microsoft RLE"),
};