Mercurial > mplayer.hg
comparison postproc/postprocess_template.c @ 4403:f3dc8bf8383a
top row bugfix
author | michael |
---|---|
date | Tue, 29 Jan 2002 04:21:27 +0000 |
parents | a4098aec828a |
children | 5c36f7890b53 |
comparison
equal
deleted
inserted
replaced
4402:67abbf501b02 | 4403:f3dc8bf8383a |
---|---|
2444 static void RENAME(postProcess)(uint8_t src[], int srcStride, uint8_t dst[], int dstStride, int width, int height, | 2444 static void RENAME(postProcess)(uint8_t src[], int srcStride, uint8_t dst[], int dstStride, int width, int height, |
2445 QP_STORE_T QPs[], int QPStride, int isColor, struct PPMode *ppMode); | 2445 QP_STORE_T QPs[], int QPStride, int isColor, struct PPMode *ppMode); |
2446 | 2446 |
2447 /** | 2447 /** |
2448 * Copies a block from src to dst and fixes the blacklevel | 2448 * Copies a block from src to dst and fixes the blacklevel |
2449 * numLines must be a multiple of 4 | |
2450 * levelFix == 0 -> dont touch the brighness & contrast | 2449 * levelFix == 0 -> dont touch the brighness & contrast |
2451 */ | 2450 */ |
2452 static inline void RENAME(blockCopy)(uint8_t dst[], int dstStride, uint8_t src[], int srcStride, | 2451 static inline void RENAME(blockCopy)(uint8_t dst[], int dstStride, uint8_t src[], int srcStride, |
2453 int levelFix) | 2452 int levelFix) |
2454 { | 2453 { |
2568 &(src[srcStride*i]), BLOCK_SIZE); | 2567 &(src[srcStride*i]), BLOCK_SIZE); |
2569 #endif | 2568 #endif |
2570 } | 2569 } |
2571 } | 2570 } |
2572 | 2571 |
2572 /** | |
2573 * Duplicates the given 8 src pixels ? times upward | |
2574 */ | |
2575 static inline void RENAME(duplicate)(uint8_t src[], int stride) | |
2576 { | |
2577 #ifdef HAVE_MMX | |
2578 asm volatile( | |
2579 "movq (%0), %%mm0 \n\t" | |
2580 "addl %1, %0 \n\t" | |
2581 "movq %%mm0, (%0) \n\t" | |
2582 "movq %%mm0, (%0, %1) \n\t" | |
2583 "movq %%mm0, (%0, %1, 2) \n\t" | |
2584 : "+r" (src) | |
2585 : "r" (-stride) | |
2586 ); | |
2587 #else | |
2588 int i; | |
2589 uint8_t *p=src; | |
2590 for(i=0; i<3; i++) | |
2591 { | |
2592 p-= stride; | |
2593 memcpy(p, src, 8); | |
2594 } | |
2595 #endif | |
2596 } | |
2573 | 2597 |
2574 /** | 2598 /** |
2575 * Filters array of bytes (Y or U or V values) | 2599 * Filters array of bytes (Y or U or V values) |
2576 */ | 2600 */ |
2577 static void RENAME(postProcess)(uint8_t src[], int srcStride, uint8_t dst[], int dstStride, int width, int height, | 2601 static void RENAME(postProcess)(uint8_t src[], int srcStride, uint8_t dst[], int dstStride, int width, int height, |
2738 } | 2762 } |
2739 | 2763 |
2740 /* copy & deinterlace first row of blocks */ | 2764 /* copy & deinterlace first row of blocks */ |
2741 y=-BLOCK_SIZE; | 2765 y=-BLOCK_SIZE; |
2742 { | 2766 { |
2743 //1% speedup if these are here instead of the inner loop | |
2744 uint8_t *srcBlock= &(src[y*srcStride]); | 2767 uint8_t *srcBlock= &(src[y*srcStride]); |
2745 uint8_t *dstBlock= &(dst[y*dstStride]); | 2768 uint8_t *dstBlock= tempDst + dstStride; |
2746 | |
2747 dstBlock= tempDst + dstStride; | |
2748 | 2769 |
2749 // From this point on it is guranteed that we can read and write 16 lines downward | 2770 // From this point on it is guranteed that we can read and write 16 lines downward |
2750 // finish 1 block before the next otherwise weŽll might have a problem | 2771 // finish 1 block before the next otherwise weŽll might have a problem |
2751 // with the L1 Cache of the P4 ... or only a few blocks at a time or soemthing | 2772 // with the L1 Cache of the P4 ... or only a few blocks at a time or soemthing |
2752 for(x=0; x<width; x+=BLOCK_SIZE) | 2773 for(x=0; x<width; x+=BLOCK_SIZE) |
2786 prefetchw(dstBlock + (((x>>3)&3) + 5)*dstStride + 32); | 2807 prefetchw(dstBlock + (((x>>3)&3) + 5)*dstStride + 32); |
2787 prefetchw(dstBlock + (((x>>3)&3) + 9)*dstStride + 32); | 2808 prefetchw(dstBlock + (((x>>3)&3) + 9)*dstStride + 32); |
2788 */ | 2809 */ |
2789 #endif | 2810 #endif |
2790 | 2811 |
2791 RENAME(blockCopy)(dstBlock + dstStride*copyAhead, dstStride, | 2812 RENAME(blockCopy)(dstBlock + dstStride*8, dstStride, |
2792 srcBlock + srcStride*copyAhead, srcStride, mode & LEVEL_FIX); | 2813 srcBlock + srcStride*8, srcStride, mode & LEVEL_FIX); |
2814 | |
2815 RENAME(duplicate)(dstBlock + dstStride*8, dstStride); | |
2793 | 2816 |
2794 if(mode & LINEAR_IPOL_DEINT_FILTER) | 2817 if(mode & LINEAR_IPOL_DEINT_FILTER) |
2795 RENAME(deInterlaceInterpolateLinear)(dstBlock, dstStride); | 2818 RENAME(deInterlaceInterpolateLinear)(dstBlock, dstStride); |
2796 else if(mode & LINEAR_BLEND_DEINT_FILTER) | 2819 else if(mode & LINEAR_BLEND_DEINT_FILTER) |
2797 RENAME(deInterlaceBlendLinear)(dstBlock, dstStride); | 2820 RENAME(deInterlaceBlendLinear)(dstBlock, dstStride); |
2803 RENAME(deInterlaceBlendCubic)(dstBlock, dstStride); | 2826 RENAME(deInterlaceBlendCubic)(dstBlock, dstStride); |
2804 */ | 2827 */ |
2805 dstBlock+=8; | 2828 dstBlock+=8; |
2806 srcBlock+=8; | 2829 srcBlock+=8; |
2807 } | 2830 } |
2808 memcpy(&(dst[y*dstStride]) + 8*dstStride, tempDst + 9*dstStride, copyAhead*dstStride ); | 2831 memcpy(dst, tempDst + 9*dstStride, copyAhead*dstStride ); |
2809 } | 2832 } |
2810 | 2833 |
2811 for(y=0; y<height; y+=BLOCK_SIZE) | 2834 for(y=0; y<height; y+=BLOCK_SIZE) |
2812 { | 2835 { |
2813 //1% speedup if these are here instead of the inner loop | 2836 //1% speedup if these are here instead of the inner loop |