summaryrefslogtreecommitdiffstats
path: root/gst/auparse
diff options
context:
space:
mode:
authorSebastian Dröge <slomo@circular-chaos.org>2007-03-30 15:59:27 +0000
committerSebastian Dröge <slomo@circular-chaos.org>2007-03-30 15:59:27 +0000
commit6632cdb003e1d2a4e8411ff4e597c89369bea64f (patch)
treeb7dcabda74c03b10fa5221768d79eaed00f8ae4b /gst/auparse
parent6d8e6c9bb0ffd82a91daf4f7f851cfa5bdfacdaf (diff)
Revert last change as we don't want plugins-good to depend on plugins-base CVS now.
Original commit message from CVS: * configure.ac: * gst/auparse/gstauparse.c: (gst_au_parse_reset), (gst_au_parse_parse_header), (gst_au_parse_chain): * gst/auparse/gstauparse.h: Revert last change as we don't want plugins-good to depend on plugins-base CVS now.
Diffstat (limited to 'gst/auparse')
-rw-r--r--gst/auparse/gstauparse.c39
-rw-r--r--gst/auparse/gstauparse.h4
2 files changed, 41 insertions, 2 deletions
diff --git a/gst/auparse/gstauparse.c b/gst/auparse/gstauparse.c
index 64bdd7a2..4664984c 100644
--- a/gst/auparse/gstauparse.c
+++ b/gst/auparse/gstauparse.c
@@ -158,6 +158,7 @@ gst_au_parse_reset (GstAuParse * auparse)
auparse->encoding = 0;
auparse->samplerate = 0;
auparse->channels = 0;
+ auparse->float_swap = 0;
gst_adapter_clear (auparse->adapter);
@@ -282,6 +283,8 @@ gst_au_parse_parse_header (GstAuParse * auparse)
* http://www.tsp.ece.mcgill.ca/MMSP/Documents/AudioFormats/AU/Samples.html
*/
+ auparse->float_swap = 0;
+
switch (auparse->encoding) {
case 1: /* 8-bit ISDN mu-law G.711 */
law = 1;
@@ -360,9 +363,13 @@ gst_au_parse_parse_header (GstAuParse * auparse)
tempcaps = gst_caps_new_simple ("audio/x-raw-float",
"rate", G_TYPE_INT, auparse->samplerate,
"channels", G_TYPE_INT, auparse->channels,
- "endianness", G_TYPE_INT, auparse->endianness,
+ "endianness", G_TYPE_INT, G_BYTE_ORDER,
"width", G_TYPE_INT, depth, NULL);
auparse->sample_size = auparse->channels * depth / 8;
+ if (auparse->endianness != G_BYTE_ORDER) {
+ GST_DEBUG_OBJECT (auparse, "need to swap float byte order ourselves!");
+ auparse->float_swap = depth;
+ }
} else if (layout[0]) {
tempcaps = gst_caps_new_simple ("audio/x-adpcm",
"layout", G_TYPE_STRING, layout, NULL);
@@ -467,7 +474,35 @@ gst_au_parse_chain (GstPad * pad, GstBuffer * buf)
}
data = gst_adapter_peek (auparse->adapter, sendnow);
- memcpy (GST_BUFFER_DATA (outbuf), data, sendnow);
+
+ /* audioconvert only handles floats in native endianness ... */
+ switch (auparse->float_swap) {
+ case 32:{
+ guint32 *indata = (guint32 *) data;
+ guint32 *outdata = (guint32 *) GST_BUFFER_DATA (outbuf);
+ gint i;
+
+ for (i = 0; i < (sendnow / sizeof (guint32)); ++i) {
+ outdata[i] = GUINT32_SWAP_LE_BE (indata[i]);
+ }
+ break;
+ }
+ case 64:{
+ guint64 *indata = (guint64 *) data;
+ guint64 *outdata = (guint64 *) GST_BUFFER_DATA (outbuf);
+ gint i;
+
+ for (i = 0; i < (sendnow / sizeof (guint64)); ++i) {
+ outdata[i] = GUINT64_SWAP_LE_BE (indata[i]);
+ }
+ break;
+ }
+ default:{
+ memcpy (GST_BUFFER_DATA (outbuf), data, sendnow);
+ break;
+ }
+ }
+
gst_adapter_flush (auparse->adapter, sendnow);
auparse->buffer_offset += sendnow;
diff --git a/gst/auparse/gstauparse.h b/gst/auparse/gstauparse.h
index 55d13e21..a74d6818 100644
--- a/gst/auparse/gstauparse.h
+++ b/gst/auparse/gstauparse.h
@@ -62,6 +62,10 @@ struct _GstAuParse {
guint samplerate;
guint endianness;
guint channels;
+
+ /* audioconvert only handles float in native endianness,
+ * so we need to swap endianness here ourselves for now */
+ guint float_swap; /* 0, 32 or 64 */
};
struct _GstAuParseClass {