Mercurial > libavcodec.hg
comparison libpostproc/postprocess_template.c @ 2036:6a6c678517b3 libavcodec
altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
| author | michael |
|---|---|
| date | Wed, 26 May 2004 20:15:15 +0000 |
| parents | 4225c131a2eb |
| children | 98d8283534bb |
comparison
equal
deleted
inserted
replaced
| 2035:e1b69326ae36 | 2036:6a6c678517b3 |
|---|---|
| 168 | 168 |
| 169 /** | 169 /** |
| 170 * Do a vertical low pass filter on the 8x16 block (only write to the 8x8 block in the middle) | 170 * Do a vertical low pass filter on the 8x16 block (only write to the 8x8 block in the middle) |
| 171 * using the 9-Tap Filter (1,1,2,2,4,2,2,1,1)/16 | 171 * using the 9-Tap Filter (1,1,2,2,4,2,2,1,1)/16 |
| 172 */ | 172 */ |
| 173 #ifndef HAVE_ALTIVEC | |
| 173 static inline void RENAME(doVertLowPass)(uint8_t *src, int stride, PPContext *c) | 174 static inline void RENAME(doVertLowPass)(uint8_t *src, int stride, PPContext *c) |
| 174 { | 175 { |
| 175 #if defined (HAVE_MMX2) || defined (HAVE_3DNOW) | 176 #if defined (HAVE_MMX2) || defined (HAVE_3DNOW) |
| 176 src+= stride*3; | 177 src+= stride*3; |
| 177 asm volatile( //"movv %0 %1 %2\n\t" | 178 asm volatile( //"movv %0 %1 %2\n\t" |
| 338 | 339 |
| 339 src++; | 340 src++; |
| 340 } | 341 } |
| 341 #endif | 342 #endif |
| 342 } | 343 } |
| 344 #endif //HAVE_ALTIVEC | |
| 343 | 345 |
| 344 #if 0 | 346 #if 0 |
| 345 /** | 347 /** |
| 346 * Experimental implementation of the filter (Algorithm 1) described in a paper from Ramkishor & Karandikar | 348 * Experimental implementation of the filter (Algorithm 1) described in a paper from Ramkishor & Karandikar |
| 347 * values are correctly clipped (MMX2) | 349 * values are correctly clipped (MMX2) |
| 580 src++; | 582 src++; |
| 581 } | 583 } |
| 582 #endif | 584 #endif |
| 583 } | 585 } |
| 584 | 586 |
| 587 #ifndef HAVE_ALTIVEC | |
| 585 static inline void RENAME(doVertDefFilter)(uint8_t src[], int stride, PPContext *c) | 588 static inline void RENAME(doVertDefFilter)(uint8_t src[], int stride, PPContext *c) |
| 586 { | 589 { |
| 587 #if defined (HAVE_MMX2) || defined (HAVE_3DNOW) | 590 #if defined (HAVE_MMX2) || defined (HAVE_3DNOW) |
| 588 /* | 591 /* |
| 589 uint8_t tmp[16]; | 592 uint8_t tmp[16]; |
| 1147 } | 1150 } |
| 1148 src++; | 1151 src++; |
| 1149 } | 1152 } |
| 1150 #endif | 1153 #endif |
| 1151 } | 1154 } |
| 1152 | 1155 #endif //HAVE_ALTIVEC |
| 1156 | |
| 1157 #ifndef HAVE_ALTIVEC | |
| 1153 static inline void RENAME(dering)(uint8_t src[], int stride, PPContext *c) | 1158 static inline void RENAME(dering)(uint8_t src[], int stride, PPContext *c) |
| 1154 { | 1159 { |
| 1155 #if defined (HAVE_MMX2) || defined (HAVE_3DNOW) | 1160 #if defined (HAVE_MMX2) || defined (HAVE_3DNOW) |
| 1156 asm volatile( | 1161 asm volatile( |
| 1157 "pxor %%mm6, %%mm6 \n\t" | 1162 "pxor %%mm6, %%mm6 \n\t" |
| 1503 // src[0] = src[7]=src[stride*7]=src[stride*7 + 7]=255; | 1508 // src[0] = src[7]=src[stride*7]=src[stride*7 + 7]=255; |
| 1504 } | 1509 } |
| 1505 #endif | 1510 #endif |
| 1506 #endif | 1511 #endif |
| 1507 } | 1512 } |
| 1513 #endif //HAVE_ALTIVEC | |
| 1508 | 1514 |
| 1509 /** | 1515 /** |
| 1510 * Deinterlaces the given block by linearly interpolating every second line. | 1516 * Deinterlaces the given block by linearly interpolating every second line. |
| 1511 * will be called for every 8x8 block and can read & write from line 4-15 | 1517 * will be called for every 8x8 block and can read & write from line 4-15 |
| 1512 * lines 0-3 have been passed through the deblock / dering filters allready, but can be read too | 1518 * lines 0-3 have been passed through the deblock / dering filters allready, but can be read too |
| 3132 #else | 3138 #else |
| 3133 if(mode & H_X1_FILTER) | 3139 if(mode & H_X1_FILTER) |
| 3134 horizX1Filter(dstBlock-4, stride, QP); | 3140 horizX1Filter(dstBlock-4, stride, QP); |
| 3135 else if(mode & H_DEBLOCK) | 3141 else if(mode & H_DEBLOCK) |
| 3136 { | 3142 { |
| 3137 if( isHorizDC(dstBlock-4, stride, &c)) | 3143 const int t= RENAME(horizClassify)(dstBlock-4, stride, &c); |
| 3138 { | 3144 |
| 3139 if(isHorizMinMaxOk(dstBlock-4, stride, QP)) | 3145 if(t==1) |
| 3140 doHorizLowPass(dstBlock-4, stride, QP); | 3146 RENAME(doHorizLowPass)(dstBlock-4, stride, &c); |
| 3141 } | 3147 else if(t==2) |
| 3142 else | 3148 RENAME(doHorizDefFilter)(dstBlock-4, stride, &c); |
| 3143 doHorizDefFilter(dstBlock-4, stride, QP); | |
| 3144 } | 3149 } |
| 3145 #endif | 3150 #endif |
| 3146 if(mode & DERING) | 3151 if(mode & DERING) |
| 3147 { | 3152 { |
| 3148 //FIXME filter first line | 3153 //FIXME filter first line |
