swscale: fix YUV420P 9/10bit support.

Fix handling of input if not in native endianness, and add support for
9/10-bit output. This allows us to force endianness of YUV420P 9/10bit
in the H264/10bit fate tests, which should fix them on big-endian
systems.
This commit is contained in:
Ronald S. Bultje 2011-05-11 19:15:14 -04:00
parent 5705b02079
commit c8f487deae
13 changed files with 203 additions and 66 deletions

View File

@ -128,10 +128,10 @@ enum PixelFormat {
PIX_FMT_VDPAU_MPEG4, ///< MPEG4 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers PIX_FMT_VDPAU_MPEG4, ///< MPEG4 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
PIX_FMT_DXVA2_VLD, ///< HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer PIX_FMT_DXVA2_VLD, ///< HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer
PIX_FMT_RGB444BE, ///< packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), big-endian, most significant bits to 0
PIX_FMT_RGB444LE, ///< packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), little-endian, most significant bits to 0 PIX_FMT_RGB444LE, ///< packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), little-endian, most significant bits to 0
PIX_FMT_BGR444BE, ///< packed BGR 4:4:4, 16bpp, (msb)4A 4B 4G 4R(lsb), big-endian, most significant bits to 1 PIX_FMT_RGB444BE, ///< packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), big-endian, most significant bits to 0
PIX_FMT_BGR444LE, ///< packed BGR 4:4:4, 16bpp, (msb)4A 4B 4G 4R(lsb), little-endian, most significant bits to 1 PIX_FMT_BGR444LE, ///< packed BGR 4:4:4, 16bpp, (msb)4A 4B 4G 4R(lsb), little-endian, most significant bits to 1
PIX_FMT_BGR444BE, ///< packed BGR 4:4:4, 16bpp, (msb)4A 4B 4G 4R(lsb), big-endian, most significant bits to 1
PIX_FMT_Y400A, ///< 8bit gray, 8bit alpha PIX_FMT_Y400A, ///< 8bit gray, 8bit alpha
PIX_FMT_BGR48BE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big-endian PIX_FMT_BGR48BE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big-endian
PIX_FMT_BGR48LE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as little-endian PIX_FMT_BGR48LE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as little-endian

View File

@ -639,7 +639,7 @@ static int RENAME(swScale)(SwsContext *c, const uint8_t* src[], int srcStride[],
} else if (isPlanarYUV(dstFormat) || dstFormat==PIX_FMT_GRAY8) { //YV12 like } else if (isPlanarYUV(dstFormat) || dstFormat==PIX_FMT_GRAY8) { //YV12 like
const int chrSkipMask= (1<<c->chrDstVSubSample)-1; const int chrSkipMask= (1<<c->chrDstVSubSample)-1;
if ((dstY&chrSkipMask) || isGray(dstFormat)) uDest=vDest= NULL; //FIXME split functions in lumi / chromi if ((dstY&chrSkipMask) || isGray(dstFormat)) uDest=vDest= NULL; //FIXME split functions in lumi / chromi
if (is16BPS(dstFormat)) { if (is16BPS(dstFormat) || is9_OR_10BPS(dstFormat)) {
yuv2yuvX16inC( yuv2yuvX16inC(
vLumFilter+dstY*vLumFilterSize , lumSrcPtr, vLumFilterSize, vLumFilter+dstY*vLumFilterSize , lumSrcPtr, vLumFilterSize,
vChrFilter+chrDstY*vChrFilterSize, chrSrcPtr, vChrFilterSize, vChrFilter+chrDstY*vChrFilterSize, chrSrcPtr, vChrFilterSize,
@ -716,7 +716,7 @@ static int RENAME(swScale)(SwsContext *c, const uint8_t* src[], int srcStride[],
} else if (isPlanarYUV(dstFormat) || dstFormat==PIX_FMT_GRAY8) { //YV12 } else if (isPlanarYUV(dstFormat) || dstFormat==PIX_FMT_GRAY8) { //YV12
const int chrSkipMask= (1<<c->chrDstVSubSample)-1; const int chrSkipMask= (1<<c->chrDstVSubSample)-1;
if ((dstY&chrSkipMask) || isGray(dstFormat)) uDest=vDest= NULL; //FIXME split functions in lumi / chromi if ((dstY&chrSkipMask) || isGray(dstFormat)) uDest=vDest= NULL; //FIXME split functions in lumi / chromi
if (is16BPS(dstFormat)) { if (is16BPS(dstFormat) || is9_OR_10BPS(dstFormat)) {
yuv2yuvX16inC( yuv2yuvX16inC(
vLumFilter+dstY*vLumFilterSize , lumSrcPtr, vLumFilterSize, vLumFilter+dstY*vLumFilterSize , lumSrcPtr, vLumFilterSize,
vChrFilter+chrDstY*vChrFilterSize, chrSrcPtr, vChrFilterSize, vChrFilter+chrDstY*vChrFilterSize, chrSrcPtr, vChrFilterSize,

View File

@ -212,10 +212,11 @@ DECLARE_ALIGNED(8, const uint8_t, dither_8x8_220)[8][8]={
static av_always_inline void yuv2yuvX16inC_template(const int16_t *lumFilter, const int16_t **lumSrc, int lumFilterSize, 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 *chrFilter, const int16_t **chrSrc, int chrFilterSize,
const int16_t **alpSrc, uint16_t *dest, uint16_t *uDest, uint16_t *vDest, uint16_t *aDest, const int16_t **alpSrc, uint16_t *dest, uint16_t *uDest, uint16_t *vDest, uint16_t *aDest,
int dstW, int chrDstW, int big_endian) int dstW, int chrDstW, int big_endian, int output_bits)
{ {
//FIXME Optimize (just quickly written not optimized..) //FIXME Optimize (just quickly written not optimized..)
int i; int i;
int shift = 11 + 16 - output_bits;
for (i = 0; i < dstW; i++) { for (i = 0; i < dstW; i++) {
int val = 1 << 10; int val = 1 << 10;
@ -225,9 +226,9 @@ static av_always_inline void yuv2yuvX16inC_template(const int16_t *lumFilter, co
val += lumSrc[j][i] * lumFilter[j]; val += lumSrc[j][i] * lumFilter[j];
if (big_endian) { if (big_endian) {
AV_WB16(&dest[i], av_clip_uint16(val >> 11)); AV_WB16(&dest[i], av_clip_uint16(val >> shift));
} else { } else {
AV_WL16(&dest[i], av_clip_uint16(val >> 11)); AV_WL16(&dest[i], av_clip_uint16(val >> shift));
} }
} }
@ -243,11 +244,11 @@ static av_always_inline void yuv2yuvX16inC_template(const int16_t *lumFilter, co
} }
if (big_endian) { if (big_endian) {
AV_WB16(&uDest[i], av_clip_uint16(u >> 11)); AV_WB16(&uDest[i], av_clip_uint16(u >> shift));
AV_WB16(&vDest[i], av_clip_uint16(v >> 11)); AV_WB16(&vDest[i], av_clip_uint16(v >> shift));
} else { } else {
AV_WL16(&uDest[i], av_clip_uint16(u >> 11)); AV_WL16(&uDest[i], av_clip_uint16(u >> shift));
AV_WL16(&vDest[i], av_clip_uint16(v >> 11)); AV_WL16(&vDest[i], av_clip_uint16(v >> shift));
} }
} }
} }
@ -261,9 +262,9 @@ static av_always_inline void yuv2yuvX16inC_template(const int16_t *lumFilter, co
val += alpSrc[j][i] * lumFilter[j]; val += alpSrc[j][i] * lumFilter[j];
if (big_endian) { if (big_endian) {
AV_WB16(&aDest[i], av_clip_uint16(val >> 11)); AV_WB16(&aDest[i], av_clip_uint16(val >> shift));
} else { } else {
AV_WL16(&aDest[i], av_clip_uint16(val >> 11)); AV_WL16(&aDest[i], av_clip_uint16(val >> shift));
} }
} }
} }
@ -274,19 +275,28 @@ static inline void yuv2yuvX16inC(const int16_t *lumFilter, const int16_t **lumSr
const int16_t **alpSrc, uint16_t *dest, uint16_t *uDest, uint16_t *vDest, uint16_t *aDest, int dstW, int chrDstW, const int16_t **alpSrc, uint16_t *dest, uint16_t *uDest, uint16_t *vDest, uint16_t *aDest, int dstW, int chrDstW,
enum PixelFormat dstFormat) enum PixelFormat dstFormat)
{ {
if (isBE(dstFormat)) { #define conv16(bits) \
yuv2yuvX16inC_template(lumFilter, lumSrc, lumFilterSize, if (isBE(dstFormat)) { \
chrFilter, chrSrc, chrFilterSize, yuv2yuvX16inC_template(lumFilter, lumSrc, lumFilterSize, \
alpSrc, chrFilter, chrSrc, chrFilterSize, \
dest, uDest, vDest, aDest, alpSrc, \
dstW, chrDstW, 1); dest, uDest, vDest, aDest, \
} else { dstW, chrDstW, 1, bits); \
yuv2yuvX16inC_template(lumFilter, lumSrc, lumFilterSize, } else { \
chrFilter, chrSrc, chrFilterSize, yuv2yuvX16inC_template(lumFilter, lumSrc, lumFilterSize, \
alpSrc, chrFilter, chrSrc, chrFilterSize, \
dest, uDest, vDest, aDest, alpSrc, \
dstW, chrDstW, 0); dest, uDest, vDest, aDest, \
dstW, chrDstW, 0, bits); \
} }
if (is16BPS(dstFormat)) {
conv16(16);
} else if (av_pix_fmt_descriptors[dstFormat].comp[0].depth_minus1 == 8) {
conv16(9);
} else {
conv16(10);
}
#undef conv16
} }
static inline void yuv2yuvXinC(const int16_t *lumFilter, const int16_t **lumSrc, int lumFilterSize, static inline void yuv2yuvXinC(const int16_t *lumFilter, const int16_t **lumSrc, int lumFilterSize,
@ -1669,25 +1679,124 @@ static int planarCopyWrapper(SwsContext *c, const uint8_t* src[], int srcStride[
length*=2; length*=2;
fillPlane(dst[plane], dstStride[plane], length, height, y, (plane==3) ? 255 : 128); fillPlane(dst[plane], dstStride[plane], length, height, y, (plane==3) ? 255 : 128);
} else { } else {
if(isNBPS(c->srcFormat)) { if(is9_OR_10BPS(c->srcFormat)) {
const int depth = av_pix_fmt_descriptors[c->srcFormat].comp[plane].depth_minus1+1; const int src_depth = av_pix_fmt_descriptors[c->srcFormat].comp[plane].depth_minus1+1;
uint16_t *srcPtr2 = (uint16_t*)srcPtr; const int dst_depth = av_pix_fmt_descriptors[c->dstFormat].comp[plane].depth_minus1+1;
const uint16_t *srcPtr2 = (const uint16_t*)srcPtr;
if (is16BPS(c->dstFormat)) { if (is16BPS(c->dstFormat)) {
uint16_t *dstPtr2 = (uint16_t*)dstPtr; uint16_t *dstPtr2 = (uint16_t*)dstPtr;
for (i = 0; i < height; i++) { #define COPY9_OR_10TO16(rfunc, wfunc) \
for (j = 0; j < length; j++) for (i = 0; i < height; i++) { \
dstPtr2[j] = (srcPtr2[j]<<(16-depth)) | (srcPtr2[j]>>(2*depth-16)); for (j = 0; j < length; j++) { \
dstPtr2 += dstStride[plane]/2; int srcpx = rfunc(&srcPtr2[j]); \
srcPtr2 += srcStride[plane]/2; wfunc(&dstPtr2[j], (srcpx<<(16-src_depth)) | (srcpx>>(2*src_depth-16))); \
} \
dstPtr2 += dstStride[plane]/2; \
srcPtr2 += srcStride[plane]/2; \
}
if (isBE(c->dstFormat)) {
if (isBE(c->srcFormat)) {
COPY9_OR_10TO16(AV_RB16, AV_WB16);
} else {
COPY9_OR_10TO16(AV_RL16, AV_WB16);
}
} else {
if (isBE(c->srcFormat)) {
COPY9_OR_10TO16(AV_RB16, AV_WL16);
} else {
COPY9_OR_10TO16(AV_RL16, AV_WL16);
}
}
} else if (is9_OR_10BPS(c->dstFormat)) {
uint16_t *dstPtr2 = (uint16_t*)dstPtr;
#define COPY9_OR_10TO9_OR_10(loop) \
for (i = 0; i < height; i++) { \
for (j = 0; j < length; j++) { \
loop; \
} \
dstPtr2 += dstStride[plane]/2; \
srcPtr2 += srcStride[plane]/2; \
}
#define COPY9_OR_10TO9_OR_10_2(rfunc, wfunc) \
if (dst_depth > src_depth) { \
COPY9_OR_10TO9_OR_10(int srcpx = rfunc(&srcPtr2[j]); \
wfunc(&dstPtr2[j], (srcpx << 1) | (srcpx >> 9))); \
} else if (dst_depth < src_depth) { \
COPY9_OR_10TO9_OR_10(wfunc(&dstPtr2[j], rfunc(&srcPtr2[j]) >> 1)); \
} else { \
COPY9_OR_10TO9_OR_10(wfunc(&dstPtr2[j], rfunc(&srcPtr2[j]))); \
}
if (isBE(c->dstFormat)) {
if (isBE(c->srcFormat)) {
COPY9_OR_10TO9_OR_10_2(AV_RB16, AV_WB16);
} else {
COPY9_OR_10TO9_OR_10_2(AV_RL16, AV_WB16);
}
} else {
if (isBE(c->srcFormat)) {
COPY9_OR_10TO9_OR_10_2(AV_RB16, AV_WL16);
} else {
COPY9_OR_10TO9_OR_10_2(AV_RL16, AV_WL16);
}
} }
} else { } else {
// FIXME Maybe dither instead. // FIXME Maybe dither instead.
for (i = 0; i < height; i++) { #define COPY9_OR_10TO8(rfunc) \
for (j = 0; j < length; j++) for (i = 0; i < height; i++) { \
dstPtr[j] = srcPtr2[j]>>(depth-8); for (j = 0; j < length; j++) { \
dstPtr += dstStride[plane]; dstPtr[j] = rfunc(&srcPtr2[j])>>(src_depth-8); \
srcPtr2 += srcStride[plane]/2; } \
dstPtr += dstStride[plane]; \
srcPtr2 += srcStride[plane]/2; \
}
if (isBE(c->srcFormat)) {
COPY9_OR_10TO8(AV_RB16);
} else {
COPY9_OR_10TO8(AV_RL16);
}
}
} else if(is9_OR_10BPS(c->dstFormat)) {
const int dst_depth = av_pix_fmt_descriptors[c->dstFormat].comp[plane].depth_minus1+1;
uint16_t *dstPtr2 = (uint16_t*)dstPtr;
if (is16BPS(c->srcFormat)) {
const uint16_t *srcPtr2 = (const uint16_t*)srcPtr;
#define COPY16TO9_OR_10(rfunc, wfunc) \
for (i = 0; i < height; i++) { \
for (j = 0; j < length; j++) { \
wfunc(&dstPtr2[j], rfunc(&srcPtr2[j])>>(16-dst_depth)); \
} \
dstPtr2 += dstStride[plane]/2; \
srcPtr2 += srcStride[plane]/2; \
}
if (isBE(c->dstFormat)) {
if (isBE(c->srcFormat)) {
COPY16TO9_OR_10(AV_RB16, AV_WB16);
} else {
COPY16TO9_OR_10(AV_RL16, AV_WB16);
}
} else {
if (isBE(c->srcFormat)) {
COPY16TO9_OR_10(AV_RB16, AV_WL16);
} else {
COPY16TO9_OR_10(AV_RL16, AV_WL16);
}
}
} else /* 8bit */ {
#define COPY8TO9_OR_10(wfunc) \
for (i = 0; i < height; i++) { \
for (j = 0; j < length; j++) { \
const int srcpx = srcPtr[j]; \
wfunc(&dstPtr2[j], (srcpx<<(dst_depth-8)) | (srcpx >> (16-dst_depth))); \
} \
dstPtr2 += dstStride[plane]/2; \
srcPtr += srcStride[plane]; \
}
if (isBE(c->dstFormat)) {
COPY8TO9_OR_10(AV_WB16);
} else {
COPY8TO9_OR_10(AV_WL16);
} }
} }
} else if(is16BPS(c->srcFormat) && !is16BPS(c->dstFormat)) { } else if(is16BPS(c->srcFormat) && !is16BPS(c->dstFormat)) {

View File

@ -354,7 +354,7 @@ const char *sws_format_name(enum PixelFormat format);
|| (x)==PIX_FMT_YUV422P16BE \ || (x)==PIX_FMT_YUV422P16BE \
|| (x)==PIX_FMT_YUV444P16BE \ || (x)==PIX_FMT_YUV444P16BE \
) )
#define isNBPS(x) ( \ #define is9_OR_10BPS(x) ( \
(x)==PIX_FMT_YUV420P9LE \ (x)==PIX_FMT_YUV420P9LE \
|| (x)==PIX_FMT_YUV420P9BE \ || (x)==PIX_FMT_YUV420P9BE \
|| (x)==PIX_FMT_YUV420P10LE \ || (x)==PIX_FMT_YUV420P10LE \

View File

@ -164,6 +164,8 @@ static inline void LEToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *src1,
const uint8_t *src2, long width, uint32_t *unused) const uint8_t *src2, long width, uint32_t *unused)
{ {
int i; int i;
// FIXME I don't think this code is right for YUV444/422, since then h is not subsampled so
// we need to skip each second pixel. Same for BEToUV.
for (i=0; i<width; i++) { for (i=0; i<width; i++) {
dstU[i]= src1[2*i + 1]; dstU[i]= src1[2*i + 1];
dstV[i]= src2[2*i + 1]; dstV[i]= src2[2*i + 1];
@ -226,8 +228,8 @@ static inline void nv21ToUV_c(uint8_t *dstU, uint8_t *dstV,
} }
// FIXME Maybe dither instead. // FIXME Maybe dither instead.
#define YUV_NBPS(depth) \ #define YUV_NBPS(depth, endianness, rfunc) \
static inline void yuv ## depth ## ToUV_c(uint8_t *dstU, uint8_t *dstV, \ static inline void endianness ## depth ## ToUV_c(uint8_t *dstU, uint8_t *dstV, \
const uint8_t *_srcU, const uint8_t *_srcV, \ const uint8_t *_srcU, const uint8_t *_srcV, \
long width, uint32_t *unused) \ long width, uint32_t *unused) \
{ \ { \
@ -235,21 +237,23 @@ static inline void yuv ## depth ## ToUV_c(uint8_t *dstU, uint8_t *dstV, \
const uint16_t *srcU = (const uint16_t*)_srcU; \ const uint16_t *srcU = (const uint16_t*)_srcU; \
const uint16_t *srcV = (const uint16_t*)_srcV; \ const uint16_t *srcV = (const uint16_t*)_srcV; \
for (i = 0; i < width; i++) { \ for (i = 0; i < width; i++) { \
dstU[i] = srcU[i]>>(depth-8); \ dstU[i] = rfunc(&srcU[i])>>(depth-8); \
dstV[i] = srcV[i]>>(depth-8); \ dstV[i] = rfunc(&srcV[i])>>(depth-8); \
} \ } \
} \ } \
\ \
static inline void yuv ## depth ## ToY_c(uint8_t *dstY, const uint8_t *_srcY, long width, uint32_t *unused) \ static inline void endianness ## depth ## ToY_c(uint8_t *dstY, const uint8_t *_srcY, long width, uint32_t *unused) \
{ \ { \
int i; \ int i; \
const uint16_t *srcY = (const uint16_t*)_srcY; \ const uint16_t *srcY = (const uint16_t*)_srcY; \
for (i = 0; i < width; i++) \ for (i = 0; i < width; i++) \
dstY[i] = srcY[i]>>(depth-8); \ dstY[i] = rfunc(&srcY[i])>>(depth-8); \
} \ } \
YUV_NBPS( 9) YUV_NBPS( 9, LE, AV_RL16)
YUV_NBPS(10) YUV_NBPS( 9, BE, AV_RB16)
YUV_NBPS(10, LE, AV_RL16)
YUV_NBPS(10, BE, AV_RB16)
static inline void bgr24ToY_c(uint8_t *dst, const uint8_t *src, static inline void bgr24ToY_c(uint8_t *dst, const uint8_t *src,
long width, uint32_t *unused) long width, uint32_t *unused)
@ -666,7 +670,7 @@ static int swScale_c(SwsContext *c, const uint8_t* src[], int srcStride[],
} else if (isPlanarYUV(dstFormat) || dstFormat==PIX_FMT_GRAY8) { //YV12 like } else if (isPlanarYUV(dstFormat) || dstFormat==PIX_FMT_GRAY8) { //YV12 like
const int chrSkipMask= (1<<c->chrDstVSubSample)-1; const int chrSkipMask= (1<<c->chrDstVSubSample)-1;
if ((dstY&chrSkipMask) || isGray(dstFormat)) uDest=vDest= NULL; //FIXME split functions in lumi / chromi if ((dstY&chrSkipMask) || isGray(dstFormat)) uDest=vDest= NULL; //FIXME split functions in lumi / chromi
if (is16BPS(dstFormat)) { if (is16BPS(dstFormat) || is9_OR_10BPS(dstFormat)) {
yuv2yuvX16inC( yuv2yuvX16inC(
vLumFilter+dstY*vLumFilterSize , lumSrcPtr, vLumFilterSize, vLumFilter+dstY*vLumFilterSize , lumSrcPtr, vLumFilterSize,
vChrFilter+chrDstY*vChrFilterSize, chrSrcPtr, vChrFilterSize, vChrFilter+chrDstY*vChrFilterSize, chrSrcPtr, vChrFilterSize,
@ -743,7 +747,7 @@ static int swScale_c(SwsContext *c, const uint8_t* src[], int srcStride[],
} else if (isPlanarYUV(dstFormat) || dstFormat==PIX_FMT_GRAY8) { //YV12 } else if (isPlanarYUV(dstFormat) || dstFormat==PIX_FMT_GRAY8) { //YV12
const int chrSkipMask= (1<<c->chrDstVSubSample)-1; const int chrSkipMask= (1<<c->chrDstVSubSample)-1;
if ((dstY&chrSkipMask) || isGray(dstFormat)) uDest=vDest= NULL; //FIXME split functions in lumi / chromi if ((dstY&chrSkipMask) || isGray(dstFormat)) uDest=vDest= NULL; //FIXME split functions in lumi / chromi
if (is16BPS(dstFormat)) { if (is16BPS(dstFormat) || is9_OR_10BPS(dstFormat)) {
yuv2yuvX16inC( yuv2yuvX16inC(
vLumFilter+dstY*vLumFilterSize , lumSrcPtr, vLumFilterSize, vLumFilter+dstY*vLumFilterSize , lumSrcPtr, vLumFilterSize,
vChrFilter+chrDstY*vChrFilterSize, chrSrcPtr, vChrFilterSize, vChrFilter+chrDstY*vChrFilterSize, chrSrcPtr, vChrFilterSize,
@ -816,10 +820,10 @@ static void sws_init_swScale_c(SwsContext *c)
case PIX_FMT_PAL8 : case PIX_FMT_PAL8 :
case PIX_FMT_BGR4_BYTE: case PIX_FMT_BGR4_BYTE:
case PIX_FMT_RGB4_BYTE: c->chrToYV12 = palToUV; break; case PIX_FMT_RGB4_BYTE: c->chrToYV12 = palToUV; break;
case PIX_FMT_YUV420P9BE: case PIX_FMT_YUV420P9BE: c->chrToYV12 = BE9ToUV_c; break;
case PIX_FMT_YUV420P9LE: c->chrToYV12 = yuv9ToUV_c; break; case PIX_FMT_YUV420P9LE: c->chrToYV12 = LE9ToUV_c; break;
case PIX_FMT_YUV420P10BE: case PIX_FMT_YUV420P10BE: c->chrToYV12 = BE10ToUV_c; break;
case PIX_FMT_YUV420P10LE: c->chrToYV12 = yuv10ToUV_c; break; case PIX_FMT_YUV420P10LE: c->chrToYV12 = LE10ToUV_c; break;
case PIX_FMT_YUV420P16BE: case PIX_FMT_YUV420P16BE:
case PIX_FMT_YUV422P16BE: case PIX_FMT_YUV422P16BE:
case PIX_FMT_YUV444P16BE: c->chrToYV12 = BEToUV_c; break; case PIX_FMT_YUV444P16BE: c->chrToYV12 = BEToUV_c; break;
@ -866,10 +870,10 @@ static void sws_init_swScale_c(SwsContext *c)
c->lumToYV12 = NULL; c->lumToYV12 = NULL;
c->alpToYV12 = NULL; c->alpToYV12 = NULL;
switch (srcFormat) { switch (srcFormat) {
case PIX_FMT_YUV420P9BE: case PIX_FMT_YUV420P9BE: c->lumToYV12 = BE9ToY_c; break;
case PIX_FMT_YUV420P9LE: c->lumToYV12 = yuv9ToY_c; break; case PIX_FMT_YUV420P9LE: c->lumToYV12 = LE9ToY_c; break;
case PIX_FMT_YUV420P10BE: case PIX_FMT_YUV420P10BE: c->lumToYV12 = BE10ToY_c; break;
case PIX_FMT_YUV420P10LE: c->lumToYV12 = yuv10ToY_c; break; case PIX_FMT_YUV420P10LE: c->lumToYV12 = LE10ToY_c; break;
case PIX_FMT_YUYV422 : case PIX_FMT_YUYV422 :
case PIX_FMT_YUV420P16BE: case PIX_FMT_YUV420P16BE:
case PIX_FMT_YUV422P16BE: case PIX_FMT_YUV422P16BE:

View File

@ -143,9 +143,13 @@ int sws_isSupportedInput(enum PixelFormat pix_fmt)
|| (x)==PIX_FMT_GRAY8 \ || (x)==PIX_FMT_GRAY8 \
|| (x)==PIX_FMT_YUV410P \ || (x)==PIX_FMT_YUV410P \
|| (x)==PIX_FMT_YUV440P \ || (x)==PIX_FMT_YUV440P \
|| (x)==PIX_FMT_YUV420P9LE \
|| (x)==PIX_FMT_YUV420P10LE \
|| (x)==PIX_FMT_YUV420P16LE \ || (x)==PIX_FMT_YUV420P16LE \
|| (x)==PIX_FMT_YUV422P16LE \ || (x)==PIX_FMT_YUV422P16LE \
|| (x)==PIX_FMT_YUV444P16LE \ || (x)==PIX_FMT_YUV444P16LE \
|| (x)==PIX_FMT_YUV420P9BE \
|| (x)==PIX_FMT_YUV420P10BE \
|| (x)==PIX_FMT_YUV420P16BE \ || (x)==PIX_FMT_YUV420P16BE \
|| (x)==PIX_FMT_YUV422P16BE \ || (x)==PIX_FMT_YUV422P16BE \
|| (x)==PIX_FMT_YUV444P16BE \ || (x)==PIX_FMT_YUV444P16BE \

View File

@ -2611,7 +2611,7 @@ static int RENAME(swScale)(SwsContext *c, const uint8_t* src[], int srcStride[],
} else if (isPlanarYUV(dstFormat) || dstFormat==PIX_FMT_GRAY8) { //YV12 like } else if (isPlanarYUV(dstFormat) || dstFormat==PIX_FMT_GRAY8) { //YV12 like
const int chrSkipMask= (1<<c->chrDstVSubSample)-1; const int chrSkipMask= (1<<c->chrDstVSubSample)-1;
if ((dstY&chrSkipMask) || isGray(dstFormat)) uDest=vDest= NULL; //FIXME split functions in lumi / chromi if ((dstY&chrSkipMask) || isGray(dstFormat)) uDest=vDest= NULL; //FIXME split functions in lumi / chromi
if (is16BPS(dstFormat)) { if (is16BPS(dstFormat) || is9_OR_10BPS(dstFormat)) {
yuv2yuvX16inC( yuv2yuvX16inC(
vLumFilter+dstY*vLumFilterSize , lumSrcPtr, vLumFilterSize, vLumFilter+dstY*vLumFilterSize , lumSrcPtr, vLumFilterSize,
vChrFilter+chrDstY*vChrFilterSize, chrSrcPtr, vChrFilterSize, vChrFilter+chrDstY*vChrFilterSize, chrSrcPtr, vChrFilterSize,
@ -2688,7 +2688,7 @@ static int RENAME(swScale)(SwsContext *c, const uint8_t* src[], int srcStride[],
} else if (isPlanarYUV(dstFormat) || dstFormat==PIX_FMT_GRAY8) { //YV12 } else if (isPlanarYUV(dstFormat) || dstFormat==PIX_FMT_GRAY8) { //YV12
const int chrSkipMask= (1<<c->chrDstVSubSample)-1; const int chrSkipMask= (1<<c->chrDstVSubSample)-1;
if ((dstY&chrSkipMask) || isGray(dstFormat)) uDest=vDest= NULL; //FIXME split functions in lumi / chromi if ((dstY&chrSkipMask) || isGray(dstFormat)) uDest=vDest= NULL; //FIXME split functions in lumi / chromi
if (is16BPS(dstFormat)) { if (is16BPS(dstFormat) || is9_OR_10BPS(dstFormat)) {
yuv2yuvX16inC( yuv2yuvX16inC(
vLumFilter+dstY*vLumFilterSize , lumSrcPtr, vLumFilterSize, vLumFilter+dstY*vLumFilterSize , lumSrcPtr, vLumFilterSize,
vChrFilter+chrDstY*vChrFilterSize, chrSrcPtr, vChrFilterSize, vChrFilter+chrDstY*vChrFilterSize, chrSrcPtr, vChrFilterSize,

View File

@ -308,13 +308,13 @@ fate-h264-conformance-frext-hpcvfl_bcrm_a: CMD = framecrc -i $(SAMPLES)/h264-co
fate-h264-conformance-frext-hpcvflnl_bcrm_a: CMD = framecrc -i $(SAMPLES)/h264-conformance/FRext/HPCVFLNL_BRCM_A.264 -vsync 0 fate-h264-conformance-frext-hpcvflnl_bcrm_a: CMD = framecrc -i $(SAMPLES)/h264-conformance/FRext/HPCVFLNL_BRCM_A.264 -vsync 0
fate-h264-conformance-frext-hpcvmolq_brcm_b: CMD = framecrc -i $(SAMPLES)/h264-conformance/FRext/HPCVMOLQ_BRCM_B.264 fate-h264-conformance-frext-hpcvmolq_brcm_b: CMD = framecrc -i $(SAMPLES)/h264-conformance/FRext/HPCVMOLQ_BRCM_B.264
fate-h264-conformance-frext-hpcvnl_brcm_a: CMD = framecrc -i $(SAMPLES)/h264-conformance/FRext/HPCVNL_BRCM_A.264 fate-h264-conformance-frext-hpcvnl_brcm_a: CMD = framecrc -i $(SAMPLES)/h264-conformance/FRext/HPCVNL_BRCM_A.264
fate-h264-conformance-frext-pph10i1_panasonic_a: CMD = framecrc -i $(SAMPLES)/h264-conformance/FRext/PPH10I1_Panasonic_A.264 fate-h264-conformance-frext-pph10i1_panasonic_a: CMD = framecrc -i $(SAMPLES)/h264-conformance/FRext/PPH10I1_Panasonic_A.264 -pix_fmt yuv420p10le
fate-h264-conformance-frext-pph10i2_panasonic_a: CMD = framecrc -i $(SAMPLES)/h264-conformance/FRext/PPH10I2_Panasonic_A.264 fate-h264-conformance-frext-pph10i2_panasonic_a: CMD = framecrc -i $(SAMPLES)/h264-conformance/FRext/PPH10I2_Panasonic_A.264 -pix_fmt yuv420p10le
fate-h264-conformance-frext-pph10i3_panasonic_a: CMD = framecrc -i $(SAMPLES)/h264-conformance/FRext/PPH10I3_Panasonic_A.264 fate-h264-conformance-frext-pph10i3_panasonic_a: CMD = framecrc -i $(SAMPLES)/h264-conformance/FRext/PPH10I3_Panasonic_A.264 -pix_fmt yuv420p10le
fate-h264-conformance-frext-pph10i4_panasonic_a: CMD = framecrc -i $(SAMPLES)/h264-conformance/FRext/PPH10I4_Panasonic_A.264 fate-h264-conformance-frext-pph10i4_panasonic_a: CMD = framecrc -i $(SAMPLES)/h264-conformance/FRext/PPH10I4_Panasonic_A.264 -pix_fmt yuv420p10le
fate-h264-conformance-frext-pph10i5_panasonic_a: CMD = framecrc -i $(SAMPLES)/h264-conformance/FRext/PPH10I5_Panasonic_A.264 fate-h264-conformance-frext-pph10i5_panasonic_a: CMD = framecrc -i $(SAMPLES)/h264-conformance/FRext/PPH10I5_Panasonic_A.264 -pix_fmt yuv420p10le
fate-h264-conformance-frext-pph10i6_panasonic_a: CMD = framecrc -i $(SAMPLES)/h264-conformance/FRext/PPH10I6_Panasonic_A.264 fate-h264-conformance-frext-pph10i6_panasonic_a: CMD = framecrc -i $(SAMPLES)/h264-conformance/FRext/PPH10I6_Panasonic_A.264 -pix_fmt yuv420p10le
fate-h264-conformance-frext-pph10i7_panasonic_a: CMD = framecrc -i $(SAMPLES)/h264-conformance/FRext/PPH10I7_Panasonic_A.264 fate-h264-conformance-frext-pph10i7_panasonic_a: CMD = framecrc -i $(SAMPLES)/h264-conformance/FRext/PPH10I7_Panasonic_A.264 -pix_fmt yuv420p10le
fate-h264-conformance-hcbp2_hhi_a: CMD = framecrc -vsync 0 -strict 1 -i $(SAMPLES)/h264-conformance/HCBP2_HHI_A.264 fate-h264-conformance-hcbp2_hhi_a: CMD = framecrc -vsync 0 -strict 1 -i $(SAMPLES)/h264-conformance/HCBP2_HHI_A.264
fate-h264-conformance-hcmp1_hhi_a: CMD = framecrc -vsync 0 -strict 1 -i $(SAMPLES)/h264-conformance/HCMP1_HHI_A.264 fate-h264-conformance-hcmp1_hhi_a: CMD = framecrc -vsync 0 -strict 1 -i $(SAMPLES)/h264-conformance/HCMP1_HHI_A.264
fate-h264-conformance-ls_sva_d: CMD = framecrc -i $(SAMPLES)/h264-conformance/LS_SVA_D.264 fate-h264-conformance-ls_sva_d: CMD = framecrc -i $(SAMPLES)/h264-conformance/LS_SVA_D.264

View File

@ -27,8 +27,12 @@ uyvy422 adcf64516a19fce44df77082bdb16291
yuv410p 2d9225153c83ee1132397d619d94d1b3 yuv410p 2d9225153c83ee1132397d619d94d1b3
yuv411p 8b298af3e43348ca1b11eb8a3252ac6c yuv411p 8b298af3e43348ca1b11eb8a3252ac6c
yuv420p eba2f135a08829387e2f698ff72a2939 yuv420p eba2f135a08829387e2f698ff72a2939
yuv420p10be 7605e266c088d0fcf68c7b27c3ceff5f
yuv420p10le 4228ee628c6deec123a13b9784516cc7
yuv420p16be 16c009a235cd52b74791a895423152a3 yuv420p16be 16c009a235cd52b74791a895423152a3
yuv420p16le 2d59c4f1d0314a5a957a7cfc4b6fabcc yuv420p16le 2d59c4f1d0314a5a957a7cfc4b6fabcc
yuv420p9be ce880fa07830e5297c22acf6e20555ce
yuv420p9le 16543fda8f87d94a6cf857d2e8d4461a
yuv422p c9bba4529821d796a6ab09f6a5fd355a yuv422p c9bba4529821d796a6ab09f6a5fd355a
yuv422p16be 5499502e1c29534a158a1fe60e889f60 yuv422p16be 5499502e1c29534a158a1fe60e889f60
yuv422p16le e3d61fde6978591596bc36b914386623 yuv422p16le e3d61fde6978591596bc36b914386623

View File

@ -27,8 +27,12 @@ uyvy422 adcf64516a19fce44df77082bdb16291
yuv410p 2d9225153c83ee1132397d619d94d1b3 yuv410p 2d9225153c83ee1132397d619d94d1b3
yuv411p 8b298af3e43348ca1b11eb8a3252ac6c yuv411p 8b298af3e43348ca1b11eb8a3252ac6c
yuv420p eba2f135a08829387e2f698ff72a2939 yuv420p eba2f135a08829387e2f698ff72a2939
yuv420p10be 7605e266c088d0fcf68c7b27c3ceff5f
yuv420p10le 4228ee628c6deec123a13b9784516cc7
yuv420p16be 16c009a235cd52b74791a895423152a3 yuv420p16be 16c009a235cd52b74791a895423152a3
yuv420p16le 2d59c4f1d0314a5a957a7cfc4b6fabcc yuv420p16le 2d59c4f1d0314a5a957a7cfc4b6fabcc
yuv420p9be ce880fa07830e5297c22acf6e20555ce
yuv420p9le 16543fda8f87d94a6cf857d2e8d4461a
yuv422p c9bba4529821d796a6ab09f6a5fd355a yuv422p c9bba4529821d796a6ab09f6a5fd355a
yuv422p16be 5499502e1c29534a158a1fe60e889f60 yuv422p16be 5499502e1c29534a158a1fe60e889f60
yuv422p16le e3d61fde6978591596bc36b914386623 yuv422p16le e3d61fde6978591596bc36b914386623

View File

@ -27,8 +27,12 @@ uyvy422 adcf64516a19fce44df77082bdb16291
yuv410p 2d9225153c83ee1132397d619d94d1b3 yuv410p 2d9225153c83ee1132397d619d94d1b3
yuv411p 8b298af3e43348ca1b11eb8a3252ac6c yuv411p 8b298af3e43348ca1b11eb8a3252ac6c
yuv420p eba2f135a08829387e2f698ff72a2939 yuv420p eba2f135a08829387e2f698ff72a2939
yuv420p10be 7605e266c088d0fcf68c7b27c3ceff5f
yuv420p10le 4228ee628c6deec123a13b9784516cc7
yuv420p16be 16c009a235cd52b74791a895423152a3 yuv420p16be 16c009a235cd52b74791a895423152a3
yuv420p16le 2d59c4f1d0314a5a957a7cfc4b6fabcc yuv420p16le 2d59c4f1d0314a5a957a7cfc4b6fabcc
yuv420p9be ce880fa07830e5297c22acf6e20555ce
yuv420p9le 16543fda8f87d94a6cf857d2e8d4461a
yuv422p c9bba4529821d796a6ab09f6a5fd355a yuv422p c9bba4529821d796a6ab09f6a5fd355a
yuv422p16be 5499502e1c29534a158a1fe60e889f60 yuv422p16be 5499502e1c29534a158a1fe60e889f60
yuv422p16le e3d61fde6978591596bc36b914386623 yuv422p16le e3d61fde6978591596bc36b914386623

View File

@ -27,8 +27,12 @@ uyvy422 314bd486277111a95d9369b944fa0400
yuv410p 7df8f6d69b56a8dcb6c7ee908e5018b5 yuv410p 7df8f6d69b56a8dcb6c7ee908e5018b5
yuv411p 1143e7c5cc28fe0922b051b17733bc4c yuv411p 1143e7c5cc28fe0922b051b17733bc4c
yuv420p fdad2d8df8985e3d17e73c71f713cb14 yuv420p fdad2d8df8985e3d17e73c71f713cb14
yuv420p10be 5051128ca208d89595f7672b1707340b
yuv420p10le 77895bf65e70ad2ca021702fff55c8fc
yuv420p16be 29a0265764530070f5cd3251cc01f66a yuv420p16be 29a0265764530070f5cd3251cc01f66a
yuv420p16le 6f3a265b084a78baec229238d9f7945f yuv420p16le 6f3a265b084a78baec229238d9f7945f
yuv420p9be 02de6b37dc8a631ce2367b535670c40c
yuv420p9le cddfbaf8e2a61aa5ea09fb396bcbc872
yuv422p 918e37701ee7377d16a8a6c119c56a40 yuv422p 918e37701ee7377d16a8a6c119c56a40
yuv422p16be ef3e865fc1d0c68977c735323c50af6e yuv422p16be ef3e865fc1d0c68977c735323c50af6e
yuv422p16le 428a9b96214c09cb5a983ce36d6961ff yuv422p16le 428a9b96214c09cb5a983ce36d6961ff

View File

@ -27,8 +27,12 @@ uyvy422 ffbd36720c77398d9a0d03ce2625928f
yuv410p 7bfb39d7afb49d6a6173e6b23ae321eb yuv410p 7bfb39d7afb49d6a6173e6b23ae321eb
yuv411p 4a90048cc3a65fac150e53289700efe1 yuv411p 4a90048cc3a65fac150e53289700efe1
yuv420p 2e6d6062e8cad37fb3ab2c433b55f382 yuv420p 2e6d6062e8cad37fb3ab2c433b55f382
yuv420p10be df97d20b3b4a10c174d4360552c4160d
yuv420p10le 4b5249208602b941332945c926f80ae9
yuv420p16be 539076782902664a8acf381bf4f713e8 yuv420p16be 539076782902664a8acf381bf4f713e8
yuv420p16le 0f609e588e5a258644ef85170d70e030 yuv420p16le 0f609e588e5a258644ef85170d70e030
yuv420p9be be40ec975fb2873891643cbbbddbc3b0
yuv420p9le 7e606310d3f5ff12badf911e8f333471
yuv422p d7f5cb44d9b0210d66d6a8762640ab34 yuv422p d7f5cb44d9b0210d66d6a8762640ab34
yuv422p16be 9bd8f8c961822b586fa4cf992be54acc yuv422p16be 9bd8f8c961822b586fa4cf992be54acc
yuv422p16le 9c4a1239605c7952b736ac3130163f14 yuv422p16le 9c4a1239605c7952b736ac3130163f14