[libav-commits] alac: move the current samples per frame to the ALACContext

Justin Ruggles git at libav.org
Thu Jul 19 20:25:10 CEST 2012


Module: libav
Branch: master
Commit: 7a50ec6799b92f0e3681d734aa0769857a16ef87

Author:    Justin Ruggles <justin.ruggles at gmail.com>
Committer: Justin Ruggles <justin.ruggles at gmail.com>
Date:      Mon Jul  9 13:15:35 2012 -0400

alac: move the current samples per frame to the ALACContext

This will simplify the multi-channel implementation.

---

 libavcodec/alac.c |   45 ++++++++++++++++++++++-----------------------
 1 files changed, 22 insertions(+), 23 deletions(-)

diff --git a/libavcodec/alac.c b/libavcodec/alac.c
index f803f9a..9e77f67 100644
--- a/libavcodec/alac.c
+++ b/libavcodec/alac.c
@@ -75,6 +75,7 @@ typedef struct {
     uint8_t  rice_limit;
 
     int extra_bits;                         /**< number of extra bits beyond 16-bit */
+    int nb_samples;                         /**< number of samples in the current frame */
 } ALACContext;
 
 static inline int decode_scalar(GetBitContext *gb, int k, int readsamplesize)
@@ -295,7 +296,6 @@ static int alac_decode_frame(AVCodecContext *avctx, void *data,
     ALACContext *alac = avctx->priv_data;
 
     int channels;
-    unsigned int outputsamples;
     int hassize;
     unsigned int readsamplesize;
     int is_compressed;
@@ -324,21 +324,18 @@ static int alac_decode_frame(AVCodecContext *avctx, void *data,
 
     if (hassize) {
         /* now read the number of samples as a 32bit integer */
-        outputsamples = get_bits_long(&alac->gb, 32);
-        if (outputsamples > alac->max_samples_per_frame) {
-            av_log(avctx, AV_LOG_ERROR, "outputsamples %d > %d\n",
-                   outputsamples, alac->max_samples_per_frame);
-            return -1;
+        uint32_t output_samples = get_bits_long(&alac->gb, 32);
+        if (!output_samples || output_samples > alac->max_samples_per_frame) {
+            av_log(avctx, AV_LOG_ERROR, "invalid samples per frame: %d\n",
+                   output_samples);
+            return AVERROR_INVALIDDATA;
         }
+        alac->nb_samples = output_samples;
     } else
-        outputsamples = alac->max_samples_per_frame;
+        alac->nb_samples = alac->max_samples_per_frame;
 
     /* get output buffer */
-    if (outputsamples > INT32_MAX) {
-        av_log(avctx, AV_LOG_ERROR, "unsupported block size: %u\n", outputsamples);
-        return AVERROR_INVALIDDATA;
-    }
-    alac->frame.nb_samples = outputsamples;
+    alac->frame.nb_samples = alac->nb_samples;
     if ((ret = avctx->get_buffer(avctx, &alac->frame)) < 0) {
         av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
         return ret;
@@ -373,7 +370,7 @@ static int alac_decode_frame(AVCodecContext *avctx, void *data,
         }
 
         if (alac->extra_bits) {
-            for (i = 0; i < outputsamples; i++) {
+            for (i = 0; i < alac->nb_samples; i++) {
                 for (ch = 0; ch < channels; ch++)
                     alac->extra_bits_buffer[ch][i] = get_bits(&alac->gb, alac->extra_bits);
             }
@@ -381,7 +378,7 @@ static int alac_decode_frame(AVCodecContext *avctx, void *data,
         for (ch = 0; ch < channels; ch++) {
             bastardized_rice_decompress(alac,
                                         alac->predict_error_buffer[ch],
-                                        outputsamples,
+                                        alac->nb_samples,
                                         readsamplesize,
                                         ricemodifier[ch] * alac->rice_history_mult / 4);
 
@@ -396,7 +393,7 @@ static int alac_decode_frame(AVCodecContext *avctx, void *data,
                  */
                 predictor_decompress_fir_adapt(alac->predict_error_buffer[ch],
                                                alac->predict_error_buffer[ch],
-                                               outputsamples, readsamplesize,
+                                               alac->nb_samples, readsamplesize,
                                                NULL, 31, 0);
             } else if (prediction_type[ch] > 0) {
                 av_log(avctx, AV_LOG_WARNING, "unknown prediction type: %i\n",
@@ -404,14 +401,14 @@ static int alac_decode_frame(AVCodecContext *avctx, void *data,
             }
             predictor_decompress_fir_adapt(alac->predict_error_buffer[ch],
                                            alac->output_samples_buffer[ch],
-                                           outputsamples, readsamplesize,
+                                           alac->nb_samples, readsamplesize,
                                            predictor_coef_table[ch],
                                            predictor_coef_num[ch],
                                            prediction_quantitization[ch]);
         }
     } else {
         /* not compressed, easy case */
-        for (i = 0; i < outputsamples; i++) {
+        for (i = 0; i < alac->nb_samples; i++) {
             for (ch = 0; ch < channels; ch++) {
                 alac->output_samples_buffer[ch][i] = get_sbits_long(&alac->gb,
                                                                     alac->sample_size);
@@ -425,23 +422,24 @@ static int alac_decode_frame(AVCodecContext *avctx, void *data,
         av_log(avctx, AV_LOG_ERROR, "Error : Wrong End Of Frame\n");
 
     if (channels == 2 && interlacing_leftweight) {
-        decorrelate_stereo(alac->output_samples_buffer, outputsamples,
+        decorrelate_stereo(alac->output_samples_buffer, alac->nb_samples,
                            interlacing_shift, interlacing_leftweight);
     }
 
     if (alac->extra_bits) {
         append_extra_bits(alac->output_samples_buffer, alac->extra_bits_buffer,
-                          alac->extra_bits, alac->channels, outputsamples);
+                          alac->extra_bits, alac->channels, alac->nb_samples);
     }
 
     switch(alac->sample_size) {
     case 16:
         if (channels == 2) {
             interleave_stereo_16(alac->output_samples_buffer,
-                                 (int16_t *)alac->frame.data[0], outputsamples);
+                                 (int16_t *)alac->frame.data[0],
+                                 alac->nb_samples);
         } else {
             int16_t *outbuffer = (int16_t *)alac->frame.data[0];
-            for (i = 0; i < outputsamples; i++) {
+            for (i = 0; i < alac->nb_samples; i++) {
                 outbuffer[i] = alac->output_samples_buffer[0][i];
             }
         }
@@ -449,10 +447,11 @@ static int alac_decode_frame(AVCodecContext *avctx, void *data,
     case 24:
         if (channels == 2) {
             interleave_stereo_24(alac->output_samples_buffer,
-                                 (int32_t *)alac->frame.data[0], outputsamples);
+                                 (int32_t *)alac->frame.data[0],
+                                 alac->nb_samples);
         } else {
             int32_t *outbuffer = (int32_t *)alac->frame.data[0];
-            for (i = 0; i < outputsamples; i++)
+            for (i = 0; i < alac->nb_samples; i++)
                 outbuffer[i] = alac->output_samples_buffer[0][i] << 8;
         }
         break;



More information about the libav-commits mailing list