| @@ -56,14 +56,11 @@ | |||
| #define MAX_CHANNELS 8 | |||
| typedef struct { | |||
| AVCodecContext *avctx; | |||
| AVFrame frame; | |||
| GetBitContext gb; | |||
| int channels; | |||
| /* buffers */ | |||
| int32_t *predict_error_buffer[2]; | |||
| int32_t *output_samples_buffer[2]; | |||
| int32_t *extra_bits_buffer[2]; | |||
| @@ -74,8 +71,8 @@ typedef struct { | |||
| uint8_t rice_initial_history; | |||
| uint8_t rice_limit; | |||
| int extra_bits; /**< number of extra bits beyond 16-bit */ | |||
| int nb_samples; /**< number of samples in the current frame */ | |||
| int extra_bits; /**< number of extra bits beyond 16-bit */ | |||
| int nb_samples; /**< number of samples in the current frame */ | |||
| } ALACContext; | |||
| enum RawDataBlockType { | |||
| @@ -145,16 +142,15 @@ static void rice_decompress(ALACContext *alac, int32_t *output_buffer, | |||
| int k; | |||
| unsigned int x; | |||
| /* read k, that is bits as is */ | |||
| /* calculate rice param and decode next value */ | |||
| k = av_log2((history >> 9) + 3); | |||
| k = FFMIN(k, alac->rice_limit); | |||
| x = decode_scalar(&alac->gb, k, bps); | |||
| x += sign_modifier; | |||
| sign_modifier = 0; | |||
| output_buffer[i] = (x >> 1) ^ -(x & 1); | |||
| /* now update the history */ | |||
| /* update the history */ | |||
| if (x > 0xffff) | |||
| history = 0xffff; | |||
| else | |||
| @@ -165,9 +161,9 @@ static void rice_decompress(ALACContext *alac, int32_t *output_buffer, | |||
| if ((history < 128) && (i + 1 < nb_samples)) { | |||
| int block_size; | |||
| k = 7 - av_log2(history) + ((history + 16) >> 6 /* / 64 */); | |||
| /* calculate rice param and decode block size */ | |||
| k = 7 - av_log2(history) + ((history + 16) >> 6); | |||
| k = FFMIN(k, alac->rice_limit); | |||
| block_size = decode_scalar(&alac->gb, k, 16); | |||
| if (block_size > 0) { | |||
| @@ -181,10 +177,8 @@ static void rice_decompress(ALACContext *alac, int32_t *output_buffer, | |||
| block_size * sizeof(*output_buffer)); | |||
| i += block_size; | |||
| } | |||
| if (block_size <= 0xffff) | |||
| sign_modifier = 1; | |||
| history = 0; | |||
| } | |||
| } | |||
| @@ -230,7 +224,6 @@ static void lpc_prediction(int32_t *error_buffer, int32_t *buffer_out, | |||
| /* NOTE: 4 and 8 are very common cases that could be optimized. */ | |||
| /* general case */ | |||
| for (i = lpc_order; i < nb_samples - 1; i++) { | |||
| int j; | |||
| int val = 0; | |||
| @@ -238,13 +231,11 @@ static void lpc_prediction(int32_t *error_buffer, int32_t *buffer_out, | |||
| int error_sign; | |||
| int d = buffer_out[i - lpc_order]; | |||
| for (j = 0; j < lpc_order; j++) { | |||
| /* LPC prediction */ | |||
| for (j = 0; j < lpc_order; j++) | |||
| val += (buffer_out[i - j] - d) * lpc_coefs[j]; | |||
| } | |||
| val = (val + (1 << (lpc_quant - 1))) >> lpc_quant; | |||
| val += d + error_val; | |||
| buffer_out[i + 1] = sign_extend(val, bps); | |||
| /* adapt LPC coefficients */ | |||
| @@ -262,9 +253,8 @@ static void lpc_prediction(int32_t *error_buffer, int32_t *buffer_out, | |||
| } | |||
| } | |||
| static void decorrelate_stereo(int32_t *buffer[2], | |||
| int nb_samples, int decorr_shift, | |||
| int decorr_left_weight) | |||
| static void decorrelate_stereo(int32_t *buffer[2], int nb_samples, | |||
| int decorr_shift, int decorr_left_weight) | |||
| { | |||
| int i; | |||
| @@ -282,8 +272,7 @@ static void decorrelate_stereo(int32_t *buffer[2], | |||
| } | |||
| } | |||
| static void append_extra_bits(int32_t *buffer[2], | |||
| int32_t *extra_bits_buffer[2], | |||
| static void append_extra_bits(int32_t *buffer[2], int32_t *extra_bits_buffer[2], | |||
| int extra_bits, int channels, int nb_samples) | |||
| { | |||
| int i, ch; | |||
| @@ -297,13 +286,9 @@ static int decode_element(AVCodecContext *avctx, void *data, int ch_index, | |||
| int channels) | |||
| { | |||
| ALACContext *alac = avctx->priv_data; | |||
| int has_size; | |||
| int bps; | |||
| int is_compressed; | |||
| int decorr_shift; | |||
| int decorr_left_weight; | |||
| int has_size, bps, is_compressed, decorr_shift, decorr_left_weight, ret; | |||
| uint32_t output_samples; | |||
| int i, ch, ret; | |||
| int i, ch; | |||
| skip_bits(&alac->gb, 4); /* element instance tag */ | |||
| skip_bits(&alac->gb, 12); /* unused header bits */ | |||
| @@ -404,10 +389,11 @@ static int decode_element(AVCodecContext *avctx, void *data, int ch_index, | |||
| /* not compressed, easy case */ | |||
| 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); | |||
| alac->output_samples_buffer[ch][i] = | |||
| get_sbits_long(&alac->gb, alac->sample_size); | |||
| } | |||
| } | |||
| alac->extra_bits = 0; | |||
| alac->extra_bits = 0; | |||
| decorr_shift = 0; | |||
| decorr_left_weight = 0; | |||
| } | |||
| @@ -477,9 +463,10 @@ static int alac_decode_frame(AVCodecContext *avctx, void *data, | |||
| ch += channels; | |||
| } | |||
| if (avpkt->size * 8 - get_bits_count(&alac->gb) > 8) | |||
| if (avpkt->size * 8 - get_bits_count(&alac->gb) > 8) { | |||
| av_log(avctx, AV_LOG_ERROR, "Error : %d bits left\n", | |||
| avpkt->size * 8 - get_bits_count(&alac->gb)); | |||
| } | |||
| *got_frame_ptr = 1; | |||
| *(AVFrame *)data = alac->frame; | |||