diff --git a/ChangeLog b/ChangeLog index f0db346c38..46696a2c94 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2005-11-25 Jan Schmidt + + * ext/mad/gstmad.c: (gst_mad_chain): + When pad_alloc returns other-than-GST_FLOW_OK and mad exits early, + skip frame synthesis and consume input data as if we'd done the + decode. Makes mad not error when the src pad is not connected. + (#319784) + 2005-11-23 Martin Soto * gst/mpegstream/gstmpegparse.c (gst_mpeg_parse_class_init) diff --git a/common b/common index ea1409191c..1b24580b06 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit ea1409191cc1e71273b2dbdd94e7ab5fc5a60a51 +Subproject commit 1b24580b06e738f920b33ea68dffd83d953f0bba diff --git a/ext/mad/gstmad.c b/ext/mad/gstmad.c index e1d45cc4b1..cd26f74761 100644 --- a/ext/mad/gstmad.c +++ b/ext/mad/gstmad.c @@ -1333,6 +1333,7 @@ gst_mad_chain (GstPad * pad, GstBuffer * buffer) guint64 time_offset; guint64 time_duration; unsigned char const *before_sync, *after_sync; + gboolean goto_exit = FALSE; mad->in_error = FALSE; @@ -1359,7 +1360,7 @@ gst_mad_chain (GstPad * pad, GstBuffer * buffer) break; } else { GST_LOG ("sync error, flushing unneeded data"); - goto next; + goto next_no_samples; } } /* we are in an error state */ @@ -1426,10 +1427,9 @@ gst_mad_chain (GstPad * pad, GstBuffer * buffer) GST_DEBUG ("synced to data: 0x%0x 0x%0x", *mad->stream.ptr.byte, *(mad->stream.ptr.byte + 1)); - mad_stream_sync (&mad->stream); /* recoverable errors pass */ - goto next; + goto next_no_samples; } if (mad->check_for_xing) { @@ -1450,7 +1450,7 @@ gst_mad_chain (GstPad * pad, GstBuffer * buffer) } mad->check_for_xing = FALSE; - goto next; + goto next_no_samples; } /* if we're not resyncing/in error, check if caps need to be set again */ @@ -1492,20 +1492,24 @@ gst_mad_chain (GstPad * pad, GstBuffer * buffer) /* for sample accurate seeking, calculate how many samples to skip and send the remaining pcm samples */ - GstBuffer *outbuffer; + GstBuffer *outbuffer = NULL; gint16 *outdata; mad_fixed_t const *left_ch, *right_ch; - mad_synth_frame (&mad->synth, &mad->frame); - left_ch = mad->synth.pcm.samples[0]; - right_ch = mad->synth.pcm.samples[1]; - /* will attach the caps to the buffer */ result = gst_pad_alloc_buffer (mad->srcpad, 0, nsamples * mad->channels * 2, GST_PAD_CAPS (mad->srcpad), &outbuffer); - if (result != GST_FLOW_OK) - goto end; + if (result != GST_FLOW_OK) { + /* Head for the exit, dropping samples as we go */ + GST_LOG ("Skipping frame synthesis due to pad_alloc return value"); + goto_exit = TRUE; + goto skip_frame; + } + + mad_synth_frame (&mad->synth, &mad->frame); + left_ch = mad->synth.pcm.samples[0]; + right_ch = mad->synth.pcm.samples[1]; outdata = (gint16 *) GST_BUFFER_DATA (outbuffer); @@ -1546,10 +1550,12 @@ gst_mad_chain (GstPad * pad, GstBuffer * buffer) result = gst_pad_push (mad->srcpad, outbuffer); if (result != GST_FLOW_OK && result != GST_FLOW_NOT_LINKED) { - goto end; + /* Head for the exit, dropping samples as we go */ + goto_exit = TRUE; } } + skip_frame: mad->total_samples += nsamples; /* we have a queued timestamp on the incoming buffer that we should @@ -1565,7 +1571,7 @@ gst_mad_chain (GstPad * pad, GstBuffer * buffer) goto end; } - next: + next_no_samples: /* figure out how many bytes mad consumed */ /* if consumed is already set, it's from the resync higher up, so we need to use that value instead. Otherwise, recalculate from @@ -1578,6 +1584,8 @@ gst_mad_chain (GstPad * pad, GstBuffer * buffer) mad_input_buffer += consumed; mad->tempsize -= consumed; mad->bytes_consumed += consumed; + if (goto_exit == TRUE) + goto end; } /* we only get here from breaks, tempsize never actually drops below 0 */ memmove (mad->tempbuffer, mad_input_buffer, mad->tempsize);