summaryrefslogtreecommitdiff
path: root/multimedia/mplayer2/files/patch-screenshot.c
blob: cac213fcc985b3589612fb6fb7133c43514ac056 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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;
 }