Mercurial > mplayer.hg
comparison libswscale/rgb2rgb_template.c @ 28962:a7e795e068ad
Unscaled converters for
YUYV->YUV420P
YUYV->YUV422P
UYVY->YUV420P
UYVY->YUV422P
author | michael |
---|---|
date | Thu, 19 Mar 2009 03:45:29 +0000 |
parents | 992cca4d7dd3 |
children | e67354af521e |
comparison
equal
deleted
inserted
replaced
28961:992cca4d7dd3 | 28962:a7e795e068ad |
---|---|
2699 ::: "memory" | 2699 ::: "memory" |
2700 ); | 2700 ); |
2701 #endif | 2701 #endif |
2702 } | 2702 } |
2703 | 2703 |
2704 static void RENAME(extract_even)(const uint8_t *src, uint8_t *dst, x86_reg count) | |
2705 { | |
2706 dst += count; | |
2707 src += 2*count; | |
2708 count= - count; | |
2709 | |
2710 #if HAVE_MMX | |
2711 if(count <= -16){ | |
2712 count += 15; | |
2713 __asm__ volatile( | |
2714 "pcmpeqw %%mm7, %%mm7 \n\t" | |
2715 "psrlw $8, %%mm7 \n\t" | |
2716 "1: \n\t" | |
2717 "movq -30(%1, %0, 2), %%mm0 \n\t" | |
2718 "movq -22(%1, %0, 2), %%mm1 \n\t" | |
2719 "movq -14(%1, %0, 2), %%mm2 \n\t" | |
2720 "movq -6(%1, %0, 2), %%mm3 \n\t" | |
2721 "pand %%mm7, %%mm0 \n\t" | |
2722 "pand %%mm7, %%mm1 \n\t" | |
2723 "pand %%mm7, %%mm2 \n\t" | |
2724 "pand %%mm7, %%mm3 \n\t" | |
2725 "packuswb %%mm1, %%mm0 \n\t" | |
2726 "packuswb %%mm3, %%mm2 \n\t" | |
2727 MOVNTQ" %%mm0,-15(%2, %0) \n\t" | |
2728 MOVNTQ" %%mm2,- 7(%2, %0) \n\t" | |
2729 "add $16, %0 \n\t" | |
2730 " js 1b \n\t" | |
2731 : "+r"(count) | |
2732 : "r"(src), "r"(dst) | |
2733 ); | |
2734 count -= 15; | |
2735 } | |
2736 #endif | |
2737 while(count<0){ | |
2738 dst[count]= src[2*count]; | |
2739 count++; | |
2740 } | |
2741 } | |
2742 | |
2743 static void RENAME(extract_even2)(const uint8_t *src, uint8_t *dst0, uint8_t *dst1, x86_reg count) | |
2744 { | |
2745 dst0+= count; | |
2746 dst1+= count; | |
2747 src += 4*count; | |
2748 count= - count; | |
2749 #if HAVE_MMX | |
2750 if(count <= -8){ | |
2751 count += 7; | |
2752 __asm__ volatile( | |
2753 "pcmpeqw %%mm7, %%mm7 \n\t" | |
2754 "psrlw $8, %%mm7 \n\t" | |
2755 "1: \n\t" | |
2756 "movq -28(%1, %0, 4), %%mm0 \n\t" | |
2757 "movq -20(%1, %0, 4), %%mm1 \n\t" | |
2758 "movq -12(%1, %0, 4), %%mm2 \n\t" | |
2759 "movq -4(%1, %0, 4), %%mm3 \n\t" | |
2760 "pand %%mm7, %%mm0 \n\t" | |
2761 "pand %%mm7, %%mm1 \n\t" | |
2762 "pand %%mm7, %%mm2 \n\t" | |
2763 "pand %%mm7, %%mm3 \n\t" | |
2764 "packuswb %%mm1, %%mm0 \n\t" | |
2765 "packuswb %%mm3, %%mm2 \n\t" | |
2766 "movq %%mm0, %%mm1 \n\t" | |
2767 "movq %%mm2, %%mm3 \n\t" | |
2768 "psrlw $8, %%mm0 \n\t" | |
2769 "psrlw $8, %%mm2 \n\t" | |
2770 "pand %%mm7, %%mm1 \n\t" | |
2771 "pand %%mm7, %%mm3 \n\t" | |
2772 "packuswb %%mm2, %%mm0 \n\t" | |
2773 "packuswb %%mm3, %%mm1 \n\t" | |
2774 MOVNTQ" %%mm0,- 7(%3, %0) \n\t" | |
2775 MOVNTQ" %%mm1,- 7(%2, %0) \n\t" | |
2776 "add $8, %0 \n\t" | |
2777 " js 1b \n\t" | |
2778 : "+r"(count) | |
2779 : "r"(src), "r"(dst0), "r"(dst1) | |
2780 ); | |
2781 count -= 7; | |
2782 } | |
2783 #endif | |
2784 while(count<0){ | |
2785 dst0[count]= src[4*count+0]; | |
2786 dst1[count]= src[4*count+2]; | |
2787 count++; | |
2788 } | |
2789 } | |
2790 | |
2791 static void RENAME(extract_odd2)(const uint8_t *src, uint8_t *dst0, uint8_t *dst1, x86_reg count) | |
2792 { | |
2793 dst0+= count; | |
2794 dst1+= count; | |
2795 src += 4*count; | |
2796 count= - count; | |
2797 #if HAVE_MMX | |
2798 if(count <= -8){ | |
2799 count += 7; | |
2800 __asm__ volatile( | |
2801 "pcmpeqw %%mm7, %%mm7 \n\t" | |
2802 "psrlw $8, %%mm7 \n\t" | |
2803 "1: \n\t" | |
2804 "movq -28(%1, %0, 4), %%mm0 \n\t" | |
2805 "movq -20(%1, %0, 4), %%mm1 \n\t" | |
2806 "movq -12(%1, %0, 4), %%mm2 \n\t" | |
2807 "movq -4(%1, %0, 4), %%mm3 \n\t" | |
2808 "psrlw $8, %%mm0 \n\t" | |
2809 "psrlw $8, %%mm1 \n\t" | |
2810 "psrlw $8, %%mm2 \n\t" | |
2811 "psrlw $8, %%mm3 \n\t" | |
2812 "packuswb %%mm1, %%mm0 \n\t" | |
2813 "packuswb %%mm3, %%mm2 \n\t" | |
2814 "movq %%mm0, %%mm1 \n\t" | |
2815 "movq %%mm2, %%mm3 \n\t" | |
2816 "psrlw $8, %%mm0 \n\t" | |
2817 "psrlw $8, %%mm2 \n\t" | |
2818 "pand %%mm7, %%mm1 \n\t" | |
2819 "pand %%mm7, %%mm3 \n\t" | |
2820 "packuswb %%mm2, %%mm0 \n\t" | |
2821 "packuswb %%mm3, %%mm1 \n\t" | |
2822 MOVNTQ" %%mm0,- 7(%3, %0) \n\t" | |
2823 MOVNTQ" %%mm1,- 7(%2, %0) \n\t" | |
2824 "add $8, %0 \n\t" | |
2825 " js 1b \n\t" | |
2826 : "+r"(count) | |
2827 : "r"(src), "r"(dst0), "r"(dst1) | |
2828 ); | |
2829 count -= 7; | |
2830 } | |
2831 #endif | |
2832 while(count<0){ | |
2833 dst0[count]= src[4*count+0]; | |
2834 dst1[count]= src[4*count+2]; | |
2835 count++; | |
2836 } | |
2837 } | |
2838 | |
2839 static void RENAME(yuyvtoyuv420)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const uint8_t *src, | |
2840 long width, long height, | |
2841 long lumStride, long chromStride, long srcStride) | |
2842 { | |
2843 long y; | |
2844 const long chromWidth= -((-width)>>1); | |
2845 | |
2846 for (y=0; y<height; y++){ | |
2847 RENAME(extract_even)(src, ydst, width); | |
2848 if(!(y&1)){ | |
2849 RENAME(extract_odd2)(src, udst, vdst, chromWidth); | |
2850 udst+= chromStride; | |
2851 vdst+= chromStride; | |
2852 } | |
2853 | |
2854 src += srcStride; | |
2855 ydst+= lumStride; | |
2856 } | |
2857 #if HAVE_MMX | |
2858 __asm__( | |
2859 EMMS" \n\t" | |
2860 SFENCE" \n\t" | |
2861 ::: "memory" | |
2862 ); | |
2863 #endif | |
2864 } | |
2865 | |
2866 static void RENAME(yuyvtoyuv422)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const uint8_t *src, | |
2867 long width, long height, | |
2868 long lumStride, long chromStride, long srcStride) | |
2869 { | |
2870 long y; | |
2871 const long chromWidth= -((-width)>>1); | |
2872 | |
2873 for (y=0; y<height; y++){ | |
2874 RENAME(extract_even)(src, ydst, width); | |
2875 RENAME(extract_odd2)(src, udst, vdst, chromWidth); | |
2876 | |
2877 src += srcStride; | |
2878 ydst+= lumStride; | |
2879 udst+= chromStride; | |
2880 vdst+= chromStride; | |
2881 } | |
2882 #if HAVE_MMX | |
2883 __asm__( | |
2884 EMMS" \n\t" | |
2885 SFENCE" \n\t" | |
2886 ::: "memory" | |
2887 ); | |
2888 #endif | |
2889 } | |
2890 | |
2891 static void RENAME(uyvytoyuv420)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const uint8_t *src, | |
2892 long width, long height, | |
2893 long lumStride, long chromStride, long srcStride) | |
2894 { | |
2895 long y; | |
2896 const long chromWidth= -((-width)>>1); | |
2897 | |
2898 for (y=0; y<height; y++){ | |
2899 RENAME(extract_even)(src+1, ydst, width); | |
2900 if(!(y&1)){ | |
2901 RENAME(extract_even2)(src, udst, vdst, chromWidth); | |
2902 udst+= chromStride; | |
2903 vdst+= chromStride; | |
2904 } | |
2905 | |
2906 src += srcStride; | |
2907 ydst+= lumStride; | |
2908 } | |
2909 #if HAVE_MMX | |
2910 __asm__( | |
2911 EMMS" \n\t" | |
2912 SFENCE" \n\t" | |
2913 ::: "memory" | |
2914 ); | |
2915 #endif | |
2916 } | |
2917 | |
2918 static void RENAME(uyvytoyuv422)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const uint8_t *src, | |
2919 long width, long height, | |
2920 long lumStride, long chromStride, long srcStride) | |
2921 { | |
2922 long y; | |
2923 const long chromWidth= -((-width)>>1); | |
2924 | |
2925 for (y=0; y<height; y++){ | |
2926 RENAME(extract_even)(src+1, ydst, width); | |
2927 RENAME(extract_even2)(src, udst, vdst, chromWidth); | |
2928 | |
2929 src += srcStride; | |
2930 ydst+= lumStride; | |
2931 udst+= chromStride; | |
2932 vdst+= chromStride; | |
2933 } | |
2934 #if HAVE_MMX | |
2935 __asm__( | |
2936 EMMS" \n\t" | |
2937 SFENCE" \n\t" | |
2938 ::: "memory" | |
2939 ); | |
2940 #endif | |
2941 } | |
2942 | |
2704 static inline void RENAME(rgb2rgb_init)(void){ | 2943 static inline void RENAME(rgb2rgb_init)(void){ |
2705 rgb15to16 = RENAME(rgb15to16); | 2944 rgb15to16 = RENAME(rgb15to16); |
2706 rgb15tobgr24 = RENAME(rgb15tobgr24); | 2945 rgb15tobgr24 = RENAME(rgb15tobgr24); |
2707 rgb15to32 = RENAME(rgb15to32); | 2946 rgb15to32 = RENAME(rgb15to32); |
2708 rgb16tobgr24 = RENAME(rgb16tobgr24); | 2947 rgb16tobgr24 = RENAME(rgb16tobgr24); |
2723 yv12toyuy2 = RENAME(yv12toyuy2); | 2962 yv12toyuy2 = RENAME(yv12toyuy2); |
2724 yv12touyvy = RENAME(yv12touyvy); | 2963 yv12touyvy = RENAME(yv12touyvy); |
2725 yuv422ptoyuy2 = RENAME(yuv422ptoyuy2); | 2964 yuv422ptoyuy2 = RENAME(yuv422ptoyuy2); |
2726 yuv422ptouyvy = RENAME(yuv422ptouyvy); | 2965 yuv422ptouyvy = RENAME(yuv422ptouyvy); |
2727 yuy2toyv12 = RENAME(yuy2toyv12); | 2966 yuy2toyv12 = RENAME(yuy2toyv12); |
2728 // uyvytoyv12 = RENAME(uyvytoyv12); | |
2729 // yvu9toyv12 = RENAME(yvu9toyv12); | 2967 // yvu9toyv12 = RENAME(yvu9toyv12); |
2730 planar2x = RENAME(planar2x); | 2968 planar2x = RENAME(planar2x); |
2731 rgb24toyv12 = RENAME(rgb24toyv12); | 2969 rgb24toyv12 = RENAME(rgb24toyv12); |
2732 interleaveBytes = RENAME(interleaveBytes); | 2970 interleaveBytes = RENAME(interleaveBytes); |
2733 vu9_to_vu12 = RENAME(vu9_to_vu12); | 2971 vu9_to_vu12 = RENAME(vu9_to_vu12); |
2734 yvu9_to_yuy2 = RENAME(yvu9_to_yuy2); | 2972 yvu9_to_yuy2 = RENAME(yvu9_to_yuy2); |
2735 } | 2973 |
2974 uyvytoyuv420 = RENAME(uyvytoyuv420); | |
2975 uyvytoyuv422 = RENAME(uyvytoyuv422); | |
2976 yuyvtoyuv420 = RENAME(yuyvtoyuv420); | |
2977 yuyvtoyuv422 = RENAME(yuyvtoyuv422); | |
2978 } |