ext/ffmpeg/gstffmpegdec.c: Fix some segfaults while seeking. When i have unreffed...
authorLuca Ognibene <luogni@tin.it>
Wed, 16 Nov 2005 21:48:06 +0000 (21:48 +0000)
committerLuca Ognibene <luogni@tin.it>
Wed, 16 Nov 2005 21:48:06 +0000 (21:48 +0000)
Original commit message from CVS:
* ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_release_buffer),
(gst_ffmpegdec_frame):
Fix some segfaults while seeking. When i have unreffed
the buffer in _release_buffer i should also set picture->opaque to
NULL otherwise sometimes it can be unreffed another time in
_frame causing an invalid read/write.

ChangeLog
common
ext/ffmpeg/gstffmpegdec.c

index 0ceec94..e993c6f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2005-11-16  Luca Ognibene  <luogni@tin.it>
+
+       * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_release_buffer),
+       (gst_ffmpegdec_frame):
+        Fix some segfaults while seeking. When i have unreffed 
+        the buffer in _release_buffer i should also set picture->opaque to
+        NULL otherwise sometimes it can be unreffed another time in
+        _frame causing an invalid read/write.
+
 2005-11-14  Andy Wingo  <wingo@pobox.com>
 
        * configure.ac (GST_PLUGIN_LDFLAGS): -no-undefined for better
diff --git a/common b/common
index 657b549..ea14091 160000 (submodule)
--- a/common
+++ b/common
@@ -1 +1 @@
-Subproject commit 657b549dfb640a76f3d7ab7676e453c801a83dca
+Subproject commit ea1409191cc1e71273b2dbdd94e7ab5fc5a60a51
index 65b85e9..b36ff48 100644 (file)
@@ -603,16 +603,19 @@ static void
 gst_ffmpegdec_release_buffer (AVCodecContext * context, AVFrame * picture)
 {
   gint i;
-  GstBuffer *buf = GST_BUFFER (picture->opaque);
+  GstBuffer *buf;
   GstFFMpegDec *ffmpegdec = (GstFFMpegDec *) context->opaque;
-
-
+  
   g_return_if_fail (buf != NULL);
   g_return_if_fail (picture->type == FF_BUFFER_TYPE_USER);
 
+  buf = GST_BUFFER (picture->opaque);
+
   if (buf == ffmpegdec->last_buffer)
     ffmpegdec->last_buffer = NULL;
   gst_buffer_unref (buf);
+  
+  picture->opaque = NULL;
 
   /* zero out the reference in ffmpeg */
   for (i = 0; i < 4; i++) {
@@ -769,9 +772,13 @@ gst_ffmpegdec_frame (GstFFMpegDec * ffmpegdec,
               "Dropping frame for synctime %" GST_TIME_FORMAT
               ", expected(next_ts) %" GST_TIME_FORMAT,
               GST_TIME_ARGS (ffmpegdec->synctime),
-              GST_TIME_ARGS (ffmpegdec->next_ts));
-          if (ffmpegdec->last_buffer)
-            gst_buffer_unref (ffmpegdec->last_buffer);
+              GST_TIME_ARGS (ffmpegdec->next_ts));       
+
+         if (ffmpegdec->picture->opaque != NULL) {
+           outbuf = (GstBuffer *) ffmpegdec->picture->opaque;
+           gst_buffer_unref (outbuf);
+         }
+
           have_data = 0;
           /* donĀ“t break here! Timestamps are updated below */
         }