Mercurial > mplayer.hg
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, |