[FFmpeg-devel] [PATCH] Make ff_lpc_calc_coefs order estimation?flexible by passing parameters

Justin Ruggles justinruggles
Sun Aug 17 02:29:34 CEST 2008


Justin Ruggles wrote:
> Michael Niedermayer wrote:
>> On Sun, Aug 17, 2008 at 02:10:28AM +0530, Jai Menon wrote:
>>> Hi,
>>>
>>> On Sunday 17 Aug 2008 1:38:51 am Michael Niedermayer wrote:
>>>> On Sun, Aug 17, 2008 at 01:21:52AM +0530, Jai Menon wrote:
>>>>> Hi,
>>>>>
>>>>> On Sunday 17 Aug 2008 12:42:33 am Jai Menon wrote:
>>>>>> Hi,
>>>>>>
>>>>>> On Sunday 17 Aug 2008 12:36:54 am Jai Menon wrote:
>>>>>>> Hi,
>>>>>>>
>>>>>>> Attached patch allows for order estimation to be varied based on
>>>>>>> external parameters.
>>>>>> This will allow for order estimation between a specific range or
>>>>>> interval, particularly useful for the alac encoder.
>>>>> Again, based on Ramiro's advice, a more detailed incremental patchset.
>>>> [...]
>>>>
>>>>> @@ -195,10 +195,20 @@ int ff_lpc_calc_coefs(DSPContext *s,
>>>>>          i = opt_order-1;
>>>>>          quantize_lpc_coefs(lpc[i], i+1, precision, coefs[i], &shift[i],
>>>>> max_shift, zero_shift); } else {
>>>>> +        if(omethod == ORDER_METHOD_RANGE) {
>>>>> +            int i = opt_order = param_list[0];
>>>>> +            while(i < param_list[1]) {
>>>>> +                if(ref[i] > ref[opt_order-1])
>>>>> +                    opt_order = i + 1;
>>>>> +                i++;
>>>>> +            }
>>>>> +            quantize_lpc_coefs(lpc[opt_order-1], opt_order, precision,
>>>>> coefs[opt_order-1], &shift[opt_order-1], max_shift, zero_shift); +       
>>>>> } else {
>>>>>          for(i=0; i<max_order; i++) {
>>>>>              quantize_lpc_coefs(lpc[i], i+1, precision, coefs[i],
>>>>> &shift[i], max_shift, zero_shift); }
>>>>>      }
>>>>> +    }
>>>>>
>>>>>      return opt_order;
>>>>>  }
>>>> As the current omethods (If i understand the code correctly) are not
>>>> limiting their search range. This is a bug, and it can either be fixed or
>>>> left but i will not accept the addition of a new omethod because the
>>>> existing ones are buggy.
>>>>
>>>> Besides max_order is passed as parameter already and we do not need a
>>>> opaque parameter list, that is the addition of such list is rejected.
>>>>
>>> So should I just hardcode the selection among 4th and 6th orders (based on 
>>> reflection coeffs) in a new order method solely for alac?
>> First please explain me again what exactly in lpc_calc_coefs is slowing your
>> code down when you use omethod != ORDER_METHOD_EST?
>>
>> is it quantize_lpc_coefs() ?
>>
>> if yes (and you really checked this instead of guessing) then
>> you can add a min_order and use ORDER_METHOD_2LEVEL with appropriate changes
>> to lpc_calc_coefs()
>> I just cannot belive that quantize_lpc_coefs() really makes a big difference ...
> 
> ORDER_METHOD_EST was tuned for FLAC, so it may not be good for other codecs.
> 
> I think it might be cleaner to share quantize_lpc_coefs() separately.
> 
> ff_lpc_calc_coefs() would do either levinson-durbin or cholesky
> depending on avctx->use_lpc, and it would output lpc and reflection
> coeffs as doubles.
> 
> ff_lpc_quantize_coefs() could be a function which quantizes coeffs for a
> range of orders.
> 
> estimate_best_order() could be shared separately as well if it proves
> useful for other codecs.
> 
> This way codecs which just want the coeffs could do their own
> quantization or order decision.  MP4-ALS, for example, quantizes the
> reflection coeffs and has a bit-exact transformation in the spec to
> convert to integer lpc coeffs.

patch attached implementing the above.

Although there is not an "all-in-one" function, I think this is a
cleaner and more flexible solution.

-Justin

-------------- next part --------------
A non-text attachment was scrubbed...
Name: split_lpc_functions.diff
Type: text/x-patch
Size: 6561 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20080816/cb4e46c3/attachment.bin>



More information about the ffmpeg-devel mailing list