xan: use the AVFrame API properly.
This commit is contained in:
		
							parent
							
								
									f3cd23fbc8
								
							
						
					
					
						commit
						04f30711d8
					
				@ -52,7 +52,7 @@
 | 
			
		||||
typedef struct XanContext {
 | 
			
		||||
 | 
			
		||||
    AVCodecContext *avctx;
 | 
			
		||||
    AVFrame last_frame;
 | 
			
		||||
    AVFrame *last_frame;
 | 
			
		||||
 | 
			
		||||
    const unsigned char *buf;
 | 
			
		||||
    int size;
 | 
			
		||||
@ -71,6 +71,19 @@ typedef struct XanContext {
 | 
			
		||||
 | 
			
		||||
} XanContext;
 | 
			
		||||
 | 
			
		||||
static av_cold int xan_decode_end(AVCodecContext *avctx)
 | 
			
		||||
{
 | 
			
		||||
    XanContext *s = avctx->priv_data;
 | 
			
		||||
 | 
			
		||||
    av_frame_free(&s->last_frame);
 | 
			
		||||
 | 
			
		||||
    av_freep(&s->buffer1);
 | 
			
		||||
    av_freep(&s->buffer2);
 | 
			
		||||
    av_freep(&s->palettes);
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static av_cold int xan_decode_init(AVCodecContext *avctx)
 | 
			
		||||
{
 | 
			
		||||
    XanContext *s = avctx->priv_data;
 | 
			
		||||
@ -91,6 +104,12 @@ static av_cold int xan_decode_init(AVCodecContext *avctx)
 | 
			
		||||
        return AVERROR(ENOMEM);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    s->last_frame = av_frame_alloc();
 | 
			
		||||
    if (!s->last_frame) {
 | 
			
		||||
        xan_decode_end(avctx);
 | 
			
		||||
        return AVERROR(ENOMEM);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -234,7 +253,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];
 | 
			
		||||
@ -582,8 +601,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;
 | 
			
		||||
@ -592,19 +611,6 @@ static int xan_decode_frame(AVCodecContext *avctx,
 | 
			
		||||
    return buf_size;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static av_cold int xan_decode_end(AVCodecContext *avctx)
 | 
			
		||||
{
 | 
			
		||||
    XanContext *s = avctx->priv_data;
 | 
			
		||||
 | 
			
		||||
    av_frame_unref(&s->last_frame);
 | 
			
		||||
 | 
			
		||||
    av_freep(&s->buffer1);
 | 
			
		||||
    av_freep(&s->buffer2);
 | 
			
		||||
    av_freep(&s->palettes);
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
AVCodec ff_xan_wc3_decoder = {
 | 
			
		||||
    .name           = "xan_wc3",
 | 
			
		||||
    .long_name      = NULL_IF_CONFIG_SMALL("Wing Commander III / Xan"),
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user