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.tags/n0.8
| @@ -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_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_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_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_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 | |||
| @@ -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 | |||
| const int chrSkipMask= (1<<c->chrDstVSubSample)-1; | |||
| 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( | |||
| vLumFilter+dstY*vLumFilterSize , lumSrcPtr, vLumFilterSize, | |||
| 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 | |||
| const int chrSkipMask= (1<<c->chrDstVSubSample)-1; | |||
| 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( | |||
| vLumFilter+dstY*vLumFilterSize , lumSrcPtr, vLumFilterSize, | |||
| vChrFilter+chrDstY*vChrFilterSize, chrSrcPtr, vChrFilterSize, | |||
| @@ -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, | |||
| 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) | |||
| int dstW, int chrDstW, int big_endian, int output_bits) | |||
| { | |||
| //FIXME Optimize (just quickly written not optimized..) | |||
| int i; | |||
| int shift = 11 + 16 - output_bits; | |||
| for (i = 0; i < dstW; i++) { | |||
| 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]; | |||
| if (big_endian) { | |||
| AV_WB16(&dest[i], av_clip_uint16(val >> 11)); | |||
| AV_WB16(&dest[i], av_clip_uint16(val >> shift)); | |||
| } 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) { | |||
| AV_WB16(&uDest[i], av_clip_uint16(u >> 11)); | |||
| AV_WB16(&vDest[i], av_clip_uint16(v >> 11)); | |||
| AV_WB16(&uDest[i], av_clip_uint16(u >> shift)); | |||
| AV_WB16(&vDest[i], av_clip_uint16(v >> shift)); | |||
| } else { | |||
| AV_WL16(&uDest[i], av_clip_uint16(u >> 11)); | |||
| AV_WL16(&vDest[i], av_clip_uint16(v >> 11)); | |||
| AV_WL16(&uDest[i], av_clip_uint16(u >> shift)); | |||
| 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]; | |||
| if (big_endian) { | |||
| AV_WB16(&aDest[i], av_clip_uint16(val >> 11)); | |||
| AV_WB16(&aDest[i], av_clip_uint16(val >> shift)); | |||
| } 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, | |||
| enum PixelFormat dstFormat) | |||
| { | |||
| if (isBE(dstFormat)) { | |||
| yuv2yuvX16inC_template(lumFilter, lumSrc, lumFilterSize, | |||
| chrFilter, chrSrc, chrFilterSize, | |||
| alpSrc, | |||
| dest, uDest, vDest, aDest, | |||
| dstW, chrDstW, 1); | |||
| #define conv16(bits) \ | |||
| if (isBE(dstFormat)) { \ | |||
| yuv2yuvX16inC_template(lumFilter, lumSrc, lumFilterSize, \ | |||
| chrFilter, chrSrc, chrFilterSize, \ | |||
| alpSrc, \ | |||
| dest, uDest, vDest, aDest, \ | |||
| dstW, chrDstW, 1, bits); \ | |||
| } else { \ | |||
| yuv2yuvX16inC_template(lumFilter, lumSrc, lumFilterSize, \ | |||
| chrFilter, chrSrc, chrFilterSize, \ | |||
| alpSrc, \ | |||
| 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 { | |||
| yuv2yuvX16inC_template(lumFilter, lumSrc, lumFilterSize, | |||
| chrFilter, chrSrc, chrFilterSize, | |||
| alpSrc, | |||
| dest, uDest, vDest, aDest, | |||
| dstW, chrDstW, 0); | |||
| conv16(10); | |||
| } | |||
| #undef conv16 | |||
| } | |||
| 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; | |||
| fillPlane(dst[plane], dstStride[plane], length, height, y, (plane==3) ? 255 : 128); | |||
| } else { | |||
| if(isNBPS(c->srcFormat)) { | |||
| const int depth = av_pix_fmt_descriptors[c->srcFormat].comp[plane].depth_minus1+1; | |||
| uint16_t *srcPtr2 = (uint16_t*)srcPtr; | |||
| if(is9_OR_10BPS(c->srcFormat)) { | |||
| const int src_depth = av_pix_fmt_descriptors[c->srcFormat].comp[plane].depth_minus1+1; | |||
| 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)) { | |||
| uint16_t *dstPtr2 = (uint16_t*)dstPtr; | |||
| for (i = 0; i < height; i++) { | |||
| for (j = 0; j < length; j++) | |||
| dstPtr2[j] = (srcPtr2[j]<<(16-depth)) | (srcPtr2[j]>>(2*depth-16)); | |||
| dstPtr2 += dstStride[plane]/2; | |||
| srcPtr2 += srcStride[plane]/2; | |||
| #define COPY9_OR_10TO16(rfunc, wfunc) \ | |||
| for (i = 0; i < height; i++) { \ | |||
| for (j = 0; j < length; j++) { \ | |||
| int srcpx = rfunc(&srcPtr2[j]); \ | |||
| 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 { | |||
| // FIXME Maybe dither instead. | |||
| for (i = 0; i < height; i++) { | |||
| for (j = 0; j < length; j++) | |||
| dstPtr[j] = srcPtr2[j]>>(depth-8); | |||
| dstPtr += dstStride[plane]; | |||
| srcPtr2 += srcStride[plane]/2; | |||
| #define COPY9_OR_10TO8(rfunc) \ | |||
| for (i = 0; i < height; i++) { \ | |||
| for (j = 0; j < length; j++) { \ | |||
| dstPtr[j] = rfunc(&srcPtr2[j])>>(src_depth-8); \ | |||
| } \ | |||
| 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)) { | |||
| @@ -354,7 +354,7 @@ const char *sws_format_name(enum PixelFormat format); | |||
| || (x)==PIX_FMT_YUV422P16BE \ | |||
| || (x)==PIX_FMT_YUV444P16BE \ | |||
| ) | |||
| #define isNBPS(x) ( \ | |||
| #define is9_OR_10BPS(x) ( \ | |||
| (x)==PIX_FMT_YUV420P9LE \ | |||
| || (x)==PIX_FMT_YUV420P9BE \ | |||
| || (x)==PIX_FMT_YUV420P10LE \ | |||
| @@ -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) | |||
| { | |||
| 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++) { | |||
| dstU[i]= src1[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. | |||
| #define YUV_NBPS(depth) \ | |||
| static inline void yuv ## depth ## ToUV_c(uint8_t *dstU, uint8_t *dstV, \ | |||
| #define YUV_NBPS(depth, endianness, rfunc) \ | |||
| static inline void endianness ## depth ## ToUV_c(uint8_t *dstU, uint8_t *dstV, \ | |||
| const uint8_t *_srcU, const uint8_t *_srcV, \ | |||
| 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 *srcV = (const uint16_t*)_srcV; \ | |||
| for (i = 0; i < width; i++) { \ | |||
| dstU[i] = srcU[i]>>(depth-8); \ | |||
| dstV[i] = srcV[i]>>(depth-8); \ | |||
| dstU[i] = rfunc(&srcU[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; \ | |||
| const uint16_t *srcY = (const uint16_t*)_srcY; \ | |||
| for (i = 0; i < width; i++) \ | |||
| dstY[i] = srcY[i]>>(depth-8); \ | |||
| dstY[i] = rfunc(&srcY[i])>>(depth-8); \ | |||
| } \ | |||
| YUV_NBPS( 9) | |||
| YUV_NBPS(10) | |||
| YUV_NBPS( 9, LE, AV_RL16) | |||
| 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, | |||
| 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 | |||
| const int chrSkipMask= (1<<c->chrDstVSubSample)-1; | |||
| 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( | |||
| vLumFilter+dstY*vLumFilterSize , lumSrcPtr, vLumFilterSize, | |||
| 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 | |||
| const int chrSkipMask= (1<<c->chrDstVSubSample)-1; | |||
| 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( | |||
| vLumFilter+dstY*vLumFilterSize , lumSrcPtr, vLumFilterSize, | |||
| vChrFilter+chrDstY*vChrFilterSize, chrSrcPtr, vChrFilterSize, | |||
| @@ -816,10 +820,10 @@ static void sws_init_swScale_c(SwsContext *c) | |||
| case PIX_FMT_PAL8 : | |||
| case PIX_FMT_BGR4_BYTE: | |||
| case PIX_FMT_RGB4_BYTE: c->chrToYV12 = palToUV; break; | |||
| case PIX_FMT_YUV420P9BE: | |||
| case PIX_FMT_YUV420P9LE: c->chrToYV12 = yuv9ToUV_c; break; | |||
| case PIX_FMT_YUV420P10BE: | |||
| case PIX_FMT_YUV420P10LE: c->chrToYV12 = yuv10ToUV_c; break; | |||
| case PIX_FMT_YUV420P9BE: c->chrToYV12 = BE9ToUV_c; break; | |||
| case PIX_FMT_YUV420P9LE: c->chrToYV12 = LE9ToUV_c; break; | |||
| case PIX_FMT_YUV420P10BE: c->chrToYV12 = BE10ToUV_c; break; | |||
| case PIX_FMT_YUV420P10LE: c->chrToYV12 = LE10ToUV_c; break; | |||
| case PIX_FMT_YUV420P16BE: | |||
| case PIX_FMT_YUV422P16BE: | |||
| 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->alpToYV12 = NULL; | |||
| switch (srcFormat) { | |||
| case PIX_FMT_YUV420P9BE: | |||
| case PIX_FMT_YUV420P9LE: c->lumToYV12 = yuv9ToY_c; break; | |||
| case PIX_FMT_YUV420P10BE: | |||
| case PIX_FMT_YUV420P10LE: c->lumToYV12 = yuv10ToY_c; break; | |||
| case PIX_FMT_YUV420P9BE: c->lumToYV12 = BE9ToY_c; break; | |||
| case PIX_FMT_YUV420P9LE: c->lumToYV12 = LE9ToY_c; break; | |||
| case PIX_FMT_YUV420P10BE: c->lumToYV12 = BE10ToY_c; break; | |||
| case PIX_FMT_YUV420P10LE: c->lumToYV12 = LE10ToY_c; break; | |||
| case PIX_FMT_YUYV422 : | |||
| case PIX_FMT_YUV420P16BE: | |||
| case PIX_FMT_YUV422P16BE: | |||
| @@ -143,9 +143,13 @@ int sws_isSupportedInput(enum PixelFormat pix_fmt) | |||
| || (x)==PIX_FMT_GRAY8 \ | |||
| || (x)==PIX_FMT_YUV410P \ | |||
| || (x)==PIX_FMT_YUV440P \ | |||
| || (x)==PIX_FMT_YUV420P9LE \ | |||
| || (x)==PIX_FMT_YUV420P10LE \ | |||
| || (x)==PIX_FMT_YUV420P16LE \ | |||
| || (x)==PIX_FMT_YUV422P16LE \ | |||
| || (x)==PIX_FMT_YUV444P16LE \ | |||
| || (x)==PIX_FMT_YUV420P9BE \ | |||
| || (x)==PIX_FMT_YUV420P10BE \ | |||
| || (x)==PIX_FMT_YUV420P16BE \ | |||
| || (x)==PIX_FMT_YUV422P16BE \ | |||
| || (x)==PIX_FMT_YUV444P16BE \ | |||
| @@ -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 | |||
| const int chrSkipMask= (1<<c->chrDstVSubSample)-1; | |||
| 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( | |||
| vLumFilter+dstY*vLumFilterSize , lumSrcPtr, vLumFilterSize, | |||
| 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 | |||
| const int chrSkipMask= (1<<c->chrDstVSubSample)-1; | |||
| 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( | |||
| vLumFilter+dstY*vLumFilterSize , lumSrcPtr, vLumFilterSize, | |||
| vChrFilter+chrDstY*vChrFilterSize, chrSrcPtr, vChrFilterSize, | |||
| @@ -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-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-pph10i1_panasonic_a: CMD = framecrc -i $(SAMPLES)/h264-conformance/FRext/PPH10I1_Panasonic_A.264 | |||
| fate-h264-conformance-frext-pph10i2_panasonic_a: CMD = framecrc -i $(SAMPLES)/h264-conformance/FRext/PPH10I2_Panasonic_A.264 | |||
| fate-h264-conformance-frext-pph10i3_panasonic_a: CMD = framecrc -i $(SAMPLES)/h264-conformance/FRext/PPH10I3_Panasonic_A.264 | |||
| fate-h264-conformance-frext-pph10i4_panasonic_a: CMD = framecrc -i $(SAMPLES)/h264-conformance/FRext/PPH10I4_Panasonic_A.264 | |||
| fate-h264-conformance-frext-pph10i5_panasonic_a: CMD = framecrc -i $(SAMPLES)/h264-conformance/FRext/PPH10I5_Panasonic_A.264 | |||
| fate-h264-conformance-frext-pph10i6_panasonic_a: CMD = framecrc -i $(SAMPLES)/h264-conformance/FRext/PPH10I6_Panasonic_A.264 | |||
| fate-h264-conformance-frext-pph10i7_panasonic_a: CMD = framecrc -i $(SAMPLES)/h264-conformance/FRext/PPH10I7_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 -pix_fmt yuv420p10le | |||
| 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 -pix_fmt yuv420p10le | |||
| 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 -pix_fmt yuv420p10le | |||
| 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-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 | |||
| @@ -27,8 +27,12 @@ uyvy422 adcf64516a19fce44df77082bdb16291 | |||
| yuv410p 2d9225153c83ee1132397d619d94d1b3 | |||
| yuv411p 8b298af3e43348ca1b11eb8a3252ac6c | |||
| yuv420p eba2f135a08829387e2f698ff72a2939 | |||
| yuv420p10be 7605e266c088d0fcf68c7b27c3ceff5f | |||
| yuv420p10le 4228ee628c6deec123a13b9784516cc7 | |||
| yuv420p16be 16c009a235cd52b74791a895423152a3 | |||
| yuv420p16le 2d59c4f1d0314a5a957a7cfc4b6fabcc | |||
| yuv420p9be ce880fa07830e5297c22acf6e20555ce | |||
| yuv420p9le 16543fda8f87d94a6cf857d2e8d4461a | |||
| yuv422p c9bba4529821d796a6ab09f6a5fd355a | |||
| yuv422p16be 5499502e1c29534a158a1fe60e889f60 | |||
| yuv422p16le e3d61fde6978591596bc36b914386623 | |||
| @@ -27,8 +27,12 @@ uyvy422 adcf64516a19fce44df77082bdb16291 | |||
| yuv410p 2d9225153c83ee1132397d619d94d1b3 | |||
| yuv411p 8b298af3e43348ca1b11eb8a3252ac6c | |||
| yuv420p eba2f135a08829387e2f698ff72a2939 | |||
| yuv420p10be 7605e266c088d0fcf68c7b27c3ceff5f | |||
| yuv420p10le 4228ee628c6deec123a13b9784516cc7 | |||
| yuv420p16be 16c009a235cd52b74791a895423152a3 | |||
| yuv420p16le 2d59c4f1d0314a5a957a7cfc4b6fabcc | |||
| yuv420p9be ce880fa07830e5297c22acf6e20555ce | |||
| yuv420p9le 16543fda8f87d94a6cf857d2e8d4461a | |||
| yuv422p c9bba4529821d796a6ab09f6a5fd355a | |||
| yuv422p16be 5499502e1c29534a158a1fe60e889f60 | |||
| yuv422p16le e3d61fde6978591596bc36b914386623 | |||
| @@ -27,8 +27,12 @@ uyvy422 adcf64516a19fce44df77082bdb16291 | |||
| yuv410p 2d9225153c83ee1132397d619d94d1b3 | |||
| yuv411p 8b298af3e43348ca1b11eb8a3252ac6c | |||
| yuv420p eba2f135a08829387e2f698ff72a2939 | |||
| yuv420p10be 7605e266c088d0fcf68c7b27c3ceff5f | |||
| yuv420p10le 4228ee628c6deec123a13b9784516cc7 | |||
| yuv420p16be 16c009a235cd52b74791a895423152a3 | |||
| yuv420p16le 2d59c4f1d0314a5a957a7cfc4b6fabcc | |||
| yuv420p9be ce880fa07830e5297c22acf6e20555ce | |||
| yuv420p9le 16543fda8f87d94a6cf857d2e8d4461a | |||
| yuv422p c9bba4529821d796a6ab09f6a5fd355a | |||
| yuv422p16be 5499502e1c29534a158a1fe60e889f60 | |||
| yuv422p16le e3d61fde6978591596bc36b914386623 | |||
| @@ -27,8 +27,12 @@ uyvy422 314bd486277111a95d9369b944fa0400 | |||
| yuv410p 7df8f6d69b56a8dcb6c7ee908e5018b5 | |||
| yuv411p 1143e7c5cc28fe0922b051b17733bc4c | |||
| yuv420p fdad2d8df8985e3d17e73c71f713cb14 | |||
| yuv420p10be 5051128ca208d89595f7672b1707340b | |||
| yuv420p10le 77895bf65e70ad2ca021702fff55c8fc | |||
| yuv420p16be 29a0265764530070f5cd3251cc01f66a | |||
| yuv420p16le 6f3a265b084a78baec229238d9f7945f | |||
| yuv420p9be 02de6b37dc8a631ce2367b535670c40c | |||
| yuv420p9le cddfbaf8e2a61aa5ea09fb396bcbc872 | |||
| yuv422p 918e37701ee7377d16a8a6c119c56a40 | |||
| yuv422p16be ef3e865fc1d0c68977c735323c50af6e | |||
| yuv422p16le 428a9b96214c09cb5a983ce36d6961ff | |||
| @@ -27,8 +27,12 @@ uyvy422 ffbd36720c77398d9a0d03ce2625928f | |||
| yuv410p 7bfb39d7afb49d6a6173e6b23ae321eb | |||
| yuv411p 4a90048cc3a65fac150e53289700efe1 | |||
| yuv420p 2e6d6062e8cad37fb3ab2c433b55f382 | |||
| yuv420p10be df97d20b3b4a10c174d4360552c4160d | |||
| yuv420p10le 4b5249208602b941332945c926f80ae9 | |||
| yuv420p16be 539076782902664a8acf381bf4f713e8 | |||
| yuv420p16le 0f609e588e5a258644ef85170d70e030 | |||
| yuv420p9be be40ec975fb2873891643cbbbddbc3b0 | |||
| yuv420p9le 7e606310d3f5ff12badf911e8f333471 | |||
| yuv422p d7f5cb44d9b0210d66d6a8762640ab34 | |||
| yuv422p16be 9bd8f8c961822b586fa4cf992be54acc | |||
| yuv422p16le 9c4a1239605c7952b736ac3130163f14 | |||