diff -Naur --exclude=.svn gst-plugins-base/gst/audioconvert/audioconvert.c gst-plugins-base-mod/gst/audioconvert/audioconvert.c
--- gst-plugins-base/gst/audioconvert/audioconvert.c	2006-10-07 17:27:04.000000000 +0200
+++ gst-plugins-base-mod/gst/audioconvert/audioconvert.c	2006-10-07 17:45:55.000000000 +0200
@@ -34,6 +34,21 @@
 /* sign bit in the intermediate format */
 #define SIGNED  (1<<31)
 
+/* the float endianness conversion from gst/floatcast/floatcast.h is
+ * overly complex, we use our own. */
+static inline gfloat
+_gfloat_swap_le_be (gfloat f)
+{
+  union {
+    guint32 i;
+    gfloat f;
+  } u;
+  
+  u.f = f;
+  u.i = GUINT32_SWAP_LE_BE (u.i);
+  return u.f;
+}
+
 /*** 
  * unpack code
  */
@@ -53,17 +68,18 @@
 }
 
 /* special unpack code for float */
-static void
-MAKE_UNPACK_FUNC_NAME (float) (gpointer src, gint32 * dst,
-    gint scale, gint count)
-{
-  gfloat *p = (gfloat *) src;
-  gdouble temp;
-
-  for (; count; count--) {
-    temp = (*p++ * 2147483647.0) + 0.5;
-    *dst++ = (gint32) CLAMP (temp, G_MININT32, G_MAXINT32);
-  }
+#define MAKE_FLOAT_UNPACK_FUNC(name, READ_FUNC)				\
+static void								\
+MAKE_UNPACK_FUNC_NAME (name) (gpointer src, gint32 * dst,		\
+    gint scale, gint count)						\
+{									\
+  gfloat *p = (gfloat *) src;						\
+  gdouble temp;								\
+									\
+  for (; count; count--, p++) {						\
+    temp = (READ_FUNC (*p) * 2147483647.0) + 0.5;			\
+    *dst++ = (gint32) CLAMP (temp, G_MININT32, G_MAXINT32);		\
+  }									\
 }
 
 #define READ8(p)          GST_READ_UINT8(p)
@@ -73,6 +89,15 @@
 #define READ24_FROM_BE(p) (p[2] | (p[1] << 8) | (p[0] << 16))
 #define READ32_FROM_LE(p) GST_READ_UINT32_LE (p)
 #define READ32_FROM_BE(p) GST_READ_UINT32_BE (p)
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+#define READ_FLOAT_FROM_LE(f) (f)
+#define READ_FLOAT_FROM_BE(f) (_gfloat_swap_le_be (f))
+#elif G_BYTE_ORDER == G_BIG_ENDIAN
+#define READ_FLOAT_FROM_LE(f) (_gfloat_swap_le_be (f))
+#define READ_FLOAT_FROM_BE(f) (f)
+#else /* !G_LITTLE_ENDIAN && !G_BIG_ENDIAN */
+#error unknown ENDIAN type
+#endif /* !G_LITTLE_ENDIAN && !G_BIG_ENDIAN */
 
 MAKE_UNPACK_FUNC (u8, 1, SIGNED, READ8);
 MAKE_UNPACK_FUNC (s8, 1, 0, READ8);
@@ -89,6 +114,9 @@
 MAKE_UNPACK_FUNC (u32_be, 4, SIGNED, READ32_FROM_BE);
 MAKE_UNPACK_FUNC (s32_be, 4, 0, READ32_FROM_BE);
 
+MAKE_FLOAT_UNPACK_FUNC (float_le, READ_FLOAT_FROM_LE);
+MAKE_FLOAT_UNPACK_FUNC (float_be, READ_FLOAT_FROM_BE);
+
 /*** 
  * packing code
  */
@@ -160,7 +188,8 @@
   MAKE_UNPACK_FUNC_NAME (s32_le),
   MAKE_UNPACK_FUNC_NAME (u32_be),
   MAKE_UNPACK_FUNC_NAME (s32_be),
-  MAKE_UNPACK_FUNC_NAME (float),
+  MAKE_UNPACK_FUNC_NAME (float_le),
+  MAKE_UNPACK_FUNC_NAME (float_be),
 };
 
 static AudioConvertPack pack_funcs[] = {
@@ -180,7 +209,16 @@
   MAKE_PACK_FUNC_NAME (s32_le),
   MAKE_PACK_FUNC_NAME (u32_be),
   MAKE_PACK_FUNC_NAME (s32_be),
+/* Only support packing floats in host byte order; we cannot support
+ * float<->float conversions without introducing float as additional
+ * intermediary format. */
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+  MAKE_PACK_FUNC_NAME (float),
+  NULL,
+#else /* !G_LITTLE_ENDIAN */
+  NULL,
   MAKE_PACK_FUNC_NAME (float),
+#endif /* !G_LITTLE_ENDIAN */
 };
 
 static gint
