From: <tp...@ke...> - 2006-06-23 11:22:17
|
CVS Root: /cvs/gstreamer Module: gst-plugins-ugly Changes by: tpm Date: Fri Jun 23 2006 11:22:17 UTC Log message: * gst/mpegstream/gstmpegpacketize.c: (gst_mpeg_packetize_new), (gst_mpeg_packetize_flush_cache), (gst_mpeg_packetize_destroy), (gst_mpeg_packetize_read): * gst/mpegstream/gstmpegpacketize.h: * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_process_event), (gst_mpeg_parse_change_state): Flush packetizer cache when we get a FLUSH_STOP event; remove unused source pad member from packetizer; add debug category for packetizer. Modified files: . : ChangeLog gst/mpegstream : gstmpegpacketize.c gstmpegpacketize.h gstmpegparse.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-ugly/ChangeLog.diff?r1=1.2052&r2=1.2053 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-ugly/gst/mpegstream/gstmpegpacketize.c.diff?r1=1.22&r2=1.23 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-ugly/gst/mpegstream/gstmpegpacketize.h.diff?r1=1.17&r2=1.18 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-ugly/gst/mpegstream/gstmpegparse.c.diff?r1=1.92&r2=1.93 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-ugly/ChangeLog,v retrieving revision 1.2052 retrieving revision 1.2053 diff -u -d -r1.2052 -r1.2053 --- ChangeLog 23 Jun 2006 09:28:28 -0000 1.2052 +++ ChangeLog 23 Jun 2006 11:22:04 -0000 1.2053 @@ -1,3 +1,15 @@ +2006-06-23 Tim-Philipp Müller <tim at centricular dot net> + + * gst/mpegstream/gstmpegpacketize.c: (gst_mpeg_packetize_new), + (gst_mpeg_packetize_flush_cache), (gst_mpeg_packetize_destroy), + (gst_mpeg_packetize_read): + * gst/mpegstream/gstmpegpacketize.h: + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_process_event), + (gst_mpeg_parse_change_state): + Flush packetizer cache when we get a FLUSH_STOP event; + remove unused source pad member from packetizer; add debug + category for packetizer. 2006-06-23 Jan Schmidt <th...@ma...> * ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (plugin_init): Index: gstmpegpacketize.c RCS file: /cvs/gstreamer/gst-plugins-ugly/gst/mpegstream/gstmpegpacketize.c,v retrieving revision 1.22 retrieving revision 1.23 diff -u -d -r1.22 -r1.23 --- gstmpegpacketize.c 13 Apr 2006 18:21:08 -0000 1.22 +++ gstmpegpacketize.c 23 Jun 2006 11:22:04 -0000 1.23 @@ -25,21 +25,17 @@ #include "gstmpegpacketize.h" +GST_DEBUG_CATEGORY_STATIC (gstmpegpacketize_debug); +#define GST_CAT_DEFAULT (gstmpegpacketize_debug) GstMPEGPacketize * -gst_mpeg_packetize_new (GstPad * srcpad, GstMPEGPacketizeType type) +gst_mpeg_packetize_new (GstMPEGPacketizeType type) { GstMPEGPacketize *new; - g_return_val_if_fail (srcpad != NULL, NULL); - g_return_val_if_fail (GST_IS_PAD (srcpad), NULL); - g_return_val_if_fail (GST_PAD_IS_SRC (srcpad), NULL); - - gst_object_ref (GST_OBJECT (srcpad)); - new = g_malloc (sizeof (GstMPEGPacketize)); + new = g_new0 (GstMPEGPacketize, 1); new->resync = TRUE; new->id = 0; - new->srcpad = srcpad; new->cache_head = 0; new->cache_tail = 0; new->cache_size = 0x4000; @@ -48,15 +44,30 @@ new->MPEG2 = FALSE; new->type = type; + if (gstmpegpacketize_debug == NULL) { + GST_DEBUG_CATEGORY_INIT (gstmpegpacketize_debug, "mpegpacketize", 0, + "MPEG parser element packetizer"); + } return new; } void -gst_mpeg_packetize_destroy (GstMPEGPacketize * packetize) +gst_mpeg_packetize_flush_cache (GstMPEGPacketize * packetize) g_return_if_fail (packetize != NULL); - gst_object_unref (GST_OBJECT (packetize->srcpad)); + packetize->resync = TRUE; + packetize->cache_head = 0; + packetize->cache_tail = 0; + GST_DEBUG ("flushed packetize cache"); +} +void +gst_mpeg_packetize_destroy (GstMPEGPacketize * packetize) +{ + g_return_if_fail (packetize != NULL); g_free (packetize->cache); g_free (packetize); @@ -333,26 +344,5 @@ } } -#if 0 - /* TODO: flush cache when newsegment is received */ - if (got_event) { - guint32 remaining; - GstEvent *event; - gint etype; - gst_bytestream_get_status (packetize->bs, &remaining, &event); - etype = event ? GST_EVENT_TYPE (event) : GST_EVENT_EOS; - switch (etype) { - case GST_EVENT_NEWSEGMENT: - GST_DEBUG ("packetize: discont\n"); - gst_bytestream_flush_fast (packetize->bs, remaining); - break; - } - return GST_MINI_OBJECT (event); - } -#endif g_assert_not_reached (); Index: gstmpegpacketize.h RCS file: /cvs/gstreamer/gst-plugins-ugly/gst/mpegstream/gstmpegpacketize.h,v retrieving revision 1.17 retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- gstmpegpacketize.h 13 Apr 2006 18:21:08 -0000 1.17 +++ gstmpegpacketize.h 23 Jun 2006 11:22:04 -0000 1.18 @@ -54,7 +54,6 @@ /* current parse state */ guchar id; - GstPad *srcpad; GstMPEGPacketizeType type; guint8 *cache; /* cache for incoming data */ @@ -67,9 +66,11 @@ gboolean resync; }; -GstMPEGPacketize* gst_mpeg_packetize_new (GstPad *pad, GstMPEGPacketizeType type); +GstMPEGPacketize* gst_mpeg_packetize_new (GstMPEGPacketizeType type); void gst_mpeg_packetize_destroy (GstMPEGPacketize *packetize); +void gst_mpeg_packetize_flush_cache (GstMPEGPacketize *packetize); guint64 gst_mpeg_packetize_tell (GstMPEGPacketize *packetize); void gst_mpeg_packetize_put (GstMPEGPacketize *packetize, GstBuffer * buf); GstFlowReturn gst_mpeg_packetize_read (GstMPEGPacketize *packetize, GstBuffer ** outbuf); Index: gstmpegparse.c RCS file: /cvs/gstreamer/gst-plugins-ugly/gst/mpegstream/gstmpegparse.c,v retrieving revision 1.92 retrieving revision 1.93 diff -u -d -r1.92 -r1.93 --- gstmpegparse.c 13 Apr 2006 18:21:08 -0000 1.92 +++ gstmpegparse.c 23 Jun 2006 11:22:04 -0000 1.93 @@ -394,7 +394,7 @@ ret = TRUE; break; - case GST_EVENT_FLUSH_STOP: + case GST_EVENT_FLUSH_STOP:{ /* Forward the event. */ if (CLASS (mpeg_parse)->send_event) { ret = CLASS (mpeg_parse)->send_event (mpeg_parse, event); @@ -404,8 +404,9 @@ /* Reset the internal fields. */ gst_mpeg_parse_reset (mpeg_parse); + gst_mpeg_packetize_flush_cache (mpeg_parse->packetize); + } default: @@ -1232,8 +1233,7 @@ case GST_STATE_CHANGE_READY_TO_PAUSED: if (!mpeg_parse->packetize) { mpeg_parse->packetize = - gst_mpeg_packetize_new (mpeg_parse->srcpad, - GST_MPEG_PACKETIZE_SYSTEM); + gst_mpeg_packetize_new (GST_MPEG_PACKETIZE_SYSTEM); } /* Initialize parser state */ |
From: <tp...@ke...> - 2006-06-23 12:25:09
|
CVS Root: /cvs/gstreamer Module: gst-plugins-ugly Changes by: tpm Date: Fri Jun 23 2006 12:25:08 UTC Log message: * gst/mpegstream/gstmpegpacketize.c: (gst_mpeg_packetize_flush_cache), (gst_mpeg_packetize_put): * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_chain): Also flush packetizer cache when we get a buffer that has the DISCONT flag set; update current byte position from buffer offset after a flush. Modified files: . : ChangeLog gst/mpegstream : gstmpegpacketize.c gstmpegparse.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-ugly/ChangeLog.diff?r1=1.2053&r2=1.2054 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-ugly/gst/mpegstream/gstmpegpacketize.c.diff?r1=1.23&r2=1.24 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-ugly/gst/mpegstream/gstmpegparse.c.diff?r1=1.93&r2=1.94 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-ugly/ChangeLog,v retrieving revision 1.2053 retrieving revision 1.2054 diff -u -d -r1.2053 -r1.2054 --- ChangeLog 23 Jun 2006 11:22:04 -0000 1.2053 +++ ChangeLog 23 Jun 2006 12:24:56 -0000 1.2054 @@ -1,5 +1,14 @@ 2006-06-23 Tim-Philipp Müller <tim at centricular dot net> + * gst/mpegstream/gstmpegpacketize.c: + (gst_mpeg_packetize_flush_cache), (gst_mpeg_packetize_put): + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_chain): + Also flush packetizer cache when we get a buffer that has the + DISCONT flag set; update current byte position from buffer + offset after a flush. + +2006-06-23 Tim-Philipp Müller <tim at centricular dot net> * gst/mpegstream/gstmpegpacketize.c: (gst_mpeg_packetize_new), (gst_mpeg_packetize_flush_cache), (gst_mpeg_packetize_destroy), (gst_mpeg_packetize_read): Index: gstmpegpacketize.c RCS file: /cvs/gstreamer/gst-plugins-ugly/gst/mpegstream/gstmpegpacketize.c,v retrieving revision 1.23 retrieving revision 1.24 diff -u -d -r1.23 -r1.24 --- gstmpegpacketize.c 23 Jun 2006 11:22:04 -0000 1.23 +++ gstmpegpacketize.c 23 Jun 2006 12:24:56 -0000 1.24 @@ -57,6 +57,8 @@ { g_return_if_fail (packetize != NULL); + packetize->cache_byte_pos += packetize->cache_tail; packetize->resync = TRUE; packetize->cache_head = 0; packetize->cache_tail = 0; @@ -84,6 +86,13 @@ int cache_len = packetize->cache_tail - packetize->cache_head; + if (packetize->cache_head == 0 && cache_len == 0 && + GST_BUFFER_OFFSET_IS_VALID (buf)) { + packetize->cache_byte_pos = GST_BUFFER_OFFSET (buf); + GST_DEBUG ("cache byte position now %" G_GINT64_FORMAT, + packetize->cache_byte_pos); + } if (cache_len + GST_BUFFER_SIZE (buf) > packetize->cache_size) { /* the buffer does not fit into the cache so grow the cache */ Index: gstmpegparse.c RCS file: /cvs/gstreamer/gst-plugins-ugly/gst/mpegstream/gstmpegparse.c,v retrieving revision 1.93 retrieving revision 1.94 diff -u -d -r1.93 -r1.94 --- gstmpegparse.c 23 Jun 2006 11:22:04 -0000 1.93 +++ gstmpegparse.c 23 Jun 2006 12:24:56 -0000 1.94 @@ -691,6 +691,11 @@ GstClockTime time; guint64 size; + if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT)) { + GST_DEBUG_OBJECT (mpeg_parse, "buffer with DISCONT flag set"); + gst_mpeg_packetize_flush_cache (mpeg_parse->packetize); gst_mpeg_packetize_put (mpeg_parse->packetize, buffer); buffer = NULL; |
From: <tp...@ke...> - 2006-09-21 13:35:11
|
CVS Root: /cvs/gstreamer Module: gst-plugins-ugly Changes by: tpm Date: Thu Sep 21 2006 13:35:11 UTC Log message: Patch by: Martin Zlomek <martin dot zlomek at itonis dot tv> * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_reset), (gst_dvd_demux_sync_stream_to_time): * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_send_subbuffer), (gst_mpeg_demux_synchronise_pads), (gst_mpeg_demux_sync_stream_to_time): Send newsegment updates for sparse streams (#350778). Modified files: . : ChangeLog gst/mpegstream : gstdvddemux.c gstmpegdemux.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-ugly/ChangeLog.diff?r1=1.2101&r2=1.2102 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-ugly/gst/mpegstream/gstdvddemux.c.diff?r1=1.37&r2=1.38 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-ugly/gst/mpegstream/gstmpegdemux.c.diff?r1=1.90&r2=1.91 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-ugly/ChangeLog,v retrieving revision 1.2101 retrieving revision 1.2102 diff -u -d -r1.2101 -r1.2102 --- ChangeLog 20 Sep 2006 16:18:24 -0000 1.2101 +++ ChangeLog 21 Sep 2006 13:34:58 -0000 1.2102 @@ -1,3 +1,14 @@ +2006-09-21 Tim-Philipp Müller <tim at centricular dot net> + + Patch by: Martin Zlomek <martin dot zlomek at itonis dot tv> + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_reset), + (gst_dvd_demux_sync_stream_to_time): + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_send_subbuffer), + (gst_mpeg_demux_synchronise_pads), + (gst_mpeg_demux_sync_stream_to_time): + Send newsegment updates for sparse streams (#350778). + 2006-09-20 Thomas Vander Stichele <thomas at apestaart dot org> * ext/dvdread/dvdreadsrc.c: (gst_dvd_read_src_do_convert_query): Index: gstdvddemux.c RCS file: /cvs/gstreamer/gst-plugins-ugly/gst/mpegstream/gstdvddemux.c,v retrieving revision 1.37 retrieving revision 1.38 diff -u -d -r1.37 -r1.38 --- gstdvddemux.c 21 Apr 2006 10:50:17 -0000 1.37 +++ gstdvddemux.c 21 Sep 2006 13:34:59 -0000 1.38 @@ -448,8 +448,8 @@ gst_element_no_more_pads (GST_ELEMENT (dvd_demux)); /* Keep video/audio/subtitle pads within 1/2 sec of the SCR */ - mpeg_demux->max_gap = 0.5 * GST_SECOND; - mpeg_demux->max_gap_tolerance = 0.05 * GST_SECOND; + mpeg_demux->max_gap = GST_SECOND / 2; + mpeg_demux->max_gap_tolerance = GST_SECOND / 20; } else { GST_DEBUG_OBJECT (dvd_demux, "dvddemux Forwarding DVD event %s to all pads", event_type); @@ -1052,7 +1052,7 @@ { int i; - //GstMPEGDemux *mpeg_demux = GST_MPEG_DEMUX (dvd_demux); + GstMPEGDemux *mpeg_demux = GST_MPEG_DEMUX (dvd_demux); GST_INFO ("Resetting the dvd demuxer"); for (i = 0; i < GST_DVD_DEMUX_NUM_SUBPICTURE_STREAMS; i++) { @@ -1075,11 +1075,9 @@ dvd_demux->cur_subpicture_nr = 0; dvd_demux->mpeg_version = 0; -#if 0 /* Reset max_gap handling */ - mpeg_demux->max_gap = GST_CLOCK_TIME_NONE; - mpeg_demux->max_gap_tolerance = GST_CLOCK_TIME_NONE; -#endif + mpeg_demux->max_gap = 0.5 * GST_SECOND; + mpeg_demux->max_gap_tolerance = 0.05 * GST_SECOND; } static void @@ -1106,14 +1104,9 @@ GstMPEGStream * stream, GstClockTime last_ts) GstDVDDemux *dvd_demux = GST_DVD_DEMUX (mpeg_demux); - - GstClockTime start_ts; - GstEvent *filler = NULL; - GstFormat fmt = GST_FORMAT_TIME; - GstPad *outpad = NULL; - gint cur_nr = 0; + GstMPEGParse *mpeg_parse = GST_MPEG_PARSE (mpeg_demux); + GstPad *outpad; + gint cur_nr; parent_class->sync_stream_to_time (mpeg_demux, stream, last_ts); @@ -1130,27 +1123,15 @@ outpad = dvd_demux->cur_subpicture; cur_nr = dvd_demux->cur_subpicture_nr; break; + default: + return; } - /* FIXME: fillers in 0.9 aren't specified properly yet */ - if ((outpad != NULL) && (cur_nr == stream->number)) { - if (GST_PAD_PEER (stream->pad) - && gst_pad_query_position (GST_PAD_PEER (stream->pad), &fmt, - (gint64 *) & start_ts)) { - if (start_ts < last_ts) - filler = - gst_event_new_filler_stamped (start_ts, GST_CLOCK_DIFF (last_ts, - start_ts)); - } else - filler = gst_event_new_filler_stamped (last_ts, GST_CLOCK_TIME_NONE); - if (filler) { - if (!gst_pad_push_event (stream->pad, filler)) - gst_event_unref (filler); - } + if (outpad && (cur_nr == stream->number)) { + gst_pad_push_event (outpad, gst_event_new_new_segment (TRUE, + mpeg_parse->current_segment.rate, GST_FORMAT_TIME, + last_ts, -1, last_ts)); static GstStateChangeReturn Index: gstmpegdemux.c RCS file: /cvs/gstreamer/gst-plugins-ugly/gst/mpegstream/gstmpegdemux.c,v retrieving revision 1.90 retrieving revision 1.91 diff -u -d -r1.90 -r1.91 --- gstmpegdemux.c 21 Apr 2006 10:50:17 -0000 1.90 +++ gstmpegdemux.c 21 Sep 2006 13:34:59 -0000 1.91 @@ -892,10 +892,9 @@ if (timestamp != GST_CLOCK_TIME_NONE) { outstream->cur_ts = timestamp; - outstream->scr_offs = GST_CLOCK_DIFF (timestamp, - PARSE_CLASS (mpeg_parse)->adjust_ts (mpeg_parse, - mpeg_parse->current_ts)); - if (outstream->scr_offs < 0) + if (timestamp > mpeg_parse->current_ts) + outstream->scr_offs = timestamp - mpeg_parse->current_ts; + else outstream->scr_offs = 0; if (mpeg_demux->index != NULL) { @@ -905,10 +904,8 @@ GST_FORMAT_BYTES, GST_BUFFER_OFFSET (buffer), GST_FORMAT_TIME, timestamp, 0); } - } else { - outstream->cur_ts = PARSE_CLASS (mpeg_parse)->adjust_ts (mpeg_parse, - mpeg_parse->current_ts + outstream->scr_offs); - } + } else + outstream->cur_ts = mpeg_parse->current_ts + outstream->scr_offs; if (size == 0) return GST_FLOW_OK; @@ -928,16 +925,10 @@ if (GST_CLOCK_TIME_IS_VALID (mpeg_demux->max_gap) && GST_CLOCK_TIME_IS_VALID (mpeg_parse->current_ts) && - (PARSE_CLASS (mpeg_parse)->adjust_ts (mpeg_parse, - mpeg_parse->current_ts) > mpeg_demux->max_gap)) { - GstClockTime threshold = - GST_CLOCK_DIFF (PARSE_CLASS (mpeg_parse)->adjust_ts (mpeg_parse, - mpeg_parse->current_ts), - mpeg_demux->max_gap); - CLASS (mpeg_demux)->synchronise_pads (mpeg_demux, threshold, - mpeg_parse->current_ts) - mpeg_demux->max_gap_tolerance); + (mpeg_parse->current_ts > mpeg_demux->max_gap)) { + CLASS (mpeg_demux)->synchronise_pads (mpeg_demux, + mpeg_parse->current_ts - mpeg_demux->max_gap, + mpeg_parse->current_ts - mpeg_demux->max_gap_tolerance); return ret; @@ -963,7 +954,7 @@ GstClockTime threshold, GstClockTime new_ts) /* - * Send a filler event to any pad with cur_ts < threshold to catch it up + * Send a new-segment event to any pad with cur_ts < threshold to catch it up */ gint i; @@ -992,47 +983,20 @@ -/* Send a filler event on the indicated pad to catch it up to - * last_ts. Query the pad for current time, and use that time - * to set the duration of the filler event, otherwise we use - * the last timestamp of the stream and rely on the sinks - * to absorb any overlap with the decoded data. +/* + * Send a new-segment event on the indicated pad to catch it up to last_ts. */ gst_mpeg_demux_sync_stream_to_time (GstMPEGDemux * mpeg_demux, - static gboolean beenhere; /* FALSE */ - if (!beenhere) { - g_message ("FIXME: gst_mpeg_demux_sync_stream_to_time\n"); - beenhere = TRUE; - if (!GST_PAD_PEER (stream->pad) - || !gst_pad_query (GST_PAD_PEER (stream->pad), GST_QUERY_POSITION, &fmt, - (gint64 *) & start_ts)) { - start_ts = stream->cur_ts; - if (start_ts < last_ts) { - filler = gst_event_new_filler_stamped (start_ts, GST_CLOCK_DIFF (last_ts, - start_ts)); - if (filler) { - GST_LOG ("Advancing %s from %llu by %lld to %llu (diff %lld)", - GST_PAD_NAME (stream->pad), stream->cur_ts, - gst_event_filler_get_duration (filler), last_ts, - GST_CLOCK_DIFF (last_ts, stream->cur_ts)); + gst_pad_push_event (stream->pad, gst_event_new_new_segment (TRUE, + mpeg_parse->current_segment.rate, GST_FORMAT_TIME, + last_ts, -1, last_ts)); - gst_pad_push_event (stream->pad, filler); + mpeg_parse->current_segment.start = last_ts; #if 0 |
From: <tp...@ke...> - 2006-09-28 09:16:56
|
CVS Root: /cvs/gstreamer Module: gst-plugins-ugly Changes by: tpm Date: Thu Sep 28 2006 09:16:50 UTC Log message: * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_handle_src_query): Reflow code so that compiler doesn't complain about possible use of uninitialised variable any longer; but just in case, initialise it anyway; also take object ref in query function and do peer pad stuff in a more thread-safe way. Modified files: . : ChangeLog gst/mpegstream : gstmpegparse.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-ugly/ChangeLog.diff?r1=1.2103&r2=1.2104 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-ugly/gst/mpegstream/gstmpegparse.c.diff?r1=1.94&r2=1.95 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-ugly/ChangeLog,v retrieving revision 1.2103 retrieving revision 1.2104 diff -u -d -r1.2103 -r1.2104 --- ChangeLog 27 Sep 2006 09:54:00 -0000 1.2103 +++ ChangeLog 28 Sep 2006 09:16:38 -0000 1.2104 @@ -1,3 +1,11 @@ +2006-09-28 Tim-Philipp Müller <tim at centricular dot net> + + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_handle_src_query): + Reflow code so that compiler doesn't complain about possible use + of uninitialised variable any longer; but just in case, initialise + it anyway; also take object ref in query function and do peer pad + stuff in a more thread-safe way. 2006-09-27 Wim Taymans <wi...@fl...> * ext/dvdread/dvdreadsrc.c: (gst_dvd_read_src_do_convert_query): Index: gstmpegparse.c RCS file: /cvs/gstreamer/gst-plugins-ugly/gst/mpegstream/gstmpegparse.c,v retrieving revision 1.94 retrieving revision 1.95 diff -u -d -r1.94 -r1.95 --- gstmpegparse.c 23 Jun 2006 12:24:56 -0000 1.94 +++ gstmpegparse.c 28 Sep 2006 09:16:38 -0000 1.95 @@ -988,13 +988,14 @@ gst_mpeg_parse_handle_src_query (GstPad * pad, GstQuery * query) { gboolean res = TRUE; - GstMPEGParse *mpeg_parse = GST_MPEG_PARSE (GST_PAD_PARENT (pad)); + GstMPEGParse *mpeg_parse; GstFormat src_format = GST_FORMAT_UNDEFINED, format; - gint64 src_value = 0, value; + gint64 src_value = 0, value = -1; + mpeg_parse = GST_MPEG_PARSE (gst_pad_get_parent (pad)); switch (GST_QUERY_TYPE (query)) { - case GST_QUERY_DURATION: - { + case GST_QUERY_DURATION:{ gst_query_parse_duration (query, &format, NULL); switch (format) { @@ -1005,7 +1006,7 @@ /* Try asking upstream if it knows the time - a DVD might know */ src_format = GST_FORMAT_TIME; - if (gst_pad_query_duration (GST_PAD_PEER (mpeg_parse->sinkpad), + if (gst_pad_query_peer_duration (mpeg_parse->sinkpad, &src_format, &src_value)) { res = TRUE; break; @@ -1013,7 +1014,7 @@ /* Otherwise fallthrough */ default: src_format = GST_FORMAT_BYTES; - if (!gst_pad_query_duration (GST_PAD_PEER (mpeg_parse->sinkpad), + if (!gst_pad_query_peer_duration (mpeg_parse->sinkpad, res = FALSE; goto done; @@ -1022,17 +1023,13 @@ } /* Convert the value to the desired format. */ - if (!gst_mpeg_parse_convert (mpeg_parse, src_format, src_value, - &format, &value)) { - res = FALSE; - goto done; + if ((res = gst_mpeg_parse_convert (mpeg_parse, src_format, src_value, + &format, &value))) { + gst_query_set_duration (query, format, value); - - gst_query_set_duration (query, format, value); break; } - case GST_QUERY_POSITION: + case GST_QUERY_POSITION:{ gint64 cur; gst_query_parse_position (query, &format, NULL); @@ -1055,26 +1052,19 @@ + gst_query_set_position (query, format, value); - gst_query_set_position (query, format, value); - case GST_QUERY_CONVERT: + case GST_QUERY_CONVERT:{ gst_query_parse_convert (query, &src_format, &src_value, &format, NULL); + gst_query_set_convert (query, src_format, src_value, format, value); - gst_query_set_convert (query, src_format, src_value, format, value); default: @@ -1083,6 +1073,7 @@ } done: + gst_object_unref (mpeg_parse); return res; } |
From: <tp...@ke...> - 2006-11-19 13:08:49
|
CVS Root: /cvs/gstreamer Module: gst-plugins-ugly Changes by: tpm Date: Sun Nov 19 2006 13:08:42 UTC Log message: * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_base_init), (gst_dvd_demux_class_init), (gst_dvd_demux_combine_flows), (gst_dvd_demux_send_subbuffer): * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_class_init), (gst_mpeg_demux_init_stream), (gst_mpeg_demux_parse_packet), (gst_mpeg_demux_parse_pes), (gst_mpeg_demux_combine_flows), (gst_mpeg_demux_send_subbuffer): * gst/mpegstream/gstmpegdemux.h: * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_process_event), (gst_mpeg_parse_chain): Fix flow value combination; this fixes playbin/totem locking up if a VobSub file is specified as subtitle file (#334322). Flow value combination should only happen once we are fairly sure we've got all pads that are available for now. Since there isn't a well-specified time when this is the case in MPEG, we'll just assume this is the case once there has been a certain number of packets for each stream we've found so far. Modified files: . : ChangeLog gst/mpegstream : gstdvddemux.c gstmpegdemux.c gstmpegdemux.h gstmpegparse.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-ugly/ChangeLog.diff?r1=1.2123&r2=1.2124 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-ugly/gst/mpegstream/gstdvddemux.c.diff?r1=1.39&r2=1.40 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-ugly/gst/mpegstream/gstmpegdemux.c.diff?r1=1.92&r2=1.93 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-ugly/gst/mpegstream/gstmpegdemux.h.diff?r1=1.25&r2=1.26 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-ugly/gst/mpegstream/gstmpegparse.c.diff?r1=1.96&r2=1.97 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-ugly/ChangeLog,v retrieving revision 1.2123 retrieving revision 1.2124 diff -u -d -r1.2123 -r1.2124 --- ChangeLog 15 Nov 2006 13:57:21 -0000 1.2123 +++ ChangeLog 19 Nov 2006 13:08:30 -0000 1.2124 @@ -1,3 +1,23 @@ +2006-11-19 Tim-Philipp Müller <tim at centricular dot net> + + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_base_init), + (gst_dvd_demux_class_init), (gst_dvd_demux_combine_flows), + (gst_dvd_demux_send_subbuffer): + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_class_init), + (gst_mpeg_demux_init_stream), (gst_mpeg_demux_parse_packet), + (gst_mpeg_demux_parse_pes), (gst_mpeg_demux_combine_flows), + (gst_mpeg_demux_send_subbuffer): + * gst/mpegstream/gstmpegdemux.h: + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_process_event), + (gst_mpeg_parse_chain): + Fix flow value combination; this fixes playbin/totem locking up if + a VobSub file is specified as subtitle file (#334322). Flow value + combination should only happen once we are fairly sure we've got all + pads that are available for now. Since there isn't a well-specified + time when this is the case in MPEG, we'll just assume this is the + case once there has been a certain number of packets for each + stream we've found so far. 2006-11-15 Wim Taymans <wi...@fl...> Patch by: Jan Arne Petersen <jpetersen at jpetersen dot org> Index: gstdvddemux.c RCS file: /cvs/gstreamer/gst-plugins-ugly/gst/mpegstream/gstdvddemux.c,v retrieving revision 1.39 retrieving revision 1.40 diff -u -d -r1.39 -r1.40 --- gstdvddemux.c 9 Oct 2006 12:09:14 -0000 1.39 +++ gstdvddemux.c 19 Nov 2006 13:08:30 -0000 1.40 @@ -139,8 +139,6 @@ static void gst_dvd_demux_init (GstDVDDemux * dvd_demux, GstDVDDemuxClass * klass); -static GstFlowReturn gst_dvd_demux_send_buffer (GstMPEGParse * mpeg_parse, - GstBuffer * buffer, GstClockTime time); static gboolean gst_dvd_demux_process_event (GstMPEGParse * mpeg_parse, GstEvent * event); @@ -167,6 +165,9 @@ GstMPEGStream * outstream, GstBuffer * buffer, GstClockTime timestamp, guint offset, guint size); +static GstFlowReturn gst_dvd_demux_combine_flows (GstMPEGDemux * mpegdemux, + GstMPEGStream * stream, GstFlowReturn flow); static void gst_dvd_demux_set_cur_audio (GstDVDDemux * dvd_demux, gint stream_nr); static void gst_dvd_demux_set_cur_subpicture @@ -192,7 +193,7 @@ GstMPEGDemuxClass *demux_class = GST_MPEG_DEMUX_CLASS (klass); GstDVDDemuxClass *dvd_demux_class = GST_DVD_DEMUX_CLASS (klass); - mpeg_parse_class->send_buffer = gst_dvd_demux_send_buffer; + mpeg_parse_class->send_buffer = NULL; mpeg_parse_class->process_event = gst_dvd_demux_process_event; /* sink pad */ @@ -245,6 +246,7 @@ mpeg_demux_class->get_audio_stream = gst_dvd_demux_get_audio_stream; mpeg_demux_class->get_video_stream = gst_dvd_demux_get_video_stream; mpeg_demux_class->send_subbuffer = gst_dvd_demux_send_subbuffer; + mpeg_demux_class->combine_flows = gst_dvd_demux_combine_flows; mpeg_demux_class->process_private = gst_dvd_demux_process_private; mpeg_demux_class->synchronise_pads = gst_dvd_demux_synchronise_pads; mpeg_demux_class->sync_stream_to_time = gst_dvd_demux_sync_stream_to_time; @@ -288,15 +290,6 @@ dvd_demux->langcodes = NULL; } - -static GstFlowReturn -gst_dvd_demux_send_buffer (GstMPEGParse * mpeg_parse, GstBuffer * buffer, - GstClockTime time) -{ - gst_buffer_unref (buffer); - return GST_FLOW_OK; -} static gboolean gst_dvd_demux_process_event (GstMPEGParse * mpeg_parse, GstEvent * event) { @@ -918,6 +911,60 @@ return ret; +/* random magic value */ +#define MIN_BUFS_FOR_NO_MORE_PADS 100 +static GstFlowReturn +gst_dvd_demux_combine_flows (GstMPEGDemux * mpegdemux, GstMPEGStream * stream, + GstFlowReturn flow) +{ + GstDVDDemux *demux = (GstDVDDemux *) mpegdemux; + gint i; + /* store the value */ + stream->last_flow = flow; + /* if it's success we can return the value right away */ + if (GST_FLOW_IS_SUCCESS (flow)) + goto done; + /* any other error that is not-linked can be returned right + * away */ + if (flow != GST_FLOW_NOT_LINKED) { + GST_DEBUG_OBJECT (demux, "flow %s on pad %" GST_PTR_FORMAT, + gst_flow_get_name (flow), stream->pad); + } + /* let parent class check for anything non-not-linked for its streams */ + flow = + GST_MPEG_DEMUX_CLASS (parent_class)->combine_flows (mpegdemux, stream, + flow); + if (flow != GST_FLOW_NOT_LINKED) + /* only return NOT_LINKED if all other pads returned NOT_LINKED */ + for (i = 0; i < GST_DVD_DEMUX_NUM_SUBPICTURE_STREAMS; i++) { + if (demux->subpicture_stream[i] != NULL) { + flow = demux->subpicture_stream[i]->last_flow; + /* some other return value (must be SUCCESS but we can return + * other values as well) */ + if (flow != GST_FLOW_NOT_LINKED) + goto done; + if (demux->subpicture_stream[i]->buffers_sent < MIN_BUFS_FOR_NO_MORE_PADS) { + flow = GST_FLOW_OK; + } + } + /* if we get here, all other pads were unlinked and we return + * NOT_LINKED then */ + GST_DEBUG_OBJECT (demux, "all pads combined have not-linked flow"); +done: + return flow; +} static GstFlowReturn gst_dvd_demux_send_subbuffer (GstMPEGDemux * mpeg_demux, GstMPEGStream * outstream, GstBuffer * buffer, @@ -987,10 +1034,22 @@ gst_buffer_set_caps (outbuf, outstream->caps); ret = gst_pad_push (outpad, outbuf); + /* this was one of the current_foo pads, which is shadowing one of the + * foo_%02d pads, so since we keep track of the last flow value in the + * stream structure we need to combine the OK/NOT_LINKED flows here + * (because both pads share the same stream structure) */ + if ((ret == GST_FLOW_NOT_LINKED && outstream->last_flow == GST_FLOW_OK) || + (ret == GST_FLOW_OK && outstream->last_flow == GST_FLOW_NOT_LINKED)) { + outstream->last_flow = GST_FLOW_OK; + ret = GST_FLOW_OK; } gst_buffer_unref (buffer); + ret = DEMUX_CLASS (dvd_demux)->combine_flows (mpeg_demux, outstream, ret); Index: gstmpegdemux.c RCS file: /cvs/gstreamer/gst-plugins-ugly/gst/mpegstream/gstmpegdemux.c,v retrieving revision 1.92 retrieving revision 1.93 diff -u -d -r1.92 -r1.93 --- gstmpegdemux.c 9 Oct 2006 12:09:14 -0000 1.92 +++ gstmpegdemux.c 19 Nov 2006 13:08:30 -0000 1.93 @@ -92,9 +92,6 @@ static void gst_mpeg_demux_class_init (GstMPEGDemuxClass * klass); -static GstFlowReturn gst_mpeg_demux_send_buffer (GstMPEGParse * mpeg_parse, static GstPad *gst_mpeg_demux_new_output_pad (GstMPEGDemux * mpeg_demux, const gchar * name, GstPadTemplate * temp); static void gst_mpeg_demux_init_stream (GstMPEGDemux * mpeg_demux, @@ -120,6 +117,8 @@ static GstFlowReturn gst_mpeg_demux_send_subbuffer (GstMPEGDemux * mpeg_demux, GstClockTime timestamp, guint offset, guint size); +static GstFlowReturn gst_mpeg_demux_combine_flows (GstMPEGDemux * mpeg_demux, static GstFlowReturn gst_mpeg_demux_process_private (GstMPEGDemux * mpeg_demux, GstBuffer * buffer, guint stream_nr, GstClockTime timestamp, guint headerlen, guint datalen); @@ -190,7 +189,7 @@ mpeg_parse_class->parse_syshead = gst_mpeg_demux_parse_syshead; mpeg_parse_class->parse_packet = gst_mpeg_demux_parse_packet; mpeg_parse_class->parse_pes = gst_mpeg_demux_parse_pes; - mpeg_parse_class->send_buffer = gst_mpeg_demux_send_buffer; klass->new_output_pad = gst_mpeg_demux_new_output_pad; klass->init_stream = gst_mpeg_demux_init_stream; @@ -198,6 +197,7 @@ klass->get_audio_stream = gst_mpeg_demux_get_audio_stream; klass->get_private_stream = gst_mpeg_demux_get_private_stream; klass->send_subbuffer = gst_mpeg_demux_send_subbuffer; + klass->combine_flows = gst_mpeg_demux_combine_flows; klass->process_private = gst_mpeg_demux_process_private; klass->synchronise_pads = gst_mpeg_demux_synchronise_pads; klass->sync_stream_to_time = gst_mpeg_demux_sync_stream_to_time; @@ -229,14 +229,6 @@ mpeg_demux->last_pts = -1; -gst_mpeg_demux_send_buffer (GstMPEGParse * mpeg_parse, GstBuffer * buffer, static gint _demux_get_writer_id (GstIndex * index, GstPad * pad) @@ -291,6 +283,9 @@ str->cur_ts = 0; str->scr_offs = 0; + str->last_flow = GST_FLOW_OK; + str->buffers_sent = 0; static GstMPEGStream * @@ -712,12 +707,12 @@ if (id == 0xBD) { /* Private stream 1. */ GST_DEBUG_OBJECT (mpeg_demux, "we have a private 1 packet"); - CLASS (mpeg_demux)->process_private (mpeg_demux, buffer, 0, timestamp, + ret = CLASS (mpeg_demux)->process_private (mpeg_demux, buffer, 0, timestamp, headerlen, datalen); } else if (id == 0xBF) { /* Private stream 2. */ GST_DEBUG_OBJECT (mpeg_demux, "we have a private 2 packet"); - CLASS (mpeg_demux)->process_private (mpeg_demux, buffer, 1, timestamp, + ret = CLASS (mpeg_demux)->process_private (mpeg_demux, buffer, 1, timestamp, } else if (id >= 0xC0 && id <= 0xDF) { /* Audio. */ @@ -855,13 +850,13 @@ - headerlen, datalen); + ret = CLASS (mpeg_demux)->process_private (mpeg_demux, buffer, 0, + timestamp, headerlen, datalen); + ret = CLASS (mpeg_demux)->process_private (mpeg_demux, buffer, 1, GST_DEBUG_OBJECT (mpeg_demux, "we have an audio packet"); @@ -886,6 +881,78 @@ +gst_mpeg_demux_combine_flows (GstMPEGDemux * demux, GstMPEGStream * stream, + for (i = 0; i < GST_MPEG_DEMUX_NUM_VIDEO_STREAMS; i++) { + if (demux->video_stream[i] != NULL) { + flow = demux->video_stream[i]->last_flow; + if (demux->video_stream[i]->buffers_sent < MIN_BUFS_FOR_NO_MORE_PADS) { + for (i = 0; i < GST_MPEG_DEMUX_NUM_AUDIO_STREAMS; i++) { + if (demux->audio_stream[i] != NULL) { + flow = demux->audio_stream[i]->last_flow; + if (demux->audio_stream[i]->buffers_sent < MIN_BUFS_FOR_NO_MORE_PADS) { + for (i = 0; i < GST_MPEG_DEMUX_NUM_PRIVATE_STREAMS; i++) { + if (demux->private_stream[i] != NULL) { + flow = demux->private_stream[i]->last_flow; + if (demux->private_stream[i]->buffers_sent < MIN_BUFS_FOR_NO_MORE_PADS) { gst_mpeg_demux_send_subbuffer (GstMPEGDemux * mpeg_demux, @@ -927,6 +994,9 @@ GST_BUFFER_TIMESTAMP (outbuf) = timestamp; GST_BUFFER_OFFSET (outbuf) = GST_BUFFER_OFFSET (buffer) + offset; ret = gst_pad_push (outstream->pad, outbuf); + GST_LOG ("flow on %s: %s", GST_PAD_NAME (outstream->pad), + gst_flow_get_name (ret)); + ++outstream->buffers_sent; if (GST_CLOCK_TIME_IS_VALID (mpeg_demux->max_gap) && GST_CLOCK_TIME_IS_VALID (mpeg_parse->current_ts) && @@ -936,6 +1006,8 @@ mpeg_parse->current_ts - mpeg_demux->max_gap_tolerance); + ret = CLASS (mpeg_demux)->combine_flows (mpeg_demux, outstream, ret); Index: gstmpegdemux.h RCS file: /cvs/gstreamer/gst-plugins-ugly/gst/mpegstream/gstmpegdemux.h,v retrieving revision 1.25 retrieving revision 1.26 diff -u -d -r1.25 -r1.26 --- gstmpegdemux.h 1 Jun 2006 21:11:41 -0000 1.25 +++ gstmpegdemux.h 19 Nov 2006 13:08:30 -0000 1.26 @@ -88,14 +88,16 @@ /* Information associated to a single MPEG stream. */ struct _GstMPEGStream { - gint type; - gint number; - GstPad *pad; - GstCaps *caps; - gint index_id; - gint size_bound; - GstClockTime cur_ts; - GstClockTimeDiff scr_offs; + gint type; + gint number; + GstPad *pad; + GstCaps *caps; + gint index_id; + gint size_bound; + GstClockTime cur_ts; + GstClockTimeDiff scr_offs; + GstFlowReturn last_flow; + guint buffers_sent; }; /* Extended structure to hold additional information for video @@ -183,6 +185,10 @@ guint size); + GstFlowReturn (*combine_flows) (GstMPEGDemux *mpeg_demux, + GstMPEGStream *stream, + GstFlowReturn flow); GstFlowReturn (*process_private) (GstMPEGDemux *mpeg_demux, GstBuffer *buffer, guint stream_nr, Index: gstmpegparse.c RCS file: /cvs/gstreamer/gst-plugins-ugly/gst/mpegstream/gstmpegparse.c,v retrieving revision 1.96 retrieving revision 1.97 diff -u -d -r1.96 -r1.97 --- gstmpegparse.c 16 Oct 2006 18:07:23 -0000 1.96 +++ gstmpegparse.c 19 Nov 2006 13:08:30 -0000 1.97 @@ -407,6 +407,9 @@ gst_mpeg_packetize_flush_cache (mpeg_parse->packetize); break; } + case GST_EVENT_EOS: + GST_DEBUG_OBJECT (mpeg_parse, "EOS"); + /* fall through to default handler */ default: if (CLASS (mpeg_parse)->send_event) { ret = CLASS (mpeg_parse)->send_event (mpeg_parse, event); @@ -684,8 +687,8 @@ gst_mpeg_parse_chain (GstPad * pad, GstBuffer * buffer) - GstMPEGParse *mpeg_parse = GST_MPEG_PARSE (gst_pad_get_parent (pad)); - GstFlowReturn result = GST_FLOW_ERROR; + GstMPEGParse *mpeg_parse = GST_MPEG_PARSE (GST_PAD_PARENT (pad)); + GstFlowReturn result; guint id; gboolean mpeg2; GstClockTime time; @@ -704,10 +707,10 @@ if (result == GST_FLOW_RESEND) { /* there was not enough data in packetizer cache */ result = GST_FLOW_OK; - goto done; + break; if (result != GST_FLOW_OK) id = GST_MPEG_PACKETIZE_ID (mpeg_parse->packetize); mpeg2 = GST_MPEG_PACKETIZE_IS_MPEG2 (mpeg_parse->packetize); @@ -749,7 +752,7 @@ GST_DEBUG_OBJECT (mpeg_parse, "waiting for SCR"); gst_buffer_unref (buffer); /* Update the byte count. */ @@ -768,7 +771,7 @@ GST_ELEMENT_ERROR (mpeg_parse, CORE, NEGOTIATION, (NULL), (NULL)); gst_buffer_unref (buffer); result = GST_FLOW_ERROR; - goto done; + break; } @@ -819,13 +822,11 @@ ", total since SCR: %" G_GINT64_FORMAT ", br: %" G_GINT64_FORMAT ", next SCR: %" G_GINT64_FORMAT, size, bss, br, mpeg_parse->next_scr); - } while (!GST_FLOW_IS_FATAL (result)); -done: - gst_object_unref (mpeg_parse); + } while (GST_FLOW_IS_SUCCESS (result)); - if (result == GST_FLOW_NOT_LINKED) - result = GST_FLOW_OK; + if (result != GST_FLOW_OK) { + GST_DEBUG_OBJECT (mpeg_parse, "flow: %s", gst_flow_get_name (result)); return result; |
From: <tp...@ke...> - 2006-12-14 12:06:04
|
CVS Root: /cvs/gstreamer Module: gst-plugins-ugly Changes by: tpm Date: Thu Dec 14 2006 12:06:01 UTC Log message: * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_parse_packhead): Use our alignment-safe macros here too, since we can't assume that GST_BUFFER_DATA is aligned (these are subbuffers we're dealing with here). Modified files: . : ChangeLog gst/mpegstream : gstmpegparse.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-ugly/ChangeLog.diff?r1=1.2136&r2=1.2137 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-ugly/gst/mpegstream/gstmpegparse.c.diff?r1=1.99&r2=1.100 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-ugly/ChangeLog,v retrieving revision 1.2136 retrieving revision 1.2137 diff -u -d -r1.2136 -r1.2137 --- ChangeLog 14 Dec 2006 11:49:39 -0000 1.2136 +++ ChangeLog 14 Dec 2006 12:05:49 -0000 1.2137 @@ -1,5 +1,12 @@ 2006-12-14 Tim-Philipp Müller <tim at centricular dot net> + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_parse_packhead): + Use our alignment-safe macros here too, since we can't assume that + GST_BUFFER_DATA is aligned (these are subbuffers we're dealing with + here). + +2006-12-14 Tim-Philipp Müller <tim at centricular dot net> * gst/realmedia/rmdemux.c: (gst_rmdemux_parse_indx_data): Also, don't read the index for a stream a second time when operating in pull-mode and reaching the end of the file. Index: gstmpegparse.c RCS file: /cvs/gstreamer/gst-plugins-ugly/gst/mpegstream/gstmpegparse.c,v retrieving revision 1.99 retrieving revision 1.100 diff -u -d -r1.99 -r1.100 --- gstmpegparse.c 12 Dec 2006 21:09:16 -0000 1.99 +++ gstmpegparse.c 14 Dec 2006 12:05:49 -0000 1.100 @@ -492,8 +492,8 @@ buf = GST_BUFFER_DATA (buffer); buf += 4; - scr1 = GUINT32_FROM_BE (*(guint32 *) buf); - scr2 = GUINT32_FROM_BE (*(guint32 *) (buf + 4)); + scr1 = GST_READ_UINT32_BE (buf); + scr2 = GST_READ_UINT32_BE (buf + 4); /* Extract the SCR and rate values from the header. */ if (GST_MPEG_PACKETIZE_IS_MPEG2 (mpeg_parse->packetize)) { |
From: <tp...@ke...> - 2007-04-16 16:31:07
|
CVS Root: /cvs/gstreamer Module: gst-plugins-ugly Changes by: tpm Date: Mon Apr 16 2007 16:31:02 UTC Log message: * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_process_event), (gst_mpeg_parse_send_event): Post an error message if EOS wasn't handled by anything downstream. This should fix playbin freezing/hanging with small VobSub subtitle files (background: not-linked flow returns from downstream are ignored for a while at the beginning, so if the file is small upstream will never get a not-linked flow return even if nothing is connected downstream). (#429960). Modified files: . : ChangeLog gst/mpegstream : gstmpegparse.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-ugly/ChangeLog.diff?r1=1.2182&r2=1.2183 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-ugly/gst/mpegstream/gstmpegparse.c.diff?r1=1.100&r2=1.101 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-ugly/ChangeLog,v retrieving revision 1.2182 retrieving revision 1.2183 diff -u -d -r1.2182 -r1.2183 --- ChangeLog 16 Apr 2007 15:15:07 -0000 1.2182 +++ ChangeLog 16 Apr 2007 16:30:50 -0000 1.2183 @@ -1,3 +1,14 @@ +2007-04-16 Tim-Philipp Müller <tim at centricular dot net> + + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_process_event), + (gst_mpeg_parse_send_event): + Post an error message if EOS wasn't handled by anything downstream. + This should fix playbin freezing/hanging with small VobSub subtitle + files (background: not-linked flow returns from downstream are + ignored for a while at the beginning, so if the file is small + upstream will never get a not-linked flow return even if nothing + is connected downstream). (#429960). 2007-04-16 Michael Smith <ms...@fl...> * ext/amrnb/amrnbparse.c: (gst_amrnbparse_init), Index: gstmpegparse.c RCS file: /cvs/gstreamer/gst-plugins-ugly/gst/mpegstream/gstmpegparse.c,v retrieving revision 1.100 retrieving revision 1.101 diff -u -d -r1.100 -r1.101 --- gstmpegparse.c 14 Dec 2006 12:05:49 -0000 1.100 +++ gstmpegparse.c 16 Apr 2007 16:30:50 -0000 1.101 @@ -407,9 +407,20 @@ gst_mpeg_packetize_flush_cache (mpeg_parse->packetize); break; } - case GST_EVENT_EOS: + case GST_EVENT_EOS:{ GST_DEBUG_OBJECT (mpeg_parse, "EOS"); - /* fall through to default handler */ + if (CLASS (mpeg_parse)->send_event) { + ret = CLASS (mpeg_parse)->send_event (mpeg_parse, event); + } else { + gst_event_unref (event); + } + if (!ret) { + GST_ELEMENT_ERROR (mpeg_parse, STREAM, DEMUX, (NULL), + ("Pushing EOS event didn't work on any of the source pads")); + break; + } default: if (CLASS (mpeg_parse)->send_event) { ret = CLASS (mpeg_parse)->send_event (mpeg_parse, event); @@ -422,12 +433,13 @@ return ret; } +/* returns TRUE if pushing the event worked on at least one pad */ static gboolean gst_mpeg_parse_send_event (GstMPEGParse * mpeg_parse, GstEvent * event) { GstIterator *it; gpointer pad; - gboolean ret = TRUE; + gboolean ret = FALSE; /* Send event to all source pads of this element. */ it = gst_element_iterate_src_pads (GST_ELEMENT (mpeg_parse)); @@ -435,7 +447,8 @@ switch (gst_iterator_next (it, &pad)) { case GST_ITERATOR_OK: gst_event_ref (event); - gst_pad_push_event (GST_PAD (pad), event); + if (gst_pad_push_event (GST_PAD (pad), event)) + ret = TRUE; gst_object_unref (GST_OBJECT (pad)); break; case GST_ITERATOR_RESYNC: |
From: <tp...@ke...> - 2007-05-16 12:49:06
|
CVS Root: /cvs/gstreamer Module: gst-plugins-ugly Changes by: tpm Date: Wed May 16 2007 12:48:55 UTC Log message: Based on patch by: Mark Nauwelaerts <manauw skynet be> * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_process_event): * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_class_init), (gst_mpeg_demux_process_event), (gst_mpeg_streams_reset_last_flow): * gst/mpegstream/gstmpegdemux.h: Reset last_flow values for the various streams after a flushing seek, otherwise we might aggregate wrong flow returns afterwards that will make upstream pause silently. This should fix seeking in DVDs and also fix the Thoggen cropping dialog (#438610). Modified files: . : ChangeLog gst/mpegstream : gstdvddemux.c gstmpegdemux.c gstmpegdemux.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-ugly/ChangeLog.diff?r1=1.2197&r2=1.2198 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-ugly/gst/mpegstream/gstdvddemux.c.diff?r1=1.40&r2=1.41 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-ugly/gst/mpegstream/gstmpegdemux.c.diff?r1=1.93&r2=1.94 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-ugly/gst/mpegstream/gstmpegdemux.h.diff?r1=1.26&r2=1.27 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-ugly/ChangeLog,v retrieving revision 1.2197 retrieving revision 1.2198 diff -u -d -r1.2197 -r1.2198 --- ChangeLog 7 May 2007 13:51:41 -0000 1.2197 +++ ChangeLog 16 May 2007 12:48:39 -0000 1.2198 @@ -1,3 +1,16 @@ +2007-05-16 Tim-Philipp Müller <tim at centricular dot net> + + Based on patch by: Mark Nauwelaerts <manauw skynet be> + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_process_event): + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_class_init), + (gst_mpeg_demux_process_event), (gst_mpeg_streams_reset_last_flow): + * gst/mpegstream/gstmpegdemux.h: + Reset last_flow values for the various streams after a flushing + seek, otherwise we might aggregate wrong flow returns afterwards + that will make upstream pause silently. This should fix seeking + in DVDs and also fix the Thoggen cropping dialog (#438610). 2007-05-07 Tim-Philipp Müller <tim at centricular dot net> * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_reset), Index: gstdvddemux.c RCS file: /cvs/gstreamer/gst-plugins-ugly/gst/mpegstream/gstdvddemux.c,v retrieving revision 1.40 retrieving revision 1.41 diff -u -d -r1.40 -r1.41 --- gstdvddemux.c 19 Nov 2006 13:08:30 -0000 1.40 +++ gstdvddemux.c 16 May 2007 12:48:43 -0000 1.41 @@ -319,6 +319,10 @@ dvd_demux->segment_filter = TRUE; ret = GST_MPEG_PARSE_CLASS (parent_class)->process_event (mpeg_parse, event); + /* parent class will have reset the other streams */ + gst_mpeg_streams_reset_last_flow (dvd_demux->subpicture_stream, + GST_DVD_DEMUX_NUM_SUBPICTURE_STREAMS); break; case GST_EVENT_CUSTOM_DOWNSTREAM: case GST_EVENT_CUSTOM_DOWNSTREAM_OOB: Index: gstmpegdemux.c RCS file: /cvs/gstreamer/gst-plugins-ugly/gst/mpegstream/gstmpegdemux.c,v retrieving revision 1.93 retrieving revision 1.94 diff -u -d -r1.93 -r1.94 --- gstmpegdemux.c 19 Nov 2006 13:08:30 -0000 1.93 +++ gstmpegdemux.c 16 May 2007 12:48:43 -0000 1.94 @@ -92,6 +92,9 @@ static void gst_mpeg_demux_class_init (GstMPEGDemuxClass * klass); +static gboolean gst_mpeg_demux_process_event (GstMPEGParse * mpeg_parse, + GstEvent * event); static GstPad *gst_mpeg_demux_new_output_pad (GstMPEGDemux * mpeg_demux, const gchar * name, GstPadTemplate * temp); static void gst_mpeg_demux_init_stream (GstMPEGDemux * mpeg_demux, @@ -190,6 +193,7 @@ mpeg_parse_class->parse_packet = gst_mpeg_demux_parse_packet; mpeg_parse_class->parse_pes = gst_mpeg_demux_parse_pes; mpeg_parse_class->send_buffer = NULL; + mpeg_parse_class->process_event = gst_mpeg_demux_process_event; klass->new_output_pad = gst_mpeg_demux_new_output_pad; klass->init_stream = gst_mpeg_demux_init_stream; @@ -229,6 +233,34 @@ mpeg_demux->last_pts = -1; } +static gboolean +gst_mpeg_demux_process_event (GstMPEGParse * mpeg_parse, GstEvent * event) +{ + GstMPEGDemux *demux = GST_MPEG_DEMUX (mpeg_parse); + gboolean ret; + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_FLUSH_STOP: + ret = GST_MPEG_PARSE_CLASS (parent_class)->process_event (mpeg_parse, + event); + gst_mpeg_streams_reset_last_flow (demux->video_stream, + GST_MPEG_DEMUX_NUM_VIDEO_STREAMS); + gst_mpeg_streams_reset_last_flow (demux->audio_stream, + GST_MPEG_DEMUX_NUM_AUDIO_STREAMS); + gst_mpeg_streams_reset_last_flow (demux->private_stream, + GST_MPEG_DEMUX_NUM_PRIVATE_STREAMS); + break; + default: + } + return ret; +} static gint _demux_get_writer_id (GstIndex * index, GstPad * pad) { @@ -1310,6 +1342,16 @@ return mpeg_demux->index; +void +gst_mpeg_streams_reset_last_flow (GstMPEGStream * streams[], guint num) + guint i; + for (i = 0; i < num; ++i) { + if (streams[i] != NULL) + streams[i]->last_flow = GST_FLOW_OK; gboolean gst_mpeg_demux_plugin_init (GstPlugin * plugin) Index: gstmpegdemux.h RCS file: /cvs/gstreamer/gst-plugins-ugly/gst/mpegstream/gstmpegdemux.h,v retrieving revision 1.26 retrieving revision 1.27 diff -u -d -r1.26 -r1.27 --- gstmpegdemux.h 19 Nov 2006 13:08:30 -0000 1.26 +++ gstmpegdemux.h 16 May 2007 12:48:43 -0000 1.27 @@ -204,9 +204,12 @@ GstClockTime last_ts); }; -GType gst_mpeg_demux_get_type (void); +void gst_mpeg_streams_reset_last_flow (GstMPEGStream *streams[], + guint num); -gboolean gst_mpeg_demux_plugin_init (GstPlugin *plugin); +GType gst_mpeg_demux_get_type (void); +gboolean gst_mpeg_demux_plugin_init (GstPlugin *plugin); G_END_DECLS |
From: <tp...@ke...> - 2007-05-21 15:12:06
|
CVS Root: /cvs/gstreamer Module: gst-plugins-ugly Changes by: tpm Date: Mon May 21 2007 15:11:57 UTC Log message: * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_send_subbuffer): Add sanity check so we don't abort for broken or non-MPEG streams, but instead error out. Fixes crashes/aborts for when our typefinder wrongly identifies quicktime files as mpeg (which should be fixed in -base now too). (#440120). Modified files: . : ChangeLog gst/mpegstream : gstmpegdemux.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-ugly/ChangeLog.diff?r1=1.2202&r2=1.2203 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-ugly/gst/mpegstream/gstmpegdemux.c.diff?r1=1.94&r2=1.95 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-ugly/ChangeLog,v retrieving revision 1.2202 retrieving revision 1.2203 diff -u -d -r1.2202 -r1.2203 --- ChangeLog 18 May 2007 09:35:16 -0000 1.2202 +++ ChangeLog 21 May 2007 15:11:44 -0000 1.2203 @@ -1,3 +1,11 @@ +2007-05-21 Tim-Philipp Müller <tim at centricular dot net> + + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_send_subbuffer): + Add sanity check so we don't abort for broken or non-MPEG streams, + but instead error out. Fixes crashes/aborts for when our typefinder + wrongly identifies quicktime files as mpeg (which should be fixed in + -base now too). (#440120). 2007-05-18 Stefan Kost <en...@us...> * ext/amrnb/amrnbdec.c (gst_amrnbdec_debug, GST_CAT_DEFAULT, Index: gstmpegdemux.c RCS file: /cvs/gstreamer/gst-plugins-ugly/gst/mpegstream/gstmpegdemux.c,v retrieving revision 1.94 retrieving revision 1.95 diff -u -d -r1.94 -r1.95 --- gstmpegdemux.c 16 May 2007 12:48:43 -0000 1.94 +++ gstmpegdemux.c 21 May 2007 15:11:45 -0000 1.95 @@ -1020,14 +1020,17 @@ } else { GST_DEBUG_OBJECT (mpeg_demux, "Creating subbuffer size %d", size); } + if (G_UNLIKELY (offset + size > GST_BUFFER_SIZE (buffer))) + goto broken_file; outbuf = gst_buffer_create_sub (buffer, offset, size); gst_buffer_set_caps (outbuf, GST_PAD_CAPS (outstream->pad)); GST_BUFFER_TIMESTAMP (outbuf) = timestamp; GST_BUFFER_OFFSET (outbuf) = GST_BUFFER_OFFSET (buffer) + offset; ret = gst_pad_push (outstream->pad, outbuf); - GST_LOG ("flow on %s: %s", GST_PAD_NAME (outstream->pad), - gst_flow_get_name (ret)); + GST_LOG_OBJECT (outstream->pad, "flow: %s", gst_flow_get_name (ret)); ++outstream->buffers_sent; if (GST_CLOCK_TIME_IS_VALID (mpeg_demux->max_gap) && @@ -1041,6 +1044,14 @@ ret = CLASS (mpeg_demux)->combine_flows (mpeg_demux, outstream, ret); return ret; +/* ERRORS */ +broken_file: + { + GST_ELEMENT_ERROR (mpeg_demux, STREAM, DEMUX, (NULL), + ("Either broken file or not an MPEG stream")); + return GST_FLOW_ERROR; + } } static GstFlowReturn |