[FFmpeg-devel] [PATCH] add fixed coeff LPC mode to alac encoder
Justin Ruggles
justin.ruggles
Mon Oct 5 23:30:03 CEST 2009
Jai Menon wrote:
> On Sun, Oct 04, 2009 at 08:53:03PM -0400, Justin Ruggles wrote:
>> Michael Niedermayer wrote:
>>
>>> On Thu, Oct 01, 2009 at 08:03:09PM -0400, Justin Ruggles wrote:
>>>> Hi,
>>>>
>>>> We currently do not have a regression test for the ALAC encoder like we
>>>> do for FLAC. The ALAC encoder has 2 compression levels, one
>>>> uncompressed, which does not cover much of the code, and one which uses
>>>> floating point when calculating LPC coefficients, which does not lend
>>>> itself to reliable regression tests across all test platforms.
>>>>
>>>> The way we do regression testing with FLAC is to use the fixed LPC
>>>> coefficient mode, which skips the floating-point parts but still covers
>>>> prediction, entropy coding, and other parts in the regression test.
>>>>
>>>> Here is a patch to the ALAC encoder to add a fixed-coeff LPC mode using
>>>> compression_level == 1. This will allow us to add a round-trip
>>>> encode/decode regression test. The default compression level is changed
>>>> to 2 and keeps the same behavior. The fixed-coeff mode is about 20%
>>>> faster but has about 6% worse compression (about the same as FLAC with
>>>> compression level 2).
>>>>
>>>> Thanks,
>>>> Justin
>>>>
>>>> alacenc.c | 13 +++++++++++--
>>>> 1 file changed, 11 insertions(+), 2 deletions(-)
>>>> f1f4235083438379b9b828846668c463de9addf2 alac_compr1.patch
>>>> Index: libavcodec/alacenc.c
>>>> ===================================================================
>>>> --- libavcodec/alacenc.c (revision 20134)
>>>> +++ libavcodec/alacenc.c (working copy)
>>>> @@ -132,12 +132,21 @@
>>>> int shift[MAX_LPC_ORDER];
>>>> int opt_order;
>>>>
>>>> + if (s->avctx->compression_level > 1) {
>>>> opt_order = ff_lpc_calc_coefs(&s->dspctx, s->sample_buf[ch], s->avctx->frame_size, s->min_prediction_order, s->max_prediction_order,
>>>> ALAC_MAX_LPC_PRECISION, coefs, shift, 1, ORDER_METHOD_EST, ALAC_MAX_LPC_SHIFT, 1);
>>>>
>>>> s->lpc[ch].lpc_order = opt_order;
>>>> s->lpc[ch].lpc_quant = shift[opt_order-1];
>>>> memcpy(s->lpc[ch].lpc_coeff, coefs[opt_order-1], opt_order*sizeof(int));
>>>> + } else {
>>>> + s->lpc[ch].lpc_order = 4;
>>>> + s->lpc[ch].lpc_quant = 3;
>>>> + s->lpc[ch].lpc_coeff[0] = -4;
>>>> + s->lpc[ch].lpc_coeff[0] = 6;
>>>> + s->lpc[ch].lpc_coeff[0] = -4;
>>>> + s->lpc[ch].lpc_coeff[0] = 1;
>>> these coefficients do not look optimal, did you generate them using the LPC
>>> code over a large number of audio samples? You should IMHO!
>> you're right. i did some more testing and found coeffs that come within
>> about 1% of compression level 2 with most samples tested.
>>
>>> besides, are you sure you want to assign them all to lpc_coeff[0] ?
>> oops... yeah, that would help. :)
>>
>> new patch attached.
>
> Feel free to apply anytime :) Sorry for the late reply, I was away for
> quite sometime..
applied.
Thanks,
Justin
More information about the ffmpeg-devel
mailing list