From 55fe83f0220ce661a6b44e48dc05615981b30262 Mon Sep 17 00:00:00 2001 From: Stefan Kost Date: Thu, 8 Nov 2007 15:00:40 +0000 Subject: gst/wavparse/gstwavparse.c: Return FALSE if we can't handle a query instead of changing the format. Ignore fact when ... Original commit message from CVS: * gst/wavparse/gstwavparse.c: Return FALSE if we can't handle a query instead of changing the format. Ignore fact when dealing with mpeg audio. --- gst/wavparse/gstwavparse.c | 69 +++++++++++++++++++++++----------------------- 1 file changed, 35 insertions(+), 34 deletions(-) (limited to 'gst/wavparse') diff --git a/gst/wavparse/gstwavparse.c b/gst/wavparse/gstwavparse.c index 43f11609..2e0d1fc0 100644 --- a/gst/wavparse/gstwavparse.c +++ b/gst/wavparse/gstwavparse.c @@ -1031,7 +1031,7 @@ gst_wavparse_peek_chunk (GstWavParse * wav, guint32 * tag, guint32 * size) /* * gst_wavparse_calculate_duration: - * @wav Wavparse object + * @wav: wavparse object * * Calculate duration on demand and store in @wav. Prefer bps, but use fact as a * fallback. @@ -1259,31 +1259,34 @@ gst_wavparse_stream_headers (GstWavParse * wav) GST_DEBUG_OBJECT (wav, "datasize = %d", size); break; } - case GST_RIFF_TAG_fact:{ - /* number of samples (for compressed formats) */ - if (wav->streaming) { - const guint8 *data = NULL; - - if (gst_adapter_available (wav->adapter) < 8 + 4) { - return GST_FLOW_OK; + case GST_RIFF_TAG_fact: + if (wav->format != GST_RIFF_WAVE_FORMAT_MPEGL12 && + wav->format != GST_RIFF_WAVE_FORMAT_MPEGL3) { + /* number of samples (for compressed formats) */ + if (wav->streaming) { + const guint8 *data = NULL; + + if (gst_adapter_available (wav->adapter) < 8 + 4) { + return GST_FLOW_OK; + } + gst_adapter_flush (wav->adapter, 8); + data = gst_adapter_peek (wav->adapter, 4); + wav->fact = GST_READ_UINT32_LE (data); + gst_adapter_flush (wav->adapter, 4); + } else { + gst_buffer_unref (buf); + if ((res = + gst_pad_pull_range (wav->sinkpad, wav->offset + 8, 4, + &buf)) != GST_FLOW_OK) + goto header_read_error; + wav->fact = GST_READ_UINT32_LE (GST_BUFFER_DATA (buf)); + gst_buffer_unref (buf); } - gst_adapter_flush (wav->adapter, 8); - data = gst_adapter_peek (wav->adapter, 4); - wav->fact = GST_READ_UINT32_LE (data); - gst_adapter_flush (wav->adapter, 4); - } else { - gst_buffer_unref (buf); - if ((res = - gst_pad_pull_range (wav->sinkpad, wav->offset + 8, 4, - &buf)) != GST_FLOW_OK) - goto header_read_error; - wav->fact = GST_READ_UINT32_LE (GST_BUFFER_DATA (buf)); - gst_buffer_unref (buf); + GST_DEBUG_OBJECT (wav, "have fact %u", wav->fact); + wav->offset += 8 + 4; + break; } - GST_DEBUG_OBJECT (wav, "have fact %u", wav->fact); - wav->offset += 8 + 4; - break; - } + /* fall-through */ default: if (wav->streaming) { if (!gst_wavparse_peek_chunk (wav, &tag, &size)) @@ -1875,14 +1878,15 @@ gst_wavparse_pad_convert (GstPad * pad, "src=%" G_GINT64_FORMAT ", offset=%" G_GINT64_FORMAT, src_value, wavparse->offset); if (wavparse->bps > 0) - *dest_value = gst_util_uint64_scale (src_value, GST_SECOND, + *dest_value = uint64_ceiling_scale (src_value, GST_SECOND, (guint64) wavparse->bps); - else { - guint64 bps = gst_util_uint64_scale_int (wavparse->datasize, + else if (wavparse->fact) { + guint64 bps = uint64_ceiling_scale_int (wavparse->datasize, wavparse->rate, wavparse->fact); - *dest_value = - gst_util_uint64_scale_int (src_value, GST_SECOND, bps); + *dest_value = uint64_ceiling_scale_int (src_value, GST_SECOND, bps); + } else { + res = FALSE; } break; default: @@ -2003,18 +2007,15 @@ gst_wavparse_pad_query (GstPad * pad, GstQuery * query) } case GST_QUERY_DURATION: { - gint64 duration; + gint64 duration = 0; GstFormat format; gst_query_parse_duration (query, &format, NULL); switch (format) { case GST_FORMAT_TIME:{ - if (gst_wavparse_calculate_duration (wav)) { + if ((res = gst_wavparse_calculate_duration (wav))) { duration = wav->duration; - } else { - format = GST_FORMAT_BYTES; - duration = wav->datasize; } break; } -- cgit