--- gst/mpegaudioparse/gstmpegaudioparse.c +++ gst/mpegaudioparse/gstmpegaudioparse.c @@ -329,6 +329,7 @@ { gboolean res; GstMPEGAudioParse *mp3parse; + GstEvent **eventp; mp3parse = GST_MP3PARSE (gst_pad_get_parent (pad)); @@ -379,12 +380,21 @@ GST_DEBUG_OBJECT (mp3parse, "Pushing newseg rate %g, applied rate %g, " "format %d, start %lld, stop %lld, pos %lld\n", rate, applied_rate, format, start, stop, pos); - res = gst_pad_push_event (mp3parse->srcpad, event); + + /* save the segment for later, right before we push a new buffer so that + * the caps are fixed and the next linked element can receive the segment. */ + eventp = &mp3parse->pending_segment; + gst_event_replace (eventp, event); + res = TRUE; + break; } case GST_EVENT_FLUSH_STOP: /* Clear our adapter and set up for a new position */ gst_adapter_clear (mp3parse->adapter); + eventp = &mp3parse->pending_segment; + gst_event_replace (eventp, NULL); + res = gst_pad_push_event (mp3parse->srcpad, event); break; default: @@ -484,6 +494,11 @@ } return gst_pad_push (mp3parse->srcpad, outbuf); + /* push any pending segment now */ + if (mp3parse->pending_segment) + gst_pad_push_event (mp3parse->srcpad, mp3parse->pending_segment); + mp3parse->pending_segment = NULL; + } #define XING_FRAMES_FLAG 0x0001 --- gst/mpegaudioparse/gstmpegaudioparse.h +++ gst/mpegaudioparse/gstmpegaudioparse.h @@ -82,6 +82,8 @@ guchar xing_seek_table[100]; guint32 xing_vbr_scale; guint xing_bitrate; + /* pending segment */ + GstEvent *pending_segment; }; struct _GstMPEGAudioParseClass {