diff options
Diffstat (limited to 'libavcodec/simple_idct_template.c')
-rw-r--r-- | libavcodec/simple_idct_template.c | 111 |
1 files changed, 71 insertions, 40 deletions
diff --git a/libavcodec/simple_idct_template.c b/libavcodec/simple_idct_template.c index d10df31..f532313 100644 --- a/libavcodec/simple_idct_template.c +++ b/libavcodec/simple_idct_template.c @@ -3,20 +3,20 @@ * * Copyright (c) 2001 Michael Niedermayer <michaelni@gmx.at> * - * This file is part of Libav. + * This file is part of FFmpeg. * - * Libav is free software; you can redistribute it and/or + * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * Libav is distributed in the hope that it will be useful, + * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with Libav; if not, write to the Free Software + * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ @@ -62,19 +62,40 @@ #define MUL(a, b) MUL16(a, b) #define MAC(a, b, c) MAC16(a, b, c) -#elif BIT_DEPTH == 10 - -#define W1 90901 -#define W2 85627 -#define W3 77062 -#define W4 65535 -#define W5 51491 -#define W6 35468 -#define W7 18081 - -#define ROW_SHIFT 15 -#define COL_SHIFT 20 -#define DC_SHIFT 1 +#elif BIT_DEPTH == 10 || BIT_DEPTH == 12 + +# if BIT_DEPTH == 10 +#define W1 22725 // 90901 +#define W2 21407 // 85627 +#define W3 19265 // 77062 +#define W4 16384 // 65535 +#define W5 12873 // 51491 +#define W6 8867 // 35468 +#define W7 4520 // 18081 + +# ifdef EXTRA_SHIFT +#define ROW_SHIFT 13 +#define COL_SHIFT 18 +#define DC_SHIFT 1 +# else +#define ROW_SHIFT 12 +#define COL_SHIFT 19 +#define DC_SHIFT 2 +# endif + +# else +#define W1 45451 +#define W2 42813 +#define W3 38531 +#define W4 32767 +#define W5 25746 +#define W6 17734 +#define W7 9041 + +#define ROW_SHIFT 16 +#define COL_SHIFT 17 +#define DC_SHIFT -1 +# endif #define MUL(a, b) ((a) * (b)) #define MAC(a, b, c) ((a) += (b) * (c)) @@ -85,18 +106,22 @@ #endif +#ifdef EXTRA_SHIFT +static inline void FUNC(idctRowCondDC_extrashift)(int16_t *row, int extra_shift) +#else static inline void FUNC(idctRowCondDC)(int16_t *row, int extra_shift) +#endif { - int a0, a1, a2, a3, b0, b1, b2, b3; + SUINT a0, a1, a2, a3, b0, b1, b2, b3; #if HAVE_FAST_64BIT #define ROW0_MASK (0xffffLL << 48 * HAVE_BIGENDIAN) if (((AV_RN64A(row) & ~ROW0_MASK) | AV_RN64A(row+4)) == 0) { uint64_t temp; - if (DC_SHIFT - extra_shift > 0) { + if (DC_SHIFT - extra_shift >= 0) { temp = (row[0] * (1 << (DC_SHIFT - extra_shift))) & 0xffff; } else { - temp = (row[0] >> (extra_shift - DC_SHIFT)) & 0xffff; + temp = ((row[0] + (1<<(extra_shift - DC_SHIFT-1))) >> (extra_shift - DC_SHIFT)) & 0xffff; } temp += temp * (1 << 16); temp += temp * ((uint64_t) 1 << 32); @@ -110,10 +135,10 @@ static inline void FUNC(idctRowCondDC)(int16_t *row, int extra_shift) AV_RN32A(row+6) | row[1])) { uint32_t temp; - if (DC_SHIFT - extra_shift > 0) { + if (DC_SHIFT - extra_shift >= 0) { temp = (row[0] * (1 << (DC_SHIFT - extra_shift))) & 0xffff; } else { - temp = (row[0] >> (extra_shift - DC_SHIFT)) & 0xffff; + temp = ((row[0] + (1<<(extra_shift - DC_SHIFT-1))) >> (extra_shift - DC_SHIFT)) & 0xffff; } temp += temp * (1 << 16); AV_WN32A(row, temp); @@ -124,7 +149,7 @@ static inline void FUNC(idctRowCondDC)(int16_t *row, int extra_shift) } #endif - a0 = (W4 * row[0]) + (1 << (ROW_SHIFT - 1)); + a0 = (W4 * row[0]) + (1 << (ROW_SHIFT + extra_shift - 1)); a1 = a0; a2 = a0; a3 = a0; @@ -162,14 +187,14 @@ static inline void FUNC(idctRowCondDC)(int16_t *row, int extra_shift) MAC(b3, -W1, row[7]); } - row[0] = (a0 + b0) >> (ROW_SHIFT + extra_shift); - row[7] = (a0 - b0) >> (ROW_SHIFT + extra_shift); - row[1] = (a1 + b1) >> (ROW_SHIFT + extra_shift); - row[6] = (a1 - b1) >> (ROW_SHIFT + extra_shift); - row[2] = (a2 + b2) >> (ROW_SHIFT + extra_shift); - row[5] = (a2 - b2) >> (ROW_SHIFT + extra_shift); - row[3] = (a3 + b3) >> (ROW_SHIFT + extra_shift); - row[4] = (a3 - b3) >> (ROW_SHIFT + extra_shift); + row[0] = (int)(a0 + b0) >> (ROW_SHIFT + extra_shift); + row[7] = (int)(a0 - b0) >> (ROW_SHIFT + extra_shift); + row[1] = (int)(a1 + b1) >> (ROW_SHIFT + extra_shift); + row[6] = (int)(a1 - b1) >> (ROW_SHIFT + extra_shift); + row[2] = (int)(a2 + b2) >> (ROW_SHIFT + extra_shift); + row[5] = (int)(a2 - b2) >> (ROW_SHIFT + extra_shift); + row[3] = (int)(a3 + b3) >> (ROW_SHIFT + extra_shift); + row[4] = (int)(a3 - b3) >> (ROW_SHIFT + extra_shift); } #define IDCT_COLS do { \ @@ -222,28 +247,31 @@ static inline void FUNC(idctRowCondDC)(int16_t *row, int extra_shift) } \ } while (0) +#ifdef EXTRA_SHIFT +static inline void FUNC(idctSparseCol_extrashift)(int16_t *col) +#else static inline void FUNC(idctSparseColPut)(pixel *dest, ptrdiff_t line_size, int16_t *col) { - int a0, a1, a2, a3, b0, b1, b2, b3; + SUINT a0, a1, a2, a3, b0, b1, b2, b3; IDCT_COLS; - dest[0] = av_clip_pixel((a0 + b0) >> COL_SHIFT); + dest[0] = av_clip_pixel((int)(a0 + b0) >> COL_SHIFT); dest += line_size; - dest[0] = av_clip_pixel((a1 + b1) >> COL_SHIFT); + dest[0] = av_clip_pixel((int)(a1 + b1) >> COL_SHIFT); dest += line_size; - dest[0] = av_clip_pixel((a2 + b2) >> COL_SHIFT); + dest[0] = av_clip_pixel((int)(a2 + b2) >> COL_SHIFT); dest += line_size; - dest[0] = av_clip_pixel((a3 + b3) >> COL_SHIFT); + dest[0] = av_clip_pixel((int)(a3 + b3) >> COL_SHIFT); dest += line_size; - dest[0] = av_clip_pixel((a3 - b3) >> COL_SHIFT); + dest[0] = av_clip_pixel((int)(a3 - b3) >> COL_SHIFT); dest += line_size; - dest[0] = av_clip_pixel((a2 - b2) >> COL_SHIFT); + dest[0] = av_clip_pixel((int)(a2 - b2) >> COL_SHIFT); dest += line_size; - dest[0] = av_clip_pixel((a1 - b1) >> COL_SHIFT); + dest[0] = av_clip_pixel((int)(a1 - b1) >> COL_SHIFT); dest += line_size; - dest[0] = av_clip_pixel((a0 - b0) >> COL_SHIFT); + dest[0] = av_clip_pixel((int)(a0 - b0) >> COL_SHIFT); } static inline void FUNC(idctSparseColAdd)(pixel *dest, ptrdiff_t line_size, @@ -271,6 +299,7 @@ static inline void FUNC(idctSparseColAdd)(pixel *dest, ptrdiff_t line_size, } static inline void FUNC(idctSparseCol)(int16_t *col) +#endif { int a0, a1, a2, a3, b0, b1, b2, b3; @@ -286,6 +315,7 @@ static inline void FUNC(idctSparseCol)(int16_t *col) col[56] = ((a0 - b0) >> COL_SHIFT); } +#ifndef EXTRA_SHIFT void FUNC(ff_simple_idct_put)(uint8_t *dest_, ptrdiff_t line_size, int16_t *block) { pixel *dest = (pixel *)dest_; @@ -324,3 +354,4 @@ void FUNC(ff_simple_idct)(int16_t *block) for (i = 0; i < 8; i++) FUNC(idctSparseCol)(block + i); } +#endif |