diff options
Diffstat (limited to 'multimedia/mplayer2/files/patch-screenshot.c')
-rw-r--r-- | multimedia/mplayer2/files/patch-screenshot.c | 90 |
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; + } + |