[411/906] gstglmixer: copy/past recent changes from gstvideomixer
authorJulien Isorce <julien.isorce@gmail.com>
Thu, 17 Dec 2009 23:34:13 +0000 (00:34 +0100)
committerTim-Philipp Müller <tim@centricular.com>
Sat, 9 Dec 2017 19:31:23 +0000 (19:31 +0000)
gst-libs/gst/gl/gstglmixer.c

index a206e1a..4c60083 100644 (file)
@@ -821,7 +821,7 @@ gst_gl_mixer_fill_queues (GstGLMixer * mix)
 
       GST_LOG_OBJECT (mix, "we need a new buffer");
 
-      buf = gst_collect_pads_pop (mix->collect, data);
+      buf = gst_collect_pads_peek (mix->collect, data);
 
       if (buf) {
         guint64 duration;
@@ -836,7 +836,9 @@ gst_gl_mixer_fill_queues (GstGLMixer * mix)
           if (mixpad->fps_n == 0) {
             duration = GST_CLOCK_TIME_NONE;
           } else {
-            duration = GST_SECOND * mixpad->fps_d / mixpad->fps_n;
+            duration =
+                gst_util_uint64_scale_int (GST_SECOND, mixpad->fps_d,
+                mixpad->fps_n);
           }
         }
         if (GST_CLOCK_TIME_IS_VALID (duration))
@@ -951,7 +953,7 @@ static void
 gst_gl_mixer_update_queues (GstGLMixer * mix)
 {
   GSList *walk;
-  guint64 interval;
+  gint64 interval;
 
   interval = mix->master->queued;
   if (interval <= 0) {
@@ -960,7 +962,7 @@ gst_gl_mixer_update_queues (GstGLMixer * mix)
     } else {
       interval = GST_SECOND * mix->fps_d / mix->fps_n;
     }
-    GST_LOG_OBJECT (mix, "set interval to %" G_GUINT64_FORMAT " nanoseconds",
+    GST_LOG_OBJECT (mix, "set interval to %" G_GINT64_FORMAT " nanoseconds",
         interval);
   }
 
@@ -975,7 +977,14 @@ gst_gl_mixer_update_queues (GstGLMixer * mix)
       pad->queued -= interval;
       GST_LOG_OBJECT (pad, "queued now %" G_GINT64_FORMAT, pad->queued);
       if (pad->queued <= 0) {
+        GstBuffer *buffer =
+            gst_collect_pads_pop (mix->collect, &mixcol->collect);
         GST_LOG_OBJECT (pad, "unreffing buffer");
+        if (buffer)
+          gst_buffer_unref (buffer);
+        else
+          GST_WARNING_OBJECT (pad,
+              "Buffer was removed by GstCollectPads in the meantime");
         gst_buffer_unref (mixcol->buffer);
         mixcol->buffer = NULL;
       }
@@ -1151,6 +1160,7 @@ gst_gl_mixer_src_event (GstPad * pad, GstEvent * event)
 static gboolean
 gst_gl_mixer_sink_event (GstPad * pad, GstEvent * event)
 {
+  GstGLMixerPad *vpad = GST_GL_MIXER_PAD (pad);
   GstGLMixer *videomixer = GST_GL_MIXER (gst_pad_get_parent (pad));
   gboolean ret;
 
@@ -1166,6 +1176,12 @@ gst_gl_mixer_sink_event (GstPad * pad, GstEvent * event)
        * and downstream (using our source pad, the bastard!).
        */
       videomixer->sendseg = TRUE;
+
+      /* Reset pad state after FLUSH_STOP */
+      if (vpad->mixcol->buffer)
+        gst_buffer_unref (vpad->mixcol->buffer);
+      vpad->mixcol->buffer = NULL;
+      vpad->queued = 0;
       break;
     case GST_EVENT_NEWSEGMENT:
       videomixer->sendseg = TRUE;