diff options
author | Julien Isorce <julien.isorce@gmail.com> | 2009-12-18 00:34:13 +0100 |
---|---|---|
committer | Julien Isorce <julien.isorce@gmail.com> | 2009-12-18 00:34:13 +0100 |
commit | 872034e3d25a2c02477a135345db1434104fddd0 (patch) | |
tree | 78f757c62b20bba28df3ac95bb4d59c2d6d78513 | |
parent | b7e2c8408e3c7c98cf3d8b9f8b3261ecaf542c41 (diff) |
gstglmixer: copy/past recent changes from gstvideomixer
-rw-r--r-- | gst-libs/gst/gl/gstglmixer.c | 24 |
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; |