diff --git a/libavcodec/vorbis.h b/libavcodec/vorbis.h
index cd4dc5597409ea109e657c4b00f2f6d2da0c54ec..03d448a640ab2263c9eef4719d0279f066b15a05 100644
--- a/libavcodec/vorbis.h
+++ b/libavcodec/vorbis.h
@@ -25,8 +25,8 @@
 
 extern const float ff_vorbis_floor1_inverse_db_table[256];
 extern const float * const ff_vorbis_vwin[8];
-extern const uint8_t ff_vorbis_channel_layout_offsets[6][6];
-extern const int64_t ff_vorbis_channel_layouts[7];
+extern const uint8_t ff_vorbis_channel_layout_offsets[8][8];
+extern const int64_t ff_vorbis_channel_layouts[9];
 
 typedef struct {
     uint_fast16_t x;
diff --git a/libavcodec/vorbis_data.c b/libavcodec/vorbis_data.c
index d9e3594ae8cc493d6066c6d9e7d6956f6e0c7ed7..2df8566631885f6a8adc9acf4d36ff44789b0029 100644
--- a/libavcodec/vorbis_data.c
+++ b/libavcodec/vorbis_data.c
@@ -21,22 +21,26 @@
 #include "dsputil.h"
 #include "vorbis.h"
 
-const uint8_t ff_vorbis_channel_layout_offsets[6][6] = {
+const uint8_t ff_vorbis_channel_layout_offsets[8][8] = {
     { 0, },
     { 0, 1, },
     { 0, 2, 1, },
     { 0, 1, 2, 3, },
     { 0, 2, 1, 3, 4, },
-    { 0, 2, 1, 5, 3, 4, }
+    { 0, 2, 1, 5, 3, 4, },
+    { 0, 2, 1, 6, 5, 3, 4, },
+    { 0, 2, 1, 7, 5, 6, 3, 4},
 };
 
-const int64_t ff_vorbis_channel_layouts[7] = {
+const int64_t ff_vorbis_channel_layouts[9] = {
     CH_LAYOUT_MONO,
     CH_LAYOUT_STEREO,
     CH_LAYOUT_SURROUND,
     CH_LAYOUT_QUAD,
     CH_LAYOUT_5POINT0_BACK,
     CH_LAYOUT_5POINT1_BACK,
+    CH_LAYOUT_5POINT1|CH_BACK_CENTER,
+    CH_LAYOUT_7POINT1,
     0
 };
 
diff --git a/libavcodec/vorbis_dec.c b/libavcodec/vorbis_dec.c
index 93fafc11786f89be560aa7539f05ab72e0603ffe..31d509252858f6447395e9ab8c9b66fdb480277a 100644
--- a/libavcodec/vorbis_dec.c
+++ b/libavcodec/vorbis_dec.c
@@ -984,7 +984,7 @@ static av_cold int vorbis_decode_init(AVCodecContext *avccontext)
         return -1;
     }
 
-    if (vc->audio_channels > 6)
+    if (vc->audio_channels > 8)
         avccontext->channel_layout = 0;
     else
         avccontext->channel_layout = ff_vorbis_channel_layouts[vc->audio_channels - 1];
@@ -1616,7 +1616,7 @@ static int vorbis_decode_frame(AVCodecContext *avccontext,
 
     AV_DEBUG("parsed %d bytes %d bits, returned %d samples (*ch*bits) \n", get_bits_count(gb)/8, get_bits_count(gb)%8, len);
 
-    if (vc->audio_channels > 6) {
+    if (vc->audio_channels > 8) {
         for (i = 0; i < vc->audio_channels; i++)
             channel_ptrs[i] = vc->channel_floors + i * len;
     } else {