From: <wt...@fr...> - 2004-10-01 16:02:16
|
CVS Root: /cvs/gstreamer Module: gst-plugins Changes by: wtay Date: Fri Oct 01 2004 09:02:12 PDT Log message: * gst/wavparse/gstwavparse.c: (gst_wavparse_class_init), (gst_wavparse_stream_init), (gst_wavparse_fmt), (gst_wavparse_other), (gst_wavparse_loop), (gst_wavparse_pad_convert), (gst_wavparse_pad_query), (gst_wavparse_srcpad_event): * gst/wavparse/gstwavparse.h: Added some more debugging info. Fix the case where the length of the file is 0. Make sure we seek to sample borders. Modified files: . : ChangeLog gst/wavparse : gstwavparse.c gstwavparse.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ChangeLog.diff?r1=1.1109&r2=1.1110 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/wavparse/gstwavparse.c.diff?r1=1.74&r2=1.75 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/wavparse/gstwavparse.h.diff?r1=1.22&r2=1.23 ====Begin Diffs==== Index: gstwavparse.c =================================================================== RCS file: /cvs/gstreamer/gst-plugins/gst/wavparse/gstwavparse.c,v retrieving revision 1.74 retrieving revision 1.75 diff -u -d -r1.74 -r1.75 --- gstwavparse.c 1 Oct 2004 12:39:08 -0000 1.74 +++ gstwavparse.c 1 Oct 2004 16:01:51 -0000 1.75 @@ -28,6 +28,9 @@ #include "gst/riff/riff-ids.h" #include "gst/riff/riff-media.h" +GST_DEBUG_CATEGORY (wavparse_debug); +#define GST_CAT_DEFAULT (wavparse_debug) + static void gst_wavparse_base_init (gpointer g_class); static void gst_wavparse_class_init (GstWavParseClass * klass); static void gst_wavparse_init (GstWavParse * wavparse); @@ -161,6 +164,8 @@ object_class->get_property = gst_wavparse_get_property; gstelement_class->change_state = gst_wavparse_change_state; + GST_DEBUG_CATEGORY_INIT (wavparse_debug, "wavparse", 0, "WAV parser"); } static void @@ -509,8 +514,10 @@ GstRiffRead *riff = GST_RIFF_READ (wav); guint32 doctype; - if (!gst_riff_read_header (riff, &doctype)) + if (!gst_riff_read_header (riff, &doctype)) { + GST_WARNING_OBJECT (wav, "could not read header"); return FALSE; + } if (doctype != GST_RIFF_RIFF_WAVE) { GST_ELEMENT_ERROR (wav, STREAM, WRONG_TYPE, (NULL), (NULL)); @@ -536,6 +543,7 @@ wav->format = header->format; wav->rate = header->rate; wav->channels = header->channels; + wav->blockalign = header->blockalign; wav->width = (header->blockalign * 8) / header->channels; wav->depth = header->size; wav->bps = header->av_bps; @@ -567,49 +575,93 @@ guint32 tag, length; if (!gst_riff_peek_head (riff, &tag, &length, NULL)) { + GST_WARNING_OBJECT (wav, "could not peek head"); } + GST_DEBUG_OBJECT (wav, "got tag (%08x) %4.4s, length %d", tag, + (gchar *) & tag, length); switch (tag) { case GST_RIFF_TAG_LIST: if (!(tag = gst_riff_peek_list (riff))) { + GST_WARNING_OBJECT (wav, "could not peek list"); return FALSE; } switch (tag) { case GST_RIFF_LIST_INFO: - if (!gst_riff_read_list (riff, &tag) || !gst_riff_read_info (riff)) + if (!gst_riff_read_list (riff, &tag) || !gst_riff_read_info (riff)) { + GST_WARNING_OBJECT (wav, "could not read list"); return FALSE; + } break; case GST_RIFF_LIST_adtl: - if (!gst_riff_read_skip (riff)) + if (!gst_riff_read_skip (riff)) { + GST_WARNING_OBJECT (wav, "could not read skip"); default: + GST_DEBUG_OBJECT (wav, "skipping tag (%08x) %4.4s", tag, + (gchar *) & tag); break; case GST_RIFF_TAG_data: - if (!gst_bytestream_flush (riff->bs, 8)) + if (!gst_bytestream_flush (riff->bs, 8)) { + GST_WARNING_OBJECT (wav, "could not flush 8 bytes"); + } + GST_DEBUG_OBJECT (wav, "switching to data mode"); wav->state = GST_WAVPARSE_DATA; - wav->dataleft = wav->datasize = (guint64) length; wav->datastart = gst_bytestream_tell (riff->bs); + if (length == 0) { + guint64 file_length; + /* length is 0, data probably stretches to the end + * of file */ + GST_DEBUG_OBJECT (wav, "length is 0 trying to find length"); + /* get length of file */ + file_length = gst_bytestream_length (riff->bs); + if (file_length == -1) { + GST_DEBUG_OBJECT (wav, + "could not get file length, assuming data to eof"); + /* could not get length, assuming till eof */ + length = G_MAXUINT32; + } + if (file_length > G_MAXUINT32) { + GST_DEBUG_OBJECT (wav, "file length %lld, clipping to 32 bits"); + } else { + GST_DEBUG_OBJECT (wav, "file length %lld, datalength", file_length, + length); + /* substract offset of datastart from length */ + length = file_length - wav->datastart; + GST_DEBUG_OBJECT (wav, "datalength %lld", length); + wav->dataleft = wav->datasize = (guint64) length; case GST_RIFF_TAG_cue: - if (!gst_riff_read_skip (riff)) + if (!gst_riff_read_skip (riff)) { + GST_WARNING_OBJECT (wav, "could not read skip"); default: + GST_DEBUG_OBJECT (wav, "skipping tag (%08x) %4.4s", tag, (gchar *) & tag); if (!gst_riff_read_skip (riff)) @@ -685,8 +737,12 @@ GstBuffer *buf = NULL; desired = MIN (wav->dataleft, MAX_BUFFER_SIZE); - if (!(buf = gst_riff_read_element_data (riff, desired, &got_bytes))) + if (!(buf = gst_riff_read_element_data (riff, desired, &got_bytes))) { + GST_WARNING_OBJECT (wav, "trying to read %d bytes failed", desired); return; + GST_DEBUG_OBJECT (wav, "read %d bytes, got %d bytes", desired, got_bytes); GST_BUFFER_TIMESTAMP (buf) = GST_SECOND * (wav->datasize - wav->dataleft) / wav->bps; GST_BUFFER_DURATION (buf) = GST_SECOND * got_bytes / wav->bps; @@ -805,7 +861,9 @@ case GST_FORMAT_TIME: switch (*dest_format) { case GST_FORMAT_BYTES: - *dest_value = src_value * byterate / GST_SECOND; + /* make sure we end up on a sample boundary */ + *dest_value = + (src_value * wavparse->rate / GST_SECOND) * wavparse->blockalign; case GST_FORMAT_DEFAULT: *dest_value = src_value * wavparse->rate / GST_SECOND; @@ -862,8 +920,8 @@ return TRUE; - return gst_pad_convert (wav->sinkpad, bytevalue, - GST_FORMAT_BYTES, format, value); + return gst_pad_convert (wav->sinkpad, GST_FORMAT_BYTES, + bytevalue, format, value); static const GstEventMask * @@ -891,8 +949,7 @@ gint64 byteoffset; GstFormat format; - /* bring format to bytes for the peer element, - * FIXME be smarter here */ + /* bring format to samples for the peer element, */ format = GST_FORMAT_BYTES; res = gst_pad_convert (pad, GST_EVENT_SEEK_FORMAT (event), Index: gstwavparse.h RCS file: /cvs/gstreamer/gst-plugins/gst/wavparse/gstwavparse.h,v retrieving revision 1.22 retrieving revision 1.23 diff -u -d -r1.22 -r1.23 --- gstwavparse.h 17 May 2004 16:29:16 -0000 1.22 +++ gstwavparse.h 1 Oct 2004 16:01:51 -0000 1.23 @@ -68,6 +68,7 @@ guint16 depth; gint rate; guint16 channels; + guint16 blockalign; guint16 width; guint32 bps; Index: ChangeLog RCS file: /cvs/gstreamer/gst-plugins/ChangeLog,v retrieving revision 1.1109 retrieving revision 1.1110 diff -u -d -r1.1109 -r1.1110 --- ChangeLog 1 Oct 2004 15:57:53 -0000 1.1109 +++ ChangeLog 1 Oct 2004 16:01:51 -0000 1.1110 @@ -1,5 +1,17 @@ 2004-10-01 Wim Taymans <wi...@fl...> + * gst/wavparse/gstwavparse.c: (gst_wavparse_class_init), + (gst_wavparse_stream_init), (gst_wavparse_fmt), + (gst_wavparse_other), (gst_wavparse_loop), + (gst_wavparse_pad_convert), (gst_wavparse_pad_query), + (gst_wavparse_srcpad_event): + * gst/wavparse/gstwavparse.h: + Added some more debugging info. + Fix the case where the length of the file is 0. + Make sure we seek to sample borders. +2004-10-01 Wim Taymans <wi...@fl...> * gst/playback/README: * gst/playback/gstdecodebin.c: (gst_decode_bin_factory_filter), (gst_decode_bin_init), (find_compatibles), (close_pad_link), |