On 2013-01-08 15:37:48 +0100, Anton Khirnov wrote:
> ---
> libavcodec/svq1dec.c | 34 +++++++++++-----------------------
> 1 file changed, 11 insertions(+), 23 deletions(-)
>
> diff --git a/libavcodec/svq1dec.c b/libavcodec/svq1dec.c
> index 5156042..0c3df9a 100644
> --- a/libavcodec/svq1dec.c
> +++ b/libavcodec/svq1dec.c
> @@ -60,7 +60,7 @@ typedef struct svq1_pmv_s {
> typedef struct SVQ1Context {
> DSPContext dsp;
> GetBitContext gb;
> - AVFrame *cur, *prev;
> + AVFrame *prev;
> int width;
> int height;
> int frame_code;
> @@ -612,14 +612,11 @@ static int svq1_decode_frame(AVCodecContext *avctx,
> void *data,
> const uint8_t *buf = avpkt->data;
> int buf_size = avpkt->size;
> SVQ1Context *s = avctx->priv_data;
> - AVFrame *cur = s->cur;
> + AVFrame *cur = data;
> uint8_t *current;
> int result, i, x, y, width, height;
> svq1_pmv *pmv;
>
> - if (cur->data[0])
> - avctx->release_buffer(avctx, cur);
> -
> /* initialize bit buffer */
> init_get_bits(&s->gb, buf, buf_size * 8);
>
> @@ -651,7 +648,7 @@ static int svq1_decode_frame(AVCodecContext *avctx, void
> *data,
> avctx->skip_frame >= AVDISCARD_ALL)
> return buf_size;
>
> - result = ff_get_buffer(avctx, cur);
> + result = ff_get_buffer(avctx, cur, s->nonref ? 0 :
> AV_GET_BUFFER_FLAG_REF);
> if (result < 0)
> return result;
>
> @@ -722,9 +719,12 @@ static int svq1_decode_frame(AVCodecContext *avctx, void
> *data,
> }
> }
>
> - *(AVFrame*)data = *cur;
> - if (!s->nonref)
> - FFSWAP(AVFrame*, s->cur, s->prev);
> + if (!s->nonref) {
> + av_frame_unref(s->prev);
> + result = av_frame_ref(s->prev, cur);
> + if (result < 0)
> + goto err;
> + }
>
> *got_frame = 1;
> result = buf_size;
> @@ -740,13 +740,9 @@ static av_cold int svq1_decode_init(AVCodecContext
> *avctx)
> int i;
> int offset = 0;
>
> - s->cur = avcodec_alloc_frame();
> s->prev = avcodec_alloc_frame();
> - if (!s->cur || !s->prev) {
> - avcodec_free_frame(&s->cur);
> - avcodec_free_frame(&s->prev);
> + if (!s->prev)
> return AVERROR(ENOMEM);
> - }
>
> s->width = avctx->width + 3 & ~3;
> s->height = avctx->height + 3 & ~3;
> @@ -797,11 +793,6 @@ static av_cold int svq1_decode_end(AVCodecContext *avctx)
> {
> SVQ1Context *s = avctx->priv_data;
>
> - if (s->cur->data[0])
> - avctx->release_buffer(avctx, s->cur);
> - if (s->prev->data[0])
> - avctx->release_buffer(avctx, s->prev);
> - avcodec_free_frame(&s->cur);
> avcodec_free_frame(&s->prev);
>
> return 0;
> @@ -811,10 +802,7 @@ static void svq1_flush(AVCodecContext *avctx)
> {
> SVQ1Context *s = avctx->priv_data;
>
> - if (s->cur->data[0])
> - avctx->release_buffer(avctx, s->cur);
> - if (s->prev->data[0])
> - avctx->release_buffer(avctx, s->prev);
> + av_frame_unref(s->prev);
> }
>
> AVCodec ff_svq1_decoder = {
ok
Janne
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel