[FFmpeg-devel] [PATCH] ALS decoder

Hervé W. H.O.W.aka.V+ffmpeg
Sat Aug 29 18:41:00 CEST 2009


On 29/08/2009, Thilo Borgmann <thilo.borgmann at googlemail.com> wrote:
> Michael Niedermayer schrieb:
>> On Wed, Aug 26, 2009 at 08:28:43PM +0200, Thilo Borgmann wrote:
>>> Revision 11 attached.
>> [...]
>>> +/** Reads the block data for a non-constant block
>>> + */
>>> +static int read_var_block(ALSDecContext *ctx, unsigned int ra_block,
>>> +                          int32_t *raw_samples, unsigned int
>>> block_length,
>>> +                          unsigned int *js_blocks, int32_t *raw_other,
>>> +                          unsigned int *shift_lsbs)
>>> +{
>>> ...
>>> +        if (opt_order) {
>>> +            if (sconf->coef_table == 3) {
>>> +                // read coefficient 0
>>> +                quant_cof[0] = parcor_scaled_values[get_bits(gb, 7)];
>>> +
>>> +                // read coefficient 1
>>> +                quant_cof[1] = -parcor_scaled_values[get_bits(gb, 7)];
>>> +
>>> +                // read coefficients 2 to opt_order
>>> +                for (k = 2; k < opt_order; k++)
>>> +                    quant_cof[k] = (get_bits(gb, 7) << 14) - (0x7F <<
>>> 13);
>>> +            } else {
>>> +                int offset, rice_param, k_max;
>>> +                int64_t quant_index;
>>> +
>>> +
>>> +                // read coefficient 0 to 19
>>> +                k_max = FFMIN(20, opt_order);
>>> +                for (k = 0; k < k_max; k++) {
>>> +                    offset       =
>>> parcor_rice_table[sconf->coef_table][k][0];
>>> +                    rice_param   =
>>> parcor_rice_table[sconf->coef_table][k][1];
>>> +                    quant_cof[k] = decode_rice(gb, rice_param) + offset;
>>> +                }
>>> +
>>> +                quant_cof[0] =  parcor_scaled_values[quant_cof[0] + 64];
>>> +                quant_cof[1] = -parcor_scaled_values[quant_cof[1] + 64];
>>> +
>>> +                for (k = 2; k < k_max; k++)
>>> +                    quant_cof[k] = (quant_cof[k] << 14) + (1 << 13);
>>> +
>>> +                // read coefficients 20 to 126
>>> +                k_max = FFMIN(127, opt_order);
>>> +                for (; k < k_max; k++) {
>>> +                    offset       = k & 1;
>>> +                    rice_param   = 2;
>>> +                    quant_index  = decode_rice(gb, rice_param) + offset;
>>> +                    quant_cof[k] = (quant_index << 14) + (1 << 13);
>>> +                }
>>> +
>>> +                // read coefficients 127 to opt_order
>>> +                for (; k < opt_order; k++) {
>>> +                    offset       = 0;
>>> +                    rice_param   = 1;
>>> +                    quant_index  = decode_rice(gb, rice_param) + offset;
>>> +                    quant_cof[k] = (quant_index << 14) + (1 << 13);
>>> +                }
>>
>> // read coefficient 0 to 19
>> k_max = FFMIN( 20, opt_order);
>> for (k = 0; k < k_max; k++) {
>>     int offset     = parcor_rice_table[sconf->coef_table][k][0];
>>     int rice_param = parcor_rice_table[sconf->coef_table][k][1];
>>     quant_cof[k] = decode_rice(gb, rice_param) + offset;
>> }
>>
>> // read coefficients 20 to 126
>> k_max = FFMIN(127, opt_order);
>> for (; k < k_max; k++)
>>     quant_cof[k] = decode_rice(gb, 2) + (k&1);
>>
>> // read coefficients 127 to opt_order
>> for (; k < opt_order; k++)
>>     quant_cof[k] = decode_rice(gb, 1);
>>
>> quant_cof[0] =  parcor_scaled_values[quant_cof[0] + 64];
>> quant_cof[1] = -parcor_scaled_values[quant_cof[1] + 64];
>>
>> for (k = 2; k < opt_order; k++)
>>     quant_cof[k] = (quant_cof[k] << 14) + (1 << 13);

> It has to be for(..; k < k_max; ...) with k_max = FFMIN(20, opt_order)...

because you already stored the result of a decode_rice(gb, rice_param)
+ offset for k=0 to FFMIN(20,opt_order)
Michaels suggestion is doing the same for the other ranges, 20 to
FFMIN(127,opt_order) and 127 to opt_order. In other words: store your
quant_index's in quant_cof[] and then do _all_ the
shift_by_14_and_add_2^13  in a single loop. From what I can tell
(using pen and paper) Michaels suggestion results in the same values
as yours.


>> and this likely can be factored with the sconf->coef_table == 3 case

> ... thus it cannot be merged with sconf->... == 3 which uses the whole k
> < opt_oder range.

Maybe you should reconsider this as well. I haven't figured out how to
do that just yet, though


-V



More information about the ffmpeg-devel mailing list