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;
}
|