diff --git a/libavcodec/alac.c b/libavcodec/alac.c
index e648f9548b7dfdc281f2154fdbcab69d48908b16..b281024f0df0d0132cf36df53d5a6a31db95cbdd 100644
--- a/libavcodec/alac.c
+++ b/libavcodec/alac.c
@@ -487,7 +487,7 @@ static int alac_decode_frame(AVCodecContext *avctx,
 
     init_get_bits(&alac->gb, inbuffer, input_buffer_size * 8);
 
-    channels = get_bits(&alac->gb, 3);
+    channels = get_bits(&alac->gb, 3) + 1;
 
         /* 2^result = something to do with output waiting.
          * perhaps matters if we read > 1 frame in a pass?
@@ -510,10 +510,10 @@ static int alac_decode_frame(AVCodecContext *avctx,
             outputsamples = alac->setinfo_max_samples_per_frame;
 
         *outputsize = outputsamples * alac->bytespersample;
-        readsamplesize = alac->setinfo_sample_size - (wasted_bytes * 8) + channels;
+        readsamplesize = alac->setinfo_sample_size - (wasted_bytes * 8) + channels - 1;
 
     switch(channels) {
-    case 0: { /* 1 channel */
+    case 1: { /* 1 channel */
         int ricemodifier;
 
         if (!isnotcompressed) {
@@ -624,7 +624,7 @@ static int alac_decode_frame(AVCodecContext *avctx,
         }
         break;
     }
-    case 1: { /* 2 channels */
+    case 2: { /* 2 channels */
         uint8_t interlacing_shift;
         uint8_t interlacing_leftweight;