summaryrefslogtreecommitdiff
path: root/multimedia/mplayer2/files/patch-screenshot.c
diff options
context:
space:
mode:
Diffstat (limited to 'multimedia/mplayer2/files/patch-screenshot.c')
-rw-r--r--multimedia/mplayer2/files/patch-screenshot.c90
1 files changed, 90 insertions, 0 deletions
diff --git a/multimedia/mplayer2/files/patch-screenshot.c b/multimedia/mplayer2/files/patch-screenshot.c
new file mode 100644
index 000000000000..cac213fcc985
--- /dev/null
+++ b/multimedia/mplayer2/files/patch-screenshot.c
@@ -0,0 +1,90 @@
+--- screenshot.c.orig 2013-07-09 16:33:27 UTC
++++ screenshot.c
+@@ -57,7 +57,7 @@ static int destroy_ctx(void *ptr)
+ {
+ struct screenshot_ctx *ctx = ptr;
+ #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(54, 28, 0)
+- avcodec_free_frame(&ctx->pic);
++ av_frame_free(&ctx->pic);
+ #else
+ av_free(ctx->pic);
+ #endif
+@@ -69,7 +69,7 @@ static screenshot_ctx *screenshot_get_ct
+ if (!mpctx->screenshot_ctx) {
+ struct screenshot_ctx *ctx = talloc_zero(mpctx, screenshot_ctx);
+ talloc_set_destructor(ctx, destroy_ctx);
+- ctx->pic = avcodec_alloc_frame();
++ ctx->pic = av_frame_alloc();
+ assert(ctx->pic);
+ mpctx->screenshot_ctx = ctx;
+ }
+@@ -80,8 +80,12 @@ static int write_png(screenshot_ctx *ctx
+ {
+ char *fname = ctx->fname;
+ FILE *fp = NULL;
+- void *outbuffer = NULL;
+ int success = 0;
++ int got_pkt;
++ AVPacket pkt = {0};
++ int got_output = 0;
++
++ av_init_packet(&pkt);
+
+ struct AVCodec *png_codec = avcodec_find_encoder(AV_CODEC_ID_PNG);
+ AVCodecContext *avctx = NULL;
+@@ -94,7 +98,7 @@ static int write_png(screenshot_ctx *ctx
+ avctx->time_base = AV_TIME_BASE_Q;
+ avctx->width = image->width;
+ avctx->height = image->height;
+- avctx->pix_fmt = PIX_FMT_RGB24;
++ avctx->pix_fmt = AV_PIX_FMT_RGB24;
+ avctx->compression_level = 0;
+
+ if (avcodec_open2(avctx, png_codec, NULL) < 0) {
+@@ -104,19 +108,14 @@ static int write_png(screenshot_ctx *ctx
+ goto error_exit;
+ }
+
+- size_t outbuffer_size = image->width * image->height * 3 * 2;
+- outbuffer = malloc(outbuffer_size);
+- if (!outbuffer)
+- goto error_exit;
+-
+ AVFrame *pic = ctx->pic;
+- avcodec_get_frame_defaults(pic);
++ av_frame_unref(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)
++ int ret = avcodec_encode_video2(avctx, &pkt, pic, &got_output);
++ if (ret < 0)
+ goto error_exit;
+
+ fp = fopen(fname, "wb");
+@@ -126,20 +125,20 @@ static int write_png(screenshot_ctx *ctx
+ goto error_exit;
+ }
+
+- fwrite(outbuffer, size, 1, fp);
++ fwrite(pkt.data, pkt.size, 1, fp);
+ fflush(fp);
+
+ if (ferror(fp))
+ goto error_exit;
+
+- success = 1;
++ success = !!got_output;
+ error_exit:
+ if (avctx)
+ avcodec_close(avctx);
+ av_free(avctx);
+ if (fp)
+ fclose(fp);
+- free(outbuffer);
++ av_free_packet(&pkt);
+ return success;
+ }
+