summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog12
-rw-r--r--ext/faad/gstfaad.c17
-rw-r--r--ext/faad/gstfaad.h1
3 files changed, 28 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 1212eadf..d67ad072 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2006-05-13 Tim-Philipp Müller <tim at centricular dot net>
+
+ Patch by: Young-Ho Cha <ganadist chollian net>
+
+ * 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 <wim@fluendo.com>
* ext/xvid/gstxvidenc.c: (gst_xvidenc_class_init),
diff --git a/ext/faad/gstfaad.c b/ext/faad/gstfaad.c
index 2c745d0e..76d4a73c 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 160b8ba4..2650223f 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 {