diff options
Diffstat (limited to 'ffmpeg/libavcodec/zmbvenc.c')
| -rw-r--r-- | ffmpeg/libavcodec/zmbvenc.c | 48 |
1 files changed, 23 insertions, 25 deletions
diff --git a/ffmpeg/libavcodec/zmbvenc.c b/ffmpeg/libavcodec/zmbvenc.c index fb782a4..28dbe20 100644 --- a/ffmpeg/libavcodec/zmbvenc.c +++ b/ffmpeg/libavcodec/zmbvenc.c @@ -44,7 +44,6 @@ */ typedef struct ZmbvEncContext { AVCodecContext *avctx; - AVFrame pic; int range; uint8_t *comp_buf, *work_buf; @@ -121,7 +120,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *pict, int *got_packet) { ZmbvEncContext * const c = avctx->priv_data; - AVFrame * const p = &c->pic; + const AVFrame * const p = pict; uint8_t *src, *prev, *buf; uint32_t *palptr; int keyframe, chpal; @@ -134,9 +133,8 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, c->curfrm++; if(c->curfrm == c->keyint) c->curfrm = 0; - *p = *pict; - p->pict_type= keyframe ? AV_PICTURE_TYPE_I : AV_PICTURE_TYPE_P; - p->key_frame= keyframe; + avctx->coded_frame->pict_type = keyframe ? AV_PICTURE_TYPE_I : AV_PICTURE_TYPE_P; + avctx->coded_frame->key_frame = keyframe; chpal = !keyframe && memcmp(p->data[1], c->pal2, 1024); palptr = (uint32_t*)p->data[1]; @@ -251,6 +249,20 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, return 0; } +static av_cold int encode_end(AVCodecContext *avctx) +{ + ZmbvEncContext * const c = avctx->priv_data; + + av_freep(&c->comp_buf); + av_freep(&c->work_buf); + + deflateEnd(&c->zstream); + av_freep(&c->prev); + + av_frame_free(&avctx->coded_frame); + + return 0; +} /** * Init zmbv encoder @@ -312,31 +324,18 @@ static av_cold int encode_init(AVCodecContext *avctx) return -1; } - avctx->coded_frame = &c->pic; - - return 0; -} - - - -/** - * Uninit zmbv encoder - */ -static av_cold int encode_end(AVCodecContext *avctx) -{ - ZmbvEncContext * const c = avctx->priv_data; - - av_freep(&c->comp_buf); - av_freep(&c->work_buf); - - deflateEnd(&c->zstream); - av_freep(&c->prev); + avctx->coded_frame = av_frame_alloc(); + if (!avctx->coded_frame) { + encode_end(avctx); + return AVERROR(ENOMEM); + } return 0; } AVCodec ff_zmbv_encoder = { .name = "zmbv", + .long_name = NULL_IF_CONFIG_SMALL("Zip Motion Blocks Video"), .type = AVMEDIA_TYPE_VIDEO, .id = AV_CODEC_ID_ZMBV, .priv_data_size = sizeof(ZmbvEncContext), @@ -344,5 +343,4 @@ AVCodec ff_zmbv_encoder = { .encode2 = encode_frame, .close = encode_end, .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_PAL8, AV_PIX_FMT_NONE }, - .long_name = NULL_IF_CONFIG_SMALL("Zip Motion Blocks Video"), }; |
