From d6ad646108204dbc3c0f40c3d2871185181a623c Mon Sep 17 00:00:00 2001 From: Zaheer Abbas Merali Date: Mon, 4 Feb 2008 14:27:32 +0000 Subject: [PATCH] ext/mpeg2dec/gstmpeg2dec.c: Reset decoder when handling sequence where libmpeg2 has set frame period to 0, probably d... Original commit message from CVS: * ext/mpeg2dec/gstmpeg2dec.c: Reset decoder when handling sequence where libmpeg2 has set frame period to 0, probably due to a corrupt packet. Fixes bug #514297 --- ChangeLog | 7 +++++++ common | 2 +- ext/mpeg2dec/gstmpeg2dec.c | 25 +++++++++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 28e09b1830..b138ec9a1c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2008-02-04 Zaheer Abbas Merali + + * ext/mpeg2dec/gstmpeg2dec.c: + Reset decoder when handling sequence where libmpeg2 has set + frame period to 0, probably due to a corrupt packet. + Fixes bug #514297 + 2008-01-29 Sebastian Dröge * gst/mpegaudioparse/gstmpegaudioparse.c: (mp3_caps_create), diff --git a/common b/common index 571dce3335..3c5473161c 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 571dce3335f9be76978009b3842c050dbb900e6f +Subproject commit 3c5473161ce19a3530bad279b842d542895b1500 diff --git a/ext/mpeg2dec/gstmpeg2dec.c b/ext/mpeg2dec/gstmpeg2dec.c index 63868ae9ab..74469357c6 100644 --- a/ext/mpeg2dec/gstmpeg2dec.c +++ b/ext/mpeg2dec/gstmpeg2dec.c @@ -612,6 +612,12 @@ handle_sequence (GstMpeg2dec * mpeg2dec, const mpeg2_info_t * info) { GstFlowReturn ret = GST_FLOW_OK; + if (info->sequence->frame_period == 0) { + GST_WARNING_OBJECT (mpeg2dec, "Frame period is 0!"); + ret = GST_FLOW_ERROR; + goto done; + } + mpeg2dec->width = info->sequence->picture_width; mpeg2dec->height = info->sequence->picture_height; mpeg2dec->pixel_width = info->sequence->pixel_width; @@ -1093,6 +1099,25 @@ gst_mpeg2dec_chain (GstPad * pad, GstBuffer * buf) switch (state) { case STATE_SEQUENCE: ret = handle_sequence (mpeg2dec, info); + /* if there is an error handling the sequence + * reset the decoder, maybe something more elegant + * could be done. + */ + if (ret == GST_FLOW_ERROR) { + mpeg2dec->error_count++; + GST_WARNING_OBJECT (mpeg2dec, "Decoding error #%d", + mpeg2dec->error_count); + if (mpeg2dec->error_count >= WARN_THRESHOLD && WARN_THRESHOLD > 0) { + GST_ELEMENT_WARNING (mpeg2dec, STREAM, DECODE, + ("%d consecutive decoding errors", mpeg2dec->error_count), + (NULL)); + } + mpeg2_reset (mpeg2dec->decoder, 0); + mpeg2_skip (mpeg2dec->decoder, 1); + mpeg2dec->discont_state = MPEG2DEC_DISC_NEW_PICTURE; + + goto exit; + } break; case STATE_SEQUENCE_REPEATED: GST_DEBUG_OBJECT (mpeg2dec, "sequence repeated");