summaryrefslogtreecommitdiff
path: root/libavcodec/rawdec.c
diff options
context:
space:
mode:
Diffstat (limited to 'libavcodec/rawdec.c')
-rw-r--r--libavcodec/rawdec.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/libavcodec/rawdec.c b/libavcodec/rawdec.c
index 3536943adf..93cbedfed8 100644
--- a/libavcodec/rawdec.c
+++ b/libavcodec/rawdec.c
@@ -112,6 +112,9 @@ static av_cold int raw_init_decoder(AVCodecContext *avctx)
avctx->pix_fmt == AV_PIX_FMT_YUYV422)
context->is_yuv2 = 1;
+ if (avctx->pix_fmt == AV_PIX_FMT_PAL8 && avctx->bits_per_coded_sample == 1)
+ avctx->pix_fmt = AV_PIX_FMT_NONE;
+
return 0;
}
@@ -152,7 +155,7 @@ MKSCALE16(scale16le, AV_RL16, AV_WL16)
static int raw_decode(AVCodecContext *avctx, void *data, int *got_frame,
AVPacket *avpkt)
{
- const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt);
+ const AVPixFmtDescriptor *desc;
RawVideoContext *context = avctx->priv_data;
const uint8_t *buf = avpkt->data;
int buf_size = avpkt->size;
@@ -173,6 +176,20 @@ static int raw_decode(AVCodecContext *avctx, void *data, int *got_frame,
av_log(avctx, AV_LOG_ERROR, "Packet too small (%d) height (%d)\n", avpkt->size, avctx->height);
return AVERROR_INVALIDDATA;
}
+ if (avctx->pix_fmt == AV_PIX_FMT_NONE &&
+ avctx->bits_per_coded_sample == 1 &&
+ avctx->frame_number == 0 &&
+ context->palette &&
+ AV_RB64(context->palette->data) == 0xFFFFFFFF00000000
+ ) {
+ const uint8_t *pal = av_packet_get_side_data(avpkt, AV_PKT_DATA_PALETTE, NULL);
+ if (!pal) {
+ avctx->pix_fmt = AV_PIX_FMT_MONOWHITE;
+ } else
+ avctx->pix_fmt = AV_PIX_FMT_PAL8;
+ }
+
+ desc = av_pix_fmt_desc_get(avctx->pix_fmt);
if ((avctx->bits_per_coded_sample == 8 || avctx->bits_per_coded_sample == 4
|| avctx->bits_per_coded_sample == 2 || avctx->bits_per_coded_sample == 1) &&