mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-24 17:20:36 +00:00
Cache all events except EOS if we still have to send a NEWSEGMENT event. This will let TAG events be forwarded until ...
Original commit message from CVS: * ext/mad/gstmad.c: (gst_mad_dispose), (gst_mad_sink_event), (gst_mad_chain): * ext/mad/gstmad.h: * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_dispose), (gst_mp3parse_sink_event), (gst_mp3parse_emit_frame): * gst/mpegaudioparse/gstmpegaudioparse.h: Cache all events except EOS if we still have to send a NEWSEGMENT event. This will let TAG events be forwarded until after decodebin to an encoder for example as decodebin only links the pads after NEWSEGMENT. Fixes bug #518933.
This commit is contained in:
parent
98577768ee
commit
b6529e9d60
5 changed files with 76 additions and 5 deletions
13
ChangeLog
13
ChangeLog
|
@ -1,3 +1,16 @@
|
||||||
|
2008-02-27 Sebastian Dröge <slomo@circular-chaos.org>
|
||||||
|
|
||||||
|
* ext/mad/gstmad.c: (gst_mad_dispose), (gst_mad_sink_event),
|
||||||
|
(gst_mad_chain):
|
||||||
|
* ext/mad/gstmad.h:
|
||||||
|
* gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_dispose),
|
||||||
|
(gst_mp3parse_sink_event), (gst_mp3parse_emit_frame):
|
||||||
|
* gst/mpegaudioparse/gstmpegaudioparse.h:
|
||||||
|
Cache all events except EOS if we still have to send a NEWSEGMENT
|
||||||
|
event. This will let TAG events be forwarded until after decodebin
|
||||||
|
to an encoder for example as decodebin only links the pads
|
||||||
|
after NEWSEGMENT. Fixes bug #518933.
|
||||||
|
|
||||||
2008-02-27 Sebastian Dröge <slomo@circular-chaos.org>
|
2008-02-27 Sebastian Dröge <slomo@circular-chaos.org>
|
||||||
|
|
||||||
* gst/mpegaudioparse/gstxingmux.c: (get_xing_offset):
|
* gst/mpegaudioparse/gstxingmux.c: (get_xing_offset):
|
||||||
|
|
|
@ -284,6 +284,10 @@ gst_mad_dispose (GObject * object)
|
||||||
g_free (mad->tempbuffer);
|
g_free (mad->tempbuffer);
|
||||||
mad->tempbuffer = NULL;
|
mad->tempbuffer = NULL;
|
||||||
|
|
||||||
|
g_list_foreach (mad->pending_events, (GFunc) gst_mini_object_unref, NULL);
|
||||||
|
g_list_free (mad->pending_events);
|
||||||
|
mad->pending_events = NULL;
|
||||||
|
|
||||||
G_OBJECT_CLASS (parent_class)->dispose (object);
|
G_OBJECT_CLASS (parent_class)->dispose (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -988,7 +992,14 @@ gst_mad_sink_event (GstPad * pad, GstEvent * event)
|
||||||
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
result = gst_pad_event_default (pad, event);
|
if (mad->restart) {
|
||||||
|
/* Cache all events except EOS if we still have to send a NEWSEGMENT */
|
||||||
|
if (GST_EVENT_TYPE (event) != GST_EVENT_EOS)
|
||||||
|
mad->pending_events = g_list_append (mad->pending_events, event);
|
||||||
|
result = TRUE;
|
||||||
|
} else {
|
||||||
|
result = gst_pad_event_default (pad, event);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
@ -1409,7 +1420,12 @@ gst_mad_chain (GstPad * pad, GstBuffer * buffer)
|
||||||
} else {
|
} else {
|
||||||
mad->tags = gst_tag_list_copy (list);
|
mad->tags = gst_tag_list_copy (list);
|
||||||
}
|
}
|
||||||
gst_pad_push_event (mad->srcpad, gst_event_new_tag (list));
|
if (mad->need_newsegment)
|
||||||
|
mad->pending_events =
|
||||||
|
g_list_append (mad->pending_events,
|
||||||
|
gst_event_new_tag (list));
|
||||||
|
else
|
||||||
|
gst_pad_push_event (mad->srcpad, gst_event_new_tag (list));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1449,7 +1465,12 @@ gst_mad_chain (GstPad * pad, GstBuffer * buffer)
|
||||||
GST_TAG_BITRATE, bitrate, NULL);
|
GST_TAG_BITRATE, bitrate, NULL);
|
||||||
gst_element_post_message (GST_ELEMENT (mad),
|
gst_element_post_message (GST_ELEMENT (mad),
|
||||||
gst_message_new_tag (GST_OBJECT (mad), gst_tag_list_copy (list)));
|
gst_message_new_tag (GST_OBJECT (mad), gst_tag_list_copy (list)));
|
||||||
gst_pad_push_event (mad->srcpad, gst_event_new_tag (list));
|
|
||||||
|
if (mad->need_newsegment)
|
||||||
|
mad->pending_events =
|
||||||
|
g_list_append (mad->pending_events, gst_event_new_tag (list));
|
||||||
|
else
|
||||||
|
gst_pad_push_event (mad->srcpad, gst_event_new_tag (list));
|
||||||
|
|
||||||
goto next_no_samples;
|
goto next_no_samples;
|
||||||
}
|
}
|
||||||
|
@ -1542,6 +1563,16 @@ gst_mad_chain (GstPad * pad, GstBuffer * buffer)
|
||||||
mad->need_newsegment = FALSE;
|
mad->need_newsegment = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mad->pending_events) {
|
||||||
|
GList *l;
|
||||||
|
|
||||||
|
for (l = mad->pending_events; l != NULL; l = l->next) {
|
||||||
|
gst_pad_push_event (mad->srcpad, GST_EVENT (l->data));
|
||||||
|
}
|
||||||
|
g_list_free (mad->pending_events);
|
||||||
|
mad->pending_events = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* will attach the caps to the buffer */
|
/* will attach the caps to the buffer */
|
||||||
result =
|
result =
|
||||||
gst_pad_alloc_buffer_and_set_caps (mad->srcpad, 0,
|
gst_pad_alloc_buffer_and_set_caps (mad->srcpad, 0,
|
||||||
|
|
|
@ -92,6 +92,8 @@ struct _GstMad
|
||||||
gboolean xing_found;
|
gboolean xing_found;
|
||||||
|
|
||||||
gboolean framed; /* whether there is a demuxer in front of us */
|
gboolean framed; /* whether there is a demuxer in front of us */
|
||||||
|
|
||||||
|
GList *pending_events;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GstMadClass
|
struct _GstMadClass
|
||||||
|
|
|
@ -401,13 +401,18 @@ gst_mp3parse_dispose (GObject * object)
|
||||||
g_mutex_free (mp3parse->pending_accurate_seeks_lock);
|
g_mutex_free (mp3parse->pending_accurate_seeks_lock);
|
||||||
mp3parse->pending_accurate_seeks_lock = NULL;
|
mp3parse->pending_accurate_seeks_lock = NULL;
|
||||||
|
|
||||||
|
g_list_foreach (mp3parse->pending_events, (GFunc) gst_mini_object_unref,
|
||||||
|
NULL);
|
||||||
|
g_list_free (mp3parse->pending_events);
|
||||||
|
mp3parse->pending_events = NULL;
|
||||||
|
|
||||||
G_OBJECT_CLASS (parent_class)->dispose (object);
|
G_OBJECT_CLASS (parent_class)->dispose (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_mp3parse_sink_event (GstPad * pad, GstEvent * event)
|
gst_mp3parse_sink_event (GstPad * pad, GstEvent * event)
|
||||||
{
|
{
|
||||||
gboolean res;
|
gboolean res = TRUE;
|
||||||
GstMPEGAudioParse *mp3parse;
|
GstMPEGAudioParse *mp3parse;
|
||||||
GstEvent **eventp;
|
GstEvent **eventp;
|
||||||
|
|
||||||
|
@ -535,7 +540,16 @@ gst_mp3parse_sink_event (GstPad * pad, GstEvent * event)
|
||||||
res = gst_pad_push_event (mp3parse->srcpad, event);
|
res = gst_pad_push_event (mp3parse->srcpad, event);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
res = gst_pad_push_event (mp3parse->srcpad, event);
|
GST_PAD_STREAM_LOCK (pad);
|
||||||
|
if (mp3parse->pending_segment) {
|
||||||
|
/* Cache all events except EOS if we have a pending segment */
|
||||||
|
if (GST_EVENT_TYPE (event) != GST_EVENT_EOS)
|
||||||
|
mp3parse->pending_events =
|
||||||
|
g_list_append (mp3parse->pending_events, event);
|
||||||
|
} else {
|
||||||
|
res = gst_pad_push_event (mp3parse->srcpad, event);
|
||||||
|
}
|
||||||
|
GST_PAD_STREAM_UNLOCK (pad);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -765,6 +779,15 @@ gst_mp3parse_emit_frame (GstMPEGAudioParse * mp3parse, guint size,
|
||||||
gst_pad_push_event (mp3parse->srcpad, mp3parse->pending_segment);
|
gst_pad_push_event (mp3parse->srcpad, mp3parse->pending_segment);
|
||||||
mp3parse->pending_segment = NULL;
|
mp3parse->pending_segment = NULL;
|
||||||
}
|
}
|
||||||
|
if (mp3parse->pending_events) {
|
||||||
|
GList *l;
|
||||||
|
|
||||||
|
for (l = mp3parse->pending_events; l != NULL; l = l->next) {
|
||||||
|
gst_pad_push_event (mp3parse->srcpad, GST_EVENT (l->data));
|
||||||
|
}
|
||||||
|
g_list_free (mp3parse->pending_events);
|
||||||
|
mp3parse->pending_events = NULL;
|
||||||
|
}
|
||||||
ret = gst_pad_push (mp3parse->srcpad, outbuf);
|
ret = gst_pad_push (mp3parse->srcpad, outbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -121,6 +121,8 @@ struct _GstMPEGAudioParse {
|
||||||
|
|
||||||
/* pending segment */
|
/* pending segment */
|
||||||
GstEvent *pending_segment;
|
GstEvent *pending_segment;
|
||||||
|
/* pending events */
|
||||||
|
GList *pending_events;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GstMPEGAudioParseClass {
|
struct _GstMPEGAudioParseClass {
|
||||||
|
|
Loading…
Reference in a new issue