]> rtime.felk.cvut.cz Git - frescor/ffmpeg.git/commitdiff
ac3dec: reorder output channels to SMPTE channel order
authorjbr <jbr@9553f0bf-9b14-0410-a0b8-cfaf0461ba5b>
Fri, 17 Apr 2009 08:43:04 +0000 (08:43 +0000)
committerjbr <jbr@9553f0bf-9b14-0410-a0b8-cfaf0461ba5b>
Fri, 17 Apr 2009 08:43:04 +0000 (08:43 +0000)
git-svn-id: file:///var/local/repositories/ffmpeg/trunk@18542 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b

libavcodec/ac3dec.c
libavcodec/ac3tab.c
libavcodec/ac3tab.h

index 854a38f32b2faa68555d9da5b54006fae5443279..4a177aae698dc377acca05025040852b5e06e27b 100644 (file)
@@ -1233,6 +1233,7 @@ static int ac3_decode_frame(AVCodecContext * avctx, void *data, int *data_size,
     AC3DecodeContext *s = avctx->priv_data;
     int16_t *out_samples = (int16_t *)data;
     int blk, ch, err;
+    const uint8_t *channel_map;
 
     /* initialize the GetBitContext with the start of valid AC-3 Frame */
     if (s->input_buffer) {
@@ -1321,6 +1322,7 @@ static int ac3_decode_frame(AVCodecContext * avctx, void *data, int *data_size,
     }
 
     /* decode the audio blocks */
+    channel_map = ff_ac3_dec_channel_map[s->output_mode & ~AC3_OUTPUT_LFEON][s->lfe_on];
     for (blk = 0; blk < s->num_blocks; blk++) {
         const float *output[s->out_channels];
         if (!err && decode_audio_block(s, blk)) {
@@ -1328,7 +1330,7 @@ static int ac3_decode_frame(AVCodecContext * avctx, void *data, int *data_size,
             err = 1;
         }
         for (ch = 0; ch < s->out_channels; ch++)
-            output[ch] = s->output[ch];
+            output[ch] = s->output[channel_map[ch]];
         s->dsp.float_to_int16_interleave(out_samples, output, 256, s->out_channels);
         out_samples += 256 * s->out_channels;
     }
index 36a7449a72fd4e4f82d9cd9bb13eb479d9c8abb3..cb07ac6255dd7b1eb6f011b63669b88c3a62a972 100644 (file)
@@ -79,21 +79,34 @@ const uint8_t ff_ac3_channels_tab[8] = {
     2, 1, 2, 3, 3, 4, 4, 5
 };
 
+#define COMMON_CHANNEL_MAP \
+    { { 0, 1,          }, { 0, 1, 2,         } },\
+    { { 0,             }, { 0, 1,            } },\
+    { { 0, 1,          }, { 0, 1, 2,         } },\
+    { { 0, 2, 1,       }, { 0, 2, 1, 3,      } },\
+    { { 0, 1, 2,       }, { 0, 1, 3, 2,      } },\
+    { { 0, 2, 1, 3,    }, { 0, 2, 1, 4, 3,   } },
+
 /**
  * Table to remap channels from SMPTE order to AC-3 order.
  * [channel_mode][lfe][ch]
  */
 const uint8_t ff_ac3_enc_channel_map[8][2][6] = {
-    { { 0, 1,          }, { 0, 1, 2,         } },
-    { { 0,             }, { 0, 1,            } },
-    { { 0, 1,          }, { 0, 1, 2,         } },
-    { { 0, 2, 1,       }, { 0, 2, 1, 3,      } },
-    { { 0, 1, 2,       }, { 0, 1, 3, 2,      } },
-    { { 0, 2, 1, 3,    }, { 0, 2, 1, 4, 3,   } },
+    COMMON_CHANNEL_MAP
     { { 0, 1, 2, 3, 4, }, { 0, 1, 3, 4, 2,   } },
     { { 0, 2, 1, 3, 4, }, { 0, 2, 1, 4, 5, 3 } },
 };
 
+/**
+ * Table to remap channels from from AC-3 order to SMPTE order.
+ * [channel_mode][lfe][ch]
+ */
+const uint8_t ff_ac3_dec_channel_map[8][2][6] = {
+    COMMON_CHANNEL_MAP
+    { { 0, 1, 2, 3, 4, }, { 0, 1, 4, 2, 3,   } },
+    { { 0, 2, 1, 3, 4, }, { 0, 2, 1, 5, 3, 4 } },
+};
+
 /* possible frequencies */
 const uint16_t ff_ac3_sample_rate_tab[3] = { 48000, 44100, 32000 };
 
index 300e3c6bc0e69f4b78ba1f79532d0dbded20b002..e4d0ce8aea9155fb209d0b8eabdd478facce9fb4 100644 (file)
@@ -27,6 +27,7 @@
 extern const uint16_t ff_ac3_frame_size_tab[38][3];
 extern const uint8_t  ff_ac3_channels_tab[8];
 extern const uint8_t  ff_ac3_enc_channel_map[8][2][6];
+extern const uint8_t  ff_ac3_dec_channel_map[8][2][6];
 extern const uint16_t ff_ac3_sample_rate_tab[3];
 extern const uint16_t ff_ac3_bitrate_tab[19];
 extern const int16_t  ff_ac3_window[256];