summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulien Isorce <julien.isorce@gmail.com>2009-12-18 00:34:13 +0100
committerJulien Isorce <julien.isorce@gmail.com>2009-12-18 00:34:13 +0100
commit872034e3d25a2c02477a135345db1434104fddd0 (patch)
tree78f757c62b20bba28df3ac95bb4d59c2d6d78513
parentb7e2c8408e3c7c98cf3d8b9f8b3261ecaf542c41 (diff)
gstglmixer: copy/past recent changes from gstvideomixer
-rw-r--r--gst-libs/gst/gl/gstglmixer.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/gst-libs/gst/gl/gstglmixer.c b/gst-libs/gst/gl/gstglmixer.c
index a206e1a..4c60083 100644
--- a/gst-libs/gst/gl/gstglmixer.c
+++ b/gst-libs/gst/gl/gstglmixer.c
@@ -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;