|
|
|
@@ -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) |
|
|
|
|