X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libswscale%2Fswscale.c;h=2f9cb1b453d2da8995b41cc4eabd6d9abd8775b5;hb=2268db2cd052674fde55c7d48b7a5098ce89b4ba;hp=dac8b37468965c8231be770d9221085262c84595;hpb=511cf612ac979f536fd65e14603a87ca5ad435f3;p=ffmpeg diff --git a/libswscale/swscale.c b/libswscale/swscale.c index dac8b374689..2f9cb1b453d 100644 --- a/libswscale/swscale.c +++ b/libswscale/swscale.c @@ -35,7 +35,7 @@ #include "swscale_internal.h" #include "swscale.h" -DECLARE_ALIGNED(8, const uint8_t, dither_8x8_128)[8][8] = { +DECLARE_ALIGNED(8, const uint8_t, ff_dither_8x8_128)[8][8] = { { 36, 68, 60, 92, 34, 66, 58, 90, }, { 100, 4, 124, 28, 98, 2, 122, 26, }, { 52, 84, 44, 76, 50, 82, 42, 74, }, @@ -46,7 +46,7 @@ DECLARE_ALIGNED(8, const uint8_t, dither_8x8_128)[8][8] = { { 112, 16, 104, 8, 118, 22, 110, 14, }, }; -DECLARE_ALIGNED(8, const uint8_t, ff_sws_pb_64)[8] = { +DECLARE_ALIGNED(8, static const uint8_t, sws_pb_64)[8] = { 64, 64, 64, 64, 64, 64, 64, 64 }; @@ -91,7 +91,7 @@ static void hScale16To19_c(SwsContext *c, int16_t *_dst, int dstW, int i; int32_t *dst = (int32_t *) _dst; const uint16_t *src = (const uint16_t *) _src; - int bits = desc->comp[0].depth_minus1; + int bits = desc->comp[0].depth - 1; int sh = bits - 4; for (i = 0; i < dstW; i++) { @@ -114,7 +114,7 @@ static void hScale16To15_c(SwsContext *c, int16_t *dst, int dstW, const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(c->srcFormat); int i; const uint16_t *src = (const uint16_t *) _src; - int sh = desc->comp[0].depth_minus1; + int sh = desc->comp[0].depth - 1; for (i = 0; i < dstW; i++) { int j; @@ -269,6 +269,9 @@ static av_always_inline void hyscale(SwsContext *c, int16_t *dst, int dstWidth, } else if (c->readLumPlanar && !isAlpha) { c->readLumPlanar(formatConvBuffer, src_in, srcW); src = formatConvBuffer; + } else if (c->readAlpPlanar && isAlpha) { + c->readAlpPlanar(formatConvBuffer, src_in, srcW); + src = formatConvBuffer; } if (!c->hyscale_fast) { @@ -337,7 +340,7 @@ static av_always_inline void hcscale(SwsContext *c, int16_t *dst1, if (DEBUG_SWSCALE_BUFFERS) \ av_log(c, AV_LOG_DEBUG, __VA_ARGS__) -static int swScale(SwsContext *c, const uint8_t *src[], +static int swscale(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dst[], int dstStride[]) { @@ -380,6 +383,7 @@ static int swScale(SwsContext *c, const uint8_t *src[], yuv2packed1_fn yuv2packed1 = c->yuv2packed1; yuv2packed2_fn yuv2packed2 = c->yuv2packed2; yuv2packedX_fn yuv2packedX = c->yuv2packedX; + yuv2anyX_fn yuv2anyX = c->yuv2anyX; const int chrSrcSliceY = srcSliceY >> c->chrSrcVSubSample; const int chrSrcSliceH = -((-srcSliceH) >> c->chrSrcVSubSample); int should_dither = is9_OR_10BPS(c->srcFormat) || @@ -406,7 +410,7 @@ static int swScale(SwsContext *c, const uint8_t *src[], srcStride[1] <<= c->vChrDrop; srcStride[2] <<= c->vChrDrop; - DEBUG_BUFFERS("swScale() %p[%d] %p[%d] %p[%d] %p[%d] -> %p[%d] %p[%d] %p[%d] %p[%d]\n", + DEBUG_BUFFERS("swscale() %p[%d] %p[%d] %p[%d] %p[%d] -> %p[%d] %p[%d] %p[%d] %p[%d]\n", src[0], srcStride[0], src[1], srcStride[1], src[2], srcStride[2], src[3], srcStride[3], dst[0], dstStride[0], dst[1], dstStride[1], @@ -439,7 +443,7 @@ static int swScale(SwsContext *c, const uint8_t *src[], } if (!should_dither) { - c->chrDither8 = c->lumDither8 = ff_sws_pb_64; + c->chrDither8 = c->lumDither8 = sws_pb_64; } lastDstY = dstY; @@ -547,14 +551,14 @@ static int swScale(SwsContext *c, const uint8_t *src[], lastInLumBuf, lastInChrBuf); #endif if (should_dither) { - c->chrDither8 = dither_8x8_128[chrDstY & 7]; - c->lumDither8 = dither_8x8_128[dstY & 7]; + c->chrDither8 = ff_dither_8x8_128[chrDstY & 7]; + c->lumDither8 = ff_dither_8x8_128[dstY & 7]; } if (dstY >= dstH - 2) { /* hmm looks like we can't use MMX here without overwriting * this array's tail */ ff_sws_init_output_funcs(c, &yuv2plane1, &yuv2planeX, &yuv2nv12cX, - &yuv2packed1, &yuv2packed2, &yuv2packedX); + &yuv2packed1, &yuv2packed2, &yuv2packedX, &yuv2anyX); } { @@ -651,7 +655,7 @@ static int swScale(SwsContext *c, const uint8_t *src[], dstW, c->lumDither8, 0); } } - } else { + } else if (yuv2packedX) { if (c->yuv2packed1 && vLumFilterSize == 1 && vChrFilterSize <= 2) { // unscaled RGB int chrAlpha = vChrFilterSize == 1 ? 0 : vChrFilter[2 * dstY + 1]; @@ -676,6 +680,12 @@ static int swScale(SwsContext *c, const uint8_t *src[], chrUSrcPtr, chrVSrcPtr, vChrFilterSize, alpSrcPtr, dest[0], dstW, dstY); } + } else { + yuv2anyX(c, vLumFilter + dstY * vLumFilterSize, + lumSrcPtr, vLumFilterSize, + vChrFilter + dstY * vChrFilterSize, + chrUSrcPtr, chrVSrcPtr, vChrFilterSize, + alpSrcPtr, dest, dstW, dstY); } } } @@ -689,8 +699,7 @@ static int swScale(SwsContext *c, const uint8_t *src[], if (is9_OR_10BPS(dstFormat)) { const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(dstFormat); fill_plane9or10(dst[3], dstStride[3], length, height, lastDstY, - 255, desc->comp[3].depth_minus1 + 1, - isBE(dstFormat)); + 255, desc->comp[3].depth, isBE(dstFormat)); } else fillPlane(dst[3], dstStride[3], length, height, lastDstY, 255); } @@ -711,13 +720,13 @@ static int swScale(SwsContext *c, const uint8_t *src[], return dstY - lastDstY; } -static av_cold void sws_init_swScale_c(SwsContext *c) +static av_cold void sws_init_swscale(SwsContext *c) { enum AVPixelFormat srcFormat = c->srcFormat; ff_sws_init_output_funcs(c, &c->yuv2plane1, &c->yuv2planeX, &c->yuv2nv12cX, &c->yuv2packed1, - &c->yuv2packed2, &c->yuv2packedX); + &c->yuv2packed2, &c->yuv2packedX, &c->yuv2anyX); ff_sws_init_input_funcs(c); @@ -763,12 +772,12 @@ static av_cold void sws_init_swScale_c(SwsContext *c) SwsFunc ff_getSwsFunc(SwsContext *c) { - sws_init_swScale_c(c); + sws_init_swscale(c); - if (HAVE_MMX) - ff_sws_init_swScale_mmx(c); - if (HAVE_ALTIVEC) - ff_sws_init_swScale_altivec(c); + if (ARCH_PPC) + ff_sws_init_swscale_ppc(c); + if (ARCH_X86) + ff_sws_init_swscale_x86(c); - return swScale; + return swscale; }