[FFmpeg-devel] [PATCH] vc2enc: properly promote operations to 64 bits
Rostislav Pehlivanov
atomnuker at gmail.com
Tue Mar 13 03:49:46 EET 2018
On 12 March 2018 at 23:36, Rostislav Pehlivanov <atomnuker at gmail.com> wrote:
> On Windows machines, the UL suffix still means 32 bits.
> The only parts that need 64 bits are (1ULL << (m + 32)) and
> (t*qf + qf). Hence, use the proper ULL suffix for the former
> and just increase the type of the qf constant for the latter.
> No overflows can happen as long as these are done in 64 bits and
> the quantization table doesn't change.
>
> Signed-off-by: Rostislav Pehlivanov <atomnuker at gmail.com>
> ---
> libavcodec/vc2enc.c | 10 +++++-----
> 1 file changed, 5 insertions(+), 5 deletions(-)
>
> diff --git a/libavcodec/vc2enc.c b/libavcodec/vc2enc.c
> index 2e480ba8d0..d0101e01e4 100644
> --- a/libavcodec/vc2enc.c
> +++ b/libavcodec/vc2enc.c
> @@ -1163,14 +1163,14 @@ static av_cold int vc2_encode_init(AVCodecContext
> *avctx)
> goto alloc_fail;
>
> for (i = 0; i < 116; i++) {
> - const uint32_t qf = ff_dirac_qscale_tab[i];
> - const int m = av_log2(qf);
> - const uint32_t t = (1UL << (m + 32)) / qf;
> - const uint32_t r = (t*qf + qf) & ((1UL << 32) - 1);
> + const uint64_t qf = ff_dirac_qscale_tab[i];
> + const uint32_t m = av_log2(qf);
> + const uint32_t t = (1ULL << (m + 32)) / qf;
> + const uint32_t r = (t*qf + qf) & UINT32_MAX;
> if (!(qf & (qf - 1))) {
> s->qmagic_lut[i][0] = 0xFFFFFFFF;
> s->qmagic_lut[i][1] = 0xFFFFFFFF;
> - } else if (r <= 1UL << m) {
> + } else if (r <= 1 << m) {
> s->qmagic_lut[i][0] = t + 1;
> s->qmagic_lut[i][1] = 0;
> } else {
> --
> 2.16.2
>
>
Fixes what its meant to fix, pushed
More information about the ffmpeg-devel
mailing list