diff options
author | Tim-Philipp Müller <tim@centricular.net> | 2006-05-06 09:01:34 +0000 |
---|---|---|
committer | Tim-Philipp Müller <tim@centricular.net> | 2006-05-06 09:01:34 +0000 |
commit | 9f6377ff0d0be274223523ac46e92c771408dfcf (patch) | |
tree | da5f996776d4205e97162c0cd2bdd08b2a7ca678 /ext/flac | |
parent | be7d42b5489c1062f2200e7f70677d2327ce8f12 (diff) |
ext/flac/gstflacdec.*: Handle segment seeks that include the end of the file as stop point properly: when the decoder...
Original commit message from CVS:
* ext/flac/gstflacdec.c: (gst_flac_dec_loop):
* ext/flac/gstflacdec.h:
Handle segment seeks that include the end of the file as stop point
properly: when the decoder hits EOS we want to send a SEGMENT_DONE
message instead of an EOS event in case we're in segment seek
mode (fixes #340699).
Diffstat (limited to 'ext/flac')
-rw-r--r-- | ext/flac/gstflacdec.c | 44 | ||||
-rw-r--r-- | ext/flac/gstflacdec.h | 4 |
2 files changed, 34 insertions, 14 deletions
diff --git a/ext/flac/gstflacdec.c b/ext/flac/gstflacdec.c index 61ebb1fa..7457aa30 100644 --- a/ext/flac/gstflacdec.c +++ b/ext/flac/gstflacdec.c @@ -792,22 +792,15 @@ analyze_state: if (flacdec->segment.stop != -1 && flacdec->segment.last_stop > 0 && flacdec->segment.last_stop >= flacdec->segment.stop) { - gint64 stop_time; - GST_DEBUG_OBJECT (flacdec, "reached end of the configured segment"); - if ((flacdec->segment.flags & GST_SEEK_FLAG_SEGMENT) == 0) + if ((flacdec->segment.flags & GST_SEEK_FLAG_SEGMENT) == 0) { goto eos_and_pause; + } else { + goto segment_done_and_pause; + } - GST_DEBUG_OBJECT (flacdec, "posting SEGMENT_DONE message"); - - stop_time = gst_util_uint64_scale_int (flacdec->segment.stop, - GST_SECOND, flacdec->sample_rate); - - gst_element_post_message (GST_ELEMENT (flacdec), - gst_message_new_segment_done (GST_OBJECT (flacdec), - GST_FORMAT_TIME, stop_time)); - goto pause; + g_assert_not_reached (); } return; @@ -816,6 +809,16 @@ analyze_state: case FLAC__SEEKABLE_STREAM_DECODER_END_OF_STREAM:{ GST_DEBUG_OBJECT (flacdec, "EOS"); FLAC__seekable_stream_decoder_reset (flacdec->decoder); + + if ((flacdec->segment.flags & GST_SEEK_FLAG_SEGMENT) != 0) { + if (flacdec->segment.duration > 0) { + flacdec->segment.stop = flacdec->segment.duration; + } else { + flacdec->segment.stop = flacdec->segment.last_stop; + } + goto segment_done_and_pause; + } + goto eos_and_pause; } @@ -837,6 +840,23 @@ analyze_state: return; +segment_done_and_pause: + { + gint64 stop_time; + + stop_time = gst_util_uint64_scale_int (flacdec->segment.stop, + GST_SECOND, flacdec->sample_rate); + + GST_DEBUG_OBJECT (flacdec, "posting SEGMENT_DONE message, stop time %" + GST_TIME_FORMAT, GST_TIME_ARGS (stop_time)); + + gst_element_post_message (GST_ELEMENT (flacdec), + gst_message_new_segment_done (GST_OBJECT (flacdec), + GST_FORMAT_TIME, stop_time)); + + goto pause; + } + eos_and_pause: { GST_DEBUG_OBJECT (flacdec, "sending EOS event"); diff --git a/ext/flac/gstflacdec.h b/ext/flac/gstflacdec.h index 75d4326f..17c232cd 100644 --- a/ext/flac/gstflacdec.h +++ b/ext/flac/gstflacdec.h @@ -30,9 +30,9 @@ G_BEGIN_DECLS #define GST_TYPE_FLAC_DEC gst_flac_dec_get_type() #define GST_FLAC_DEC(obj) G_TYPE_CHECK_INSTANCE_CAST(obj, GST_TYPE_FLAC_DEC, GstFlacDec) -#define GST_FLAC_DEC_CLASS(klass) G_TYPE_CHECK_CLASS_CAST(klass, GST_TYPE_FLAC_DEC, GstFlacDec) +#define GST_FLAC_DEC_CLASS(klass) G_TYPE_CHECK_CLASS_CAST(klass, GST_TYPE_FLAC_DEC, GstFlacDecClass) #define GST_IS_FLAC_DEC(obj) G_TYPE_CHECK_INSTANCE_TYPE(obj, GST_TYPE_FLAC_DEC) -#define GST_IS_FLAC_DEC_CLASS(obj) G_TYPE_CHECK_CLASS_TYPE(klass, GST_TYPE_FLAC_DEC) +#define GST_IS_FLAC_DEC_CLASS(klass) G_TYPE_CHECK_CLASS_TYPE(klass, GST_TYPE_FLAC_DEC) typedef struct _GstFlacDec GstFlacDec; typedef struct _GstFlacDecClass GstFlacDecClass; |