From 8774d5835806e02e875e833f6a0b48b26413c730 Mon Sep 17 00:00:00 2001 From: Kostya Shishkov Date: Thu, 18 Oct 2012 11:08:01 +0200 Subject: [PATCH] bmv: get a new frame on every decode_frame(), so we can use direct rendering --- libavcodec/bmv.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/libavcodec/bmv.c b/libavcodec/bmv.c index 876c13f923..461111967d 100644 --- a/libavcodec/bmv.c +++ b/libavcodec/bmv.c @@ -196,7 +196,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPac { BMVDecContext * const c = avctx->priv_data; int type, scr_off; - int i; + int i, ret; uint8_t *srcptr, *outptr; c->stream = pkt->data; @@ -237,6 +237,15 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPac scr_off = 0; } + if (c->pic.data[0]) + avctx->release_buffer(avctx, &c->pic); + + c->pic.reference = 3; + if ((ret = avctx->get_buffer(avctx, &c->pic)) < 0) { + av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); + return ret; + } + if (decode_bmv_frame(c->stream, pkt->size - (c->stream - pkt->data), c->frame, scr_off)) { av_log(avctx, AV_LOG_ERROR, "Error decoding frame data\n"); return AVERROR_INVALIDDATA; @@ -268,12 +277,6 @@ static av_cold int decode_init(AVCodecContext *avctx) c->avctx = avctx; avctx->pix_fmt = AV_PIX_FMT_PAL8; - c->pic.reference = 1; - if (avctx->get_buffer(avctx, &c->pic) < 0) { - av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); - return -1; - } - c->frame = c->frame_base + 640; return 0; @@ -365,6 +368,7 @@ AVCodec ff_bmv_video_decoder = { .init = decode_init, .close = decode_end, .decode = decode_frame, + .capabilities = CODEC_CAP_DR1, .long_name = NULL_IF_CONFIG_SMALL("Discworld II BMV video"), };