From: <tp...@ke...> - 2006-02-27 14:49:24
|
CVS Root: /cvs/gstreamer Module: gst-plugins-ugly Changes by: tpm Date: Mon Feb 27 2006 14:49:17 UTC Log message: Reviewed by: Tim-Philipp Müller <tim at centricular dot net> * 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). Modified files: . : ChangeLog ext/mpeg2dec : gstmpeg2dec.c gstmpeg2dec.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-ugly/ChangeLog.diff?r1=1.1976&r2=1.1977 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-ugly/ext/mpeg2dec/gstmpeg2dec.c.diff?r1=1.104&r2=1.105 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-ugly/ext/mpeg2dec/gstmpeg2dec.h.diff?r1=1.25&r2=1.26 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-ugly/ChangeLog,v retrieving revision 1.1976 retrieving revision 1.1977 diff -u -d -r1.1976 -r1.1977 --- ChangeLog 26 Feb 2006 22:33:33 -0000 1.1976 +++ ChangeLog 27 Feb 2006 14:49:05 -0000 1.1977 @@ -1,3 +1,15 @@ +2006-02-27 Luca Ognibene <luogni at tin dot it> + + Reviewed by: Tim-Philipp Müller <tim at centricular dot net> + * 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 <tim at centricular dot net> * ext/dvdnav/dvdnavsrc.h: Index: gstmpeg2dec.c RCS file: /cvs/gstreamer/gst-plugins-ugly/ext/mpeg2dec/gstmpeg2dec.c,v retrieving revision 1.104 retrieving revision 1.105 diff -u -d -r1.104 -r1.105 --- gstmpeg2dec.c 17 Feb 2006 11:51:12 -0000 1.104 +++ gstmpeg2dec.c 27 Feb 2006 14:49:05 -0000 1.105 @@ -75,6 +75,11 @@ /* 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_element_add_pad (GST_ELEMENT (mpeg2dec), mpeg2dec->userdatapad); #endif + mpeg2dec->error_count = 0; /* initialize the mpeg2dec acceleration */ } @@ -321,6 +328,7 @@ mpeg2dec->need_sequence = TRUE; mpeg2dec->next_time = 0; mpeg2dec->offset = 0; mpeg2_reset (mpeg2dec->decoder, 1); @@ -920,13 +928,21 @@ 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 */ @@ -950,6 +966,11 @@ 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; Index: gstmpeg2dec.h RCS file: /cvs/gstreamer/gst-plugins-ugly/ext/mpeg2dec/gstmpeg2dec.h,v retrieving revision 1.25 retrieving revision 1.26 diff -u -d -r1.25 -r1.26 --- gstmpeg2dec.h 6 Dec 2005 19:48:06 -0000 1.25 +++ gstmpeg2dec.h 27 Feb 2006 14:49:05 -0000 1.26 @@ -75,7 +75,7 @@ gboolean closed; gboolean have_fbuf; - GstBuffer *buffers[GST_MPEG2DEC_NUM_BUFS]; + GstBuffer *buffers[GST_MPEG2DEC_NUM_BUFS]; DiscontState discont_state; @@ -96,7 +96,7 @@ gint64 total_frames; gint64 frame_period; - guint64 offset; + guint64 offset; gint fps_n; gint fps_d; gboolean need_sequence; @@ -105,6 +105,8 @@ GstIndex *index; gint index_id; + + gint error_count; struct _GstMpeg2decClass { |