Mercurial > mplayer.hg
changeset 36744:a86b7ed5f1dc
Switch to refcounted API since the old ones have memleaks.
A fixable one due to the "non-refcounting" API in fact still
using reference counting for the qp tables, and a probably
unfixable one (unless we add hacks MPlayer side) due to the
sidedata being copied.
author | reimar |
---|---|
date | Sat, 15 Feb 2014 16:52:59 +0000 |
parents | 9249a5caebdf |
children | b85aab929951 |
files | libmpcodecs/vd_ffmpeg.c |
diffstat | 1 files changed, 12 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/libmpcodecs/vd_ffmpeg.c Sat Feb 15 16:52:58 2014 +0000 +++ b/libmpcodecs/vd_ffmpeg.c Sat Feb 15 16:52:59 2014 +0000 @@ -76,6 +76,7 @@ typedef struct { AVCodecContext *avctx; AVFrame *pic; + AVFrame *refcount_frame; enum AVPixelFormat pix_fmt; int do_slices; int do_dr1; @@ -338,7 +339,7 @@ ctx->ip_count= ctx->b_count= 0; - ctx->pic = avcodec_alloc_frame(); + ctx->pic = av_frame_alloc(); ctx->avctx = avcodec_alloc_context3(lavc_codec); avctx = ctx->avctx; avctx->opaque = sh; @@ -482,6 +483,7 @@ set_format_params(avctx, PIX_FMT_XVMC_MPEG2_IDCT); avctx->thread_count = lavc_param_threads; avctx->thread_type = FF_THREAD_FRAME | FF_THREAD_SLICE; + avctx->refcounted_frames = 1; /* open it */ if (avcodec_open2(avctx, lavc_codec, &opts) < 0) { @@ -502,6 +504,10 @@ vd_ffmpeg_ctx *ctx = sh->context; AVCodecContext *avctx = ctx->avctx; + if (ctx->refcount_frame) { + av_frame_unref(ctx->refcount_frame); + ctx->refcount_frame = NULL; + } if(lavc_param_vstats && avctx->coded_frame){ int i; for(i=1; i<32; i++){ @@ -885,6 +891,10 @@ int dr1= ctx->do_dr1; AVPacket pkt; + if (ctx->refcount_frame) { + av_frame_unref(ctx->refcount_frame); + ctx->refcount_frame = NULL; + } if(data && len<=0) return NULL; // skipped frame //ffmpeg interlace (mpeg2) bug have been fixed. no need of -noslices @@ -938,6 +948,7 @@ ctx->palette_sent = 1; } ret = avcodec_decode_video2(avctx, pic, &got_picture, &pkt); + ctx->refcount_frame = pic; pkt.data = NULL; pkt.size = 0; av_packet_free_side_data(&pkt);