[FFmpeg-devel] [PATCH/RFC] Remove triplication of compute_lpc_coefs() function

Vitor Sessak vitor1001
Sat Aug 30 20:28:26 CEST 2008


Justin Ruggles wrote:
> Vitor Sessak wrote:
>> Justin Ruggles wrote:
>>> Vitor Sessak wrote:
>>>> Hi
>>>>
>>>> Michael Niedermayer wrote:
>>>>> On Thu, Aug 28, 2008 at 02:28:50PM +0200, Vitor Sessak wrote:
>>>>>> Hi all.
>>>>>>
>>>>>> I've finally found a more or less clean way of doing $subj. I also
>>>>>> want to know if it is ok to remove the following useless loop:
>>>>>>
>>>>>>> for(i=0; i<max_order; i++) lpc_tmp[i] = 0;
>>>>> all useless loops can be removed ...
>>>> Gone.
>>>>
>>>>> Some comments ...
>>>>> Is the double based code really a problem speedwise? IIRC someone (mans?)
>>>>> said it was very slow on some ARM, but that considered flac float vs.
>>>>> double which included the autocorrelation stuff, not just
>>>>> compute_lpc_coefs() float vs. double IIRC.
>>>> Even if compute_lpc_coefs() is not speed critical, to convert all
>>>> input/output buffers to double/float before passing to the function is
>>>> ugly and slow.
>>>>
>>>>> It should be clarified how much time is actually spend in this code when
>>>>> encoding flac.
>>>>>
>>>>> Also iam still curious if all variables must be double to maintain the
>>>>> good
>>>>> compression with flac ...
>>>> The following patch makes the flac encoder use a float version of
>>>> compute_lpc_coefs() but keeps doubles for the intermediate variables. In
>>>> my tests I've not seem a worsening of the encoded size, but I'd be glad
>>>> if someone could test it independently.
>>>>
>>>> Index: libavcodec/flacenc.c
>>>> ===================================================================
>>>> --- libavcodec/flacenc.c	(revision 15005)
>>>> +++ libavcodec/flacenc.c	(working copy)
>>>> @@ -595,7 +595,7 @@
>>>>   * A Welch window function is applied before calculation.
>>>>   */
>>>>  void ff_flac_compute_autocorr(const int32_t *data, int len, int lag,
>>>> -                              double *autoc)
>>>> +                              float *autoc)
>>>>  {
>>>>      int i, j;
>>>>      double tmp[len + lag + 1];
>>> This is not compatible with dsputil, which uses doubles.
>>>
>>> I am not against changing this, but the dsputil functions would need to
>>> be modified as well.
>> Yes, I forgot to mention this when sending the patch. I hope this is 
>> something easy to change (I don't know ASM).
>>
>> Also, would you mind trying this patch with the same sample you used 
>> last time to see if it really doesn't worsen compression?
> 
> previous test
> -------------
> compression level 8:
> double  -- 13.385s -- 167634457
> no sse2 -- 13.981s -- 167634492
> float   -- 13.857s -- 168444919 = 0.4% larger
> 
> patch   -- 13.985s -- 168435032

Thanks for testing. I've tried with a shorter sample (luckynight.wav) 
and got different results.

> about the same speed as double w/o sse. and compression is about the
> same as float-only.
> 
> I think such a small loss in bitrate in favor of reusability is
> acceptable.

While I agree with that in general, I think that the 0.4% gain is worth 
a few preprocessor directives and the LPC_type hack (at least for my 
taste, the patch I posted in the first message of this thread is not too 
ugly).

-Vitor




More information about the ffmpeg-devel mailing list