Mercurial > cgi-bin > hgwebdir.cgi > PR > Applications > VSs > VSs__H264__App
diff libavcodec/simple_idct.c @ 2:897f711a7157
rearrange to work with autoconf
| author | Nina Engelhardt <nengel@mailbox.tu-berlin.de> |
|---|---|
| date | Tue, 25 Sep 2012 15:55:33 +0200 |
| parents | |
| children |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/libavcodec/simple_idct.c Tue Sep 25 15:55:33 2012 +0200 1.3 @@ -0,0 +1,372 @@ 1.4 +/* 1.5 + * Simple IDCT 1.6 + * 1.7 + * Copyright (c) 2001 Michael Niedermayer <michaelni@gmx.at> 1.8 + * 1.9 + * This file is part of FFmpeg. 1.10 + * 1.11 + * FFmpeg is free software; you can redistribute it and/or 1.12 + * modify it under the terms of the GNU Lesser General Public 1.13 + * License as published by the Free Software Foundation; either 1.14 + * version 2.1 of the License, or (at your option) any later version. 1.15 + * 1.16 + * FFmpeg is distributed in the hope that it will be useful, 1.17 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 1.18 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1.19 + * Lesser General Public License for more details. 1.20 + * 1.21 + * You should have received a copy of the GNU Lesser General Public 1.22 + * License along with FFmpeg; if not, write to the Free Software 1.23 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 1.24 + */ 1.25 + 1.26 +/** 1.27 + * @file 1.28 + * simpleidct in C. 1.29 + */ 1.30 + 1.31 +/* 1.32 + based upon some outcommented c code from mpeg2dec (idct_mmx.c 1.33 + written by Aaron Holtzman <aholtzma@ess.engr.uvic.ca>) 1.34 + */ 1.35 +#include "avcodec.h" 1.36 +#include "dsputil.h" 1.37 +#include "mathops.h" 1.38 +#include "simple_idct.h" 1.39 + 1.40 +#if 0 1.41 +#define W1 2841 /* 2048*sqrt (2)*cos (1*pi/16) */ 1.42 +#define W2 2676 /* 2048*sqrt (2)*cos (2*pi/16) */ 1.43 +#define W3 2408 /* 2048*sqrt (2)*cos (3*pi/16) */ 1.44 +#define W4 2048 /* 2048*sqrt (2)*cos (4*pi/16) */ 1.45 +#define W5 1609 /* 2048*sqrt (2)*cos (5*pi/16) */ 1.46 +#define W6 1108 /* 2048*sqrt (2)*cos (6*pi/16) */ 1.47 +#define W7 565 /* 2048*sqrt (2)*cos (7*pi/16) */ 1.48 +#define ROW_SHIFT 8 1.49 +#define COL_SHIFT 17 1.50 +#else 1.51 +#define W1 22725 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 1.52 +#define W2 21407 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 1.53 +#define W3 19266 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 1.54 +#define W4 16383 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 1.55 +#define W5 12873 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 1.56 +#define W6 8867 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 1.57 +#define W7 4520 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 1.58 +#define ROW_SHIFT 11 1.59 +#define COL_SHIFT 20 // 6 1.60 +#endif 1.61 + 1.62 +static inline void idctRowCondDC (DCTELEM * row) 1.63 +{ 1.64 + int a0, a1, a2, a3, b0, b1, b2, b3; 1.65 + uint64_t temp; 1.66 + 1.67 +#if HAVE_BIGENDIAN 1.68 +#define ROW0_MASK 0xffff000000000000LL 1.69 +#else 1.70 +#define ROW0_MASK 0xffffLL 1.71 +#endif 1.72 + if(sizeof(DCTELEM)==2){ 1.73 + if ( ((((uint64_t *)row)[0] & ~ROW0_MASK) | 1.74 + ((uint64_t *)row)[1]) == 0) { 1.75 + temp = (row[0] << 3) & 0xffff; 1.76 + temp += temp << 16; 1.77 + temp += temp << 32; 1.78 + ((uint64_t *)row)[0] = temp; 1.79 + ((uint64_t *)row)[1] = temp; 1.80 + return; 1.81 + } 1.82 + }else{ 1.83 + if (!(row[1]|row[2]|row[3]|row[4]|row[5]|row[6]|row[7])) { 1.84 + row[0]=row[1]=row[2]=row[3]=row[4]=row[5]=row[6]=row[7]= row[0] << 3; 1.85 + return; 1.86 + } 1.87 + } 1.88 + 1.89 + a0 = (W4 * row[0]) + (1 << (ROW_SHIFT - 1)); 1.90 + a1 = a0; 1.91 + a2 = a0; 1.92 + a3 = a0; 1.93 + 1.94 + /* no need to optimize : gcc does it */ 1.95 + a0 += W2 * row[2]; 1.96 + a1 += W6 * row[2]; 1.97 + a2 -= W6 * row[2]; 1.98 + a3 -= W2 * row[2]; 1.99 + 1.100 + b0 = MUL16(W1, row[1]); 1.101 + MAC16(b0, W3, row[3]); 1.102 + b1 = MUL16(W3, row[1]); 1.103 + MAC16(b1, -W7, row[3]); 1.104 + b2 = MUL16(W5, row[1]); 1.105 + MAC16(b2, -W1, row[3]); 1.106 + b3 = MUL16(W7, row[1]); 1.107 + MAC16(b3, -W5, row[3]); 1.108 + 1.109 + temp = ((uint64_t*)row)[1]; 1.110 + 1.111 + if (temp != 0) { 1.112 + a0 += W4*row[4] + W6*row[6]; 1.113 + a1 += - W4*row[4] - W2*row[6]; 1.114 + a2 += - W4*row[4] + W2*row[6]; 1.115 + a3 += W4*row[4] - W6*row[6]; 1.116 + 1.117 + MAC16(b0, W5, row[5]); 1.118 + MAC16(b0, W7, row[7]); 1.119 + 1.120 + MAC16(b1, -W1, row[5]); 1.121 + MAC16(b1, -W5, row[7]); 1.122 + 1.123 + MAC16(b2, W7, row[5]); 1.124 + MAC16(b2, W3, row[7]); 1.125 + 1.126 + MAC16(b3, W3, row[5]); 1.127 + MAC16(b3, -W1, row[7]); 1.128 + } 1.129 + 1.130 + row[0] = (a0 + b0) >> ROW_SHIFT; 1.131 + row[7] = (a0 - b0) >> ROW_SHIFT; 1.132 + row[1] = (a1 + b1) >> ROW_SHIFT; 1.133 + row[6] = (a1 - b1) >> ROW_SHIFT; 1.134 + row[2] = (a2 + b2) >> ROW_SHIFT; 1.135 + row[5] = (a2 - b2) >> ROW_SHIFT; 1.136 + row[3] = (a3 + b3) >> ROW_SHIFT; 1.137 + row[4] = (a3 - b3) >> ROW_SHIFT; 1.138 +} 1.139 + 1.140 +static inline void idctSparseColPut (uint8_t *dest, int line_size, 1.141 + DCTELEM * col) 1.142 +{ 1.143 + int a0, a1, a2, a3, b0, b1, b2, b3; 1.144 + uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 1.145 + 1.146 + /* XXX: I did that only to give same values as previous code */ 1.147 + a0 = W4 * (col[8*0] + ((1<<(COL_SHIFT-1))/W4)); 1.148 + a1 = a0; 1.149 + a2 = a0; 1.150 + a3 = a0; 1.151 + 1.152 + a0 += + W2*col[8*2]; 1.153 + a1 += + W6*col[8*2]; 1.154 + a2 += - W6*col[8*2]; 1.155 + a3 += - W2*col[8*2]; 1.156 + 1.157 + b0 = MUL16(W1, col[8*1]); 1.158 + b1 = MUL16(W3, col[8*1]); 1.159 + b2 = MUL16(W5, col[8*1]); 1.160 + b3 = MUL16(W7, col[8*1]); 1.161 + 1.162 + MAC16(b0, + W3, col[8*3]); 1.163 + MAC16(b1, - W7, col[8*3]); 1.164 + MAC16(b2, - W1, col[8*3]); 1.165 + MAC16(b3, - W5, col[8*3]); 1.166 + 1.167 + if(col[8*4]){ 1.168 + a0 += + W4*col[8*4]; 1.169 + a1 += - W4*col[8*4]; 1.170 + a2 += - W4*col[8*4]; 1.171 + a3 += + W4*col[8*4]; 1.172 + } 1.173 + 1.174 + if (col[8*5]) { 1.175 + MAC16(b0, + W5, col[8*5]); 1.176 + MAC16(b1, - W1, col[8*5]); 1.177 + MAC16(b2, + W7, col[8*5]); 1.178 + MAC16(b3, + W3, col[8*5]); 1.179 + } 1.180 + 1.181 + if(col[8*6]){ 1.182 + a0 += + W6*col[8*6]; 1.183 + a1 += - W2*col[8*6]; 1.184 + a2 += + W2*col[8*6]; 1.185 + a3 += - W6*col[8*6]; 1.186 + } 1.187 + 1.188 + if (col[8*7]) { 1.189 + MAC16(b0, + W7, col[8*7]); 1.190 + MAC16(b1, - W5, col[8*7]); 1.191 + MAC16(b2, + W3, col[8*7]); 1.192 + MAC16(b3, - W1, col[8*7]); 1.193 + } 1.194 + 1.195 + dest[0] = cm[(a0 + b0) >> COL_SHIFT]; 1.196 + dest += line_size; 1.197 + dest[0] = cm[(a1 + b1) >> COL_SHIFT]; 1.198 + dest += line_size; 1.199 + dest[0] = cm[(a2 + b2) >> COL_SHIFT]; 1.200 + dest += line_size; 1.201 + dest[0] = cm[(a3 + b3) >> COL_SHIFT]; 1.202 + dest += line_size; 1.203 + dest[0] = cm[(a3 - b3) >> COL_SHIFT]; 1.204 + dest += line_size; 1.205 + dest[0] = cm[(a2 - b2) >> COL_SHIFT]; 1.206 + dest += line_size; 1.207 + dest[0] = cm[(a1 - b1) >> COL_SHIFT]; 1.208 + dest += line_size; 1.209 + dest[0] = cm[(a0 - b0) >> COL_SHIFT]; 1.210 +} 1.211 + 1.212 +static inline void idctSparseColAdd (uint8_t *dest, int line_size, 1.213 + DCTELEM * col) 1.214 +{ 1.215 + int a0, a1, a2, a3, b0, b1, b2, b3; 1.216 + uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 1.217 + 1.218 + /* XXX: I did that only to give same values as previous code */ 1.219 + a0 = W4 * (col[8*0] + ((1<<(COL_SHIFT-1))/W4)); 1.220 + a1 = a0; 1.221 + a2 = a0; 1.222 + a3 = a0; 1.223 + 1.224 + a0 += + W2*col[8*2]; 1.225 + a1 += + W6*col[8*2]; 1.226 + a2 += - W6*col[8*2]; 1.227 + a3 += - W2*col[8*2]; 1.228 + 1.229 + b0 = MUL16(W1, col[8*1]); 1.230 + b1 = MUL16(W3, col[8*1]); 1.231 + b2 = MUL16(W5, col[8*1]); 1.232 + b3 = MUL16(W7, col[8*1]); 1.233 + 1.234 + MAC16(b0, + W3, col[8*3]); 1.235 + MAC16(b1, - W7, col[8*3]); 1.236 + MAC16(b2, - W1, col[8*3]); 1.237 + MAC16(b3, - W5, col[8*3]); 1.238 + 1.239 + if(col[8*4]){ 1.240 + a0 += + W4*col[8*4]; 1.241 + a1 += - W4*col[8*4]; 1.242 + a2 += - W4*col[8*4]; 1.243 + a3 += + W4*col[8*4]; 1.244 + } 1.245 + 1.246 + if (col[8*5]) { 1.247 + MAC16(b0, + W5, col[8*5]); 1.248 + MAC16(b1, - W1, col[8*5]); 1.249 + MAC16(b2, + W7, col[8*5]); 1.250 + MAC16(b3, + W3, col[8*5]); 1.251 + } 1.252 + 1.253 + if(col[8*6]){ 1.254 + a0 += + W6*col[8*6]; 1.255 + a1 += - W2*col[8*6]; 1.256 + a2 += + W2*col[8*6]; 1.257 + a3 += - W6*col[8*6]; 1.258 + } 1.259 + 1.260 + if (col[8*7]) { 1.261 + MAC16(b0, + W7, col[8*7]); 1.262 + MAC16(b1, - W5, col[8*7]); 1.263 + MAC16(b2, + W3, col[8*7]); 1.264 + MAC16(b3, - W1, col[8*7]); 1.265 + } 1.266 + 1.267 + dest[0] = cm[dest[0] + ((a0 + b0) >> COL_SHIFT)]; 1.268 + dest += line_size; 1.269 + dest[0] = cm[dest[0] + ((a1 + b1) >> COL_SHIFT)]; 1.270 + dest += line_size; 1.271 + dest[0] = cm[dest[0] + ((a2 + b2) >> COL_SHIFT)]; 1.272 + dest += line_size; 1.273 + dest[0] = cm[dest[0] + ((a3 + b3) >> COL_SHIFT)]; 1.274 + dest += line_size; 1.275 + dest[0] = cm[dest[0] + ((a3 - b3) >> COL_SHIFT)]; 1.276 + dest += line_size; 1.277 + dest[0] = cm[dest[0] + ((a2 - b2) >> COL_SHIFT)]; 1.278 + dest += line_size; 1.279 + dest[0] = cm[dest[0] + ((a1 - b1) >> COL_SHIFT)]; 1.280 + dest += line_size; 1.281 + dest[0] = cm[dest[0] + ((a0 - b0) >> COL_SHIFT)]; 1.282 +} 1.283 + 1.284 +static inline void idctSparseCol (DCTELEM * col) 1.285 +{ 1.286 + int a0, a1, a2, a3, b0, b1, b2, b3; 1.287 + 1.288 + /* XXX: I did that only to give same values as previous code */ 1.289 + a0 = W4 * (col[8*0] + ((1<<(COL_SHIFT-1))/W4)); 1.290 + a1 = a0; 1.291 + a2 = a0; 1.292 + a3 = a0; 1.293 + 1.294 + a0 += + W2*col[8*2]; 1.295 + a1 += + W6*col[8*2]; 1.296 + a2 += - W6*col[8*2]; 1.297 + a3 += - W2*col[8*2]; 1.298 + 1.299 + b0 = MUL16(W1, col[8*1]); 1.300 + b1 = MUL16(W3, col[8*1]); 1.301 + b2 = MUL16(W5, col[8*1]); 1.302 + b3 = MUL16(W7, col[8*1]); 1.303 + 1.304 + MAC16(b0, + W3, col[8*3]); 1.305 + MAC16(b1, - W7, col[8*3]); 1.306 + MAC16(b2, - W1, col[8*3]); 1.307 + MAC16(b3, - W5, col[8*3]); 1.308 + 1.309 + if(col[8*4]){ 1.310 + a0 += + W4*col[8*4]; 1.311 + a1 += - W4*col[8*4]; 1.312 + a2 += - W4*col[8*4]; 1.313 + a3 += + W4*col[8*4]; 1.314 + } 1.315 + 1.316 + if (col[8*5]) { 1.317 + MAC16(b0, + W5, col[8*5]); 1.318 + MAC16(b1, - W1, col[8*5]); 1.319 + MAC16(b2, + W7, col[8*5]); 1.320 + MAC16(b3, + W3, col[8*5]); 1.321 + } 1.322 + 1.323 + if(col[8*6]){ 1.324 + a0 += + W6*col[8*6]; 1.325 + a1 += - W2*col[8*6]; 1.326 + a2 += + W2*col[8*6]; 1.327 + a3 += - W6*col[8*6]; 1.328 + } 1.329 + 1.330 + if (col[8*7]) { 1.331 + MAC16(b0, + W7, col[8*7]); 1.332 + MAC16(b1, - W5, col[8*7]); 1.333 + MAC16(b2, + W3, col[8*7]); 1.334 + MAC16(b3, - W1, col[8*7]); 1.335 + } 1.336 + 1.337 + col[0 ] = ((a0 + b0) >> COL_SHIFT); 1.338 + col[8 ] = ((a1 + b1) >> COL_SHIFT); 1.339 + col[16] = ((a2 + b2) >> COL_SHIFT); 1.340 + col[24] = ((a3 + b3) >> COL_SHIFT); 1.341 + col[32] = ((a3 - b3) >> COL_SHIFT); 1.342 + col[40] = ((a2 - b2) >> COL_SHIFT); 1.343 + col[48] = ((a1 - b1) >> COL_SHIFT); 1.344 + col[56] = ((a0 - b0) >> COL_SHIFT); 1.345 +} 1.346 + 1.347 +void ff_simple_idct_put(uint8_t *dest, int line_size, DCTELEM *block) 1.348 +{ 1.349 + int i; 1.350 + for(i=0; i<8; i++) 1.351 + idctRowCondDC(block + i*8); 1.352 + 1.353 + for(i=0; i<8; i++) 1.354 + idctSparseColPut(dest + i, line_size, block + i); 1.355 +} 1.356 + 1.357 +void ff_simple_idct_add(uint8_t *dest, int line_size, DCTELEM *block) 1.358 +{ 1.359 + int i; 1.360 + for(i=0; i<8; i++) 1.361 + idctRowCondDC(block + i*8); 1.362 + 1.363 + for(i=0; i<8; i++) 1.364 + idctSparseColAdd(dest + i, line_size, block + i); 1.365 +} 1.366 + 1.367 +void ff_simple_idct(DCTELEM *block) 1.368 +{ 1.369 + int i; 1.370 + for(i=0; i<8; i++) 1.371 + idctRowCondDC(block + i*8); 1.372 + 1.373 + for(i=0; i<8; i++) 1.374 + idctSparseCol(block + i); 1.375 +}
