summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>2009-03-31 16:07:46 +0200
committerMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>2009-03-31 16:18:00 +0200
commitad2c7bffe7d94c79184904b14101cbc93eeb9ebd (patch)
tree85462ced72694644022f71ac3d2daaa8f4483532
parentd2f954636997b16343b40dfefd3ffb0fb00895a1 (diff)
baseparse: Delay newsegment as long as possible.
If newsegment is sent (too) early, caps may not yet be fixed/set, and downstream may not have been linked.
-rw-r--r--gst/aacparse/gstbaseparse.c59
-rw-r--r--gst/amrparse/gstbaseparse.c59
2 files changed, 68 insertions, 50 deletions
diff --git a/gst/aacparse/gstbaseparse.c b/gst/aacparse/gstbaseparse.c
index 6d0e7f8d4..4940a8e49 100644
--- a/gst/aacparse/gstbaseparse.c
+++ b/gst/aacparse/gstbaseparse.c
@@ -750,4 +750,38 @@ gst_base_parse_handle_and_push_buffer (GstBaseParse * parse,
+ /* should have caps by now */
+ g_return_val_if_fail (GST_PAD_CAPS (parse->srcpad), GST_FLOW_ERROR);
+
gst_buffer_set_caps (buffer, GST_PAD_CAPS (parse->srcpad));
+ /* and should then also be linked downstream, so safe to send some events */
+ if (parse->priv->pad_mode == GST_ACTIVATE_PULL) {
+ if (G_UNLIKELY (parse->close_segment)) {
+ GST_DEBUG_OBJECT (parse, "loop sending close segment");
+ gst_pad_push_event (parse->srcpad, parse->close_segment);
+ parse->close_segment = NULL;
+ }
+
+ if (G_UNLIKELY (parse->pending_segment)) {
+ GST_DEBUG_OBJECT (parse, "loop push pending segment");
+ gst_pad_push_event (parse->srcpad, parse->pending_segment);
+ parse->pending_segment = NULL;
+ }
+ } else {
+ if (G_UNLIKELY (parse->pending_segment)) {
+ GST_DEBUG_OBJECT (parse, "chain pushing a pending segment");
+ gst_pad_push_event (parse->srcpad, parse->pending_segment);
+ parse->pending_segment = NULL;
+ }
+ }
+
+ if (G_UNLIKELY (parse->priv->pending_events)) {
+ GList *l;
+
+ for (l = parse->priv->pending_events; l != NULL; l = l->next) {
+ gst_pad_push_event (parse->srcpad, GST_EVENT (l->data));
+ }
+ g_list_free (parse->priv->pending_events);
+ parse->priv->pending_events = NULL;
+ }
+
/* TODO: Add to seek table */
@@ -841,5 +875,2 @@ gst_base_parse_chain (GstPad * pad, GstBuffer * buffer)
if (G_UNLIKELY (parse->pending_segment)) {
- GST_DEBUG_OBJECT (parse, "chain pushing a pending segment");
- gst_pad_push_event (parse->srcpad, parse->pending_segment);
- parse->pending_segment = NULL;
parse->priv->offset = parse->priv->pending_offset;
@@ -856,12 +887,2 @@ gst_base_parse_chain (GstPad * pad, GstBuffer * buffer)
- if (G_UNLIKELY (parse->priv->pending_events)) {
- GList *l;
-
- for (l = parse->priv->pending_events; l != NULL; l = l->next) {
- gst_pad_push_event (parse->srcpad, GST_EVENT (l->data));
- }
- g_list_free (parse->priv->pending_events);
- parse->priv->pending_events = NULL;
- }
-
if (G_LIKELY (buffer)) {
@@ -1053,14 +1074,2 @@ gst_base_parse_loop (GstPad * pad)
- if (parse->close_segment) {
- GST_DEBUG_OBJECT (parse, "loop sending close segment");
- gst_pad_push_event (parse->srcpad, parse->close_segment);
- parse->close_segment = NULL;
- }
-
- if (parse->pending_segment) {
- GST_DEBUG_OBJECT (parse, "loop push pending segment");
- gst_pad_push_event (parse->srcpad, parse->pending_segment);
- parse->pending_segment = NULL;
- }
-
/* TODO: Check if we reach segment stop limit */
diff --git a/gst/amrparse/gstbaseparse.c b/gst/amrparse/gstbaseparse.c
index 673f7169c..b06b9becb 100644
--- a/gst/amrparse/gstbaseparse.c
+++ b/gst/amrparse/gstbaseparse.c
@@ -750,4 +750,38 @@ gst_base_parse_handle_and_push_buffer (GstBaseParse * parse,
+ /* should have caps by now */
+ g_return_val_if_fail (GST_PAD_CAPS (parse->srcpad), GST_FLOW_ERROR);
+
gst_buffer_set_caps (buffer, GST_PAD_CAPS (parse->srcpad));
+ /* and should then also be linked downstream, so safe to send some events */
+ if (parse->priv->pad_mode == GST_ACTIVATE_PULL) {
+ if (G_UNLIKELY (parse->close_segment)) {
+ GST_DEBUG_OBJECT (parse, "loop sending close segment");
+ gst_pad_push_event (parse->srcpad, parse->close_segment);
+ parse->close_segment = NULL;
+ }
+
+ if (G_UNLIKELY (parse->pending_segment)) {
+ GST_DEBUG_OBJECT (parse, "loop push pending segment");
+ gst_pad_push_event (parse->srcpad, parse->pending_segment);
+ parse->pending_segment = NULL;
+ }
+ } else {
+ if (G_UNLIKELY (parse->pending_segment)) {
+ GST_DEBUG_OBJECT (parse, "chain pushing a pending segment");
+ gst_pad_push_event (parse->srcpad, parse->pending_segment);
+ parse->pending_segment = NULL;
+ }
+ }
+
+ if (G_UNLIKELY (parse->priv->pending_events)) {
+ GList *l;
+
+ for (l = parse->priv->pending_events; l != NULL; l = l->next) {
+ gst_pad_push_event (parse->srcpad, GST_EVENT (l->data));
+ }
+ g_list_free (parse->priv->pending_events);
+ parse->priv->pending_events = NULL;
+ }
+
/* TODO: Add to seek table */
@@ -841,5 +875,2 @@ gst_base_parse_chain (GstPad * pad, GstBuffer * buffer)
if (G_UNLIKELY (parse->pending_segment)) {
- GST_DEBUG_OBJECT (parse, "chain pushing a pending segment");
- gst_pad_push_event (parse->srcpad, parse->pending_segment);
- parse->pending_segment = NULL;
parse->priv->offset = parse->priv->pending_offset;
@@ -856,12 +887,2 @@ gst_base_parse_chain (GstPad * pad, GstBuffer * buffer)
- if (G_UNLIKELY (parse->priv->pending_events)) {
- GList *l;
-
- for (l = parse->priv->pending_events; l != NULL; l = l->next) {
- gst_pad_push_event (parse->srcpad, GST_EVENT (l->data));
- }
- g_list_free (parse->priv->pending_events);
- parse->priv->pending_events = NULL;
- }
-
if (G_LIKELY (buffer)) {
@@ -1053,14 +1074,2 @@ gst_base_parse_loop (GstPad * pad)
- if (parse->close_segment) {
- GST_DEBUG_OBJECT (parse, "loop sending close segment");
- gst_pad_push_event (parse->srcpad, parse->close_segment);
- parse->close_segment = NULL;
- }
-
- if (parse->pending_segment) {
- GST_DEBUG_OBJECT (parse, "loop push pending segment");
- gst_pad_push_event (parse->srcpad, parse->pending_segment);
- parse->pending_segment = NULL;
- }
-
/* TODO: Check if we reach segment stop limit */