From 11505f39e128e4b9a79aa1998bf3c56f45c5bb14 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Fri, 10 Feb 2012 10:30:05 +0100 Subject: zmbvenc: switch to encode2(). --- libavcodec/zmbvenc.c | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) (limited to 'libavcodec/zmbvenc.c') diff --git a/libavcodec/zmbvenc.c b/libavcodec/zmbvenc.c index 6425353ff1..1c1e78d912 100644 --- a/libavcodec/zmbvenc.c +++ b/libavcodec/zmbvenc.c @@ -29,6 +29,7 @@ #include "libavutil/intreadwrite.h" #include "avcodec.h" +#include "internal.h" #include @@ -115,19 +116,18 @@ static int zmbv_me(ZmbvEncContext *c, uint8_t *src, int sstride, uint8_t *prev, return bv; } -static int encode_frame(AVCodecContext *avctx, uint8_t *buf, int buf_size, void *data) +static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, + const AVFrame *pict, int *got_packet) { ZmbvEncContext * const c = avctx->priv_data; - AVFrame *pict = data; AVFrame * const p = &c->pic; - uint8_t *src, *prev; + uint8_t *src, *prev, *buf; uint32_t *palptr; - int len = 0; int keyframe, chpal; int fl; - int work_size = 0; + int work_size = 0, pkt_size; int bw, bh; - int i, j; + int i, j, ret; keyframe = !c->curfrm; c->curfrm++; @@ -227,18 +227,29 @@ static int encode_frame(AVCodecContext *avctx, uint8_t *buf, int buf_size, void return -1; } + pkt_size = c->zstream.total_out + 1 + 6*keyframe; + if ((ret = ff_alloc_packet(pkt, pkt_size)) < 0) { + av_log(avctx, AV_LOG_ERROR, "Error getting packet of size %d.\n", pkt_size); + return ret; + } + buf = pkt->data; + fl = (keyframe ? ZMBV_KEYFRAME : 0) | (chpal ? ZMBV_DELTAPAL : 0); - *buf++ = fl; len++; + *buf++ = fl; if (keyframe) { - *buf++ = 0; len++; // hi ver - *buf++ = 1; len++; // lo ver - *buf++ = 1; len++; // comp - *buf++ = 4; len++; // format - 8bpp - *buf++ = ZMBV_BLOCK; len++; // block width - *buf++ = ZMBV_BLOCK; len++; // block height + *buf++ = 0; // hi ver + *buf++ = 1; // lo ver + *buf++ = 1; // comp + *buf++ = 4; // format - 8bpp + *buf++ = ZMBV_BLOCK; // block width + *buf++ = ZMBV_BLOCK; // block height } memcpy(buf, c->comp_buf, c->zstream.total_out); - return len + c->zstream.total_out; + + pkt->flags |= AV_PKT_FLAG_KEY*keyframe; + *got_packet = 1; + + return 0; } @@ -331,7 +342,7 @@ AVCodec ff_zmbv_encoder = { .id = CODEC_ID_ZMBV, .priv_data_size = sizeof(ZmbvEncContext), .init = encode_init, - .encode = encode_frame, + .encode2 = encode_frame, .close = encode_end, .pix_fmts = (const enum PixelFormat[]){PIX_FMT_PAL8, PIX_FMT_NONE}, .long_name = NULL_IF_CONFIG_SMALL("Zip Motion Blocks Video"), -- cgit v1.2.3