From 1514ba29e93adc06ae67ffc4b7a95406a2633a82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Thu, 16 Feb 2006 20:30:13 +0000 Subject: [PATCH] gst/wavparse/gstwavparse.c: Pass extra_data to gst_riff_create_audio_caps(), so that Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_stream_headers): Pass extra_data to gst_riff_create_audio_caps(), so that WAVEFORMATEX stuff works. Post audio codec name and post it as taglist on the bus. Allow up to 8 channesl for raw PCM in the source pad template caps. --- ChangeLog | 8 +++++++ gst/wavparse/gstwavparse.c | 47 ++++++++++++++++++++++---------------- 2 files changed, 35 insertions(+), 20 deletions(-) diff --git a/ChangeLog b/ChangeLog index c5b336a0f3..af3a2bb2d2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2006-02-16 Tim-Philipp Müller + + * gst/wavparse/gstwavparse.c: (gst_wavparse_stream_headers): + Pass extra_data to gst_riff_create_audio_caps(), so that + WAVEFORMATEX stuff works. Post audio codec name and post + it as taglist on the bus. Allow up to 8 channesl for raw + PCM in the source pad template caps. + 2006-02-16 Wim Taymans * gst/multipart/multipartdemux.c: (gst_multipart_demux_base_init), diff --git a/gst/wavparse/gstwavparse.c b/gst/wavparse/gstwavparse.c index d3b1b7f82c..5493a1a031 100644 --- a/gst/wavparse/gstwavparse.c +++ b/gst/wavparse/gstwavparse.c @@ -67,14 +67,14 @@ GST_STATIC_PAD_TEMPLATE ("wavparse_sink", static GstStaticPadTemplate src_template_factory = GST_STATIC_PAD_TEMPLATE ("wavparse_src", GST_PAD_SRC, - GST_PAD_SOMETIMES, /* FIXME: spider */ + GST_PAD_SOMETIMES, GST_STATIC_CAPS ("audio/x-raw-int, " "endianness = (int) little_endian, " "signed = (boolean) { true, false }, " "width = (int) { 8, 16, 24, 32 }, " "depth = (int) { 8, 16, 24, 32 }, " "rate = (int) [ 8000, 96000 ], " - "channels = (int) [ 1, 2 ]; " + "channels = (int) [ 1, 8 ]; " "audio/mpeg, " "mpegversion = (int) 1, " "layer = (int) [ 1, 3 ], " @@ -98,22 +98,9 @@ static GstStaticPadTemplate src_template_factory = "audio/x-wma, " "wmaversion = (int) [ 1, 2 ]") ); -/* WavParse signals and args */ -enum -{ - /* FILL ME */ - LAST_SIGNAL -}; - -enum -{ - PROP_0 -}; static GstElementClass *parent_class = NULL; -/*static guint gst_wavparse_signals[LAST_SIGNAL] = { 0 }; */ - GType gst_wavparse_get_type (void) { @@ -852,6 +839,7 @@ gst_wavparse_stream_headers (GstWavParse * wav) gboolean gotdata = FALSE; GstCaps *caps; gint64 duration; + gchar *codec_name = NULL; /* The header start with a 'fmt ' tag */ if ((res = gst_riff_read_chunk (GST_ELEMENT (wav), wav->sinkpad, @@ -864,14 +852,14 @@ gst_wavparse_stream_headers (GstWavParse * wav) if (!(gst_riff_parse_strf_auds (GST_ELEMENT (wav), buf, &header, &extra))) goto parse_header_error; - if (extra) - gst_buffer_unref (extra); - /* Note: gst_riff_create_audio_caps might nedd to fix values in * the header header depending on the format, so call it first */ caps = - gst_riff_create_audio_caps (header->format, NULL, header, NULL, - NULL, NULL); + gst_riff_create_audio_caps (header->format, NULL, header, extra, + NULL, &codec_name); + + if (extra) + gst_buffer_unref (extra); wav->format = header->format; wav->rate = header->rate; @@ -906,6 +894,18 @@ gst_wavparse_stream_headers (GstWavParse * wav) gst_element_add_pad (GST_ELEMENT (wav), wav->srcpad); gst_element_no_more_pads (GST_ELEMENT (wav)); + if (codec_name) { + GstTagList *tags = gst_tag_list_new (); + + gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, + GST_TAG_AUDIO_CODEC, codec_name, NULL); + + gst_element_found_tags_for_pad (GST_ELEMENT (wav), wav->srcpad, tags); + + g_free (codec_name); + codec_name = NULL; + } + GST_DEBUG ("frequency %d, channels %d", wav->rate, wav->channels); /* loop headers until we get data */ @@ -961,6 +961,7 @@ invalid_wav: GST_ELEMENT_ERROR (wav, STREAM, DEMUX, (NULL), ("Invalid WAV header (no fmt at start): %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag))); + g_free (codec_name); return GST_FLOW_ERROR; } parse_header_error: @@ -968,6 +969,7 @@ parse_header_error: GST_ELEMENT_ERROR (wav, STREAM, DEMUX, (NULL), ("Couldn't parse audio header")); gst_buffer_unref (buf); + g_free (codec_name); return GST_FLOW_ERROR; } no_channels: @@ -975,6 +977,7 @@ no_channels: GST_ELEMENT_ERROR (wav, STREAM, FAILED, (NULL), ("Stream claims to contain no channels - invalid data")); g_free (header); + g_free (codec_name); return GST_FLOW_ERROR; } no_bitrate: @@ -982,6 +985,7 @@ no_bitrate: GST_ELEMENT_ERROR (wav, STREAM, FAILED, (NULL), ("Stream claims to have a bitrate of <= zero - invalid data")); g_free (header); + g_free (codec_name); return GST_FLOW_ERROR; } no_bytes_per_sample: @@ -989,6 +993,7 @@ no_bytes_per_sample: GST_ELEMENT_ERROR (wav, STREAM, FAILED, (NULL), ("could not caluclate bytes per sample - invalid data")); g_free (header); + g_free (codec_name); return GST_FLOW_ERROR; } unknown_format: @@ -996,11 +1001,13 @@ unknown_format: GST_ELEMENT_ERROR (wav, STREAM, TYPE_NOT_FOUND, (NULL), ("No caps found for format 0x%x, %d channels, %d Hz", wav->format, wav->channels, wav->rate)); + g_free (codec_name); return GST_FLOW_ERROR; } header_read_error: { GST_ELEMENT_ERROR (wav, STREAM, DEMUX, (NULL), ("Couldn't read in header")); + g_free (codec_name); return GST_FLOW_ERROR; } }