summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@mplayer2.org>2012-04-29 07:32:57 +0200
committerwm4 <wm4@mplayer2.org>2012-04-29 10:01:55 +0200
commit4add4f708e14367833fb9f1308c0802fbe32a808 (patch)
tree8fb8eef1953017c1d432708ae6073c006020c1f2
parent97ac824124fc5cdfbd9ac74156b79c098bce09c6 (diff)
downloadmpv-4add4f708e14367833fb9f1308c0802fbe32a808.tar.bz2
mpv-4add4f708e14367833fb9f1308c0802fbe32a808.tar.xz
screenshot, vo_png: fix dependency on sizeof(AVFrame)
In order to stay binary compatible with libavcodec, applications should not dependent on sizeof(AVFrame). This means allocating AVFrame on the stack is not allowed, and the function avcodec_alloc_frame() must be used to allocate an AVFrame instead. Partially based on a patch by uau.
-rw-r--r--libvo/vo_png.c15
-rw-r--r--screenshot.c18
2 files changed, 22 insertions, 11 deletions
diff --git a/libvo/vo_png.c b/libvo/vo_png.c
index 6e23bafd5f..d0d56d3e85 100644
--- a/libvo/vo_png.c
+++ b/libvo/vo_png.c
@@ -50,6 +50,7 @@ static int z_compression;
static int framenum;
static int use_alpha;
static AVCodecContext *avctx;
+static AVFrame *pic;
static uint8_t *outbuffer;
int outbuffer_size;
@@ -70,6 +71,9 @@ config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uin
avctx = avcodec_alloc_context3(png_codec);
if (!avctx)
goto error;
+ pic = avcodec_alloc_frame();
+ if (!pic)
+ goto error;
avctx->width = width;
avctx->height = height;
avctx->pix_fmt = imgfmt2pixfmt(format);
@@ -85,7 +89,6 @@ config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uin
static uint32_t draw_image(mp_image_t* mpi){
- AVFrame pic;
int buffersize;
int res;
char buf[100];
@@ -101,15 +104,17 @@ static uint32_t draw_image(mp_image_t* mpi){
return 1;
}
- pic.data[0] = mpi->planes[0];
- pic.linesize[0] = mpi->stride[0];
+ avcodec_get_frame_defaults(pic);
+
+ pic->data[0] = mpi->planes[0];
+ pic->linesize[0] = mpi->stride[0];
buffersize = mpi->w * mpi->h * 8;
if (outbuffer_size < buffersize) {
av_freep(&outbuffer);
outbuffer = av_malloc(buffersize);
outbuffer_size = buffersize;
}
- res = avcodec_encode_video(avctx, outbuffer, outbuffer_size, &pic);
+ res = avcodec_encode_video(avctx, outbuffer, outbuffer_size, pic);
if(res < 0){
mp_msg(MSGT_VO,MSGL_WARN, "[VO_PNG] Error in create_png.\n");
@@ -156,6 +161,8 @@ static void uninit(void)
avcodec_close(avctx);
av_freep(&avctx);
av_freep(&outbuffer);
+ av_free(pic);
+ pic = NULL;
outbuffer_size = 0;
}
diff --git a/screenshot.c b/screenshot.c
index ba1a48809f..43e77f22a5 100644
--- a/screenshot.c
+++ b/screenshot.c
@@ -23,8 +23,6 @@
#include <setjmp.h>
#include <time.h>
-#include "osdep/io.h"
-
#include <libswscale/swscale.h>
#include <libavcodec/avcodec.h>
@@ -34,6 +32,8 @@
#include <jpeglib.h>
#endif
+#include "osdep/io.h"
+
#include "talloc.h"
#include "screenshot.h"
#include "mp_core.h"
@@ -82,6 +82,7 @@ static int write_png(screenshot_ctx *ctx, struct mp_image *image, FILE *fp)
{
void *outbuffer = NULL;
int success = 0;
+ AVFrame *pic = NULL;
struct AVCodec *png_codec = avcodec_find_encoder(CODEC_ID_PNG);
AVCodecContext *avctx = NULL;
@@ -109,13 +110,15 @@ static int write_png(screenshot_ctx *ctx, struct mp_image *image, FILE *fp)
if (!outbuffer)
goto error_exit;
- AVFrame pic;
- avcodec_get_frame_defaults(&pic);
+ pic = avcodec_alloc_frame();
+ if (!pic)
+ goto error_exit;
+ avcodec_get_frame_defaults(pic);
for (int n = 0; n < 4; n++) {
- pic.data[n] = image->planes[n];
- pic.linesize[n] = image->stride[n];
+ pic->data[n] = image->planes[n];
+ pic->linesize[n] = image->stride[n];
}
- int size = avcodec_encode_video(avctx, outbuffer, outbuffer_size, &pic);
+ int size = avcodec_encode_video(avctx, outbuffer, outbuffer_size, pic);
if (size < 1)
goto error_exit;
@@ -126,6 +129,7 @@ error_exit:
if (avctx)
avcodec_close(avctx);
av_free(avctx);
+ av_free(pic);
free(outbuffer);
return success;
}