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;
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))
gst_gl_mixer_update_queues (GstGLMixer * mix)
{
GSList *walk;
- guint64 interval;
+ gint64 interval;
interval = mix->master->queued;
if (interval <= 0) {
} 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);
}
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;
}
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;
* 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;