From 6632cdb003e1d2a4e8411ff4e597c89369bea64f Mon Sep 17 00:00:00 2001 From: Sebastian Dröge Date: Fri, 30 Mar 2007 15:59:27 +0000 Subject: 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. --- gst/auparse/gstauparse.c | 39 +++++++++++++++++++++++++++++++++++++-- gst/auparse/gstauparse.h | 4 ++++ 2 files changed, 41 insertions(+), 2 deletions(-) (limited to 'gst/auparse') 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 { -- cgit