static GstPad *gst_ogg_mux_request_new_pad (GstElement * element,
GstPadTemplate * templ, const gchar * name, const GstCaps * caps);
static void gst_ogg_mux_release_pad (GstElement * element, GstPad * pad);
+static void gst_ogg_pad_data_reset (GstOggMux * ogg_mux,
+ GstOggPadData * pad_data);
static void gst_ogg_mux_set_property (GObject * object,
guint prop_id, const GValue * value, GParamSpec * pspec);
return GST_PAD_LINK_OK;
}
+static void
+gst_ogg_mux_flush (GstOggMux * ogg_mux)
+{
+ GSList *walk;
+
+ for (walk = ogg_mux->collect->data; walk; walk = g_slist_next (walk)) {
+ GstOggPadData *pad;
+
+ pad = (GstOggPadData *) walk->data;
+
+ gst_ogg_pad_data_reset (ogg_mux, pad);
+ }
+
+ gst_ogg_mux_clear (ogg_mux);
+}
+
static gboolean
gst_ogg_mux_sink_event (GstCollectPads * pads, GstCollectData * pad,
GstEvent * event, gpointer user_data)
break;
}
case GST_EVENT_FLUSH_STOP:{
- gst_segment_init (&ogg_pad->segment, GST_FORMAT_TIME);
+ /* only a single flush-stop is forwarded from collect pads */
+ gst_ogg_mux_flush (ogg_mux);
break;
}
case GST_EVENT_TAG:{
return FALSE;
}
+static void
+gst_ogg_pad_data_reset (GstOggMux * ogg_mux, GstOggPadData * oggpad)
+{
+ oggpad->packetno = 0;
+ oggpad->pageno = 0;
+ oggpad->eos = FALSE;
+
+ /* we assume there will be some control data first for this pad */
+ oggpad->state = GST_OGG_PAD_STATE_CONTROL;
+ oggpad->new_page = TRUE;
+ oggpad->first_delta = FALSE;
+ oggpad->prev_delta = FALSE;
+ oggpad->data_pushed = FALSE;
+ oggpad->map.headers = NULL;
+ oggpad->map.queued = NULL;
+ oggpad->next_granule = 0;
+ oggpad->keyframe_granule = -1;
+ ogg_stream_init (&oggpad->map.stream, oggpad->map.serialno);
+
+ if (oggpad->pagebuffers) {
+ GstBuffer *buf;
+
+ while ((buf = g_queue_pop_head (oggpad->pagebuffers)) != NULL) {
+ gst_buffer_unref (buf);
+ }
+ } else if (GST_STATE (ogg_mux) > GST_STATE_READY) {
+ /* This will be initialized in init_collectpads when going from ready
+ * paused state */
+ oggpad->pagebuffers = g_queue_new ();
+ }
+
+ gst_segment_init (&oggpad->segment, GST_FORMAT_TIME);
+}
+
static guint32
gst_ogg_mux_generate_serialno (GstOggMux * ogg_mux)
{
ogg_mux->active_pads++;
oggpad->map.serialno = serial;
- oggpad->packetno = 0;
- oggpad->pageno = 0;
- oggpad->eos = FALSE;
- /* we assume there will be some control data first for this pad */
- oggpad->state = GST_OGG_PAD_STATE_CONTROL;
- oggpad->new_page = TRUE;
- oggpad->first_delta = FALSE;
- oggpad->prev_delta = FALSE;
- oggpad->data_pushed = FALSE;
- oggpad->map.headers = NULL;
- oggpad->map.queued = NULL;
- oggpad->next_granule = 0;
- oggpad->keyframe_granule = -1;
-
- if (GST_STATE (ogg_mux) > GST_STATE_READY) {
- /* This will be initialized in init_collectpads when going from ready
- * paused state */
- ogg_stream_init (&oggpad->map.stream, oggpad->map.serialno);
- oggpad->pagebuffers = g_queue_new ();
- }
-
- gst_segment_init (&oggpad->segment, GST_FORMAT_TIME);
+ gst_ogg_pad_data_reset (ogg_mux, oggpad);
}
}