+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:
/* 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...
gst_element_add_pad (GST_ELEMENT (mpeg2dec), mpeg2dec->userdatapad);
#endif
+ mpeg2dec->error_count = 0;
+
/* initialize the mpeg2dec acceleration */
}
mpeg2dec->need_sequence = TRUE;
mpeg2dec->next_time = 0;
mpeg2dec->offset = 0;
+ mpeg2dec->error_count = 0;
mpeg2_reset (mpeg2dec->decoder, 1);
}
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
*/
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;
}