X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fmsrle.c;h=bbac2a3ffbfe9b6e6f54b84223fbf1da57c46cf3;hb=83b6471dcb762859f20b2c414decc755fcceb5e8;hp=adb55b1302c0762de53852731946068ff15ea7f9;hpb=f3881c04e93ee70567bd3fe087f49b996b026d30;p=ffmpeg diff --git a/libavcodec/msrle.c b/libavcodec/msrle.c index adb55b1302c..bbac2a3ffbf 100644 --- a/libavcodec/msrle.c +++ b/libavcodec/msrle.c @@ -33,6 +33,7 @@ #include #include "avcodec.h" +#include "decode.h" #include "internal.h" #include "msrledec.h" #include "libavutil/imgutils.h" @@ -42,8 +43,6 @@ typedef struct MsrleContext { AVFrame *frame; GetByteContext gb; - const unsigned char *buf; - int size; uint32_t pal[256]; } MsrleContext; @@ -92,22 +91,15 @@ static int msrle_decode_frame(AVCodecContext *avctx, int istride = FFALIGN(avctx->width*avctx->bits_per_coded_sample, 32) / 8; int ret; - s->buf = buf; - s->size = buf_size; + if (buf_size < 2) //Minimally a end of picture code should be there + return AVERROR_INVALIDDATA; - if ((ret = ff_reget_buffer(avctx, s->frame)) < 0) + if ((ret = ff_reget_buffer(avctx, s->frame, 0)) < 0) return ret; if (avctx->bits_per_coded_sample > 1 && avctx->bits_per_coded_sample <= 8) { - int size; - const uint8_t *pal = av_packet_get_side_data(avpkt, AV_PKT_DATA_PALETTE, &size); - - if (pal && size == AVPALETTE_SIZE) { - s->frame->palette_has_changed = 1; - memcpy(s->pal, pal, AVPALETTE_SIZE); - } else if (pal) { - av_log(avctx, AV_LOG_ERROR, "Palette size %d is wrong\n", size); - } + s->frame->palette_has_changed = ff_copy_palette(s->pal, avpkt, avctx); + /* make the palette available */ memcpy(s->frame->data[1], s->pal, AVPALETTE_SIZE); } @@ -150,6 +142,13 @@ static int msrle_decode_frame(AVCodecContext *avctx, return buf_size; } +static void msrle_decode_flush(AVCodecContext *avctx) +{ + MsrleContext *s = avctx->priv_data; + + av_frame_unref(s->frame); +} + static av_cold int msrle_decode_end(AVCodecContext *avctx) { MsrleContext *s = avctx->priv_data; @@ -160,7 +159,7 @@ static av_cold int msrle_decode_end(AVCodecContext *avctx) return 0; } -AVCodec ff_msrle_decoder = { +const AVCodec ff_msrle_decoder = { .name = "msrle", .long_name = NULL_IF_CONFIG_SMALL("Microsoft RLE"), .type = AVMEDIA_TYPE_VIDEO, @@ -169,5 +168,6 @@ AVCodec ff_msrle_decoder = { .init = msrle_decode_init, .close = msrle_decode_end, .decode = msrle_decode_frame, + .flush = msrle_decode_flush, .capabilities = AV_CODEC_CAP_DR1, };