| @@ -112,14 +112,13 @@ static const uint16_t alac_channel_layouts[8] = { | |||
| AV_CH_LAYOUT_7POINT1_WIDE_BACK | |||
| }; | |||
| static inline unsigned int decode_scalar(GetBitContext *gb, int k, | |||
| int readsamplesize) | |||
| static inline unsigned int decode_scalar(GetBitContext *gb, int k, int bps) | |||
| { | |||
| unsigned int x = get_unary_0_9(gb); | |||
| if (x > 8) { /* RICE THRESHOLD */ | |||
| /* use alternative encoding */ | |||
| x = get_bits_long(gb, readsamplesize); | |||
| x = get_bits_long(gb, bps); | |||
| } else if (k != 1) { | |||
| int extrabits = show_bits(gb, k); | |||
| @@ -135,28 +134,25 @@ static inline unsigned int decode_scalar(GetBitContext *gb, int k, | |||
| return x; | |||
| } | |||
| static void bastardized_rice_decompress(ALACContext *alac, | |||
| int32_t *output_buffer, | |||
| int output_size, | |||
| int readsamplesize, | |||
| int rice_history_mult) | |||
| static void rice_decompress(ALACContext *alac, int32_t *output_buffer, | |||
| int nb_samples, int bps, int rice_history_mult) | |||
| { | |||
| int output_count; | |||
| int i; | |||
| unsigned int history = alac->rice_initial_history; | |||
| int sign_modifier = 0; | |||
| for (output_count = 0; output_count < output_size; output_count++) { | |||
| for (i = 0; i < nb_samples; i++) { | |||
| int k; | |||
| unsigned int x; | |||
| /* read k, that is bits as is */ | |||
| k = av_log2((history >> 9) + 3); | |||
| k = FFMIN(k, alac->rice_limit); | |||
| x = decode_scalar(&alac->gb, k, readsamplesize); | |||
| x = decode_scalar(&alac->gb, k, bps); | |||
| x += sign_modifier; | |||
| sign_modifier = 0; | |||
| output_buffer[output_count] = (x >> 1) ^ -(x & 1); | |||
| output_buffer[i] = (x >> 1) ^ -(x & 1); | |||
| /* now update the history */ | |||
| if (x > 0xffff) | |||
| @@ -166,7 +162,7 @@ static void bastardized_rice_decompress(ALACContext *alac, | |||
| ((history * rice_history_mult) >> 9); | |||
| /* special case: there may be compressed blocks of 0 */ | |||
| if ((history < 128) && (output_count+1 < output_size)) { | |||
| if ((history < 128) && (i + 1 < nb_samples)) { | |||
| int block_size; | |||
| k = 7 - av_log2(history) + ((history + 16) >> 6 /* / 64 */); | |||
| @@ -175,13 +171,15 @@ static void bastardized_rice_decompress(ALACContext *alac, | |||
| block_size = decode_scalar(&alac->gb, k, 16); | |||
| if (block_size > 0) { | |||
| if(block_size >= output_size - output_count){ | |||
| av_log(alac->avctx, AV_LOG_ERROR, "invalid zero block size of %d %d %d\n", block_size, output_size, output_count); | |||
| block_size= output_size - output_count - 1; | |||
| if (block_size >= nb_samples - i) { | |||
| av_log(alac->avctx, AV_LOG_ERROR, | |||
| "invalid zero block size of %d %d %d\n", block_size, | |||
| nb_samples, i); | |||
| block_size = nb_samples - i - 1; | |||
| } | |||
| memset(&output_buffer[output_count + 1], 0, | |||
| memset(&output_buffer[i + 1], 0, | |||
| block_size * sizeof(*output_buffer)); | |||
| output_count += block_size; | |||
| i += block_size; | |||
| } | |||
| if (block_size <= 0xffff) | |||
| @@ -197,93 +195,86 @@ static inline int sign_only(int v) | |||
| return v ? FFSIGN(v) : 0; | |||
| } | |||
| static void predictor_decompress_fir_adapt(int32_t *error_buffer, | |||
| int32_t *buffer_out, | |||
| int output_size, | |||
| int readsamplesize, | |||
| int16_t *predictor_coef_table, | |||
| int predictor_coef_num, | |||
| int predictor_quantitization) | |||
| static void lpc_prediction(int32_t *error_buffer, int32_t *buffer_out, | |||
| int nb_samples, int bps, int16_t *lpc_coefs, | |||
| int lpc_order, int lpc_quant) | |||
| { | |||
| int i; | |||
| /* first sample always copies */ | |||
| *buffer_out = *error_buffer; | |||
| if (output_size <= 1) | |||
| if (nb_samples <= 1) | |||
| return; | |||
| if (!predictor_coef_num) { | |||
| if (!lpc_order) { | |||
| memcpy(&buffer_out[1], &error_buffer[1], | |||
| (output_size - 1) * sizeof(*buffer_out)); | |||
| (nb_samples - 1) * sizeof(*buffer_out)); | |||
| return; | |||
| } | |||
| if (predictor_coef_num == 31) { | |||
| if (lpc_order == 31) { | |||
| /* simple 1st-order prediction */ | |||
| for (i = 1; i < output_size; i++) { | |||
| for (i = 1; i < nb_samples; i++) { | |||
| buffer_out[i] = sign_extend(buffer_out[i - 1] + error_buffer[i], | |||
| readsamplesize); | |||
| bps); | |||
| } | |||
| return; | |||
| } | |||
| /* read warm-up samples */ | |||
| for (i = 0; i < predictor_coef_num; i++) { | |||
| for (i = 0; i < lpc_order; i++) { | |||
| buffer_out[i + 1] = sign_extend(buffer_out[i] + error_buffer[i + 1], | |||
| readsamplesize); | |||
| bps); | |||
| } | |||
| /* NOTE: 4 and 8 are very common cases that could be optimized. */ | |||
| /* general case */ | |||
| for (i = predictor_coef_num; i < output_size - 1; i++) { | |||
| for (i = lpc_order; i < nb_samples - 1; i++) { | |||
| int j; | |||
| int val = 0; | |||
| int error_val = error_buffer[i + 1]; | |||
| int error_sign; | |||
| int d = buffer_out[i - predictor_coef_num]; | |||
| int d = buffer_out[i - lpc_order]; | |||
| for (j = 0; j < predictor_coef_num; j++) { | |||
| val += (buffer_out[i - j] - d) * | |||
| predictor_coef_table[j]; | |||
| for (j = 0; j < lpc_order; j++) { | |||
| val += (buffer_out[i - j] - d) * lpc_coefs[j]; | |||
| } | |||
| val = (val + (1 << (predictor_quantitization - 1))) >> | |||
| predictor_quantitization; | |||
| val = (val + (1 << (lpc_quant - 1))) >> lpc_quant; | |||
| val += d + error_val; | |||
| buffer_out[i + 1] = sign_extend(val, readsamplesize); | |||
| buffer_out[i + 1] = sign_extend(val, bps); | |||
| /* adapt LPC coefficients */ | |||
| error_sign = sign_only(error_val); | |||
| if (error_sign) { | |||
| for (j = predictor_coef_num - 1; j >= 0 && error_val * error_sign > 0; j--) { | |||
| for (j = lpc_order - 1; j >= 0 && error_val * error_sign > 0; j--) { | |||
| int sign; | |||
| val = d - buffer_out[i - j]; | |||
| sign = sign_only(val) * error_sign; | |||
| predictor_coef_table[j] -= sign; | |||
| lpc_coefs[j] -= sign; | |||
| val *= sign; | |||
| error_val -= ((val >> predictor_quantitization) * | |||
| (predictor_coef_num - j)); | |||
| error_val -= (val >> lpc_quant) * (lpc_order - j); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| static void decorrelate_stereo(int32_t *buffer[2], | |||
| int numsamples, uint8_t interlacing_shift, | |||
| uint8_t interlacing_leftweight) | |||
| int nb_samples, uint8_t decorr_shift, | |||
| uint8_t decorr_left_weight) | |||
| { | |||
| int i; | |||
| for (i = 0; i < numsamples; i++) { | |||
| for (i = 0; i < nb_samples; i++) { | |||
| int32_t a, b; | |||
| a = buffer[0][i]; | |||
| b = buffer[1][i]; | |||
| a -= (b * interlacing_leftweight) >> interlacing_shift; | |||
| a -= (b * decorr_left_weight) >> decorr_shift; | |||
| b += a; | |||
| buffer[0][i] = b; | |||
| @@ -293,12 +284,12 @@ static void decorrelate_stereo(int32_t *buffer[2], | |||
| static void append_extra_bits(int32_t *buffer[2], | |||
| int32_t *extra_bits_buffer[2], | |||
| int extra_bits, int numchannels, int numsamples) | |||
| int extra_bits, int channels, int nb_samples) | |||
| { | |||
| int i, ch; | |||
| for (ch = 0; ch < numchannels; ch++) | |||
| for (i = 0; i < numsamples; i++) | |||
| for (ch = 0; ch < channels; ch++) | |||
| for (i = 0; i < nb_samples; i++) | |||
| buffer[ch][i] = (buffer[ch][i] << extra_bits) | extra_bits_buffer[ch][i]; | |||
| } | |||
| @@ -306,11 +297,11 @@ static int decode_element(AVCodecContext *avctx, void *data, int ch_index, | |||
| int channels) | |||
| { | |||
| ALACContext *alac = avctx->priv_data; | |||
| int hassize; | |||
| unsigned int readsamplesize; | |||
| int has_size; | |||
| unsigned int bps; | |||
| int is_compressed; | |||
| uint8_t interlacing_shift; | |||
| uint8_t interlacing_leftweight; | |||
| uint8_t decorr_shift; | |||
| uint8_t decorr_left_weight; | |||
| uint32_t output_samples; | |||
| int i, ch, ret; | |||
| @@ -318,19 +309,19 @@ static int decode_element(AVCodecContext *avctx, void *data, int ch_index, | |||
| skip_bits(&alac->gb, 12); /* unused header bits */ | |||
| /* the number of output samples is stored in the frame */ | |||
| hassize = get_bits1(&alac->gb); | |||
| has_size = get_bits1(&alac->gb); | |||
| alac->extra_bits = get_bits(&alac->gb, 2) << 3; | |||
| readsamplesize = alac->sample_size - alac->extra_bits + channels - 1; | |||
| if (readsamplesize > 32) { | |||
| av_log(avctx, AV_LOG_ERROR, "bps is unsupported: %d\n", readsamplesize); | |||
| bps = alac->sample_size - alac->extra_bits + channels - 1; | |||
| if (bps > 32) { | |||
| av_log(avctx, AV_LOG_ERROR, "bps is unsupported: %d\n", bps); | |||
| return AVERROR_PATCHWELCOME; | |||
| } | |||
| /* whether the frame is compressed */ | |||
| is_compressed = !get_bits1(&alac->gb); | |||
| if (hassize) | |||
| if (has_size) | |||
| output_samples = get_bits_long(&alac->gb, 32); | |||
| else | |||
| output_samples = alac->max_samples_per_frame; | |||
| @@ -358,25 +349,24 @@ static int decode_element(AVCodecContext *avctx, void *data, int ch_index, | |||
| alac->nb_samples = output_samples; | |||
| if (is_compressed) { | |||
| int16_t predictor_coef_table[2][32]; | |||
| int predictor_coef_num[2]; | |||
| int16_t lpc_coefs[2][32]; | |||
| int lpc_order[2]; | |||
| int prediction_type[2]; | |||
| int prediction_quantitization[2]; | |||
| int ricemodifier[2]; | |||
| int lpc_quant[2]; | |||
| int rice_history_mult[2]; | |||
| interlacing_shift = get_bits(&alac->gb, 8); | |||
| interlacing_leftweight = get_bits(&alac->gb, 8); | |||
| decorr_shift = get_bits(&alac->gb, 8); | |||
| decorr_left_weight = get_bits(&alac->gb, 8); | |||
| for (ch = 0; ch < channels; ch++) { | |||
| prediction_type[ch] = get_bits(&alac->gb, 4); | |||
| prediction_quantitization[ch] = get_bits(&alac->gb, 4); | |||
| ricemodifier[ch] = get_bits(&alac->gb, 3); | |||
| predictor_coef_num[ch] = get_bits(&alac->gb, 5); | |||
| prediction_type[ch] = get_bits(&alac->gb, 4); | |||
| lpc_quant[ch] = get_bits(&alac->gb, 4); | |||
| rice_history_mult[ch] = get_bits(&alac->gb, 3); | |||
| lpc_order[ch] = get_bits(&alac->gb, 5); | |||
| /* read the predictor table */ | |||
| for (i = 0; i < predictor_coef_num[ch]; i++) | |||
| predictor_coef_table[ch][i] = get_sbits(&alac->gb, 16); | |||
| for (i = 0; i < lpc_order[ch]; i++) | |||
| lpc_coefs[ch][i] = get_sbits(&alac->gb, 16); | |||
| } | |||
| if (alac->extra_bits) { | |||
| @@ -386,11 +376,9 @@ static int decode_element(AVCodecContext *avctx, void *data, int ch_index, | |||
| } | |||
| } | |||
| for (ch = 0; ch < channels; ch++) { | |||
| bastardized_rice_decompress(alac, | |||
| alac->predict_error_buffer[ch], | |||
| alac->nb_samples, | |||
| readsamplesize, | |||
| ricemodifier[ch] * alac->rice_history_mult / 4); | |||
| rice_decompress(alac, alac->predict_error_buffer[ch], | |||
| alac->nb_samples, bps, | |||
| rice_history_mult[ch] * alac->rice_history_mult / 4); | |||
| /* adaptive FIR filter */ | |||
| if (prediction_type[ch] == 15) { | |||
| @@ -401,20 +389,16 @@ static int decode_element(AVCodecContext *avctx, void *data, int ch_index, | |||
| * However, this prediction type is not currently used by the | |||
| * reference encoder. | |||
| */ | |||
| predictor_decompress_fir_adapt(alac->predict_error_buffer[ch], | |||
| alac->predict_error_buffer[ch], | |||
| alac->nb_samples, readsamplesize, | |||
| NULL, 31, 0); | |||
| lpc_prediction(alac->predict_error_buffer[ch], | |||
| alac->predict_error_buffer[ch], | |||
| alac->nb_samples, bps, NULL, 31, 0); | |||
| } else if (prediction_type[ch] > 0) { | |||
| av_log(avctx, AV_LOG_WARNING, "unknown prediction type: %i\n", | |||
| prediction_type[ch]); | |||
| } | |||
| predictor_decompress_fir_adapt(alac->predict_error_buffer[ch], | |||
| alac->output_samples_buffer[ch], | |||
| alac->nb_samples, readsamplesize, | |||
| predictor_coef_table[ch], | |||
| predictor_coef_num[ch], | |||
| prediction_quantitization[ch]); | |||
| lpc_prediction(alac->predict_error_buffer[ch], | |||
| alac->output_samples_buffer[ch], alac->nb_samples, | |||
| bps, lpc_coefs[ch], lpc_order[ch], lpc_quant[ch]); | |||
| } | |||
| } else { | |||
| /* not compressed, easy case */ | |||
| @@ -424,13 +408,13 @@ static int decode_element(AVCodecContext *avctx, void *data, int ch_index, | |||
| } | |||
| } | |||
| alac->extra_bits = 0; | |||
| interlacing_shift = 0; | |||
| interlacing_leftweight = 0; | |||
| decorr_shift = 0; | |||
| decorr_left_weight = 0; | |||
| } | |||
| if (channels == 2 && interlacing_leftweight) { | |||
| if (channels == 2 && decorr_left_weight) { | |||
| decorrelate_stereo(alac->output_samples_buffer, alac->nb_samples, | |||
| interlacing_shift, interlacing_leftweight); | |||
| decorr_shift, decorr_left_weight); | |||
| } | |||
| if (alac->extra_bits) { | |||