pacho       14/06/25 09:32:27

  Added:                gst-plugins-libav-1.2.4-ffmpeg2.patch
                        gst-plugins-libav-1.2.4-fix-memory-leak.patch
  Log:
  Version bump, fix memory leak (#494282)
  
  (Portage version: 2.2.10/cvs/Linux x86_64, signed Manifest commit with key 
A188FBD4)

Revision  Changes    Path
1.1                  
media-plugins/gst-plugins-libav/files/gst-plugins-libav-1.2.4-ffmpeg2.patch

file : 
http://sources.gentoo.org/viewvc.cgi/gentoo-x86/media-plugins/gst-plugins-libav/files/gst-plugins-libav-1.2.4-ffmpeg2.patch?rev=1.1&view=markup
plain: 
http://sources.gentoo.org/viewvc.cgi/gentoo-x86/media-plugins/gst-plugins-libav/files/gst-plugins-libav-1.2.4-ffmpeg2.patch?rev=1.1&content-type=text/plain

Index: gst-plugins-libav-1.2.4-ffmpeg2.patch
===================================================================
Index: gst-libav-1.2.0/ext/libav/gstavauddec.c
===================================================================
--- gst-libav-1.2.0.orig/ext/libav/gstavauddec.c
+++ gst-libav-1.2.0/ext/libav/gstavauddec.c
@@ -460,7 +460,7 @@ gst_ffmpegauddec_audio_frame (GstFFMpegA
     GstBuffer ** outbuf, GstFlowReturn * ret)
 {
   gint len = -1;
-  gint have_data = AVCODEC_MAX_AUDIO_FRAME_SIZE;
+  gint have_data = 0;
   AVPacket packet;
   AVFrame frame;
 
Index: gst-libav-1.2.0/ext/libav/gstavaudenc.c
===================================================================
--- gst-libav-1.2.0.orig/ext/libav/gstavaudenc.c
+++ gst-libav-1.2.0/ext/libav/gstavaudenc.c
@@ -289,7 +289,6 @@ gst_ffmpegaudenc_set_format (GstAudioEnc
   ffmpegaudenc->context->coder_type = 0;
   ffmpegaudenc->context->context_model = 0;
   ffmpegaudenc->context->scenechange_threshold = 0;
-  ffmpegaudenc->context->inter_threshold = 0;
 
   /* fetch pix_fmt and so on */
   gst_ffmpeg_audioinfo_to_context (info, ffmpegaudenc->context);
Index: gst-libav-1.2.0/ext/libav/gstavcfg.c
===================================================================
--- gst-libav-1.2.0.orig/ext/libav/gstavcfg.c
+++ gst-libav-1.2.0/ext/libav/gstavcfg.c
@@ -171,13 +171,10 @@ gst_ffmpeg_idct_algo_get_type (void)
       {FF_IDCT_INT, "JPEG reference Integer", "int"},
       {FF_IDCT_SIMPLE, "Simple", "simple"},
       {FF_IDCT_SIMPLEMMX, "Simple MMX", "simplemmx"},
-      {FF_IDCT_LIBMPEG2MMX, "LIBMPEG2MMX", "libmpeg2mmx"},
       {FF_IDCT_ARM, "ARM", "arm"},
       {FF_IDCT_ALTIVEC, "ALTIVEC", "altivec"},
       {FF_IDCT_SH4, "SH4", "sh4"},
       {FF_IDCT_SIMPLEARM, "SIMPLEARM", "simplearm"},
-      {FF_IDCT_H264, "H264", "h264"},
-      {FF_IDCT_VP3, "VP3", "vp3"},
       {FF_IDCT_IPP, "IPP", "ipp"},
       {FF_IDCT_XVIDMMX, "XVIDMMX", "xvidmmx"},
       {0, NULL, NULL},
@@ -274,9 +271,6 @@ gst_ffmpeg_flags_get_type (void)
           "global-headers"},
       {CODEC_FLAG_AC_PRED, "H263 Advanced Intra Coding / MPEG4 AC prediction",
           "aic"},
-      {CODEC_FLAG_CBP_RD, "Rate Distoration Optimization for CBP", "cbp-rd"},
-      {CODEC_FLAG_QP_RD, "Rate Distoration Optimization for QP selection",
-          "qp-rd"},
       {CODEC_FLAG_CLOSED_GOP, "Closed GOP", "closedgop"},
       {0, NULL, NULL},
     };
@@ -564,18 +558,6 @@ gst_ffmpeg_cfg_init (void)
       -100, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
   gst_ffmpeg_add_pspec (pspec, max_key_interval, FALSE, mpeg, NULL);
 
-  pspec = g_param_spec_int ("luma-elim-threshold",
-      "Luma Elimination Threshold",
-      "Luma Single Coefficient Elimination Threshold",
-      -99, 99, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
-  gst_ffmpeg_add_pspec (pspec, config.luma_elim_threshold, FALSE, mpeg, NULL);
-
-  pspec = g_param_spec_int ("chroma-elim-threshold",
-      "Chroma Elimination Threshold",
-      "Chroma Single Coefficient Elimination Threshold",
-      -99, 99, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
-  gst_ffmpeg_add_pspec (pspec, config.chroma_elim_threshold, FALSE, mpeg, 
NULL);
-
   pspec = g_param_spec_float ("lumi-masking", "Luminance Masking",
       "Luminance Masking", -1.0f, 1.0f, 0.0f,
       G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
Index: gst-libav-1.2.0/ext/libav/gstavcodecmap.c
===================================================================
--- gst-libav-1.2.0.orig/ext/libav/gstavcodecmap.c
+++ gst-libav-1.2.0/ext/libav/gstavcodecmap.c
@@ -788,12 +788,10 @@ gst_ffmpeg_codecid_to_caps (enum AVCodec
           break;
       }
 
-      /* FIXME: context->sub_id must be filled in during decoding */
       caps =
           gst_ff_vid_caps_new (context, NULL, codec_id, encode,
           "video/x-pn-realvideo", "rmversion", G_TYPE_INT, version, NULL);
       if (context) {
-        gst_caps_set_simple (caps, "format", G_TYPE_INT, context->sub_id, 
NULL);
         if (context->extradata_size >= 8) {
           gst_caps_set_simple (caps,
               "subformat", G_TYPE_INT, GST_READ_UINT32_BE (context->extradata),
@@ -2892,18 +2890,6 @@ gst_ffmpeg_caps_with_codecid (enum AVCod
     }
       break;
 
-    case AV_CODEC_ID_RV10:
-    case AV_CODEC_ID_RV20:
-    case AV_CODEC_ID_RV30:
-    case AV_CODEC_ID_RV40:
-    {
-      gint format;
-
-      if (gst_structure_get_int (str, "format", &format))
-        context->sub_id = format;
-
-      break;
-    }
     case AV_CODEC_ID_COOK:
     case AV_CODEC_ID_RA_288:
     case AV_CODEC_ID_RA_144:
Index: gst-libav-1.2.0/ext/libav/gstavvidenc.c
===================================================================
--- gst-libav-1.2.0.orig/ext/libav/gstavvidenc.c
+++ gst-libav-1.2.0/ext/libav/gstavvidenc.c
@@ -338,7 +338,6 @@ gst_ffmpegvidenc_set_format (GstVideoEnc
   ffmpegenc->context->coder_type = 0;
   ffmpegenc->context->context_model = 0;
   ffmpegenc->context->scenechange_threshold = 0;
-  ffmpegenc->context->inter_threshold = 0;
 
   /* and last but not least the pass; CBR, 2-pass, etc */
   ffmpegenc->context->flags |= ffmpegenc->pass;



1.1                  
media-plugins/gst-plugins-libav/files/gst-plugins-libav-1.2.4-fix-memory-leak.patch

file : 
http://sources.gentoo.org/viewvc.cgi/gentoo-x86/media-plugins/gst-plugins-libav/files/gst-plugins-libav-1.2.4-fix-memory-leak.patch?rev=1.1&view=markup
plain: 
http://sources.gentoo.org/viewvc.cgi/gentoo-x86/media-plugins/gst-plugins-libav/files/gst-plugins-libav-1.2.4-fix-memory-leak.patch?rev=1.1&content-type=text/plain

Index: gst-plugins-libav-1.2.4-fix-memory-leak.patch
===================================================================
--- ext/libav/gstavviddec.c
+++ ext/libav/gstavviddec.c
@@ -523,6 +523,7 @@ open_failed:
 
 typedef struct
 {
+  GstFFMpegVidDec *ffmpegdec;
   GstVideoCodecFrame *frame;
   gboolean mapped;
   GstVideoFrame vframe;
@@ -530,13 +531,17 @@ typedef struct
 } GstFFMpegVidDecVideoFrame;
 
 static GstFFMpegVidDecVideoFrame *
-gst_ffmpegviddec_video_frame_new (GstVideoCodecFrame * frame)
+gst_ffmpegviddec_video_frame_new (GstFFMpegVidDec * ffmpegdec,
+    GstVideoCodecFrame * frame)
 {
   GstFFMpegVidDecVideoFrame *dframe;
 
   dframe = g_slice_new0 (GstFFMpegVidDecVideoFrame);
+  dframe->ffmpegdec = ffmpegdec;
   dframe->frame = frame;
 
+  GST_DEBUG_OBJECT (ffmpegdec, "new video frame %p", dframe);
+
   return dframe;
 }
 
@@ -544,6 +549,8 @@ static void
 gst_ffmpegviddec_video_frame_free (GstFFMpegVidDec * ffmpegdec,
     GstFFMpegVidDecVideoFrame * frame)
 {
+  GST_DEBUG_OBJECT (ffmpegdec, "free video frame %p", frame);
+
   if (frame->mapped)
     gst_video_frame_unmap (&frame->vframe);
   gst_video_decoder_release_frame (GST_VIDEO_DECODER (ffmpegdec), 
frame->frame);
@@ -551,6 +558,14 @@ gst_ffmpegviddec_video_frame_free (GstFFMpegVidDec * 
ffmpegdec,
   g_slice_free (GstFFMpegVidDecVideoFrame, frame);
 }
 
+static void
+dummy_free_buffer (void *opaque, uint8_t * data)
+{
+  GstFFMpegVidDecVideoFrame *frame = opaque;
+
+  gst_ffmpegviddec_video_frame_free (frame->ffmpegdec, frame);
+}
+
 /* called when ffmpeg wants us to allocate a buffer to write the decoded frame
  * into. We try to give it memory from our pool */
 static int
@@ -589,7 +604,8 @@ gst_ffmpegviddec_get_buffer (AVCodecContext * context, 
AVFrame * picture)
     goto duplicate_frame;
 
   /* GstFFMpegVidDecVideoFrame receives the frame ref */
-  picture->opaque = dframe = gst_ffmpegviddec_video_frame_new (frame);
+  picture->opaque = dframe =
+      gst_ffmpegviddec_video_frame_new (ffmpegdec, frame);
 
   GST_DEBUG_OBJECT (ffmpegdec, "storing opaque %p", dframe);
 
@@ -695,12 +711,20 @@ invalid_frame:
 fallback:
   {
     int c;
+    gboolean first = TRUE;
     int ret = avcodec_default_get_buffer (context, picture);
 
     GST_LOG_OBJECT (ffmpegdec, "performing fallback alloc");
-    for (c = 0; c < AV_NUM_DATA_POINTERS; c++)
+    for (c = 0; c < AV_NUM_DATA_POINTERS; c++) {
       ffmpegdec->stride[c] = picture->linesize[c];
 
+      if (picture->buf[c] == NULL && first) {
+        picture->buf[c] =
+            av_buffer_create (NULL, 0, dummy_free_buffer, dframe, 0);
+        first = FALSE;
+      }
+    }
+
     return ret;
   }
 duplicate_frame:
@@ -1684,8 +1718,8 @@ gst_ffmpegviddec_decide_allocation (GstVideoDecoder * 
decoder, GstQuery * query)
     avcodec_align_dimensions2 (ffmpegdec->context, &width, &height,
         linesize_align);
     edge =
-        ffmpegdec->context->
-        flags & CODEC_FLAG_EMU_EDGE ? 0 : avcodec_get_edge_width ();
+        ffmpegdec->
+        context->flags & CODEC_FLAG_EMU_EDGE ? 0 : avcodec_get_edge_width ();
     /* increase the size for the padding */
     width += edge << 1;
     height += edge << 1;




Reply via email to