]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/adpcm.c
Make sure that eac3_decoder only gets enabled when CONFIG_EAC3_DECODER is set.
[ffmpeg] / libavcodec / adpcm.c
index 7ddd72375a9fe929deb01c4d5fcddaac41aa6742..d8908d34d26a908c6356755bcc407527f0bff1de 100644 (file)
@@ -19,7 +19,8 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 #include "avcodec.h"
-#include "bitstream.h"
+#include "get_bits.h"
+#include "put_bits.h"
 #include "bytestream.h"
 
 /**
@@ -190,7 +191,6 @@ static av_cold int adpcm_encode_init(AVCodecContext *avctx)
         break;
     default:
         return -1;
-        break;
     }
 
     avctx->coded_frame= avcodec_alloc_frame();
@@ -647,15 +647,12 @@ static int adpcm_encode_frame(AVCodecContext *avctx,
                     *dst++ = buf[0][i] | (buf[1][i] << 4);
             }
         } else
-        for (; n>0; n--) {
-            for(i = 0; i < avctx->channels; i++) {
+            for (n *= avctx->channels; n>0; n--) {
                 int nibble;
-                nibble  = adpcm_yamaha_compress_sample(&c->status[i], samples[i]);
-                nibble |= adpcm_yamaha_compress_sample(&c->status[i], samples[i+avctx->channels]) << 4;
+                nibble  = adpcm_yamaha_compress_sample(&c->status[ 0], *samples++);
+                nibble |= adpcm_yamaha_compress_sample(&c->status[st], *samples++) << 4;
                 *dst++ = nibble;
             }
-            samples += 2 * avctx->channels;
-        }
         break;
     default:
         return -1;
@@ -1208,11 +1205,11 @@ static int adpcm_decode_frame(AVCodecContext *avctx,
         }
         break;
     case CODEC_ID_ADPCM_EA:
-        samples_in_chunk = AV_RL32(src);
-        if (samples_in_chunk >= ((buf_size - 12) * 2)) {
+        if (buf_size < 4 || AV_RL32(src) >= ((buf_size - 12) * 2)) {
             src += buf_size;
             break;
         }
+        samples_in_chunk = AV_RL32(src);
         src += 4;
         current_left_sample   = (int16_t)bytestream_get_le16(&src);
         previous_left_sample  = (int16_t)bytestream_get_le16(&src);
@@ -1250,6 +1247,10 @@ static int adpcm_decode_frame(AVCodecContext *avctx,
                 *samples++ = (unsigned short)current_right_sample;
             }
         }
+
+        if (src - buf == buf_size - 2)
+            src += 2; // Skip terminating 0x0000
+
         break;
     case CODEC_ID_ADPCM_EA_MAXIS_XA:
         for(channel = 0; channel < avctx->channels; channel++) {