@@ -193,7 +231,7 @@
     index += fmt->endianness == G_LITTLE_ENDIAN ? 0 : 2;
     index += fmt->sign ? 1 : 0;
   } else {
-    index = 16;
+    index = fmt->endianness == G_LITTLE_ENDIAN ? 16 : 17;
   }
   return index;
 }
diff -Naur --exclude=.svn gst-plugins-base/gst/audioconvert/gstaudioconvert.c gst-plugins-base-mod/gst/audioconvert/gstaudioconvert.c
--- gst-plugins-base/gst/audioconvert/gstaudioconvert.c	2006-10-07 17:27:04.000000000 +0200
+++ gst-plugins-base-mod/gst/audioconvert/gstaudioconvert.c	2006-10-07 18:30:02.000000000 +0200
@@ -118,13 +118,7 @@
 
 /*** GSTREAMER PROTOTYPES *****************************************************/
 
-#define STATIC_CAPS \
-GST_STATIC_CAPS ( \
-  "audio/x-raw-float, " \
-    "rate = (int) [ 1, MAX ], " \
-    "channels = (int) [ 1, 8 ], " \
-    "endianness = (int) BYTE_ORDER, " \
-    "width = (int) 32;" \
+#define COMMON_CAPS \
   "audio/x-raw-int, " \
     "rate = (int) [ 1, MAX ], " \
     "channels = (int) [ 1, 8 ], " \
@@ -151,8 +145,25 @@
     "endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " \
     "width = (int) 8, " \
     "depth = (int) [ 1, 8 ], " \
-    "signed = (boolean) { true, false } " \
-)
+    "signed = (boolean) { true, false } "
+
+#define STATIC_CAPS_SRC \
+GST_STATIC_CAPS ( \
+  "audio/x-raw-float, " \
+    "rate = (int) [ 1, MAX ], " \
+    "channels = (int) [ 1, 8 ], " \
+    "endianness = (int) BYTE_ORDER, " \
+    "width = (int) 32;" \
+  COMMON_CAPS)
+
+#define STATIC_CAPS_SINK \
+GST_STATIC_CAPS ( \
+  "audio/x-raw-float, " \
+    "rate = (int) [ 1, MAX ], " \
+    "channels = (int) [ 1, 8 ], " \
+    "endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " \
+    "width = (int) 32;" \
+  COMMON_CAPS)
 
 static GstAudioChannelPosition *supported_positions;
 
@@ -160,13 +171,13 @@
 GST_STATIC_PAD_TEMPLATE ("src",
     GST_PAD_SRC,
     GST_PAD_ALWAYS,
-    STATIC_CAPS);
+    STATIC_CAPS_SRC);
 
 static GstStaticPadTemplate gst_audio_convert_sink_template =
 GST_STATIC_PAD_TEMPLATE ("sink",
     GST_PAD_SINK,
     GST_PAD_ALWAYS,
-    STATIC_CAPS);
+    STATIC_CAPS_SINK);
 
 /*** TYPE FUNCTIONS ***********************************************************/
 
@@ -255,6 +266,11 @@
     goto no_values;
   if (!gst_structure_get_int (structure, "rate", &fmt->rate))
     goto no_values;
