comparison simple_idct.c @ 479:40ffce2cb6ef libavcodec

added inlined put/add functions
author bellard
date Wed, 05 Jun 2002 18:46:25 +0000
parents ec13b0a726c3
children 2bf17a142cf4
comparison
equal deleted inserted replaced
478:055d9ac1584d 479:40ffce2cb6ef
20 /* 20 /*
21 based upon some outcommented c code from mpeg2dec (idct_mmx.c 21 based upon some outcommented c code from mpeg2dec (idct_mmx.c
22 written by Aaron Holtzman <aholtzma@ess.engr.uvic.ca>) 22 written by Aaron Holtzman <aholtzma@ess.engr.uvic.ca>)
23 */ 23 */
24 #include "avcodec.h" 24 #include "avcodec.h"
25 25 #include "dsputil.h"
26 #include "simple_idct.h" 26 #include "simple_idct.h"
27 27
28 #if 0 28 #if 0
29 #define W1 2841 /* 2048*sqrt (2)*cos (1*pi/16) */ 29 #define W1 2841 /* 2048*sqrt (2)*cos (1*pi/16) */
30 #define W2 2676 /* 2048*sqrt (2)*cos (2*pi/16) */ 30 #define W2 2676 /* 2048*sqrt (2)*cos (2*pi/16) */
259 row[3] = (a3 + b3) >> ROW_SHIFT; 259 row[3] = (a3 + b3) >> ROW_SHIFT;
260 row[4] = (a3 - b3) >> ROW_SHIFT; 260 row[4] = (a3 - b3) >> ROW_SHIFT;
261 } 261 }
262 #endif /* not ARCH_ALPHA */ 262 #endif /* not ARCH_ALPHA */
263 263
264 static inline void idctSparseCol (int16_t * col) 264 static inline void idctSparseColPut (UINT8 *dest, int line_size,
265 int16_t * col)
265 { 266 {
266 int a0, a1, a2, a3, b0, b1, b2, b3; 267 int a0, a1, a2, a3, b0, b1, b2, b3;
268 UINT8 *cm = cropTbl + MAX_NEG_CROP;
267 269
268 /* XXX: I did that only to give same values as previous code */ 270 /* XXX: I did that only to give same values as previous code */
269 a0 = W4 * (col[8*0] + ((1<<(COL_SHIFT-1))/W4)); 271 a0 = W4 * (col[8*0] + ((1<<(COL_SHIFT-1))/W4));
270 a1 = a0; 272 a1 = a0;
271 a2 = a0; 273 a2 = a0;
312 MAC16(b1, - W5, col[8*7]); 314 MAC16(b1, - W5, col[8*7]);
313 MAC16(b2, + W3, col[8*7]); 315 MAC16(b2, + W3, col[8*7]);
314 MAC16(b3, - W1, col[8*7]); 316 MAC16(b3, - W1, col[8*7]);
315 } 317 }
316 318
317 col[8*0] = (a0 + b0) >> COL_SHIFT; 319 dest[0] = cm[(a0 + b0) >> COL_SHIFT];
318 col[8*7] = (a0 - b0) >> COL_SHIFT; 320 dest += line_size;
319 col[8*1] = (a1 + b1) >> COL_SHIFT; 321 dest[0] = cm[(a1 + b1) >> COL_SHIFT];
320 col[8*6] = (a1 - b1) >> COL_SHIFT; 322 dest += line_size;
321 col[8*2] = (a2 + b2) >> COL_SHIFT; 323 dest[0] = cm[(a2 + b2) >> COL_SHIFT];
322 col[8*5] = (a2 - b2) >> COL_SHIFT; 324 dest += line_size;
323 col[8*3] = (a3 + b3) >> COL_SHIFT; 325 dest[0] = cm[(a3 + b3) >> COL_SHIFT];
324 col[8*4] = (a3 - b3) >> COL_SHIFT; 326 dest += line_size;
327 dest[0] = cm[(a3 - b3) >> COL_SHIFT];
328 dest += line_size;
329 dest[0] = cm[(a2 - b2) >> COL_SHIFT];
330 dest += line_size;
331 dest[0] = cm[(a1 - b1) >> COL_SHIFT];
332 dest += line_size;
333 dest[0] = cm[(a0 - b0) >> COL_SHIFT];
334 }
335
336 static inline void idctSparseColAdd (UINT8 *dest, int line_size,
337 int16_t * col)
338 {
339 int a0, a1, a2, a3, b0, b1, b2, b3;
340 UINT8 *cm = cropTbl + MAX_NEG_CROP;
341
342 /* XXX: I did that only to give same values as previous code */
343 a0 = W4 * (col[8*0] + ((1<<(COL_SHIFT-1))/W4));
344 a1 = a0;
345 a2 = a0;
346 a3 = a0;
347
348 a0 += + W2*col[8*2];
349 a1 += + W6*col[8*2];
350 a2 += - W6*col[8*2];
351 a3 += - W2*col[8*2];
352
353 MUL16(b0, W1, col[8*1]);
354 MUL16(b1, W3, col[8*1]);
355 MUL16(b2, W5, col[8*1]);
356 MUL16(b3, W7, col[8*1]);
357
358 MAC16(b0, + W3, col[8*3]);
359 MAC16(b1, - W7, col[8*3]);
360 MAC16(b2, - W1, col[8*3]);
361 MAC16(b3, - W5, col[8*3]);
362
363 if(col[8*4]){
364 a0 += + W4*col[8*4];
365 a1 += - W4*col[8*4];
366 a2 += - W4*col[8*4];
367 a3 += + W4*col[8*4];
368 }
369
370 if (col[8*5]) {
371 MAC16(b0, + W5, col[8*5]);
372 MAC16(b1, - W1, col[8*5]);
373 MAC16(b2, + W7, col[8*5]);
374 MAC16(b3, + W3, col[8*5]);
375 }
376
377 if(col[8*6]){
378 a0 += + W6*col[8*6];
379 a1 += - W2*col[8*6];
380 a2 += + W2*col[8*6];
381 a3 += - W6*col[8*6];
382 }
383
384 if (col[8*7]) {
385 MAC16(b0, + W7, col[8*7]);
386 MAC16(b1, - W5, col[8*7]);
387 MAC16(b2, + W3, col[8*7]);
388 MAC16(b3, - W1, col[8*7]);
389 }
390
391 dest[0] = cm[dest[0] + ((a0 + b0) >> COL_SHIFT)];
392 dest += line_size;
393 dest[0] = cm[dest[0] + ((a1 + b1) >> COL_SHIFT)];
394 dest += line_size;
395 dest[0] = cm[dest[0] + ((a2 + b2) >> COL_SHIFT)];
396 dest += line_size;
397 dest[0] = cm[dest[0] + ((a3 + b3) >> COL_SHIFT)];
398 dest += line_size;
399 dest[0] = cm[dest[0] + ((a3 - b3) >> COL_SHIFT)];
400 dest += line_size;
401 dest[0] = cm[dest[0] + ((a2 - b2) >> COL_SHIFT)];
402 dest += line_size;
403 dest[0] = cm[dest[0] + ((a1 - b1) >> COL_SHIFT)];
404 dest += line_size;
405 dest[0] = cm[dest[0] + ((a0 - b0) >> COL_SHIFT)];
325 } 406 }
326 407
327 #ifdef ARCH_ALPHA 408 #ifdef ARCH_ALPHA
328 /* If all rows but the first one are zero after row transformation, 409 /* If all rows but the first one are zero after row transformation,
329 all rows will be identical after column transformation. */ 410 all rows will be identical after column transformation. */
387 for (i = 0; i < 8; i++) 468 for (i = 0; i < 8; i++)
388 idctSparseCol(block + i); 469 idctSparseCol(block + i);
389 } 470 }
390 } 471 }
391 472
392 #else 473 /* XXX: suppress this mess */
393 474 void simple_idct_put(UINT8 *dest, int line_size, DCTELEM *block)
394 void simple_idct (short *block) 475 {
476 simple_idct(block);
477 put_pixels_clamped(block, dest, line_size);
478 }
479
480 void simple_idct_add(UINT8 *dest, int line_size, DCTELEM *block)
481 {
482 simple_idct(block);
483 add_pixels_clamped(block, dest, line_size);
484 }
485
486 #else
487
488 void simple_idct_put(UINT8 *dest, int line_size, INT16 *block)
395 { 489 {
396 int i; 490 int i;
397 for(i=0; i<8; i++) 491 for(i=0; i<8; i++)
398 idctRowCondDC(block + i*8); 492 idctRowCondDC(block + i*8);
399 493
400 for(i=0; i<8; i++) 494 for(i=0; i<8; i++)
401 idctSparseCol(block + i); 495 idctSparseColPut(dest + i, line_size, block + i);
496 }
497
498 void simple_idct_add(UINT8 *dest, int line_size, INT16 *block)
499 {
500 int i;
501 for(i=0; i<8; i++)
502 idctRowCondDC(block + i*8);
503
504 for(i=0; i<8; i++)
505 idctSparseColAdd(dest + i, line_size, block + i);
402 } 506 }
403 507
404 #endif 508 #endif
405 509
406 #undef COL_SHIFT 510 #undef COL_SHIFT