yading@10: /* yading@10: * Simple IDCT MMX yading@10: * yading@10: * Copyright (c) 2001, 2002 Michael Niedermayer yading@10: * yading@10: * This file is part of FFmpeg. yading@10: * yading@10: * FFmpeg is free software; you can redistribute it and/or yading@10: * modify it under the terms of the GNU Lesser General Public yading@10: * License as published by the Free Software Foundation; either yading@10: * version 2.1 of the License, or (at your option) any later version. yading@10: * yading@10: * FFmpeg is distributed in the hope that it will be useful, yading@10: * but WITHOUT ANY WARRANTY; without even the implied warranty of yading@10: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU yading@10: * Lesser General Public License for more details. yading@10: * yading@10: * You should have received a copy of the GNU Lesser General Public yading@10: * License along with FFmpeg; if not, write to the Free Software yading@10: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA yading@10: */ yading@10: #include "libavcodec/simple_idct.h" yading@10: #include "libavutil/mem.h" yading@10: #include "dsputil_mmx.h" yading@10: yading@10: #if HAVE_INLINE_ASM yading@10: yading@10: /* yading@10: 23170.475006 yading@10: 22725.260826 yading@10: 21406.727617 yading@10: 19265.545870 yading@10: 16384.000000 yading@10: 12872.826198 yading@10: 8866.956905 yading@10: 4520.335430 yading@10: */ yading@10: #define C0 23170 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 yading@10: #define C1 22725 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 yading@10: #define C2 21407 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 yading@10: #define C3 19266 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 yading@10: #define C4 16383 //cos(i*M_PI/16)*sqrt(2)*(1<<14) - 0.5 yading@10: #define C5 12873 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 yading@10: #define C6 8867 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 yading@10: #define C7 4520 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 yading@10: yading@10: #define ROW_SHIFT 11 yading@10: #define COL_SHIFT 20 // 6 yading@10: yading@10: DECLARE_ASM_CONST(8, uint64_t, wm1010)= 0xFFFF0000FFFF0000ULL; yading@10: DECLARE_ASM_CONST(8, uint64_t, d40000)= 0x0000000000040000ULL; yading@10: yading@10: DECLARE_ALIGNED(8, static const int16_t, coeffs)[]= { yading@10: 1<<(ROW_SHIFT-1), 0, 1<<(ROW_SHIFT-1), 0, yading@10: // 1<<(COL_SHIFT-1), 0, 1<<(COL_SHIFT-1), 0, yading@10: // 0, 1<<(COL_SHIFT-1-16), 0, 1<<(COL_SHIFT-1-16), yading@10: 1<<(ROW_SHIFT-1), 1, 1<<(ROW_SHIFT-1), 0, yading@10: // the 1 = ((1<<(COL_SHIFT-1))/C4)<