diff options
author | Sebastian Dröge <slomo@circular-chaos.org> | 2007-03-29 12:14:22 +0000 |
---|---|---|
committer | Sebastian Dröge <slomo@circular-chaos.org> | 2007-03-29 12:14:22 +0000 |
commit | d26cbc8c663b56976224a433c18817be5a57fe45 (patch) | |
tree | 5732494a06a38567e2b16aa1edd742c3e905a365 /gst | |
parent | 112216c22f971c56ad8c3e952b146868180cd157 (diff) |
gst/wavenc/gstwavenc.c: Correctly handle width!=depth input.
Original commit message from CVS:
* gst/wavenc/gstwavenc.c: (gst_wavenc_create_header_buf),
(gst_wavenc_sink_setcaps):
Correctly handle width!=depth input.
* gst/wavparse/gstwavparse.c:
Already export in the caps that width==8 uses unsigned samples and
everything else uses signed samples.
Diffstat (limited to 'gst')
-rw-r--r-- | gst/wavenc/gstwavenc.c | 18 | ||||
-rw-r--r-- | gst/wavparse/gstwavparse.c | 11 |
2 files changed, 17 insertions, 12 deletions
diff --git a/gst/wavenc/gstwavenc.c b/gst/wavenc/gstwavenc.c index 0ecf2af7..d72664ab 100644 --- a/gst/wavenc/gstwavenc.c +++ b/gst/wavenc/gstwavenc.c @@ -78,14 +78,15 @@ GST_ELEMENT_DETAILS ("WAV audio muxer", "rate = (int) [ 1, MAX ], " \ "channels = (int) [ 1, 2 ], " \ "endianness = (int) LITTLE_ENDIAN, " \ - "width = (int) 16, " \ - "depth = (int) 16, " \ + "width = (int) { 16, 24, 32 }, " \ + "depth = (int) [ 1, 32 ], " \ "signed = (boolean) true" \ "; " \ "audio/x-raw-int, " \ "rate = (int) [ 1, MAX ], " \ "channels = (int) [ 1, 2 ], " \ "width = (int) 8, " \ + "depth = (int) [ 1, 8 ], " \ "signed = (boolean) false" static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", @@ -154,7 +155,6 @@ gst_wavenc_init (GstWavEnc * wavenc, GstWavEncClass * klass) #define WAV_HEADER_LEN 44 -/* FIXME: we are probably not handling depth != width correctly here */ static GstBuffer * gst_wavenc_create_header_buf (GstWavEnc * wavenc, guint audio_data_size) { @@ -179,11 +179,9 @@ gst_wavenc_create_header_buf (GstWavEnc * wavenc, guint audio_data_size) wave.format.len = 16; wave.common.wFormatTag = WAVE_FORMAT_PCM; - wave.common.dwAvgBytesPerSec = - wave.common.wChannels * wave.common.dwSamplesPerSec * - (wave.common.wBitsPerSample >> 3); - wave.common.wBlockAlign = - wave.common.wChannels * (wave.common.wBitsPerSample >> 3); + wave.common.wBlockAlign = (wavenc->width / 8) * wave.common.wChannels; + wave.common.dwAvgBytesPerSec = wave.common.wBlockAlign * + wave.common.dwSamplesPerSec; memcpy (wave.data.id, "data", 4); wave.data.len = audio_data_size; @@ -253,14 +251,14 @@ gst_wavenc_sink_setcaps (GstPad * pad, GstCaps * caps) if (!gst_structure_get_int (structure, "channels", &chans) || !gst_structure_get_int (structure, "rate", &rate) || !gst_structure_get_int (structure, "width", &width) || - (width != 8 && !gst_structure_get_int (structure, "depth", &depth))) { + !gst_structure_get_int (structure, "depth", &depth)) { GST_WARNING_OBJECT (wavenc, "caps incomplete"); goto fail; } wavenc->channels = chans; wavenc->width = width; - wavenc->depth = (width == 8) ? 8 : depth; + wavenc->depth = depth; wavenc->rate = rate; GST_LOG_OBJECT (wavenc, "accepted caps: chans=%u width=%u depth=%u rate=%u", diff --git a/gst/wavparse/gstwavparse.c b/gst/wavparse/gstwavparse.c index d3619ae4..c0defcdc 100644 --- a/gst/wavparse/gstwavparse.c +++ b/gst/wavparse/gstwavparse.c @@ -110,11 +110,18 @@ static GstStaticPadTemplate src_template_factory = GST_PAD_SOMETIMES, GST_STATIC_CAPS ("audio/x-raw-int, " "endianness = (int) little_endian, " - "signed = (boolean) { true, false }, " - "width = (int) { 8, 16, 24, 32 }, " + "signed = (boolean) true, " + "width = (int) { 16, 24, 32 }, " "depth = (int) [ 1, 32 ], " "rate = (int) [ 8000, 96000 ], " "channels = (int) [ 1, 8 ]; " + "audio/x-raw-int, " + "endianness = (int) little_endian, " + "signed = (boolean) false, " + "width = (int) 8, " + "depth = (int) [ 1, 8 ], " + "rate = (int) [ 8000, 96000 ], " + "channels = (int) [ 1, 8 ]; " "audio/ms-gsm; " "audio/mpeg, " "mpegversion = (int) 1, " |