--- simple_idct.c 2003/02/15 15:22:18 1.2 +++ simple_idct.c 2003/10/01 23:23:01 1.2.2.4 @@ -1,26 +1,36 @@ -/* - * Simple IDCT +/***************************************************************************** * - * Copyright (c) 2001 Michael Niedermayer + * XVID MPEG-4 VIDEO CODEC + * - Inverse DCT (More precise version) - * - * This library 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 of the License, or (at your option) any later version. + * Copyright (c) 2001 Michael Niedermayer * - * This library 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. + * Originally distributed under the GNU LGPL License (ffmpeg). + * It is licensed under the GNU GPL for the XviD tree. * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ + * This program is free software ; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation ; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program ; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id: simple_idct.c,v 1.2.2.4 2003/10/01 23:23:01 edgomez Exp $ + * + ****************************************************************************/ + /* based upon some outcommented c code from mpeg2dec (idct_mmx.c - written by Aaron Holtzman ) + written by Aaron Holtzman ) */ + #include "../portab.h" #include "idct.h" @@ -35,15 +45,15 @@ #define ROW_SHIFT 8 #define COL_SHIFT 17 #else -#define W1 22725 //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 -#define W3 19266 //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 -#define W5 12873 //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 -#define W7 4520 //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 */ +#define W2 21407 /* 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 */ +#define W4 16383 /* 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 */ +#define W6 8867 /* 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 */ #define ROW_SHIFT 11 -#define COL_SHIFT 20 // 6 +#define COL_SHIFT 20 /* 6 */ #endif #if defined(ARCH_IS_PPC) @@ -81,7 +91,7 @@ #else #define ROW0_MASK 0xffffLL #endif - if ( ((((uint64_t *)row)[0] & ~ROW0_MASK) | + if ( ((((uint64_t *)row)[0] & ~ROW0_MASK) | ((uint64_t *)row)[1]) == 0) { temp = (row[0] << 3) & 0xffff; temp += temp << 16; @@ -93,7 +103,7 @@ #else if (!(((uint32_t*)row)[1] | ((uint32_t*)row)[2] | - ((uint32_t*)row)[3] | + ((uint32_t*)row)[3] | row[1])) { temp = (row[0] << 3) & 0xffff; temp += temp << 16; @@ -136,13 +146,13 @@ MAC16(b0, W5, row[5]); MAC16(b0, W7, row[7]); - + MAC16(b1, -W1, row[5]); MAC16(b1, -W5, row[7]); - + MAC16(b2, W7, row[5]); MAC16(b2, W3, row[7]); - + MAC16(b3, W3, row[5]); MAC16(b3, -W1, row[7]); } @@ -226,33 +236,7 @@ int i; for(i=0; i<8; i++) idctRowCondDC(block + i*8); - + for(i=0; i<8; i++) idctSparseCol(block + i); } - - -/* 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