diff options
Diffstat (limited to 'gst/realmedia/rmdemux.c')
-rw-r--r-- | gst/realmedia/rmdemux.c | 52 |
1 files changed, 48 insertions, 4 deletions
diff --git a/gst/realmedia/rmdemux.c b/gst/realmedia/rmdemux.c index 4252940..2340a05 100644 --- a/gst/realmedia/rmdemux.c +++ b/gst/realmedia/rmdemux.c @@ -20,8 +20,8 @@ * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H @@ -262,6 +262,8 @@ gst_rmdemux_init (GstRMDemux * rmdemux) rmdemux->first_ts = GST_CLOCK_TIME_NONE; rmdemux->base_ts = GST_CLOCK_TIME_NONE; rmdemux->need_newsegment = TRUE; + rmdemux->have_group_id = FALSE; + rmdemux->group_id = G_MAXUINT; gst_rm_utils_run_tests (); } @@ -645,6 +647,25 @@ gst_rmdemux_src_query (GstPad * pad, GstObject * parent, GstQuery * query) } break; } + case GST_QUERY_SEGMENT: + { + GstFormat format; + gint64 start, stop; + + format = rmdemux->segment.format; + + start = + gst_segment_to_stream_time (&rmdemux->segment, format, + rmdemux->segment.start); + if ((stop = rmdemux->segment.stop) == -1) + stop = rmdemux->segment.duration; + else + stop = gst_segment_to_stream_time (&rmdemux->segment, format, stop); + + gst_query_set_segment (query, rmdemux->segment.rate, format, start, stop); + res = TRUE; + break; + } default: res = gst_pad_query_default (pad, parent, query); break; @@ -693,6 +714,9 @@ gst_rmdemux_reset (GstRMDemux * rmdemux) rmdemux->first_ts = GST_CLOCK_TIME_NONE; rmdemux->base_ts = GST_CLOCK_TIME_NONE; rmdemux->need_newsegment = TRUE; + + rmdemux->have_group_id = FALSE; + rmdemux->group_id = G_MAXUINT; } static GstStateChangeReturn @@ -782,6 +806,7 @@ gst_rmdemux_sink_activate_mode (GstPad * sinkpad, GstObject * parent, switch (mode) { case GST_PAD_MODE_PUSH: demux->seekable = FALSE; + demux->running = active; res = TRUE; break; case GST_PAD_MODE_PULL: @@ -1466,6 +1491,7 @@ gst_rmdemux_add_stream (GstRMDemux * rmdemux, GstRMDemuxStream * stream) stream_caps); if (stream->pad && stream_caps) { + GstEvent *event; GST_LOG_OBJECT (rmdemux, "%d bytes of extra data for stream %s", stream->extra_data_size, GST_PAD_NAME (stream->pad)); @@ -1496,8 +1522,26 @@ gst_rmdemux_add_stream (GstRMDemux * rmdemux, GstRMDemuxStream * stream) stream_id = gst_pad_create_stream_id_printf (stream->pad, - GST_ELEMENT_CAST (rmdemux), "%u", stream->id); - gst_pad_push_event (stream->pad, gst_event_new_stream_start (stream_id)); + GST_ELEMENT_CAST (rmdemux), "%03u", stream->id); + + event = + gst_pad_get_sticky_event (rmdemux->sinkpad, GST_EVENT_STREAM_START, 0); + if (event) { + if (gst_event_parse_group_id (event, &rmdemux->group_id)) + rmdemux->have_group_id = TRUE; + else + rmdemux->have_group_id = FALSE; + gst_event_unref (event); + } else if (!rmdemux->have_group_id) { + rmdemux->have_group_id = TRUE; + rmdemux->group_id = gst_util_group_id_next (); + } + + event = gst_event_new_stream_start (stream_id); + if (rmdemux->have_group_id) + gst_event_set_group_id (event, rmdemux->group_id); + + gst_pad_push_event (stream->pad, event); g_free (stream_id); gst_pad_set_caps (stream->pad, stream_caps); |