diff options
author | Ramiro Polla <ramiro.polla@gmail.com> | 2009-08-14 15:52:40 +0000 |
---|---|---|
committer | Ramiro Polla <ramiro.polla@gmail.com> | 2009-08-14 15:52:40 +0000 |
commit | 52154148f462a5b4c77c865e0893b5ca599a55af (patch) | |
tree | 5c085a745a38e6c818013c820f5cde7433c36539 /libswscale/swscale.c | |
parent | 562f6853078bf541b8d8d8888c92ca5ab0123aa5 (diff) | |
download | ffmpeg-52154148f462a5b4c77c865e0893b5ca599a55af.tar.gz |
Vertical yuv -> yuv16 scaler.
Originally committed as revision 29517 to svn://svn.mplayerhq.hu/mplayer/trunk/libswscale
Diffstat (limited to 'libswscale/swscale.c')
-rw-r--r-- | libswscale/swscale.c | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/libswscale/swscale.c b/libswscale/swscale.c index 5743e7104d..c513066b25 100644 --- a/libswscale/swscale.c +++ b/libswscale/swscale.c @@ -74,6 +74,7 @@ untested special converters #include "swscale.h" #include "swscale_internal.h" #include "rgb2rgb.h" +#include "libavutil/intreadwrite.h" #include "libavutil/x86_cpu.h" #include "libavutil/bswap.h" @@ -474,6 +475,86 @@ const char *sws_format_name(enum PixelFormat format) } } +static av_always_inline void yuv2yuvX16inC_template(const int16_t *lumFilter, const int16_t **lumSrc, int lumFilterSize, + const int16_t *chrFilter, const int16_t **chrSrc, int chrFilterSize, + const int16_t **alpSrc, uint16_t *dest, uint16_t *uDest, uint16_t *vDest, uint16_t *aDest, + int dstW, int chrDstW, int big_endian) +{ + //FIXME Optimize (just quickly written not optimized..) + int i; + + for (i = 0; i < dstW; i++) { + int val = 1 << 10; + int j; + + for (j = 0; j < lumFilterSize; j++) + val += lumSrc[j][i] * lumFilter[j]; + + if (big_endian) { + AV_WB16(&dest[i], av_clip_uint16(val >> 11)); + } else { + AV_WL16(&dest[i], av_clip_uint16(val >> 11)); + } + } + + if (uDest) { + for (i = 0; i < chrDstW; i++) { + int u = 1 << 10; + int v = 1 << 10; + int j; + + for (j = 0; j < chrFilterSize; j++) { + u += chrSrc[j][i ] * chrFilter[j]; + v += chrSrc[j][i + VOFW] * chrFilter[j]; + } + + if (big_endian) { + AV_WB16(&uDest[i], av_clip_uint16(u >> 11)); + AV_WB16(&vDest[i], av_clip_uint16(v >> 11)); + } else { + AV_WL16(&uDest[i], av_clip_uint16(u >> 11)); + AV_WL16(&vDest[i], av_clip_uint16(v >> 11)); + } + } + } + + if (CONFIG_SWSCALE_ALPHA && aDest) { + for (i = 0; i < dstW; i++) { + int val = 1 << 10; + int j; + + for (j = 0; j < lumFilterSize; j++) + val += alpSrc[j][i] * lumFilter[j]; + + if (big_endian) { + AV_WB16(&aDest[i], av_clip_uint16(val >> 11)); + } else { + AV_WL16(&aDest[i], av_clip_uint16(val >> 11)); + } + } + } +} + +static inline void yuv2yuvX16inC(const int16_t *lumFilter, const int16_t **lumSrc, int lumFilterSize, + const int16_t *chrFilter, const int16_t **chrSrc, int chrFilterSize, + const int16_t **alpSrc, uint16_t *dest, uint16_t *uDest, uint16_t *vDest, uint16_t *aDest, int dstW, int chrDstW, + enum PixelFormat dstFormat) +{ + if (isBE(dstFormat)) { + yuv2yuvX16inC_template(lumFilter, lumSrc, lumFilterSize, + chrFilter, chrSrc, chrFilterSize, + alpSrc, + dest, uDest, vDest, aDest, + dstW, chrDstW, 1); + } else { + yuv2yuvX16inC_template(lumFilter, lumSrc, lumFilterSize, + chrFilter, chrSrc, chrFilterSize, + alpSrc, + dest, uDest, vDest, aDest, + dstW, chrDstW, 0); + } +} + static inline void yuv2yuvXinC(const int16_t *lumFilter, const int16_t **lumSrc, int lumFilterSize, const int16_t *chrFilter, const int16_t **chrSrc, int chrFilterSize, const int16_t **alpSrc, uint8_t *dest, uint8_t *uDest, uint8_t *vDest, uint8_t *aDest, int dstW, int chrDstW) |