+  /* width != 8 needs an endianness field */
+  if (fmt->width != 8) {
+    if (!gst_structure_get_int (structure, "endianness", &fmt->endianness))
+      goto no_values;
+  }
 
   if (fmt->is_int) {
     /* int specific fields */
@@ -263,11 +279,6 @@
     if (!gst_structure_get_int (structure, "depth", &fmt->depth))
       goto no_values;
 
-    /* width != 8 can have an endianness field */
-    if (fmt->width != 8) {
-      if (!gst_structure_get_int (structure, "endianness", &fmt->endianness))
-        goto no_values;
-    }
     /* depth cannot be bigger than the width */
     if (fmt->depth > fmt->width)
       goto not_allowed;
@@ -323,31 +334,30 @@
 static GstStructure *
 make_lossless_changes (GstStructure * s, gboolean isfloat)
 {
+  GValue list = { 0 };
+  GValue val = { 0 };
+  int i;
+  const gint endian[] = { G_LITTLE_ENDIAN, G_BIG_ENDIAN };
+  const gboolean booleans[] = { TRUE, FALSE };
+  
+  g_value_init (&list, GST_TYPE_LIST);
+  g_value_init (&val, G_TYPE_INT);
+  for (i = 0; i < 2; i++) {
+    g_value_set_int (&val, endian[i]);
+    gst_value_list_append_value (&list, &val);
+  }
+  gst_structure_set_value (s, "endianness", &list);
+  g_value_unset (&val);
+  g_value_unset (&list);
+
   if (isfloat) {
-    /* float doesn't have a depth or signedness field and only supports a
-     * width of 32 and native endianness */
+    /* float doesn't have a depth or signedness field and we only support a
+     * width of 32 */
     gst_structure_remove_field (s, "depth");
     gst_structure_remove_field (s, "signed");
     gst_structure_set (s, "width", G_TYPE_INT, 32, NULL);
-    gst_structure_set (s, "endianness", G_TYPE_INT, G_BYTE_ORDER, NULL);
   } else {
-    /* int supports either endian, and signed or unsigned. GValues are a pain */
-    GValue list = { 0 };
-    GValue val = { 0 };
-    int i;
-    const gint endian[] = { G_LITTLE_ENDIAN, G_BIG_ENDIAN };
-    const gboolean booleans[] = { TRUE, FALSE };
-
-    g_value_init (&list, GST_TYPE_LIST);
-    g_value_init (&val, G_TYPE_INT);
-    for (i = 0; i < 2; i++) {
-      g_value_set_int (&val, endian[i]);
-      gst_value_list_append_value (&list, &val);
-    }
-    gst_structure_set_value (s, "endianness", &list);
-    g_value_unset (&val);
-    g_value_unset (&list);
-
+    /* int supports signed and unsigned. GValues are a pain */
     g_value_init (&list, GST_TYPE_LIST);
     g_value_init (&val, G_TYPE_BOOLEAN);
     for (i = 0; i < 2; i++) {
diff -Naur --exclude=.svn gst-plugins-base/tests/check/elements/audioconvert.c gst-plugins-base-mod/tests/check/elements/audioconvert.c
--- gst-plugins-base/tests/check/elements/audioconvert.c	2006-10-07 17:27:03.000000000 +0200
+++ gst-plugins-base-mod/tests/check/elements/audioconvert.c	2006-10-07 17:27:22.000000000 +0200
@@ -36,7 +36,7 @@
   "audio/x-raw-float, " \
     "rate = (int) [ 1, MAX ], " \
     "channels = (int) [ 1, 8 ], " \
-    "endianness = (int) BYTE_ORDER, " \
+    "endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " \
     "width = (int) 32;" \
   "audio/x-raw-int, " \
     "rate = (int) [ 1, MAX ], " \
@@ -455,6 +455,7 @@
   {
     gfloat in[] = { 0.0, 1.0, -1.0, 0.5, -0.5, 1.1, -1.1 };
     gint16 out[] = { 0, 32767, -32768, 16384, -16384, 32767, -32768 };
+    gint i;
 
     /* only one direction conversion, the other direction does
      * not produce exactly the same as the input due to floating
@@ -462,6 +463,30 @@
     RUN_CONVERSION ("32 float to 16 signed", in, get_float_caps (1,
             "BYTE_ORDER", 32), out, get_int_caps (1, "BYTE_ORDER", 16, 16, TRUE)
         );
+
+    /* Turn the input data into foreign byte order format: */
+    for (i = 0; i < G_N_ELEMENTS (in); i++) {
+      union {
+	guint32 i;
+	gfloat f;
+      } u;
+      u.f = in[i];
+      u.i = GUINT32_SWAP_LE_BE (u.i);
+      in[i] = u.f;
+    }
+
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+#define FOREIGN_BYTE_ORDER "BIG_ENDIAN"
+#elif G_BYTE_ORDER == G_BIG_ENDIAN
+#define FOREIGN_BYTE_ORDER "LITTLE_ENDIAN"
+#else
+#error unknown ENDIAN type
+#endif
+
+    RUN_CONVERSION ("32 float foreign byte order to 16 signed", in,
+	get_float_caps (1, FOREIGN_BYTE_ORDER, 32), out, get_int_caps (1,
+	    "BYTE_ORDER", 16, 16, TRUE)
+        );
   }
 }
 
