audiomixer: Mark a discont when we receive a new segment event

This allows us to handle new segment events correctly; either by dropping
buffers or inserting silence; for example if the offset is changed on an srcpad
connected to audiomixer.
This commit is contained in:
Nirbheek Chauhan 2015-03-12 01:56:44 +05:30 committed by Sebastian Dröge
parent 38cf87aaea
commit 8227310d22
2 changed files with 11 additions and 1 deletions

View file

@ -675,7 +675,9 @@ gst_audiomixer_sink_event (GstAggregator * agg, GstAggregatorPad * aggpad,
} }
case GST_EVENT_SEGMENT: case GST_EVENT_SEGMENT:
{ {
GstAudioMixerPad *pad = GST_AUDIO_MIXER_PAD (aggpad);
const GstSegment *segment; const GstSegment *segment;
gst_event_parse_segment (event, &segment); gst_event_parse_segment (event, &segment);
if (segment->rate != agg->segment.rate) { if (segment->rate != agg->segment.rate) {
GST_ERROR_OBJECT (aggpad, GST_ERROR_OBJECT (aggpad,
@ -689,6 +691,10 @@ gst_audiomixer_sink_event (GstAggregator * agg, GstAggregatorPad * aggpad,
res = FALSE; res = FALSE;
gst_event_unref (event); gst_event_unref (event);
event = NULL; event = NULL;
} else {
/* Ideally, this should only be set when the new segment causes running
* times to change, and hence needs discont calculation in fill_buffer */
pad->new_segment = TRUE;
} }
break; break;
} }
@ -1007,8 +1013,9 @@ gst_audio_mixer_fill_buffer (GstAudioMixer * audiomixer, GstAudioMixerPad * pad,
if (GST_BUFFER_IS_DISCONT (inbuf) if (GST_BUFFER_IS_DISCONT (inbuf)
|| GST_BUFFER_FLAG_IS_SET (inbuf, GST_BUFFER_FLAG_RESYNC) || GST_BUFFER_FLAG_IS_SET (inbuf, GST_BUFFER_FLAG_RESYNC)
|| pad->next_offset == -1) { || pad->new_segment || pad->next_offset == -1) {
discont = TRUE; discont = TRUE;
pad->new_segment = FALSE;
} else { } else {
guint64 diff, max_sample_diff; guint64 diff, max_sample_diff;

View file

@ -110,6 +110,9 @@ struct _GstAudioMixerPad {
/* Last time we noticed a discont */ /* Last time we noticed a discont */
GstClockTime discont_time; GstClockTime discont_time;
/* A new unhandled segment event has been received */
gboolean new_segment;
}; };
struct _GstAudioMixerPadClass { struct _GstAudioMixerPadClass {