From ba5fc1d5e6c7d0762cd051edc80011faa9ab6a6a Mon Sep 17 00:00:00 2001 From: wm4 Date: Sat, 9 Mar 2013 07:01:43 +0100 Subject: [PATCH] image_writer: switch to avcodec_encode_video2() avcodec_encode_video() was deprecated, and was finally removed from Libav and FFmpeg git. This change breaks compatibility with Libav 0.8.x. Thank the Libav developers, not me. --- video/image_writer.c | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/video/image_writer.c b/video/image_writer.c index 0ec949b36a..7802923e15 100644 --- a/video/image_writer.c +++ b/video/image_writer.c @@ -86,9 +86,12 @@ struct img_writer { static int write_lavc(struct image_writer_ctx *ctx, mp_image_t *image, FILE *fp) { - void *outbuffer = NULL; int success = 0; AVFrame *pic = NULL; + AVPacket pkt = {0}; + int got_output = 0; + + av_init_packet(&pkt); struct AVCodec *codec = avcodec_find_encoder(ctx->writer->lavc_codec); AVCodecContext *avctx = NULL; @@ -112,11 +115,6 @@ static int write_lavc(struct image_writer_ctx *ctx, mp_image_t *image, FILE *fp) goto error_exit; } - size_t outbuffer_size = image->w * image->h * 3 * 2; - outbuffer = malloc(outbuffer_size); - if (!outbuffer) - goto error_exit; - pic = avcodec_alloc_frame(); if (!pic) goto error_exit; @@ -125,19 +123,19 @@ static int write_lavc(struct image_writer_ctx *ctx, mp_image_t *image, FILE *fp) pic->data[n] = image->planes[n]; pic->linesize[n] = image->stride[n]; } - int size = avcodec_encode_video(avctx, outbuffer, outbuffer_size, pic); - if (size < 1) + int ret = avcodec_encode_video2(avctx, &pkt, pic, &got_output); + if (ret < 0) goto error_exit; - fwrite(outbuffer, size, 1, fp); + fwrite(pkt.data, pkt.size, 1, fp); - success = 1; + success = !!got_output; error_exit: if (avctx) avcodec_close(avctx); av_free(avctx); avcodec_free_frame(&pic); - free(outbuffer); + av_free_packet(&pkt); return success; } @@ -280,9 +278,8 @@ int write_image(struct mp_image *image, const struct image_writer_opts *opts, } } - // Caveat: - no colorspace/levels conversion done if pixel formats equal - // - RGB->YUV assumes BT.601 - // - color levels broken in various ways thanks to libswscale + // Caveat: no colorspace/levels conversion done if pixel formats equal + // it's unclear what colorspace/levels the target wants if (image->imgfmt != destfmt || is_anamorphic) { struct mp_image *dst = mp_image_alloc(destfmt, d_w, d_h); mp_image_copy_attributes(dst, image);