diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2013-03-24 15:19:37 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2013-03-25 13:30:30 +0100 |
commit | ad438f450b83882a1277a79c1c3d6dfe55573b1c (patch) | |
tree | 86ce7a6cede6f617eb346c5542284eeb52232941 /libavcodec | |
parent | 45013b365e46008988c31c81b4ec1318dbc67e78 (diff) | |
download | ffmpeg-ad438f450b83882a1277a79c1c3d6dfe55573b1c.tar.gz |
xan: make decoder independent of sizeof(AVFrame)
Reviewed-by: Paul B Mahol <onemda@gmail.com>
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/xan.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/libavcodec/xan.c b/libavcodec/xan.c index 2ee22910f1..27583522f9 100644 --- a/libavcodec/xan.c +++ b/libavcodec/xan.c @@ -52,7 +52,7 @@ typedef struct XanContext { AVCodecContext *avctx; - AVFrame last_frame; + AVFrame *last_frame; const unsigned char *buf; int size; @@ -71,6 +71,8 @@ typedef struct XanContext { } XanContext; +static av_cold int xan_decode_end(AVCodecContext *avctx); + static av_cold int xan_decode_init(AVCodecContext *avctx) { XanContext *s = avctx->priv_data; @@ -90,7 +92,11 @@ static av_cold int xan_decode_init(AVCodecContext *avctx) av_freep(&s->buffer1); return AVERROR(ENOMEM); } - avcodec_get_frame_defaults(&s->last_frame); + s->last_frame = av_frame_alloc(); + if (!s->last_frame) { + xan_decode_end(avctx); + return AVERROR(ENOMEM); + } return 0; } @@ -234,7 +240,7 @@ static inline void xan_wc3_copy_pixel_run(XanContext *s, AVFrame *frame, return; palette_plane = frame->data[0]; - prev_palette_plane = s->last_frame.data[0]; + prev_palette_plane = s->last_frame->data[0]; if (!prev_palette_plane) prev_palette_plane = palette_plane; stride = frame->linesize[0]; @@ -602,8 +608,8 @@ static int xan_decode_frame(AVCodecContext *avctx, if (xan_wc3_decode_frame(s, frame) < 0) return AVERROR_INVALIDDATA; - av_frame_unref(&s->last_frame); - if ((ret = av_frame_ref(&s->last_frame, frame)) < 0) + av_frame_unref(s->last_frame); + if ((ret = av_frame_ref(s->last_frame, frame)) < 0) return ret; *got_frame = 1; @@ -616,7 +622,7 @@ static av_cold int xan_decode_end(AVCodecContext *avctx) { XanContext *s = avctx->priv_data; - av_frame_unref(&s->last_frame); + av_frame_free(&s->last_frame); av_freep(&s->buffer1); av_freep(&s->buffer2); |