diff --git a/gst/audioparsers/gstdcaparse.c b/gst/audioparsers/gstdcaparse.c
index 2bf0e38..aabfc8f 100644
--- a/gst/audioparsers/gstdcaparse.c
+++ b/gst/audioparsers/gstdcaparse.c
@@ -410,8 +410,58 @@ gst_dca_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
   if (!gst_dca_parse_parse_header (dcaparse, &r, &size, &rate, &chans, &depth,
           &endianness, &num_blocks, &samples_per_block, &terminator))
     goto broken_header;
+  
+  unsigned char *data = GST_BUFFER_DATA(buf);
+  if (endianness == G_LITTLE_ENDIAN)
+  {
+  GST_INFO_OBJECT (parse, "stream is in G_LITTLE_ENDIAN -> byteswapping into big endian");
+  unsigned int pos = 0;
+  unsigned char tmp;
+  while (pos < size-2)
+  {
+    tmp = data[pos];
+    data[pos] = data[pos+1];
+    data[pos+1] = tmp;
+    pos += 2;
+  }
+  gst_buffer_set_data(buf, data, size);
+  }
 
+  if (depth==14)
+  {
+    GST_INFO_OBJECT (parse, "depth is 14-bits -> upconverting it into a 16-bit stream!", GST_BUFFER_SIZE(buf),data[0],data[1],data[2],data[3]);  
+   
+    unsigned char *new_data = malloc(size);
+    new_data[0] = 0x7F; new_data[1] = 0xFE; new_data[2] = 0x80; new_data[3] = 0x01;
+
+    unsigned int pos14 = 4;
+    unsigned int pos16 = 4;
+    for (pos14 = 4; pos14 < 15; pos14++)
+    {
+      new_data[pos14] = data[pos14];
+      pos16++;
+    }
+    
+    while (pos16 < size-8) // 14-bit to 16-bit upconversion
+    {
+	  new_data[pos16++] =   data[pos14++]&0xFF;
+	  new_data[pos16++] =   data[pos14]  &0x3F;
+	  new_data[pos16++] = ((data[pos14++]&0xC0)>>6) | ((data[pos14]&0x0F)<<2);
+	  new_data[pos16++] = ((data[pos14++]&0xC0)>>6) | ((data[pos14]&0x0F)<<2);
+	  new_data[pos16++] = ((data[pos14++]&0xF0)>>4) | ((data[pos14]&0x0F)<<4);
+	  new_data[pos16++] = ((data[pos14++]&0xF0)>>4) | ((data[pos14]&0x03)<<4);
+	  new_data[pos16++] = ((data[pos14++]&0xFC)>>2) | ((data[pos14]&0x03)<<6);
+	  new_data[pos16++] =  (data[pos14++]&0xFC)>>2;
+    }
+    gst_buffer_set_data(buf, new_data, size);
+    data = GST_BUFFER_DATA(buf);
+  }
+  gst_byte_reader_init_from_buffer (&r, buf);
+  gst_dca_parse_parse_header (dcaparse, &r, &size, &rate, &chans, &depth,
+          &endianness, &num_blocks, &samples_per_block, &terminator);
+  
   block_size = num_blocks * samples_per_block;
+//   GST_INFO_OBJECT (parse, "payload depth=%i, source wants depth=%i", depth, dcaparse->depth);
 
   if (G_UNLIKELY (dcaparse->rate != rate || dcaparse->channels != chans
           || dcaparse->depth != depth || dcaparse->endianness != endianness
