Mercurial > libavcodec.hg
comparison simple_idct.c @ 215:1fe6b64feefb libavcodec
Small simple idct improvement for Alpha by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
author | nickols_k |
---|---|
date | Mon, 21 Jan 2002 17:46:42 +0000 |
parents | 73df666cacc7 |
children | 5a8eb5cf9f92 |
comparison
equal
deleted
inserted
replaced
214:73df666cacc7 | 215:1fe6b64feefb |
---|---|
102 | 102 |
103 return 1; | 103 return 1; |
104 } | 104 } |
105 | 105 |
106 #ifdef ARCH_ALPHA | 106 #ifdef ARCH_ALPHA |
107 /* 0: all entries 0, 1: only first entry nonzero, 2: otherwise */ | |
107 static int inline idctRowCondDC(int16_t *row) | 108 static int inline idctRowCondDC(int16_t *row) |
108 { | 109 { |
109 int_fast32_t a0, a1, a2, a3, b0, b1, b2, b3; | 110 int_fast32_t a0, a1, a2, a3, b0, b1, b2, b3; |
110 uint64_t *lrow = (uint64_t *) row; | 111 uint64_t *lrow = (uint64_t *) row; |
111 | 112 |
199 row[4] = (a3 - b3) >> ROW_SHIFT; | 200 row[4] = (a3 - b3) >> ROW_SHIFT; |
200 row[5] = (a2 - b2) >> ROW_SHIFT; | 201 row[5] = (a2 - b2) >> ROW_SHIFT; |
201 row[6] = (a1 - b1) >> ROW_SHIFT; | 202 row[6] = (a1 - b1) >> ROW_SHIFT; |
202 row[7] = (a0 - b0) >> ROW_SHIFT; | 203 row[7] = (a0 - b0) >> ROW_SHIFT; |
203 | 204 |
204 return 1; | 205 return 2; |
205 } | 206 } |
206 #else /* not ARCH_ALPHA */ | 207 #else /* not ARCH_ALPHA */ |
207 static int inline idctRowCondDC (int16_t * row) | 208 static int inline idctRowCondDC (int16_t * row) |
208 { | 209 { |
209 int a0, a1, a2, a3, b0, b1, b2, b3; | 210 int a0, a1, a2, a3, b0, b1, b2, b3; |
545 { | 546 { |
546 for(i=0; i<8; i++) | 547 for(i=0; i<8; i++) |
547 idctSparse2Col(block + i); | 548 idctSparse2Col(block + i); |
548 } | 549 } |
549 #elif defined(ARCH_ALPHA) | 550 #elif defined(ARCH_ALPHA) |
550 int shortcut = 1; | 551 int rowsZero = 1; /* all rows except row 0 zero */ |
552 int rowsConstant = 1; /* all rows consist of a constant value */ | |
551 | 553 |
552 for (i = 0; i < 8; i++) { | 554 for (i = 0; i < 8; i++) { |
553 int anynonzero = idctRowCondDC(block + 8 * i); | 555 int sparseness = idctRowCondDC(block + 8 * i); |
554 if (i > 0 && anynonzero) | 556 |
555 shortcut = 0; | 557 if (i > 0 && sparseness > 0) |
556 } | 558 rowsZero = 0; |
557 | 559 if (sparseness == 2) |
558 if (shortcut) { | 560 rowsConstant = 0; |
559 idctCol2(block); | 561 } |
562 | |
563 if (rowsZero) { | |
564 idctCol2(block); | |
565 } else if (rowsConstant) { | |
566 uint64_t *lblock = (uint64_t *) block; | |
567 | |
568 idctSparseCol(block); | |
569 for (i = 0; i < 8; i++) { | |
570 uint64_t v = (uint16_t) block[i * 8]; | |
571 | |
572 v += v << 16; | |
573 v += v << 32; | |
574 lblock[0] = v; | |
575 lblock[1] = v; | |
576 lblock += 2; | |
577 } | |
560 } else { | 578 } else { |
561 for (i = 0; i < 8; i++) | 579 for (i = 0; i < 8; i++) |
562 idctSparseCol(block + i); | 580 idctSparseCol(block + i); |
563 } | 581 } |
564 #else | 582 #else |