2006-07-14 Andy Wingo <wingo@pobox.com>
+ * ext/theora/gsttheoraparse.h:
+ * ext/theora/theoraparse.c (theora_parse_drain_event_queue)
+ (theora_parse_push_headers, theora_parse_clear_queue)
+ (theora_parse_drain_queue_prematurely, )
+ (theora_parse_sink_event, theora_parse_change_state): Queue events
+ until we initialized our state, like in vorbisparse.
+
* ext/vorbis/vorbisparse.h:
* ext/vorbis/vorbisparse.c (vorbis_parse_drain_event_queue)
(vorbis_parse_push_headers, vorbis_parse_clear_queue)
}
static void
+theora_parse_drain_event_queue (GstTheoraParse * parse)
+{
+ while (parse->event_queue->length) {
+ GstEvent *event;
+
+ event = GST_EVENT_CAST (g_queue_pop_head (parse->event_queue));
+ gst_pad_event_default (parse->sinkpad, event);
+ }
+}
+
+static void
theora_parse_push_headers (GstTheoraParse * parse)
{
gint i;
+ theora_parse_drain_event_queue (parse);
+
if (!parse->streamheader_received)
theora_parse_set_streamheader (parse);
buf = GST_BUFFER_CAST (g_queue_pop_head (parse->buffer_queue));
gst_buffer_unref (buf);
}
+ while (parse->event_queue->length) {
+ GstEvent *event;
+
+ event = GST_EVENT_CAST (g_queue_pop_head (parse->event_queue));
+ gst_buffer_unref (event);
+ }
}
static gint64
GST_DEBUG_OBJECT (parse, "got EOS, draining queue");
+ /* if we get an eos before pushing the streamheaders, drain our events before
+ * eos */
+ theora_parse_drain_event_queue (parse);
+
while (!g_queue_is_empty (parse->buffer_queue)) {
GstBuffer *buf;
}
static gboolean
+theora_parse_queue_event (GstTheoraParse * parse, GstEvent * event)
+{
+ g_queue_push_tail (parse->event_queue, event);
+ return TRUE;
+}
+
+static gboolean
theora_parse_sink_event (GstPad * pad, GstEvent * event)
{
gboolean ret;
ret = gst_pad_event_default (pad, event);
break;
default:
- ret = gst_pad_event_default (pad, event);
+ if (parse->send_streamheader && GST_EVENT_IS_SERIALIZED (event))
+ ret = theora_parse_queue_event (parse, event);
+ else
+ ret = gst_pad_event_default (pad, event);
break;
}
parse->packetno = 0;
parse->send_streamheader = TRUE;
parse->buffer_queue = g_queue_new ();
+ parse->event_queue = g_queue_new ();
parse->prev_keyframe = -1;
parse->prev_frame = -1;
break;
theora_comment_clear (&parse->comment);
theora_parse_clear_queue (parse);
g_queue_free (parse->buffer_queue);
+ g_queue_free (parse->event_queue);
parse->buffer_queue = NULL;
for (i = 0; i < 3; i++) {
if (parse->streamheader[i]) {
#define GST_LICENSE "LGPL"
/* package name in plugins */
-#define GST_PACKAGE_NAME "GStreamer Base Plug-ins source release"
+#define GST_PACKAGE_NAME "GStreamer Base Plug-ins CVS/prerelease"
/* package origin */
#define GST_PACKAGE_ORIGIN "Unknown package origin"
#undef PACKAGE_NAME "GStreamer Base Plug-ins"
/* Define to the full name and version of this package. */
-#undef PACKAGE_STRING "GStreamer Base Plug-ins 0.10.9"
+#undef PACKAGE_STRING "GStreamer Base Plug-ins 0.10.9.1"
/* Define to the one symbol short name of this package. */
#undef PACKAGE_TARNAME "gst-plugins-base"
/* Define to the version of this package. */
-#undef PACKAGE_VERSION "0.10.9"
+#undef PACKAGE_VERSION "0.10.9.1"
/* directory where plugins are located */
#undef PLUGINDIR
#undef STDC_HEADERS
/* Version number of package */
-#define VERSION "0.10.9"
+#define VERSION "0.10.9.1"
/* Define to 1 if your processor stores words with the most significant byte
first (like Motorola and SPARC, unlike Intel and VAX). */