📄 fdct_mmx.c
字号:
/* * MMX optimized forward DCT * The gcc porting is Copyright (c) 2001 Fabrice Bellard. * cleanup/optimizations are Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at> * SSE2 optimization is Copyright (c) 2004 Denes Balatoni. * * from fdctam32.c - AP922 MMX(3D-Now) forward-DCT * * Intel Application Note AP-922 - fast, precise implementation of DCT * http://developer.intel.com/vtune/cbts/appnotes.htm * * Also of inspiration: * a page about fdct at http://www.geocities.com/ssavekar/dct.htm * Skal's fdct at http://skal.planet-d.net/coding/dct.html * * This file is part of FFmpeg. * * 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. * * 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 FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */#include "libavutil/common.h"#include "libavcodec/dsputil.h"#include "mmx.h"#define ATTR_ALIGN(align) __attribute__ ((__aligned__ (align)))////////////////////////////////////////////////////////////////////////// constants for the forward DCT// -----------------------------//// Be sure to check that your compiler is aligning all constants to QWORD// (8-byte) memory boundaries! Otherwise the unaligned memory access will// severely stall MMX execution.////////////////////////////////////////////////////////////////////////#define BITS_FRW_ACC 3 //; 2 or 3 for accuracy#define SHIFT_FRW_COL BITS_FRW_ACC#define SHIFT_FRW_ROW (BITS_FRW_ACC + 17 - 3)#define RND_FRW_ROW (1 << (SHIFT_FRW_ROW-1))//#define RND_FRW_COL (1 << (SHIFT_FRW_COL-1))#define X8(x) x,x,x,x,x,x,x,x//concatenated table, for forward DCT transformationstatic const int16_t fdct_tg_all_16[24] ATTR_ALIGN(16) = { X8(13036), // tg * (2<<16) + 0.5 X8(27146), // tg * (2<<16) + 0.5 X8(-21746) // tg * (2<<16) + 0.5};static const int16_t ocos_4_16[8] ATTR_ALIGN(16) = { X8(23170) //cos * (2<<15) + 0.5};static const int16_t fdct_one_corr[8] ATTR_ALIGN(16) = { X8(1) };static const int32_t fdct_r_row[2] ATTR_ALIGN(8) = {RND_FRW_ROW, RND_FRW_ROW };static struct{ const int32_t fdct_r_row_sse2[4] ATTR_ALIGN(16);} fdct_r_row_sse2 ATTR_ALIGN(16)={{ RND_FRW_ROW, RND_FRW_ROW, RND_FRW_ROW, RND_FRW_ROW}};//static const long fdct_r_row_sse2[4] ATTR_ALIGN(16) = {RND_FRW_ROW, RND_FRW_ROW, RND_FRW_ROW, RND_FRW_ROW};static const int16_t tab_frw_01234567[] ATTR_ALIGN(8) = { // forward_dct coeff table 16384, 16384, 22725, 19266, 16384, 16384, 12873, 4520, 21407, 8867, 19266, -4520, -8867, -21407, -22725, -12873, 16384, -16384, 12873, -22725, -16384, 16384, 4520, 19266, 8867, -21407, 4520, -12873, 21407, -8867, 19266, -22725, 22725, 22725, 31521, 26722, 22725, 22725, 17855, 6270, 29692, 12299, 26722, -6270, -12299, -29692, -31521, -17855, 22725, -22725, 17855, -31521, -22725, 22725, 6270, 26722, 12299, -29692, 6270, -17855, 29692, -12299, 26722, -31521, 21407, 21407, 29692, 25172, 21407, 21407, 16819, 5906, 27969, 11585, 25172, -5906, -11585, -27969, -29692, -16819, 21407, -21407, 16819, -29692, -21407, 21407, 5906, 25172, 11585, -27969, 5906, -16819, 27969, -11585, 25172, -29692, 19266, 19266, 26722, 22654, 19266, 19266, 15137, 5315, 25172, 10426, 22654, -5315, -10426, -25172, -26722, -15137, 19266, -19266, 15137, -26722, -19266, 19266, 5315, 22654, 10426, -25172, 5315, -15137, 25172, -10426, 22654, -26722, 16384, 16384, 22725, 19266, 16384, 16384, 12873, 4520, 21407, 8867, 19266, -4520, -8867, -21407, -22725, -12873, 16384, -16384, 12873, -22725, -16384, 16384, 4520, 19266, 8867, -21407, 4520, -12873, 21407, -8867, 19266, -22725, 19266, 19266, 26722, 22654, 19266, 19266, 15137, 5315, 25172, 10426, 22654, -5315, -10426, -25172, -26722, -15137, 19266, -19266, 15137, -26722, -19266, 19266, 5315, 22654, 10426, -25172, 5315, -15137, 25172, -10426, 22654, -26722, 21407, 21407, 29692, 25172, 21407, 21407, 16819, 5906, 27969, 11585, 25172, -5906, -11585, -27969, -29692, -16819, 21407, -21407, 16819, -29692, -21407, 21407, 5906, 25172, 11585, -27969, 5906, -16819, 27969, -11585, 25172, -29692, 22725, 22725, 31521, 26722, 22725, 22725, 17855, 6270, 29692, 12299, 26722, -6270, -12299, -29692, -31521, -17855, 22725, -22725, 17855, -31521, -22725, 22725, 6270, 26722, 12299, -29692, 6270, -17855, 29692, -12299, 26722, -31521,};static struct{ const int16_t tab_frw_01234567_sse2[256] ATTR_ALIGN(16);} tab_frw_01234567_sse2 ATTR_ALIGN(16) ={{//static const int16_t tab_frw_01234567_sse2[] ATTR_ALIGN(16) = { // forward_dct coeff table#define TABLE_SSE2 C4, C4, C1, C3, -C6, -C2, -C1, -C5, \ C4, C4, C5, C7, C2, C6, C3, -C7, \ -C4, C4, C7, C3, C6, -C2, C7, -C5, \ C4, -C4, C5, -C1, C2, -C6, C3, -C1,// c1..c7 * cos(pi/4) * 2^15#define C1 22725#define C2 21407#define C3 19266#define C4 16384#define C5 12873#define C6 8867#define C7 4520TABLE_SSE2#undef C1#undef C2#undef C3#undef C4#undef C5#undef C6#undef C7#define C1 31521#define C2 29692#define C3 26722#define C4 22725#define C5 17855#define C6 12299#define C7 6270TABLE_SSE2#undef C1#undef C2#undef C3#undef C4#undef C5#undef C6#undef C7#define C1 29692#define C2 27969#define C3 25172#define C4 21407#define C5 16819#define C6 11585#define C7 5906TABLE_SSE2#undef C1#undef C2#undef C3#undef C4#undef C5#undef C6#undef C7#define C1 26722#define C2 25172#define C3 22654#define C4 19266#define C5 15137#define C6 10426#define C7 5315TABLE_SSE2#undef C1#undef C2#undef C3#undef C4#undef C5#undef C6#undef C7#define C1 22725#define C2 21407#define C3 19266#define C4 16384#define C5 12873#define C6 8867#define C7 4520TABLE_SSE2#undef C1#undef C2#undef C3#undef C4#undef C5#undef C6#undef C7#define C1 26722#define C2 25172#define C3 22654#define C4 19266#define C5 15137#define C6 10426#define C7 5315TABLE_SSE2#undef C1#undef C2#undef C3#undef C4#undef C5#undef C6#undef C7#define C1 29692#define C2 27969#define C3 25172#define C4 21407#define C5 16819#define C6 11585#define C7 5906TABLE_SSE2#undef C1#undef C2#undef C3#undef C4#undef C5#undef C6#undef C7#define C1 31521#define C2 29692#define C3 26722#define C4 22725#define C5 17855#define C6 12299#define C7 6270
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -