[FFmpeg-devel] [PATCH] use MUL64 in ac3dec.c
Justin Ruggles
justin.ruggles
Tue Jan 12 12:00:08 CET 2010
Reimar D?ffinger wrote:
> On Mon, Jan 11, 2010 at 11:11:43PM +0000, M?ns Rullg?rd wrote:
>> Reimar D?ffinger <Reimar.Doeffinger at gmx.de> writes:
>>> Even faster (though possibly wrong, even though I hear no issues with
>>> my samples) should be the variant with MULH, though I could not really
>>> measure a difference:
>> Make sure the output is actually identical.
>>
>>> Index: libavcodec/ac3dec.c
>>> ===================================================================
>>> --- libavcodec/ac3dec.c (revision 21153)
>>> +++ libavcodec/ac3dec.c (working copy)
>>> @@ -420,10 +420,9 @@
>>> int band_end = bin + s->cpl_band_sizes[band];
>>> for (ch = 1; ch <= s->fbw_channels; ch++) {
>>> if (s->channel_in_cpl[ch]) {
>>> - int64_t cpl_coord = s->cpl_coords[ch][band];
>>> + int cpl_coord = s->cpl_coords[ch][band] << 9;
>> Is this certain not to overflow?
>
> No idea, I just wanted to mention it. For me it is not any faster so I don't
> intend to investigate that variant further - it was just in case someone here
> knows the limits for these variables right out of their head.
The shift can overflow. The maximum value for cpl_coords is 31<<21.
>
>>> for (bin = band_start; bin < band_end; bin++) {
>>> - s->fixed_coeffs[ch][bin] = ((int64_t)s->fixed_coeffs[CPL_CH][bin] *
>>> - cpl_coord) >> 23;
>>> + s->fixed_coeffs[ch][bin] = MULH(s->fixed_coeffs[CPL_CH][bin], cpl_coord);
>>> }
>> Provided the shift above is safe, that had better work, since the
>> destination is 32-bit, or the original would be suffering some serious
>> truncation problems.
>
> And if fixed_coeffs can end up being any 32 bit value, that in turn would
> limit cpl_coord enough to make above shift safe. However it is all speculation.
fixed_coeffs original value is 24-bit signed, but the final value can be
as large as cpl_coords. I had honestly never looked at the maximum
value of this before, and it may have other implications in the code
that I will need to investigate.
Your first patch looks fine though.
-Justin
More information about the ffmpeg-devel
mailing list