From e49d21306a49c09bdf66435b73ea01384a5645ae Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Wed, 7 Dec 2011 11:56:57 -0500 Subject: [PATCH] alacdec: implement the 2-pass prediction type. The reference encoder does not generate any streams using this, but the reference decoder can handle it, so we should as well. --- libavcodec/alac.c | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/libavcodec/alac.c b/libavcodec/alac.c index eb6c1cfc16..278cc99969 100644 --- a/libavcodec/alac.c +++ b/libavcodec/alac.c @@ -452,24 +452,29 @@ static int alac_decode_frame(AVCodecContext *avctx, void *data, ricemodifier[ch] * alac->setinfo_rice_historymult / 4, (1 << alac->setinfo_rice_kmodifier) - 1); - if (prediction_type[ch] == 0) { - /* adaptive fir */ - predictor_decompress_fir_adapt(alac->predicterror_buffer[ch], - alac->outputsamples_buffer[ch], - outputsamples, - readsamplesize, - predictor_coef_table[ch], - predictor_coef_num[ch], - prediction_quantitization[ch]); - } else { - av_log(avctx, AV_LOG_ERROR, "FIXME: unhandled prediction type: %i\n", prediction_type[ch]); - /* I think the only other prediction type (or perhaps this is - * just a boolean?) runs adaptive fir twice.. like: - * predictor_decompress_fir_adapt(predictor_error, tempout, ...) - * predictor_decompress_fir_adapt(predictor_error, outputsamples ...) - * little strange.. + /* adaptive FIR filter */ + if (prediction_type[ch] == 15) { + /* Prediction type 15 runs the adaptive FIR twice. + * The first pass uses the special-case coef_num = 31, while + * the second pass uses the coefs from the bitstream. + * + * However, this prediction type is not currently used by the + * reference encoder. */ + predictor_decompress_fir_adapt(alac->predicterror_buffer[ch], + alac->predicterror_buffer[ch], + outputsamples, readsamplesize, + 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->predicterror_buffer[ch], + alac->outputsamples_buffer[ch], + outputsamples, readsamplesize, + predictor_coef_table[ch], + predictor_coef_num[ch], + prediction_quantitization[ch]); } } else { /* not compressed, easy case */