summaryrefslogtreecommitdiff
path: root/libavcodec/alac.c
diff options
context:
space:
mode:
authorJustin Ruggles <justin.ruggles@gmail.com>2011-12-07 11:56:57 -0500
committerJustin Ruggles <justin.ruggles@gmail.com>2012-01-03 13:15:24 -0500
commite49d21306a49c09bdf66435b73ea01384a5645ae (patch)
treecfa8c1667085569c238f3be12402a8566eaaf009 /libavcodec/alac.c
parentbb63475aec53e001ad84a24ed6e2a23ad1697fc8 (diff)
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.
Diffstat (limited to 'libavcodec/alac.c')
-rw-r--r--libavcodec/alac.c37
1 files 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 */