diff --git a/libavcodec/aac_ac3_parser.c b/libavcodec/aac_ac3_parser.c
index ab3269f2db46df526b5aa1687607b6bc041c257a..b51f1769f72fe8841dd545208749d1409dcc3170 100644
--- a/libavcodec/aac_ac3_parser.c
+++ b/libavcodec/aac_ac3_parser.c
@@ -85,6 +85,7 @@ get_next:
         avctx->channels = avctx->request_channels;
     } else {
         avctx->channels = s->channels;
+        avctx->channel_layout = s->channel_layout;
     }
     avctx->bit_rate = s->bit_rate;
     avctx->frame_size = s->samples;
diff --git a/libavcodec/aac_ac3_parser.h b/libavcodec/aac_ac3_parser.h
index 04fd8f197459172a6107817ae595a1d2eeabdaab..75f6d4be4ac21f33a42d5e2730b90fc8c0a8fce2 100644
--- a/libavcodec/aac_ac3_parser.h
+++ b/libavcodec/aac_ac3_parser.h
@@ -48,6 +48,7 @@ typedef struct AACAC3ParseContext {
     int sample_rate;
     int bit_rate;
     int samples;
+    int64_t channel_layout;
 
     int remaining_size;
     uint64_t state;
diff --git a/libavcodec/ac3.h b/libavcodec/ac3.h
index 7391be1b829781abc135c8cf0c9e8ca7b97da517..276ecba4c77792cbca2dc4f87152c07fe35a5294 100644
--- a/libavcodec/ac3.h
+++ b/libavcodec/ac3.h
@@ -100,6 +100,7 @@ typedef struct {
     uint32_t bit_rate;
     uint8_t channels;
     uint16_t frame_size;
+    int64_t channel_layout;
     /** @} */
 } AC3HeaderInfo;
 
diff --git a/libavcodec/ac3_parser.c b/libavcodec/ac3_parser.c
index 35d8a17fb13562bf9c328aca8a0a87f3e450e203..856f97aafb2cc17c4135504343a2ae63b90532e4 100644
--- a/libavcodec/ac3_parser.c
+++ b/libavcodec/ac3_parser.c
@@ -121,6 +121,9 @@ int ff_ac3_parse_header(GetBitContext *gbc, AC3HeaderInfo *hdr)
                         (hdr->num_blocks * 256.0));
         hdr->channels = ff_ac3_channels_tab[hdr->channel_mode] + hdr->lfe_on;
     }
+    hdr->channel_layout = ff_ac3_channel_layout_tab[hdr->channel_mode];
+    if (hdr->lfe_on)
+        hdr->channel_layout |= CH_LOW_FREQUENCY;
 
     return 0;
 }
@@ -174,6 +177,7 @@ static int ac3_sync(uint64_t state, AACAC3ParseContext *hdr_info,
     hdr_info->sample_rate = hdr.sample_rate;
     hdr_info->bit_rate = hdr.bit_rate;
     hdr_info->channels = hdr.channels;
+    hdr_info->channel_layout = hdr.channel_layout;
     hdr_info->samples = hdr.num_blocks * 256;
     if(hdr.bitstream_id>10)
         hdr_info->codec_id = CODEC_ID_EAC3;
diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c
index 4a177aae698dc377acca05025040852b5e06e27b..c142ca9bb21a5109c036103282edd83579de2252 100644
--- a/libavcodec/ac3dec.c
+++ b/libavcodec/ac3dec.c
@@ -285,6 +285,7 @@ static int parse_frame_header(AC3DecodeContext *s)
     /* get decoding parameters from header info */
     s->bit_alloc_params.sr_code     = hdr.sr_code;
     s->channel_mode                 = hdr.channel_mode;
+    s->channel_layout               = hdr.channel_layout;
     s->lfe_on                       = hdr.lfe_on;
     s->bit_alloc_params.sr_shift    = hdr.sr_shift;
     s->sample_rate                  = hdr.sample_rate;
@@ -1307,8 +1308,10 @@ static int ac3_decode_frame(AVCodecContext * avctx, void *data, int *data_size,
                 avctx->request_channels < s->channels) {
             s->out_channels = avctx->request_channels;
             s->output_mode  = avctx->request_channels == 1 ? AC3_CHMODE_MONO : AC3_CHMODE_STEREO;
+            s->channel_layout = ff_ac3_channel_layout_tab[s->output_mode];
         }
         avctx->channels = s->out_channels;
+        avctx->channel_layout = s->channel_layout;
 
         /* set downmixing coefficients if needed */
         if(s->channels != s->out_channels && !((s->output_mode & AC3_OUTPUT_LFEON) &&
diff --git a/libavcodec/ac3dec.h b/libavcodec/ac3dec.h
index 29eb04182e4a3fab451c05dedf93bb9d49b7f7ff..bdee7e78cfe21b3542ab45839fc6e0d1edf44fd9 100644
--- a/libavcodec/ac3dec.h
+++ b/libavcodec/ac3dec.h
@@ -58,6 +58,7 @@ typedef struct {
     int sample_rate;                        ///< sample frequency, in Hz
     int num_blocks;                         ///< number of audio blocks
     int channel_mode;                       ///< channel mode                           (acmod)
+    int channel_layout;                     ///< channel layout
     int lfe_on;                             ///< lfe channel in use
     int channel_map;                        ///< custom channel map
     int center_mix_level;                   ///< Center mix level index
diff --git a/libavcodec/ac3tab.c b/libavcodec/ac3tab.c
index cb07ac6255dd7b1eb6f011b63669b88c3a62a972..ba7b204b2173007d0300b2e6cafcb5e399818c95 100644
--- a/libavcodec/ac3tab.c
+++ b/libavcodec/ac3tab.c
@@ -24,6 +24,7 @@
  * tables taken directly from the AC-3 spec.
  */
 
+#include "avcodec.h"
 #include "ac3tab.h"
 
 /**
@@ -79,6 +80,20 @@ const uint8_t ff_ac3_channels_tab[8] = {
     2, 1, 2, 3, 3, 4, 4, 5
 };
 
+/**
+ * Maps audio coding mode (acmod) to channel layout mask.
+ */
+const uint16_t ff_ac3_channel_layout_tab[8] = {
+    CH_LAYOUT_STEREO,
+    CH_LAYOUT_MONO,
+    CH_LAYOUT_STEREO,
+    CH_LAYOUT_SURROUND,
+    CH_LAYOUT_2_1,
+    CH_LAYOUT_4POINT0,
+    CH_LAYOUT_2_2,
+    CH_LAYOUT_5POINT0
+};
+
 #define COMMON_CHANNEL_MAP \
     { { 0, 1,          }, { 0, 1, 2,         } },\
     { { 0,             }, { 0, 1,            } },\
diff --git a/libavcodec/ac3tab.h b/libavcodec/ac3tab.h
index e4d0ce8aea9155fb209d0b8eabdd478facce9fb4..b5c2b77c9d66c6157c49a1ada201ab9a395e6bb0 100644
--- a/libavcodec/ac3tab.h
+++ b/libavcodec/ac3tab.h
@@ -26,6 +26,7 @@
 
 extern const uint16_t ff_ac3_frame_size_tab[38][3];
 extern const uint8_t  ff_ac3_channels_tab[8];
+extern const uint16_t ff_ac3_channel_layout_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];