1 |
/* |
/***************************************************************************** |
2 |
* Simple IDCT |
* |
3 |
|
* XVID MPEG-4 VIDEO CODEC |
4 |
|
* - Inverse DCT (More precise version) - |
5 |
* |
* |
6 |
* Copyright (c) 2001 Michael Niedermayer <michaelni@gmx.at> |
* Copyright (c) 2001 Michael Niedermayer <michaelni@gmx.at> |
7 |
* |
* |
8 |
* This library is free software; you can redistribute it and/or |
* Originally distributed under the GNU LGPL License (ffmpeg). |
9 |
* modify it under the terms of the GNU Lesser General Public |
* It is licensed under the GNU GPL for the XviD tree. |
|
* License as published by the Free Software Foundation; either |
|
|
* version 2 of the License, or (at your option) any later version. |
|
10 |
* |
* |
11 |
* This library is distributed in the hope that it will be useful, |
* This program is free software ; you can redistribute it and/or modify |
12 |
|
* it under the terms of the GNU General Public License as published by |
13 |
|
* the Free Software Foundation ; either version 2 of the License, or |
14 |
|
* (at your option) any later version. |
15 |
|
* |
16 |
|
* This program is distributed in the hope that it will be useful, |
17 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
18 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
19 |
* Lesser General Public License for more details. |
* GNU General Public License for more details. |
20 |
* |
* |
21 |
* You should have received a copy of the GNU Lesser General Public |
* You should have received a copy of the GNU General Public License |
22 |
* License along with this library; if not, write to the Free Software |
* along with this program ; if not, write to the Free Software |
23 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
24 |
*/ |
* |
25 |
|
* $Id: simple_idct.c,v 1.4 2004-03-22 22:36:23 edgomez Exp $ |
26 |
|
* |
27 |
|
****************************************************************************/ |
28 |
|
|
29 |
/* |
/* |
30 |
based upon some outcommented c code from mpeg2dec (idct_mmx.c |
based upon some outcommented c code from mpeg2dec (idct_mmx.c |
31 |
written by Aaron Holtzman <aholtzma@ess.engr.uvic.ca>) |
written by Aaron Holtzman <aholtzma@ess.engr.uvic.ca>) |
32 |
*/ |
*/ |
33 |
|
|
34 |
#include "../portab.h" |
#include "../portab.h" |
35 |
#include "idct.h" |
#include "idct.h" |
36 |
|
|
45 |
#define ROW_SHIFT 8 |
#define ROW_SHIFT 8 |
46 |
#define COL_SHIFT 17 |
#define COL_SHIFT 17 |
47 |
#else |
#else |
48 |
#define W1 22725 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 |
#define W1 22725 /* cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 */ |
49 |
#define W2 21407 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 |
#define W2 21407 /* cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 */ |
50 |
#define W3 19266 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 |
#define W3 19266 /* cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 */ |
51 |
#define W4 16383 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 |
#define W4 16383 /* cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 */ |
52 |
#define W5 12873 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 |
#define W5 12873 /* cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 */ |
53 |
#define W6 8867 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 |
#define W6 8867 /* cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 */ |
54 |
#define W7 4520 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 |
#define W7 4520 /* cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 */ |
55 |
#define ROW_SHIFT 11 |
#define ROW_SHIFT 11 |
56 |
#define COL_SHIFT 20 // 6 |
#define COL_SHIFT 20 /* 6 */ |
57 |
#endif |
#endif |
58 |
|
|
59 |
#if defined(ARCH_IS_PPC) |
#if defined(ARCH_IS_PPC) |
240 |
for(i=0; i<8; i++) |
for(i=0; i<8; i++) |
241 |
idctSparseCol(block + i); |
idctSparseCol(block + i); |
242 |
} |
} |
|
|
|
|
|
|
|
/* Input permutation for the simple_idct_mmx */ |
|
|
static const uint8_t simple_mmx_permutation[64]={ |
|
|
0x00, 0x08, 0x04, 0x09, 0x01, 0x0C, 0x05, 0x0D, |
|
|
0x10, 0x18, 0x14, 0x19, 0x11, 0x1C, 0x15, 0x1D, |
|
|
0x20, 0x28, 0x24, 0x29, 0x21, 0x2C, 0x25, 0x2D, |
|
|
0x12, 0x1A, 0x16, 0x1B, 0x13, 0x1E, 0x17, 0x1F, |
|
|
0x02, 0x0A, 0x06, 0x0B, 0x03, 0x0E, 0x07, 0x0F, |
|
|
0x30, 0x38, 0x34, 0x39, 0x31, 0x3C, 0x35, 0x3D, |
|
|
0x22, 0x2A, 0x26, 0x2B, 0x23, 0x2E, 0x27, 0x2F, |
|
|
0x32, 0x3A, 0x36, 0x3B, 0x33, 0x3E, 0x37, 0x3F, |
|
|
}; |
|
|
|
|
|
#if defined(ARCH_IS_IA32) |
|
|
/* wrapper function, as simple_idct_mmx expects data to be permutated */ |
|
|
void simple_idct_mmx2(int16_t * const block) |
|
|
{ |
|
|
int16_t tmp[64]; |
|
|
int i; |
|
|
|
|
|
for(i=0;i<64;i++) tmp[simple_mmx_permutation[i]] = block[i]; |
|
|
simple_idct_mmx(tmp); |
|
|
for(i=0;i<64;i++) block[i] = tmp[i]; |
|
|
} |
|
|
#endif |
|