diff --git a/ChangeLog b/ChangeLog index 1212eadf11..d67ad072e3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2006-05-13 Tim-Philipp Müller + + Patch by: Young-Ho Cha + + * ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chain), + (gst_faad_change_state): + * ext/faad/gstfaad.h: + If we encounter a decoding error, don't error out immediately, + but try to resync (or see if we have better luck with the next + buffer in case of framed input). Only error out after five + consecutive errors. Fixes #341563. + 2006-05-12 Wim Taymans * ext/xvid/gstxvidenc.c: (gst_xvidenc_class_init), diff --git a/ext/faad/gstfaad.c b/ext/faad/gstfaad.c index 2c745d0eb7..76d4a73cf2 100644 --- a/ext/faad/gstfaad.c +++ b/ext/faad/gstfaad.c @@ -51,6 +51,8 @@ extern int8_t faacDecInit2 (faacDecHandle, guint8 *, guint32, GST_DEBUG_CATEGORY_STATIC (faad_debug); #define GST_CAT_DEFAULT faad_debug +#define MAX_DECODE_ERRORS 5 + static const GstElementDetails faad_details = GST_ELEMENT_DETAILS ("AAC audio decoder", "Codec/Decoder/Audio", @@ -192,6 +194,7 @@ gst_faad_init (GstFaad * faad) faad->bytes_in = 0; faad->sum_dur_out = 0; faad->packetised = FALSE; + faad->error_count = 0; faad->sinkpad = gst_pad_new_from_static_template (&sink_template, "sink"); gst_element_add_pad (GST_ELEMENT (faad), faad->sinkpad); @@ -1208,8 +1211,17 @@ gst_faad_chain (GstPad * pad, GstBuffer * buffer) out = faacDecDecode (faad->handle, &info, input_data + skip_bytes, input_size - skip_bytes); - if (info.error) - goto decode_error; + if (info.error) { + faad->error_count++; + if (faad->error_count >= MAX_DECODE_ERRORS) + goto decode_error; + GST_DEBUG_OBJECT (faad, + "Failed to decode buffer: %s, count = %d, trying to resync", + faacDecGetErrorMessage (info.error), faad->error_count); + continue; + } + + faad->error_count = 0; /* all fine, reset error counter */ } if (info.bytesconsumed > input_size) @@ -1387,6 +1399,7 @@ gst_faad_change_state (GstElement * element, GstStateChange transition) faad->prev_ts = GST_CLOCK_TIME_NONE; faad->bytes_in = 0; faad->sum_dur_out = 0; + faad->error_count = 0; break; case GST_STATE_CHANGE_READY_TO_NULL: gst_faad_close_decoder (faad); diff --git a/ext/faad/gstfaad.h b/ext/faad/gstfaad.h index 160b8ba469..2650223f66 100644 --- a/ext/faad/gstfaad.h +++ b/ext/faad/gstfaad.h @@ -63,6 +63,7 @@ typedef struct _GstFaad { gint64 next_ts; /* timestamp of next buffer */ guint64 bytes_in; /* bytes received */ guint64 sum_dur_out; /* sum of durations of decoded buffers we sent out */ + gint error_count; } GstFaad; typedef struct _GstFaadClass {