comparison postproc/swscale_template.c @ 14715:1fab95e4513c

Improved NV12/NV21 support. - Fixed PlanarToNV12Wrapper() and made it handle NV21. - Added yuv2nv12XinC() to handle software scaling. - Added NV12/NV21 handling to various places. - Removed NV12 from vf_hue and vf_spp as they don't look like they can actually handle it.
author syrjala
date Wed, 16 Feb 2005 23:47:00 +0000
parents 31cb219364a4
children 3486552cd33e
comparison
equal deleted inserted replaced
14714:c840f4309043 14715:1fab95e4513c
794 dest, uDest, vDest, dstW, chrDstW); 794 dest, uDest, vDest, dstW, chrDstW);
795 #endif //!HAVE_ALTIVEC 795 #endif //!HAVE_ALTIVEC
796 #endif 796 #endif
797 } 797 }
798 798
799 static inline void RENAME(yuv2nv12X)(SwsContext *c, int16_t *lumFilter, int16_t **lumSrc, int lumFilterSize,
800 int16_t *chrFilter, int16_t **chrSrc, int chrFilterSize,
801 uint8_t *dest, uint8_t *uDest, int dstW, int chrDstW, int dstFormat)
802 {
803 yuv2nv12XinC(lumFilter, lumSrc, lumFilterSize,
804 chrFilter, chrSrc, chrFilterSize,
805 dest, uDest, dstW, chrDstW, dstFormat);
806 }
807
799 static inline void RENAME(yuv2yuv1)(int16_t *lumSrc, int16_t *chrSrc, 808 static inline void RENAME(yuv2yuv1)(int16_t *lumSrc, int16_t *chrSrc,
800 uint8_t *dest, uint8_t *uDest, uint8_t *vDest, int dstW, int chrDstW) 809 uint8_t *dest, uint8_t *uDest, uint8_t *vDest, int dstW, int chrDstW)
801 { 810 {
802 #ifdef HAVE_MMX 811 #ifdef HAVE_MMX
803 if(uDest != NULL) 812 if(uDest != NULL)
2790 chrMmxFilter[4*i+2]= 2799 chrMmxFilter[4*i+2]=
2791 chrMmxFilter[4*i+3]= 2800 chrMmxFilter[4*i+3]=
2792 ((uint16_t)vChrFilter[chrDstY*vChrFilterSize + i])*0x10001; 2801 ((uint16_t)vChrFilter[chrDstY*vChrFilterSize + i])*0x10001;
2793 } 2802 }
2794 #endif 2803 #endif
2795 if(isPlanarYUV(dstFormat) || isGray(dstFormat)) //YV12 like 2804 if(dstFormat == IMGFMT_NV12 || dstFormat == IMGFMT_NV21){
2805 const int chrSkipMask= (1<<c->chrDstVSubSample)-1;
2806 if(dstY&chrSkipMask) uDest= NULL; //FIXME split functions in lumi / chromi
2807 RENAME(yuv2nv12X)(c,
2808 vLumFilter+dstY*vLumFilterSize , lumSrcPtr, vLumFilterSize,
2809 vChrFilter+chrDstY*vChrFilterSize, chrSrcPtr, vChrFilterSize,
2810 dest, uDest, dstW, chrDstW, dstFormat);
2811 }
2812 else if(isPlanarYUV(dstFormat) || isGray(dstFormat)) //YV12 like
2796 { 2813 {
2797 const int chrSkipMask= (1<<c->chrDstVSubSample)-1; 2814 const int chrSkipMask= (1<<c->chrDstVSubSample)-1;
2798 if((dstY&chrSkipMask) || isGray(dstFormat)) uDest=vDest= NULL; //FIXME split functions in lumi / chromi 2815 if((dstY&chrSkipMask) || isGray(dstFormat)) uDest=vDest= NULL; //FIXME split functions in lumi / chromi
2799 if(vLumFilterSize == 1 && vChrFilterSize == 1) // Unscaled YV12 2816 if(vLumFilterSize == 1 && vChrFilterSize == 1) // Unscaled YV12
2800 { 2817 {
2838 } 2855 }
2839 else // hmm looks like we can't use MMX here without overwriting this array's tail 2856 else // hmm looks like we can't use MMX here without overwriting this array's tail
2840 { 2857 {
2841 int16_t **lumSrcPtr= lumPixBuf + lumBufIndex + firstLumSrcY - lastInLumBuf + vLumBufSize; 2858 int16_t **lumSrcPtr= lumPixBuf + lumBufIndex + firstLumSrcY - lastInLumBuf + vLumBufSize;
2842 int16_t **chrSrcPtr= chrPixBuf + chrBufIndex + firstChrSrcY - lastInChrBuf + vChrBufSize; 2859 int16_t **chrSrcPtr= chrPixBuf + chrBufIndex + firstChrSrcY - lastInChrBuf + vChrBufSize;
2843 if(isPlanarYUV(dstFormat) || isGray(dstFormat)) //YV12 2860 if(dstFormat == IMGFMT_NV12 || dstFormat == IMGFMT_NV21){
2861 const int chrSkipMask= (1<<c->chrDstVSubSample)-1;
2862 if(dstY&chrSkipMask) uDest= NULL; //FIXME split functions in lumi / chromi
2863 yuv2nv12XinC(
2864 vLumFilter+dstY*vLumFilterSize , lumSrcPtr, vLumFilterSize,
2865 vChrFilter+chrDstY*vChrFilterSize, chrSrcPtr, vChrFilterSize,
2866 dest, uDest, dstW, chrDstW, dstFormat);
2867 }
2868 else if(isPlanarYUV(dstFormat) || isGray(dstFormat)) //YV12
2844 { 2869 {
2845 const int chrSkipMask= (1<<c->chrDstVSubSample)-1; 2870 const int chrSkipMask= (1<<c->chrDstVSubSample)-1;
2846 if((dstY&chrSkipMask) || isGray(dstFormat)) uDest=vDest= NULL; //FIXME split functions in lumi / chromi 2871 if((dstY&chrSkipMask) || isGray(dstFormat)) uDest=vDest= NULL; //FIXME split functions in lumi / chromi
2847 yuv2yuvXinC( 2872 yuv2yuvXinC(
2848 vLumFilter+dstY*vLumFilterSize , lumSrcPtr, vLumFilterSize, 2873 vLumFilter+dstY*vLumFilterSize , lumSrcPtr, vLumFilterSize,