| @@ -29,6 +29,7 @@ | |||
| #include "libavutil/intreadwrite.h" | |||
| #include "avcodec.h" | |||
| #include "internal.h" | |||
| #include <zlib.h> | |||
| @@ -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"), | |||