Index: libavcodec/dca.c
===================================================================
--- libavcodec/dca.c	(Revision 23802)
+++ libavcodec/dca.c	(Arbeitskopie)
@@ -1261,7 +1261,11 @@
     int num_core_channels = 0;
     int i;
     int xch_present = 0;
-    int16_t *samples = data;
+    #ifdef CONFIG_AUDIO_FULL
+      float *samples = data;
+    #else
+      int16_t *samples = data;
+    #endif
     DCAContext *s = avctx->priv_data;
     int channels;
 
@@ -1376,16 +1380,33 @@
     if (!avctx->channels)
         avctx->channels = channels;
 
-    if (*data_size < (s->sample_blocks / 8) * 256 * sizeof(int16_t) * channels)
+    if (*data_size < (s->sample_blocks / 8) * 256 * sizeof(samples[0]) * channels)
         return -1;
-    *data_size = 256 / 8 * s->sample_blocks * sizeof(int16_t) * channels;
 
-    /* filter to get final output */
-    for (i = 0; i < (s->sample_blocks / 8); i++) {
-        dca_filter_channels(s, i);
-        s->dsp.float_to_int16_interleave(samples, s->samples_chanptr, 256, channels);
-        samples += 256 * channels;
-    }
+    #ifdef CONFIG_AUDIO_FULL
+      *data_size = 0;
+      for (i = 0; i < (s->sample_blocks / 8); i++) {
+          int j;
+          dca_filter_channels(s, i);
+          /* interleave samples */
+          for (j = 0; j < 256; j++) {
+              int k;
+              for (k = 0; k < channels; k++)
+                  samples[k] = s->samples[j + k * 256] / 32768.0f;
+              samples += channels;
+          }
+          *data_size += 256 * sizeof(samples[0]) * channels;
+      }
+    #else
+      *data_size = 256 / 8 * s->sample_blocks * sizeof(samples[0]) * channels;
+ 
+      /* filter to get final output */
+      for (i = 0; i < (s->sample_blocks / 8); i++) {
+          dca_filter_channels(s, i);
+          s->dsp.float_to_int16_interleave(samples, s->samples_chanptr, 256, channels);
+          samples += 256 * channels;
+      }
+    #endif
 
     /* update lfe history */
     lfe_samples = 2 * s->lfe * (s->sample_blocks / 8);
@@ -1419,7 +1440,11 @@
 
     for (i = 0; i < DCA_PRIM_CHANNELS_MAX+1; i++)
         s->samples_chanptr[i] = s->samples + i * 256;
-    avctx->sample_fmt = SAMPLE_FMT_S16;
+    #ifdef CONFIG_AUDIO_FULL
+      avctx->sample_fmt = SAMPLE_FMT_FLT;
+    #else
+      avctx->sample_fmt = SAMPLE_FMT_S16;
+    #endif
 
     if (s->dsp.float_to_int16_interleave == ff_float_to_int16_interleave_c) {
         s->add_bias = 385.0f;
