diff options
author | wm4 <wm4@nowhere> | 2013-03-09 07:01:43 +0100 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2013-03-13 23:51:29 +0100 |
commit | ba5fc1d5e6c7d0762cd051edc80011faa9ab6a6a (patch) | |
tree | f2b6f68cd73049b0284fc1c47f46912c6a4ad9a4 | |
parent | fd8750c25b4eec77f6401033ab1c2c5385cbedaf (diff) | |
download | mpv-ba5fc1d5e6c7d0762cd051edc80011faa9ab6a6a.tar.bz2 mpv-ba5fc1d5e6c7d0762cd051edc80011faa9ab6a6a.tar.xz |
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.
-rw-r--r-- | video/image_writer.c | 25 |
1 files 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); |