From 64380946951993994aca4c07b82da4ea91107a50 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Tim-Philipp=20M=C3=BCller?= Date: Mon, 27 Feb 2006 14:49:05 +0000 Subject: [PATCH] ext/mpeg2dec/gstmpeg2dec.*: Don't treat STATE_INVALID as fatal error; throw an error only after five consecutive deco... MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Original commit message from CVS: Reviewed by: Tim-Philipp Müller * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_init), (gst_mpeg2dec_reset), (gst_mpeg2dec_chain): * ext/mpeg2dec/gstmpeg2dec.h: Don't treat STATE_INVALID as fatal error; throw an error only after five consecutive decoding errors. Makes decoding mpeg streams more robust and fixes playback of joined clips (#300682). --- ChangeLog | 12 ++++++++++++ ext/mpeg2dec/gstmpeg2dec.c | 25 +++++++++++++++++++++++-- ext/mpeg2dec/gstmpeg2dec.h | 6 ++++-- 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9dec8601..d5597de1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2006-02-27 Luca Ognibene + + Reviewed by: Tim-Philipp Müller + + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_init), + (gst_mpeg2dec_reset), (gst_mpeg2dec_chain): + * ext/mpeg2dec/gstmpeg2dec.h: + Don't treat STATE_INVALID as fatal error; throw an error + only after five consecutive decoding errors. Makes decoding + mpeg streams more robust and fixes playback of joined clips + (#300682). + 2006-02-26 Tim-Philipp Müller * ext/dvdnav/dvdnavsrc.h: diff --git a/ext/mpeg2dec/gstmpeg2dec.c b/ext/mpeg2dec/gstmpeg2dec.c index 12d0c03f..f8133792 100644 --- a/ext/mpeg2dec/gstmpeg2dec.c +++ b/ext/mpeg2dec/gstmpeg2dec.c @@ -75,6 +75,11 @@ enum /* FILL ME */ }; +/* error out after receiving MAX_ERROR_COUNT STATE_INVALID return value + * from mpeg2_parse. -1 means never error out + */ +#define MAX_ERROR_COUNT (5) + /* * We can't use fractions in static pad templates, so * we do something manual... @@ -290,6 +295,8 @@ gst_mpeg2dec_init (GstMpeg2dec * mpeg2dec) gst_element_add_pad (GST_ELEMENT (mpeg2dec), mpeg2dec->userdatapad); #endif + mpeg2dec->error_count = 0; + /* initialize the mpeg2dec acceleration */ } @@ -321,6 +328,7 @@ gst_mpeg2dec_reset (GstMpeg2dec * mpeg2dec) mpeg2dec->need_sequence = TRUE; mpeg2dec->next_time = 0; mpeg2dec->offset = 0; + mpeg2dec->error_count = 0; mpeg2_reset (mpeg2dec->decoder, 1); } @@ -920,13 +928,21 @@ gst_mpeg2dec_chain (GstPad * pad, GstBuffer * buf) break; /* error */ case STATE_INVALID: - GST_WARNING_OBJECT (mpeg2dec, "Decoding error"); + mpeg2dec->error_count++; + GST_WARNING_OBJECT (mpeg2dec, "Decoding error #%d", + mpeg2dec->error_count); + if (mpeg2dec->error_count >= MAX_ERROR_COUNT && MAX_ERROR_COUNT > 0) { + GST_WARNING_OBJECT (mpeg2dec, "Too many decoding errors"); + goto exit_error; + } goto exit; default: GST_ERROR_OBJECT (mpeg2dec, "Unknown libmpeg2 state %d, FIXME", state); - break; + goto exit; } + mpeg2dec->error_count = 0; + /* * FIXME: should pass more information such as state the user data is from */ @@ -949,6 +965,11 @@ gst_mpeg2dec_chain (GstPad * pad, GstBuffer * buf) return ret; exit: + gst_buffer_unref (buf); + return GST_FLOW_OK; + +exit_error: + GST_ELEMENT_ERROR (mpeg2dec, STREAM, DECODE, (NULL), (NULL)); gst_buffer_unref (buf); return GST_FLOW_ERROR; } diff --git a/ext/mpeg2dec/gstmpeg2dec.h b/ext/mpeg2dec/gstmpeg2dec.h index 1bcc5e44..d4959669 100644 --- a/ext/mpeg2dec/gstmpeg2dec.h +++ b/ext/mpeg2dec/gstmpeg2dec.h @@ -75,7 +75,7 @@ struct _GstMpeg2dec { gboolean closed; gboolean have_fbuf; - GstBuffer *buffers[GST_MPEG2DEC_NUM_BUFS]; + GstBuffer *buffers[GST_MPEG2DEC_NUM_BUFS]; DiscontState discont_state; @@ -96,7 +96,7 @@ struct _GstMpeg2dec { gint64 total_frames; gint64 frame_period; - guint64 offset; + guint64 offset; gint fps_n; gint fps_d; gboolean need_sequence; @@ -105,6 +105,8 @@ struct _GstMpeg2dec { GstIndex *index; gint index_id; + + gint error_count; }; struct _GstMpeg2decClass { -- 2.34.1