ext/ffmpeg/gstffmpegdec.c: Properly unref a buffer if we drop it.
authorEdward Hervey <bilboed@bilboed.com>
Fri, 11 Nov 2005 14:43:01 +0000 (14:43 +0000)
committerEdward Hervey <bilboed@bilboed.com>
Fri, 11 Nov 2005 14:43:01 +0000 (14:43 +0000)
Original commit message from CVS:
* ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_get_buffer),
(gst_ffmpegdec_release_buffer), (gst_ffmpegdec_frame),
(gst_ffmpegdec_sink_event):
Properly unref a buffer if we drop it.
Esthetic fixes.

ChangeLog
ext/ffmpeg/gstffmpegdec.c

index c4ce5cd11fba2006dd9e3974f3602bbc5ca7890a..a909b3276808e861350baf4105b17b394d2ca73a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2005-11-11  Edward Hervey  <edward@fluendo.com>
+
+       * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_get_buffer),
+       (gst_ffmpegdec_release_buffer), (gst_ffmpegdec_frame),
+       (gst_ffmpegdec_sink_event):
+       Properly unref a buffer if we drop it.
+       Esthetic fixes.
+
 2005-11-08  Ronald S. Bultje  <rbultje@ronald.bitfreak.net>
 
        * TODO:
index 33b0abfc304c78f4c4ab1ea2b8a04ceb2a6510a4..47ca32830b219ced59385ee3215d5746ac14c034 100644 (file)
@@ -566,7 +566,8 @@ gst_ffmpegdec_get_buffer (AVCodecContext * context, AVFrame * picture)
        return avcodec_default_get_buffer(context, picture);
       }
       
-      if (gst_pad_alloc_buffer (ffmpegdec->srcpad, GST_BUFFER_OFFSET_NONE, bufsize, GST_PAD_CAPS (ffmpegdec->srcpad), &buf) != GST_FLOW_OK)
+      if (gst_pad_alloc_buffer (ffmpegdec->srcpad, GST_BUFFER_OFFSET_NONE, 
+                               bufsize, GST_PAD_CAPS (ffmpegdec->srcpad), &buf) != GST_FLOW_OK)
         return -1;
       ffmpegdec->last_buffer = buf;
       
@@ -592,6 +593,8 @@ gst_ffmpegdec_get_buffer (AVCodecContext * context, AVFrame * picture)
   picture->opaque = buf;
   gst_buffer_ref (buf);
 
+  GST_LOG_OBJECT (ffmpegdec, "END");
+
   return 0;
 }
 
@@ -602,6 +605,7 @@ gst_ffmpegdec_release_buffer (AVCodecContext * context, AVFrame * picture)
   GstBuffer *buf = GST_BUFFER (picture->opaque);
   GstFFMpegDec *ffmpegdec = (GstFFMpegDec *) context->opaque; 
   
+
   g_return_if_fail (buf != NULL);
   g_return_if_fail (picture->type == FF_BUFFER_TYPE_USER);
 
@@ -727,7 +731,7 @@ gst_ffmpegdec_frame (GstFFMpegDec * ffmpegdec,
       len = avcodec_decode_video (ffmpegdec->context,
           ffmpegdec->picture, &have_data, data, size);
       GST_DEBUG_OBJECT (ffmpegdec,
-          "Decode video: len=%d, have_data=%d", len, have_data);
+          "Decoded video: len=%d, have_data=%d", len, have_data);
 
       if (ffmpegdec->waiting_for_key) {
         if (ffmpegdec->picture->pict_type == FF_I_TYPE) {
@@ -758,9 +762,11 @@ gst_ffmpegdec_frame (GstFFMpegDec * ffmpegdec,
           ffmpegdec->synctime = GST_CLOCK_TIME_NONE;
         } else {
           GST_WARNING_OBJECT (ffmpegdec,
-              "Dropping frame for synctime %" GST_TIME_FORMAT ", expected %"
+              "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);
           have_data = 0;
           /* donĀ“t break here! Timestamps are updated below */
         }
@@ -960,8 +966,8 @@ gst_ffmpegdec_sink_event (GstPad * pad, GstEvent * event)
       gst_event_parse_newsegment (event, NULL, &rate, &fmt, &start, &end, &base);
       if (fmt == GST_FORMAT_TIME) {
         ffmpegdec->next_ts = start;
-        GST_DEBUG_OBJECT (ffmpegdec, "Discont to time %" GST_TIME_FORMAT,
-            GST_TIME_ARGS (start));
+        GST_DEBUG_OBJECT (ffmpegdec, "Discont to time (next_ts) %" GST_TIME_FORMAT" -- %"GST_TIME_FORMAT,
+            GST_TIME_ARGS (start), GST_TIME_ARGS (end));
       } else if (ffmpegdec->context->bit_rate && fmt == GST_FORMAT_BYTES) {
         ffmpegdec->next_ts = start * GST_SECOND / ffmpegdec->context->bit_rate;
         GST_DEBUG_OBJECT (ffmpegdec,