From a295acae0ef5b6e21dda499a2c5e4212f9eccb29 Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Sat, 8 Jul 2006 13:48:58 +0000 Subject: [PATCH] theoraparse.c (theora_parse_push_buffer) Original commit message from CVS: 2006-07-08 Andy Wingo * theoraparse.c (theora_parse_push_buffer) (theora_parse_drain_queue_prematurely, theora_parse_drain_queue): Add some more debugging. Fix granulepos reconstruction in the face of discontinuities. --- ChangeLog | 7 +++++++ ext/theora/theoraparse.c | 26 +++++++++++++++++++++++--- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index aa26f273c4..2a81e32427 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2006-07-08 Andy Wingo + + * theoraparse.c (theora_parse_push_buffer) + (theora_parse_drain_queue_prematurely, theora_parse_drain_queue): + Add some more debugging. Fix granulepos reconstruction in the face + of discontinuities. + 2006-07-06 Wim Taymans * gst-libs/gst/audio/gstbaseaudiosink.c: diff --git a/ext/theora/theoraparse.c b/ext/theora/theoraparse.c index a1e997def9..cd81d521e1 100644 --- a/ext/theora/theoraparse.c +++ b/ext/theora/theoraparse.c @@ -296,6 +296,9 @@ theora_parse_push_buffer (GstTheoraParse * parse, GstBuffer * buf, gst_buffer_set_caps (buf, GST_PAD_CAPS (parse->srcpad)); + GST_DEBUG_OBJECT (parse, "pushing buffer with granulepos %" G_GINT64_FORMAT + "|%" G_GINT64_FORMAT, keyframe, frame - keyframe); + return gst_pad_push (parse->srcpad, buf); } @@ -309,6 +312,8 @@ theora_parse_drain_queue_prematurely (GstTheoraParse * parse) * didn't-get-a-granulepos-on-the-last-packet case. Assuming a continuous * stream. */ + GST_DEBUG_OBJECT (parse, "got EOS, draining queue"); + while (!g_queue_is_empty (parse->buffer_queue)) { GstBuffer *buf; @@ -351,12 +356,27 @@ static GstFlowReturn theora_parse_drain_queue (GstTheoraParse * parse, gint64 granulepos) { GstFlowReturn ret = GST_FLOW_OK; - gint64 keyframe, frame; + gint64 keyframe, prev_frame, frame; parse_granulepos (granulepos, parse->shift, &keyframe, &frame); - parse->prev_frame = MAX (parse->prev_frame, - frame - g_queue_get_length (parse->buffer_queue)); + prev_frame = frame - g_queue_get_length (parse->buffer_queue); + if (prev_frame < parse->prev_frame) { + GST_WARNING ("jumped %" G_GINT64_FORMAT + " frames backwards! not sure what to do here", + parse->prev_frame - prev_frame); + ret = GST_FLOW_ERROR; + goto done; + } else if (prev_frame > parse->prev_frame) { + GST_INFO ("discontinuity detected (%" G_GINT64_FORMAT + " frames)", prev_frame - parse->prev_frame); + if (keyframe <= prev_frame && keyframe > parse->prev_keyframe) + parse->prev_keyframe = keyframe; + parse->prev_frame = prev_frame; + } + + GST_DEBUG ("draining queue of length %d", + g_queue_get_length (parse->buffer_queue)); while (!g_queue_is_empty (parse->buffer_queue)) { GstBuffer *buf;