From 759001c534287a96dc96d1e274665feb7059145d Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Wed, 21 Nov 2012 21:34:46 +0100 Subject: lavc decoders: work with refcounted frames. --- libavcodec/cscd.c | 32 +++++++++++--------------------- 1 file changed, 11 insertions(+), 21 deletions(-) (limited to 'libavcodec/cscd.c') diff --git a/libavcodec/cscd.c b/libavcodec/cscd.c index b982f5029c..6b8d144f76 100644 --- a/libavcodec/cscd.c +++ b/libavcodec/cscd.c @@ -31,7 +31,6 @@ #include "libavutil/lzo.h" typedef struct { - AVFrame pic; int linelen, height, bpp; unsigned int decomp_size; unsigned char* decomp_buf; @@ -150,12 +149,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, return AVERROR_INVALIDDATA; } - if (c->pic.data[0]) - avctx->release_buffer(avctx, &c->pic); - c->pic.reference = 1; - c->pic.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_READABLE | - FF_BUFFER_HINTS_PRESERVE | FF_BUFFER_HINTS_REUSABLE; - if ((ret = ff_get_buffer(avctx, &c->pic)) < 0) { + if ((ret = ff_get_buffer(avctx, picture, 0)) < 0) { av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); return ret; } @@ -186,36 +180,35 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, // flip upside down, add difference frame if (buf[0] & 1) { // keyframe - c->pic.pict_type = AV_PICTURE_TYPE_I; - c->pic.key_frame = 1; + picture->pict_type = AV_PICTURE_TYPE_I; + picture->key_frame = 1; switch (c->bpp) { case 16: - copy_frame_16(&c->pic, c->decomp_buf, c->linelen, c->height); + copy_frame_16(picture, c->decomp_buf, c->linelen, c->height); break; case 32: - copy_frame_32(&c->pic, c->decomp_buf, c->linelen, c->height); + copy_frame_32(picture, c->decomp_buf, c->linelen, c->height); break; default: - copy_frame_default(&c->pic, c->decomp_buf, FFALIGN(c->linelen, 4), + copy_frame_default(picture, c->decomp_buf, FFALIGN(c->linelen, 4), c->linelen, c->height); } } else { - c->pic.pict_type = AV_PICTURE_TYPE_P; - c->pic.key_frame = 0; + picture->pict_type = AV_PICTURE_TYPE_P; + picture->key_frame = 0; switch (c->bpp) { case 16: - add_frame_16(&c->pic, c->decomp_buf, c->linelen, c->height); + add_frame_16(picture, c->decomp_buf, c->linelen, c->height); break; case 32: - add_frame_32(&c->pic, c->decomp_buf, c->linelen, c->height); + add_frame_32(picture, c->decomp_buf, c->linelen, c->height); break; default: - add_frame_default(&c->pic, c->decomp_buf, FFALIGN(c->linelen, 4), + add_frame_default(picture, c->decomp_buf, FFALIGN(c->linelen, 4), c->linelen, c->height); } } - *picture = c->pic; *got_frame = 1; return buf_size; } @@ -234,7 +227,6 @@ static av_cold int decode_init(AVCodecContext *avctx) { return AVERROR_INVALIDDATA; } c->bpp = avctx->bits_per_coded_sample; - c->pic.data[0] = NULL; c->linelen = avctx->width * avctx->bits_per_coded_sample / 8; c->height = avctx->height; stride = c->linelen; @@ -252,8 +244,6 @@ static av_cold int decode_init(AVCodecContext *avctx) { static av_cold int decode_end(AVCodecContext *avctx) { CamStudioContext *c = avctx->priv_data; av_freep(&c->decomp_buf); - if (c->pic.data[0]) - avctx->release_buffer(avctx, &c->pic); return 0; } -- cgit v1.2.3