summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@mplayer2.org>2012-02-16 17:30:22 +0100
committerUoti Urpala <uau@mplayer2.org>2012-02-25 16:29:52 +0200
commite796c7495cab78e0468c9c3a76b1bcaa3fcd1798 (patch)
tree34b6939a7bc47350de22ed59f9803e39305afbbe
parentda52c9400defebc3f5840acc1f9eb0ead1a759cb (diff)
downloadmpv-e796c7495cab78e0468c9c3a76b1bcaa3fcd1798.tar.bz2
mpv-e796c7495cab78e0468c9c3a76b1bcaa3fcd1798.tar.xz
screenshot: fix libav API use (pix_fmt and some other things)
Libavcodec started checking that avctx->pix_fmt is set when opening an encoder. The existing code (originally from vf_screenshot.c) only set it afterwards, which now made screenshots fail. Fix the code to set parameters before calling avcodec_open2(). Also fix some minor things, which seems to make it work for other encoders. This could be used to add more libavcodec based image writers. Fix memory leak (missing av_free(avctx)).
-rw-r--r--screenshot.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/screenshot.c b/screenshot.c
index 55107bf930..597a36afed 100644
--- a/screenshot.c
+++ b/screenshot.c
@@ -75,6 +75,13 @@ static int write_png(screenshot_ctx *ctx, struct mp_image *image)
avctx = avcodec_alloc_context3(png_codec);
if (!avctx)
goto print_open_fail;
+
+ avctx->time_base = AV_TIME_BASE_Q;
+ avctx->width = image->width;
+ avctx->height = image->height;
+ avctx->pix_fmt = PIX_FMT_RGB24;
+ avctx->compression_level = 0;
+
if (avcodec_open2(avctx, png_codec, NULL) < 0) {
print_open_fail:
mp_msg(MSGT_CPLAYER, MSGL_INFO, "Could not open libavcodec PNG encoder"
@@ -82,26 +89,23 @@ static int write_png(screenshot_ctx *ctx, struct mp_image *image)
goto error_exit;
}
- avctx->width = image->width;
- avctx->height = image->height;
- avctx->pix_fmt = PIX_FMT_RGB24;
- avctx->compression_level = 0;
-
size_t outbuffer_size = image->width * image->height * 3 * 2;
outbuffer = malloc(outbuffer_size);
if (!outbuffer)
goto error_exit;
AVFrame pic;
- pic.data[0] = image->planes[0];
- pic.linesize[0] = image->stride[0];
+ avcodec_get_frame_defaults(&pic);
+ for (int n = 0; n < 4; n++) {
+ 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)
goto error_exit;
fp = fopen(fname, "wb");
if (fp == NULL) {
- avcodec_close(avctx);
mp_msg(MSGT_CPLAYER, MSGL_ERR, "\nPNG Error opening %s for writing!\n",
fname);
goto error_exit;
@@ -117,6 +121,7 @@ static int write_png(screenshot_ctx *ctx, struct mp_image *image)
error_exit:
if (avctx)
avcodec_close(avctx);
+ av_free(avctx);
if (fp)
fclose(fp);
free(outbuffer);