History

swscale: cleanup unused code

Removed previous swscale code under '#ifndef NEW_FILTER' and removed unused fields of SwsContext

Pedro Arthur committed 10 years ago

Commit 6de58b41 parent 3b905b910 files · +65 −463Browse files

Unified · Split

10 files
  1. libswscale/input.c +1 −1
  2. libswscale/output.c +20 −20
  3. libswscale/ppc/swscale_altivec.c +2 −2
  4. libswscale/slice.c +2 −2
  5. libswscale/swscale.c +21 −315
  6. libswscale/swscale_internal.h +1 −9
  7. libswscale/utils.c +2 −76
  8. libswscale/vscale.c +2 −2
  9. libswscale/x86/swscale.c +8 −30
  10. libswscale/x86/swscale_template.c +6 −6
libswscale/input.c+1−1
@@ -1482,7 +1482,7 @@ av_cold void ff_sws_init_input_funcs(SwsContext *c) · 1481 unmodified lines
1482 c->lumToYV12 = p010BEToY_c;1482 c->lumToYV12 = p010BEToY_c;
1483 break;1483 break;
1484 }1484 }
1485 if (c->alpPixBuf) {1485 if (c->needAlpha) {
1486 if (is16BPS(srcFormat) || isNBPS(srcFormat)) {1486 if (is16BPS(srcFormat) || isNBPS(srcFormat)) {
1487 if (HAVE_BIGENDIAN == !isBE(srcFormat))1487 if (HAVE_BIGENDIAN == !isBE(srcFormat))
1488 c->alpToYV12 = bswap16Y_c;1488 c->alpToYV12 = bswap16Y_c;
libswscale/output.c+20−20
@@ -1513,8 +1513,8 @@ static void name ## ext ## _1_c(SwsContext *c, const int16_t *buf0, \ · 1512 unmodified lines
1513}1513}
1514 1514
1515#if CONFIG_SMALL1515#if CONFIG_SMALL
1516YUV2RGBWRAPPER(yuv2rgb,, 32_1, AV_PIX_FMT_RGB32_1, CONFIG_SWSCALE_ALPHA && c->alpPixBuf)1516YUV2RGBWRAPPER(yuv2rgb,, 32_1, AV_PIX_FMT_RGB32_1, CONFIG_SWSCALE_ALPHA && c->needAlpha)
1517YUV2RGBWRAPPER(yuv2rgb,, 32, AV_PIX_FMT_RGB32, CONFIG_SWSCALE_ALPHA && c->alpPixBuf)1517YUV2RGBWRAPPER(yuv2rgb,, 32, AV_PIX_FMT_RGB32, CONFIG_SWSCALE_ALPHA && c->needAlpha)
1518#else1518#else
1519#if CONFIG_SWSCALE_ALPHA1519#if CONFIG_SWSCALE_ALPHA
1520YUV2RGBWRAPPER(yuv2rgb,, a32_1, AV_PIX_FMT_RGB32_1, 1)1520YUV2RGBWRAPPER(yuv2rgb,, a32_1, AV_PIX_FMT_RGB32_1, 1)
@@ -1823,10 +1823,10 @@ yuv2rgb_full_1_c_template(SwsContext *c, const int16_t *buf0, · 302 unmodified lines
1823}1823}
1824 1824
1825#if CONFIG_SMALL1825#if CONFIG_SMALL
1826YUV2RGBWRAPPER(yuv2, rgb_full, bgra32_full, AV_PIX_FMT_BGRA, CONFIG_SWSCALE_ALPHA && c->alpPixBuf)1826YUV2RGBWRAPPER(yuv2, rgb_full, bgra32_full, AV_PIX_FMT_BGRA, CONFIG_SWSCALE_ALPHA && c->needAlpha)
1827YUV2RGBWRAPPER(yuv2, rgb_full, abgr32_full, AV_PIX_FMT_ABGR, CONFIG_SWSCALE_ALPHA && c->alpPixBuf)1827YUV2RGBWRAPPER(yuv2, rgb_full, abgr32_full, AV_PIX_FMT_ABGR, CONFIG_SWSCALE_ALPHA && c->needAlpha)
1828YUV2RGBWRAPPER(yuv2, rgb_full, rgba32_full, AV_PIX_FMT_RGBA, CONFIG_SWSCALE_ALPHA && c->alpPixBuf)1828YUV2RGBWRAPPER(yuv2, rgb_full, rgba32_full, AV_PIX_FMT_RGBA, CONFIG_SWSCALE_ALPHA && c->needAlpha)
1829YUV2RGBWRAPPER(yuv2, rgb_full, argb32_full, AV_PIX_FMT_ARGB, CONFIG_SWSCALE_ALPHA && c->alpPixBuf)1829YUV2RGBWRAPPER(yuv2, rgb_full, argb32_full, AV_PIX_FMT_ARGB, CONFIG_SWSCALE_ALPHA && c->needAlpha)
1830#else1830#else
1831#if CONFIG_SWSCALE_ALPHA1831#if CONFIG_SWSCALE_ALPHA
1832YUV2RGBWRAPPER(yuv2, rgb_full, bgra32_full, AV_PIX_FMT_BGRA, 1)1832YUV2RGBWRAPPER(yuv2, rgb_full, bgra32_full, AV_PIX_FMT_BGRA, 1)
@@ -2119,7 +2119,7 @@ av_cold void ff_sws_init_output_funcs(SwsContext *c, · 286 unmodified lines
2119 *yuv2packed1 = yuv2rgba32_full_1_c;2119 *yuv2packed1 = yuv2rgba32_full_1_c;
2120#else2120#else
2121#if CONFIG_SWSCALE_ALPHA2121#if CONFIG_SWSCALE_ALPHA
2122 if (c->alpPixBuf) {2122 if (c->needAlpha) {
2123 *yuv2packedX = yuv2rgba32_full_X_c;2123 *yuv2packedX = yuv2rgba32_full_X_c;
2124 *yuv2packed2 = yuv2rgba32_full_2_c;2124 *yuv2packed2 = yuv2rgba32_full_2_c;
2125 *yuv2packed1 = yuv2rgba32_full_1_c;2125 *yuv2packed1 = yuv2rgba32_full_1_c;
@@ -2139,7 +2139,7 @@ av_cold void ff_sws_init_output_funcs(SwsContext *c, · 13 unmodified lines
2139 *yuv2packed1 = yuv2argb32_full_1_c;2139 *yuv2packed1 = yuv2argb32_full_1_c;
2140#else2140#else
2141#if CONFIG_SWSCALE_ALPHA2141#if CONFIG_SWSCALE_ALPHA
2142 if (c->alpPixBuf) {2142 if (c->needAlpha) {
2143 *yuv2packedX = yuv2argb32_full_X_c;2143 *yuv2packedX = yuv2argb32_full_X_c;
2144 *yuv2packed2 = yuv2argb32_full_2_c;2144 *yuv2packed2 = yuv2argb32_full_2_c;
2145 *yuv2packed1 = yuv2argb32_full_1_c;2145 *yuv2packed1 = yuv2argb32_full_1_c;
@@ -2159,7 +2159,7 @@ av_cold void ff_sws_init_output_funcs(SwsContext *c, · 13 unmodified lines
2159 *yuv2packed1 = yuv2bgra32_full_1_c;2159 *yuv2packed1 = yuv2bgra32_full_1_c;
2160#else2160#else
2161#if CONFIG_SWSCALE_ALPHA2161#if CONFIG_SWSCALE_ALPHA
2162 if (c->alpPixBuf) {2162 if (c->needAlpha) {
2163 *yuv2packedX = yuv2bgra32_full_X_c;2163 *yuv2packedX = yuv2bgra32_full_X_c;
2164 *yuv2packed2 = yuv2bgra32_full_2_c;2164 *yuv2packed2 = yuv2bgra32_full_2_c;
2165 *yuv2packed1 = yuv2bgra32_full_1_c;2165 *yuv2packed1 = yuv2bgra32_full_1_c;
@@ -2179,7 +2179,7 @@ av_cold void ff_sws_init_output_funcs(SwsContext *c, · 13 unmodified lines
2179 *yuv2packed1 = yuv2abgr32_full_1_c;2179 *yuv2packed1 = yuv2abgr32_full_1_c;
2180#else2180#else
2181#if CONFIG_SWSCALE_ALPHA2181#if CONFIG_SWSCALE_ALPHA
2182 if (c->alpPixBuf) {2182 if (c->needAlpha) {
2183 *yuv2packedX = yuv2abgr32_full_X_c;2183 *yuv2packedX = yuv2abgr32_full_X_c;
2184 *yuv2packed2 = yuv2abgr32_full_2_c;2184 *yuv2packed2 = yuv2abgr32_full_2_c;
2185 *yuv2packed1 = yuv2abgr32_full_1_c;2185 *yuv2packed1 = yuv2abgr32_full_1_c;
@@ -2194,7 +2194,7 @@ av_cold void ff_sws_init_output_funcs(SwsContext *c, · 8 unmodified lines
2194 break;2194 break;
2195 case AV_PIX_FMT_RGBA64LE:2195 case AV_PIX_FMT_RGBA64LE:
2196#if CONFIG_SWSCALE_ALPHA2196#if CONFIG_SWSCALE_ALPHA
2197 if (c->alpPixBuf) {2197 if (c->needAlpha) {
2198 *yuv2packedX = yuv2rgba64le_full_X_c;2198 *yuv2packedX = yuv2rgba64le_full_X_c;
2199 *yuv2packed2 = yuv2rgba64le_full_2_c;2199 *yuv2packed2 = yuv2rgba64le_full_2_c;
2200 *yuv2packed1 = yuv2rgba64le_full_1_c;2200 *yuv2packed1 = yuv2rgba64le_full_1_c;
@@ -2208,7 +2208,7 @@ av_cold void ff_sws_init_output_funcs(SwsContext *c, · 7 unmodified lines
2208 break;2208 break;
2209 case AV_PIX_FMT_RGBA64BE:2209 case AV_PIX_FMT_RGBA64BE:
2210#if CONFIG_SWSCALE_ALPHA2210#if CONFIG_SWSCALE_ALPHA
2211 if (c->alpPixBuf) {2211 if (c->needAlpha) {
2212 *yuv2packedX = yuv2rgba64be_full_X_c;2212 *yuv2packedX = yuv2rgba64be_full_X_c;
2213 *yuv2packed2 = yuv2rgba64be_full_2_c;2213 *yuv2packed2 = yuv2rgba64be_full_2_c;
2214 *yuv2packed1 = yuv2rgba64be_full_1_c;2214 *yuv2packed1 = yuv2rgba64be_full_1_c;
@@ -2222,7 +2222,7 @@ av_cold void ff_sws_init_output_funcs(SwsContext *c, · 7 unmodified lines
2222 break;2222 break;
2223 case AV_PIX_FMT_BGRA64LE:2223 case AV_PIX_FMT_BGRA64LE:
2224#if CONFIG_SWSCALE_ALPHA2224#if CONFIG_SWSCALE_ALPHA
2225 if (c->alpPixBuf) {2225 if (c->needAlpha) {
2226 *yuv2packedX = yuv2bgra64le_full_X_c;2226 *yuv2packedX = yuv2bgra64le_full_X_c;
2227 *yuv2packed2 = yuv2bgra64le_full_2_c;2227 *yuv2packed2 = yuv2bgra64le_full_2_c;
2228 *yuv2packed1 = yuv2bgra64le_full_1_c;2228 *yuv2packed1 = yuv2bgra64le_full_1_c;
@@ -2236,7 +2236,7 @@ av_cold void ff_sws_init_output_funcs(SwsContext *c, · 7 unmodified lines
2236 break;2236 break;
2237 case AV_PIX_FMT_BGRA64BE:2237 case AV_PIX_FMT_BGRA64BE:
2238#if CONFIG_SWSCALE_ALPHA2238#if CONFIG_SWSCALE_ALPHA
2239 if (c->alpPixBuf) {2239 if (c->needAlpha) {
2240 *yuv2packedX = yuv2bgra64be_full_X_c;2240 *yuv2packedX = yuv2bgra64be_full_X_c;
2241 *yuv2packed2 = yuv2bgra64be_full_2_c;2241 *yuv2packed2 = yuv2bgra64be_full_2_c;
2242 *yuv2packed1 = yuv2bgra64be_full_1_c;2242 *yuv2packed1 = yuv2bgra64be_full_1_c;
@@ -2321,7 +2321,7 @@ av_cold void ff_sws_init_output_funcs(SwsContext *c, · 78 unmodified lines
2321 switch (dstFormat) {2321 switch (dstFormat) {
2322 case AV_PIX_FMT_RGBA64LE:2322 case AV_PIX_FMT_RGBA64LE:
2323#if CONFIG_SWSCALE_ALPHA2323#if CONFIG_SWSCALE_ALPHA
2324 if (c->alpPixBuf) {2324 if (c->needAlpha) {
2325 *yuv2packed1 = yuv2rgba64le_1_c;2325 *yuv2packed1 = yuv2rgba64le_1_c;
2326 *yuv2packed2 = yuv2rgba64le_2_c;2326 *yuv2packed2 = yuv2rgba64le_2_c;
2327 *yuv2packedX = yuv2rgba64le_X_c;2327 *yuv2packedX = yuv2rgba64le_X_c;
@@ -2335,7 +2335,7 @@ av_cold void ff_sws_init_output_funcs(SwsContext *c, · 7 unmodified lines
2335 break;2335 break;
2336 case AV_PIX_FMT_RGBA64BE:2336 case AV_PIX_FMT_RGBA64BE:
2337#if CONFIG_SWSCALE_ALPHA2337#if CONFIG_SWSCALE_ALPHA
2338 if (c->alpPixBuf) {2338 if (c->needAlpha) {
2339 *yuv2packed1 = yuv2rgba64be_1_c;2339 *yuv2packed1 = yuv2rgba64be_1_c;
2340 *yuv2packed2 = yuv2rgba64be_2_c;2340 *yuv2packed2 = yuv2rgba64be_2_c;
2341 *yuv2packedX = yuv2rgba64be_X_c;2341 *yuv2packedX = yuv2rgba64be_X_c;
@@ -2349,7 +2349,7 @@ av_cold void ff_sws_init_output_funcs(SwsContext *c, · 7 unmodified lines
2349 break;2349 break;
2350 case AV_PIX_FMT_BGRA64LE:2350 case AV_PIX_FMT_BGRA64LE:
2351#if CONFIG_SWSCALE_ALPHA2351#if CONFIG_SWSCALE_ALPHA
2352 if (c->alpPixBuf) {2352 if (c->needAlpha) {
2353 *yuv2packed1 = yuv2bgra64le_1_c;2353 *yuv2packed1 = yuv2bgra64le_1_c;
2354 *yuv2packed2 = yuv2bgra64le_2_c;2354 *yuv2packed2 = yuv2bgra64le_2_c;
2355 *yuv2packedX = yuv2bgra64le_X_c;2355 *yuv2packedX = yuv2bgra64le_X_c;
@@ -2363,7 +2363,7 @@ av_cold void ff_sws_init_output_funcs(SwsContext *c, · 7 unmodified lines
2363 break;2363 break;
2364 case AV_PIX_FMT_BGRA64BE:2364 case AV_PIX_FMT_BGRA64BE:
2365#if CONFIG_SWSCALE_ALPHA2365#if CONFIG_SWSCALE_ALPHA
2366 if (c->alpPixBuf) {2366 if (c->needAlpha) {
2367 *yuv2packed1 = yuv2bgra64be_1_c;2367 *yuv2packed1 = yuv2bgra64be_1_c;
2368 *yuv2packed2 = yuv2bgra64be_2_c;2368 *yuv2packed2 = yuv2bgra64be_2_c;
2369 *yuv2packedX = yuv2bgra64be_X_c;2369 *yuv2packedX = yuv2bgra64be_X_c;
@@ -2403,7 +2403,7 @@ av_cold void ff_sws_init_output_funcs(SwsContext *c, · 33 unmodified lines
2403 *yuv2packedX = yuv2rgb32_X_c;2403 *yuv2packedX = yuv2rgb32_X_c;
2404#else2404#else
2405#if CONFIG_SWSCALE_ALPHA2405#if CONFIG_SWSCALE_ALPHA
2406 if (c->alpPixBuf) {2406 if (c->needAlpha) {
2407 *yuv2packed1 = yuv2rgba32_1_c;2407 *yuv2packed1 = yuv2rgba32_1_c;
2408 *yuv2packed2 = yuv2rgba32_2_c;2408 *yuv2packed2 = yuv2rgba32_2_c;
2409 *yuv2packedX = yuv2rgba32_X_c;2409 *yuv2packedX = yuv2rgba32_X_c;
@@ -2424,7 +2424,7 @@ av_cold void ff_sws_init_output_funcs(SwsContext *c, · 14 unmodified lines
2424 *yuv2packedX = yuv2rgb32_1_X_c;2424 *yuv2packedX = yuv2rgb32_1_X_c;
2425#else2425#else
2426#if CONFIG_SWSCALE_ALPHA2426#if CONFIG_SWSCALE_ALPHA
2427 if (c->alpPixBuf) {2427 if (c->needAlpha) {
2428 *yuv2packed1 = yuv2rgba32_1_1_c;2428 *yuv2packed1 = yuv2rgba32_1_1_c;
2429 *yuv2packed2 = yuv2rgba32_1_2_c;2429 *yuv2packed2 = yuv2rgba32_1_2_c;
2430 *yuv2packedX = yuv2rgba32_1_X_c;2430 *yuv2packedX = yuv2rgba32_1_X_c;
libswscale/ppc/swscale_altivec.c+2−2
@@ -339,13 +339,13 @@ av_cold void ff_sws_init_swscale_ppc(SwsContext *c) · 338 unmodified lines
339 }339 }
340 if (!is16BPS(dstFormat) && !is9_OR_10BPS(dstFormat) &&340 if (!is16BPS(dstFormat) && !is9_OR_10BPS(dstFormat) &&
341 dstFormat != AV_PIX_FMT_NV12 && dstFormat != AV_PIX_FMT_NV21 &&341 dstFormat != AV_PIX_FMT_NV12 && dstFormat != AV_PIX_FMT_NV21 &&
342 !c->alpPixBuf) {342 !c->needAlpha) {
343 c->yuv2planeX = yuv2planeX_altivec;343 c->yuv2planeX = yuv2planeX_altivec;
344 }344 }
345 345
346 /* The following list of supported dstFormat values should346 /* The following list of supported dstFormat values should
347 * match what's found in the body of ff_yuv2packedX_altivec() */347 * match what's found in the body of ff_yuv2packedX_altivec() */
348 if (!(c->flags & (SWS_BITEXACT | SWS_FULL_CHR_H_INT)) && !c->alpPixBuf) {348 if (!(c->flags & (SWS_BITEXACT | SWS_FULL_CHR_H_INT)) && !c->needAlpha) {
349 switch (c->dstFormat) {349 switch (c->dstFormat) {
350 case AV_PIX_FMT_ABGR:350 case AV_PIX_FMT_ABGR:
351 c->yuv2packedX = ff_yuv2abgr_X_altivec;351 c->yuv2packedX = ff_yuv2abgr_X_altivec;
libswscale/slice.c+2−2
@@ -279,7 +279,7 @@ int ff_init_filters(SwsContext * c) · 278 unmodified lines
279 if (need_lum_conv) {279 if (need_lum_conv) {
280 res = ff_init_desc_fmt_convert(&c->desc[index], &c->slice[srcIdx], &c->slice[dstIdx], pal);280 res = ff_init_desc_fmt_convert(&c->desc[index], &c->slice[srcIdx], &c->slice[dstIdx], pal);
281 if (res < 0) goto cleanup;281 if (res < 0) goto cleanup;
282 c->desc[index].alpha = c->alpPixBuf != 0;282 c->desc[index].alpha = c->needAlpha;
283 ++index;283 ++index;
284 srcIdx = dstIdx;284 srcIdx = dstIdx;
285 }285 }
@@ -288,7 +288,7 @@ int ff_init_filters(SwsContext * c) · 2 unmodified lines
288 dstIdx = FFMAX(num_ydesc, num_cdesc);288 dstIdx = FFMAX(num_ydesc, num_cdesc);
289 res = ff_init_desc_hscale(&c->desc[index], &c->slice[srcIdx], &c->slice[dstIdx], c->hLumFilter, c->hLumFilterPos, c->hLumFilterSize, c->lumXInc);289 res = ff_init_desc_hscale(&c->desc[index], &c->slice[srcIdx], &c->slice[dstIdx], c->hLumFilter, c->hLumFilterPos, c->hLumFilterSize, c->lumXInc);
290 if (res < 0) goto cleanup;290 if (res < 0) goto cleanup;
291 c->desc[index].alpha = c->alpPixBuf != 0;291 c->desc[index].alpha = c->needAlpha;
292 292
293 293
294 ++index;294 ++index;
libswscale/swscale.c+21−315
@@ -52,24 +52,6 @@ DECLARE_ALIGNED(8, static const uint8_t, sws_pb_64)[8] = { · 51 unmodified lines
52 64, 64, 64, 64, 64, 64, 64, 6452 64, 64, 64, 64, 64, 64, 64, 64
53};53};
54 54
55#ifndef NEW_FILTER
56static void gamma_convert(uint8_t * src[], int width, uint16_t *gamma)
57{
58 int i;
59 uint16_t *src1 = (uint16_t*)src[0];
60
61 for (i = 0; i < width; ++i) {
62 uint16_t r = AV_RL16(src1 + i*4 + 0);
63 uint16_t g = AV_RL16(src1 + i*4 + 1);
64 uint16_t b = AV_RL16(src1 + i*4 + 2);
65
66 AV_WL16(src1 + i*4 + 0, gamma[r]);
67 AV_WL16(src1 + i*4 + 1, gamma[g]);
68 AV_WL16(src1 + i*4 + 2, gamma[b]);
69 }
70}
71#endif
72
73static av_always_inline void fillPlane(uint8_t *plane, int stride, int width,55static av_always_inline void fillPlane(uint8_t *plane, int stride, int width,
74 int height, int y, uint8_t val)56 int height, int y, uint8_t val)
75{57{
@@ -240,79 +222,6 @@ static void lumRangeFromJpeg16_c(int16_t *_dst, int width) · 164 unmodified lines
240 dst[i] = (dst[i]*(14071/4) + (33561947<<4)/4)>>12;222 dst[i] = (dst[i]*(14071/4) + (33561947<<4)/4)>>12;
241}223}
242 224
243#ifndef NEW_FILTER
244// *** horizontal scale Y line to temp buffer
245static av_always_inline void hyscale(SwsContext *c, int16_t *dst, int dstWidth,
246 const uint8_t *src_in[4],
247 int srcW, int xInc,
248 const int16_t *hLumFilter,
249 const int32_t *hLumFilterPos,
250 int hLumFilterSize,
251 uint8_t *formatConvBuffer,
252 uint32_t *pal, int isAlpha)
253{
254 void (*toYV12)(uint8_t *, const uint8_t *, const uint8_t *, const uint8_t *, int, uint32_t *) =
255 isAlpha ? c->alpToYV12 : c->lumToYV12;
256 void (*convertRange)(int16_t *, int) = isAlpha ? NULL : c->lumConvertRange;
257 const uint8_t *src = src_in[isAlpha ? 3 : 0];
258
259 if (toYV12) {
260 toYV12(formatConvBuffer, src, src_in[1], src_in[2], srcW, pal);
261 src = formatConvBuffer;
262 } else if (c->readLumPlanar && !isAlpha) {
263 c->readLumPlanar(formatConvBuffer, src_in, srcW, c->input_rgb2yuv_table);
264 src = formatConvBuffer;
265 } else if (c->readAlpPlanar && isAlpha) {
266 c->readAlpPlanar(formatConvBuffer, src_in, srcW, NULL);
267 src = formatConvBuffer;
268 }
269
270 if (!c->hyscale_fast) {
271 c->hyScale(c, dst, dstWidth, src, hLumFilter,
272 hLumFilterPos, hLumFilterSize);
273 } else { // fast bilinear upscale / crap downscale
274 c->hyscale_fast(c, dst, dstWidth, src, srcW, xInc);
275 }
276
277 if (convertRange)
278 convertRange(dst, dstWidth);
279}
280
281static av_always_inline void hcscale(SwsContext *c, int16_t *dst1,
282 int16_t *dst2, int dstWidth,
283 const uint8_t *src_in[4],
284 int srcW, int xInc,
285 const int16_t *hChrFilter,
286 const int32_t *hChrFilterPos,
287 int hChrFilterSize,
288 uint8_t *formatConvBuffer, uint32_t *pal)
289{
290 const uint8_t *src1 = src_in[1], *src2 = src_in[2];
291 if (c->chrToYV12) {
292 uint8_t *buf2 = formatConvBuffer +
293 FFALIGN(srcW*2+78, 16);
294 c->chrToYV12(formatConvBuffer, buf2, src_in[0], src1, src2, srcW, pal);
295 src1= formatConvBuffer;
296 src2= buf2;
297 } else if (c->readChrPlanar) {
298 uint8_t *buf2 = formatConvBuffer +
299 FFALIGN(srcW*2+78, 16);
300 c->readChrPlanar(formatConvBuffer, buf2, src_in, srcW, c->input_rgb2yuv_table);
301 src1 = formatConvBuffer;
302 src2 = buf2;
303 }
304
305 if (!c->hcscale_fast) {
306 c->hcScale(c, dst1, dstWidth, src1, hChrFilter, hChrFilterPos, hChrFilterSize);
307 c->hcScale(c, dst2, dstWidth, src2, hChrFilter, hChrFilterPos, hChrFilterSize);
308 } else { // fast bilinear upscale / crap downscale
309 c->hcscale_fast(c, dst1, dst2, dstWidth, src1, src2, srcW, xInc);
310 }
311
312 if (c->chrConvertRange)
313 c->chrConvertRange(dst1, dst2, dstWidth);
314}
315#endif /* NEW_FILTER */
316 225
317#define DEBUG_SWSCALE_BUFFERS 0226#define DEBUG_SWSCALE_BUFFERS 0
318#define DEBUG_BUFFERS(...) \227#define DEBUG_BUFFERS(...) \
@@ -325,46 +234,17 @@ static int swscale(SwsContext *c, const uint8_t *src[], · 6 unmodified lines
325{234{
326 /* load a few things into local vars to make the code more readable?235 /* load a few things into local vars to make the code more readable?
327 * and faster */236 * and faster */
328#ifndef NEW_FILTER
329 const int srcW = c->srcW;
330#endif
331 const int dstW = c->dstW;237 const int dstW = c->dstW;
332 const int dstH = c->dstH;238 const int dstH = c->dstH;
333#ifndef NEW_FILTER239
334 const int chrDstW = c->chrDstW;
335 const int chrSrcW = c->chrSrcW;
336 const int lumXInc = c->lumXInc;
337 const int chrXInc = c->chrXInc;
338#endif
339 const enum AVPixelFormat dstFormat = c->dstFormat;240 const enum AVPixelFormat dstFormat = c->dstFormat;
340 const int flags = c->flags;241 const int flags = c->flags;
341 int32_t *vLumFilterPos = c->vLumFilterPos;242 int32_t *vLumFilterPos = c->vLumFilterPos;
342 int32_t *vChrFilterPos = c->vChrFilterPos;243 int32_t *vChrFilterPos = c->vChrFilterPos;
343#ifndef NEW_FILTER244
344 int32_t *hLumFilterPos = c->hLumFilterPos;
345 int32_t *hChrFilterPos = c->hChrFilterPos;
346 int16_t *hLumFilter = c->hLumFilter;
347 int16_t *hChrFilter = c->hChrFilter;
348 int32_t *lumMmxFilter = c->lumMmxFilter;
349 int32_t *chrMmxFilter = c->chrMmxFilter;
350#endif
351 const int vLumFilterSize = c->vLumFilterSize;245 const int vLumFilterSize = c->vLumFilterSize;
352 const int vChrFilterSize = c->vChrFilterSize;246 const int vChrFilterSize = c->vChrFilterSize;
353#ifndef NEW_FILTER247
354 const int hLumFilterSize = c->hLumFilterSize;
355 const int hChrFilterSize = c->hChrFilterSize;
356 int16_t **lumPixBuf = c->lumPixBuf;
357 int16_t **chrUPixBuf = c->chrUPixBuf;
358 int16_t **chrVPixBuf = c->chrVPixBuf;
359#endif
360 int16_t **alpPixBuf = c->alpPixBuf;
361 const int vLumBufSize = c->vLumBufSize;
362 const int vChrBufSize = c->vChrBufSize;
363#ifndef NEW_FILTER
364 uint8_t *formatConvBuffer = c->formatConvBuffer;
365 uint32_t *pal = c->pal_yuv;
366 int perform_gamma = c->is_internal_gamma;
367#endif
368 yuv2planar1_fn yuv2plane1 = c->yuv2plane1;248 yuv2planar1_fn yuv2plane1 = c->yuv2plane1;
369 yuv2planarX_fn yuv2planeX = c->yuv2planeX;249 yuv2planarX_fn yuv2planeX = c->yuv2planeX;
370 yuv2interleavedX_fn yuv2nv12cX = c->yuv2nv12cX;250 yuv2interleavedX_fn yuv2nv12cX = c->yuv2nv12cX;
@@ -385,7 +265,7 @@ static int swscale(SwsContext *c, const uint8_t *src[], · 14 unmodified lines
385 int lastInLumBuf = c->lastInLumBuf;265 int lastInLumBuf = c->lastInLumBuf;
386 int lastInChrBuf = c->lastInChrBuf;266 int lastInChrBuf = c->lastInChrBuf;
387 267
388#ifdef NEW_FILTER268
389 int lumStart = 0;269 int lumStart = 0;
390 int lumEnd = c->descIndex[0];270 int lumEnd = c->descIndex[0];
391 int chrStart = lumEnd;271 int chrStart = lumEnd;
@@ -397,15 +277,12 @@ static int swscale(SwsContext *c, const uint8_t *src[], · 5 unmodified lines
397 SwsSlice *vout_slice = &c->slice[c->numSlice-1];277 SwsSlice *vout_slice = &c->slice[c->numSlice-1];
398 SwsFilterDescriptor *desc = c->desc;278 SwsFilterDescriptor *desc = c->desc;
399 279
280
281 int needAlpha = c->needAlpha;
282
400 int hasLumHoles = 1;283 int hasLumHoles = 1;
401 int hasChrHoles = 1;284 int hasChrHoles = 1;
402#endif
403 285
404#ifndef NEW_FILTER
405 if (!usePal(c->srcFormat)) {
406 pal = c->input_rgb2yuv_table;
407 }
408#endif
409 286
410 if (isPacked(c->srcFormat)) {287 if (isPacked(c->srcFormat)) {
411 src[0] =288 src[0] =
@@ -427,8 +304,8 @@ static int swscale(SwsContext *c, const uint8_t *src[], · 15 unmodified lines
427 dst[2], dstStride[2], dst[3], dstStride[3]);304 dst[2], dstStride[2], dst[3], dstStride[3]);
428 DEBUG_BUFFERS("srcSliceY: %d srcSliceH: %d dstY: %d dstH: %d\n",305 DEBUG_BUFFERS("srcSliceY: %d srcSliceH: %d dstY: %d dstH: %d\n",
429 srcSliceY, srcSliceH, dstY, dstH);306 srcSliceY, srcSliceH, dstY, dstH);
430 DEBUG_BUFFERS("vLumFilterSize: %d vLumBufSize: %d vChrFilterSize: %d vChrBufSize: %d\n",307 DEBUG_BUFFERS("vLumFilterSize: %d vChrFilterSize: %d\n",
431 vLumFilterSize, vLumBufSize, vChrFilterSize, vChrBufSize);308 vLumFilterSize, vChrFilterSize);
432 309
433 if (dstStride[0]&15 || dstStride[1]&15 ||310 if (dstStride[0]&15 || dstStride[1]&15 ||
434 dstStride[2]&15 || dstStride[3]&15) {311 dstStride[2]&15 || dstStride[3]&15) {
@@ -470,7 +347,6 @@ static int swscale(SwsContext *c, const uint8_t *src[], · 35 unmodified lines
470 }347 }
471 lastDstY = dstY;348 lastDstY = dstY;
472 349
473#ifdef NEW_FILTER
474 ff_init_vscale_pfn(c, yuv2plane1, yuv2planeX, yuv2nv12cX,350 ff_init_vscale_pfn(c, yuv2plane1, yuv2planeX, yuv2nv12cX,
475 yuv2packed1, yuv2packed2, yuv2packedX, yuv2anyX, c->use_mmx_vfilter);351 yuv2packed1, yuv2packed2, yuv2packedX, yuv2anyX, c->use_mmx_vfilter);
476 352
@@ -492,18 +368,9 @@ static int swscale(SwsContext *c, const uint8_t *src[], · 15 unmodified lines
492 hout_slice->plane[3].sliceH = 0;368 hout_slice->plane[3].sliceH = 0;
493 hout_slice->width = dstW;369 hout_slice->width = dstW;
494 }370 }
495#endif
496 371
497 for (; dstY < dstH; dstY++) {372 for (; dstY < dstH; dstY++) {
498 const int chrDstY = dstY >> c->chrDstVSubSample;373 const int chrDstY = dstY >> c->chrDstVSubSample;
499#ifndef NEW_FILTER
500 uint8_t *dest[4] = {
501 dst[0] + dstStride[0] * dstY,
502 dst[1] + dstStride[1] * chrDstY,
503 dst[2] + dstStride[2] * chrDstY,
504 (CONFIG_SWSCALE_ALPHA && alpPixBuf) ? dst[3] + dstStride[3] * dstY : NULL,
505 };
506#endif
507 int use_mmx_vfilter= c->use_mmx_vfilter;374 int use_mmx_vfilter= c->use_mmx_vfilter;
508 375
509 // First line needed as input376 // First line needed as input
@@ -517,14 +384,13 @@ static int swscale(SwsContext *c, const uint8_t *src[], · 7 unmodified lines
517 int lastLumSrcY2 = FFMIN(c->srcH, firstLumSrcY2 + vLumFilterSize) - 1;384 int lastLumSrcY2 = FFMIN(c->srcH, firstLumSrcY2 + vLumFilterSize) - 1;
518 int lastChrSrcY = FFMIN(c->chrSrcH, firstChrSrcY + vChrFilterSize) - 1;385 int lastChrSrcY = FFMIN(c->chrSrcH, firstChrSrcY + vChrFilterSize) - 1;
519 int enough_lines;386 int enough_lines;
520#ifdef NEW_FILTER387
521 int i;388 int i;
522 int posY, cPosY, firstPosY, lastPosY, firstCPosY, lastCPosY;389 int posY, cPosY, firstPosY, lastPosY, firstCPosY, lastCPosY;
523#endif
524 390
525 // handle holes (FAST_BILINEAR & weird filters)391 // handle holes (FAST_BILINEAR & weird filters)
526 if (firstLumSrcY > lastInLumBuf) {392 if (firstLumSrcY > lastInLumBuf) {
527#ifdef NEW_FILTER393
528 hasLumHoles = lastInLumBuf != firstLumSrcY - 1;394 hasLumHoles = lastInLumBuf != firstLumSrcY - 1;
529 if (hasLumHoles) {395 if (hasLumHoles) {
530 hout_slice->plane[0].sliceY = firstLumSrcY;396 hout_slice->plane[0].sliceY = firstLumSrcY;
@@ -532,11 +398,11 @@ static int swscale(SwsContext *c, const uint8_t *src[], · 1 unmodified line
532 hout_slice->plane[0].sliceH =398 hout_slice->plane[0].sliceH =
533 hout_slice->plane[3].sliceH = 0;399 hout_slice->plane[3].sliceH = 0;
534 }400 }
535#endif401
536 lastInLumBuf = firstLumSrcY - 1;402 lastInLumBuf = firstLumSrcY - 1;
537 }403 }
538 if (firstChrSrcY > lastInChrBuf) {404 if (firstChrSrcY > lastInChrBuf) {
539#ifdef NEW_FILTER405
540 hasChrHoles = lastInChrBuf != firstChrSrcY - 1;406 hasChrHoles = lastInChrBuf != firstChrSrcY - 1;
541 if (hasChrHoles) {407 if (hasChrHoles) {
542 hout_slice->plane[1].sliceY = firstChrSrcY;408 hout_slice->plane[1].sliceY = firstChrSrcY;
@@ -544,11 +410,11 @@ static int swscale(SwsContext *c, const uint8_t *src[], · 1 unmodified line
544 hout_slice->plane[1].sliceH =410 hout_slice->plane[1].sliceH =
545 hout_slice->plane[2].sliceH = 0;411 hout_slice->plane[2].sliceH = 0;
546 }412 }
547#endif413
548 lastInChrBuf = firstChrSrcY - 1;414 lastInChrBuf = firstChrSrcY - 1;
549 }415 }
550 av_assert0(firstLumSrcY >= lastInLumBuf - vLumBufSize + 1);416 av_assert0(firstLumSrcY >= lastInLumBuf - vLumFilterSize + 1);
551 av_assert0(firstChrSrcY >= lastInChrBuf - vChrBufSize + 1);417 av_assert0(firstChrSrcY >= lastInChrBuf - vChrFilterSize + 1);
552 418
553 DEBUG_BUFFERS("dstY: %d\n", dstY);419 DEBUG_BUFFERS("dstY: %d\n", dstY);
554 DEBUG_BUFFERS("\tfirstLumSrcY: %d lastLumSrcY: %d lastInLumBuf: %d\n",420 DEBUG_BUFFERS("\tfirstLumSrcY: %d lastLumSrcY: %d lastInLumBuf: %d\n",
@@ -567,7 +433,6 @@ static int swscale(SwsContext *c, const uint8_t *src[], · 12 unmodified lines
567 lastLumSrcY, lastChrSrcY);433 lastLumSrcY, lastChrSrcY);
568 }434 }
569 435
570#ifdef NEW_FILTER
571 posY = hout_slice->plane[0].sliceY + hout_slice->plane[0].sliceH;436 posY = hout_slice->plane[0].sliceY + hout_slice->plane[0].sliceH;
572 if (posY <= lastLumSrcY && !hasLumHoles) {437 if (posY <= lastLumSrcY && !hasLumHoles) {
573 firstPosY = FFMAX(firstLumSrcY, posY);438 firstPosY = FFMAX(firstLumSrcY, posY);
@@ -604,62 +469,11 @@ static int swscale(SwsContext *c, const uint8_t *src[], · 30 unmodified lines
604 chrBufIndex += lastChrSrcY - lastInChrBuf;469 chrBufIndex += lastChrSrcY - lastInChrBuf;
605 lastInChrBuf = lastChrSrcY;470 lastInChrBuf = lastChrSrcY;
606 471
607#else
608 // Do horizontal scaling
609 while (lastInLumBuf < lastLumSrcY) {
610 const uint8_t *src1[4] = {
611 src[0] + (lastInLumBuf + 1 - srcSliceY) * srcStride[0],
612 src[1] + (lastInLumBuf + 1 - srcSliceY) * srcStride[1],
613 src[2] + (lastInLumBuf + 1 - srcSliceY) * srcStride[2],
614 src[3] + (lastInLumBuf + 1 - srcSliceY) * srcStride[3],
615 };
616 lumBufIndex++;
617 av_assert0(lumBufIndex < 2 * vLumBufSize);
618 av_assert0(lastInLumBuf + 1 - srcSliceY < srcSliceH);
619 av_assert0(lastInLumBuf + 1 - srcSliceY >= 0);
620
621 if (perform_gamma)
622 gamma_convert((uint8_t **)src1, srcW, c->inv_gamma);
623
624 hyscale(c, lumPixBuf[lumBufIndex], dstW, src1, srcW, lumXInc,
625 hLumFilter, hLumFilterPos, hLumFilterSize,
626 formatConvBuffer, pal, 0);
627 if (CONFIG_SWSCALE_ALPHA && alpPixBuf)
628 hyscale(c, alpPixBuf[lumBufIndex], dstW, src1, srcW,
629 lumXInc, hLumFilter, hLumFilterPos, hLumFilterSize,
630 formatConvBuffer, pal, 1);
631 lastInLumBuf++;
632 DEBUG_BUFFERS("\t\tlumBufIndex %d: lastInLumBuf: %d\n",
633 lumBufIndex, lastInLumBuf);
634 }
635 while (lastInChrBuf < lastChrSrcY) {
636 const uint8_t *src1[4] = {
637 src[0] + (lastInChrBuf + 1 - chrSrcSliceY) * srcStride[0],
638 src[1] + (lastInChrBuf + 1 - chrSrcSliceY) * srcStride[1],
639 src[2] + (lastInChrBuf + 1 - chrSrcSliceY) * srcStride[2],
640 src[3] + (lastInChrBuf + 1 - chrSrcSliceY) * srcStride[3],
641 };
642 chrBufIndex++;
643 av_assert0(chrBufIndex < 2 * vChrBufSize);
644 av_assert0(lastInChrBuf + 1 - chrSrcSliceY < (chrSrcSliceH));
645 av_assert0(lastInChrBuf + 1 - chrSrcSliceY >= 0);
646 // FIXME replace parameters through context struct (some at least)
647
648 if (c->needs_hcscale)
649 hcscale(c, chrUPixBuf[chrBufIndex], chrVPixBuf[chrBufIndex],
650 chrDstW, src1, chrSrcW, chrXInc,
651 hChrFilter, hChrFilterPos, hChrFilterSize,
652 formatConvBuffer, pal);
653 lastInChrBuf++;
654 DEBUG_BUFFERS("\t\tchrBufIndex %d: lastInChrBuf: %d\n",
655 chrBufIndex, lastInChrBuf);
656 }
657#endif
658 // wrap buf index around to stay inside the ring buffer472 // wrap buf index around to stay inside the ring buffer
659 if (lumBufIndex >= vLumBufSize)473 if (lumBufIndex >= vLumFilterSize)
660 lumBufIndex -= vLumBufSize;474 lumBufIndex -= vLumFilterSize;
661 if (chrBufIndex >= vChrBufSize)475 if (chrBufIndex >= vChrFilterSize)
662 chrBufIndex -= vChrBufSize;476 chrBufIndex -= vChrFilterSize;
663 if (!enough_lines)477 if (!enough_lines)
664 break; // we can't output a dstY line so let's try with the next slice478 break; // we can't output a dstY line so let's try with the next slice
665 479
@@ -682,119 +496,11 @@ static int swscale(SwsContext *c, const uint8_t *src[], · 16 unmodified lines
682 }496 }
683 497
684 {498 {
685#ifdef NEW_FILTER
686 for (i = vStart; i < vEnd; ++i)499 for (i = vStart; i < vEnd; ++i)
687 desc[i].process(c, &desc[i], dstY, 1);500 desc[i].process(c, &desc[i], dstY, 1);
688#else
689 const int16_t **lumSrcPtr = (const int16_t **)(void*) lumPixBuf + lumBufIndex + firstLumSrcY - lastInLumBuf + vLumBufSize;
690 const int16_t **chrUSrcPtr = (const int16_t **)(void*) chrUPixBuf + chrBufIndex + firstChrSrcY - lastInChrBuf + vChrBufSize;
691 const int16_t **chrVSrcPtr = (const int16_t **)(void*) chrVPixBuf + chrBufIndex + firstChrSrcY - lastInChrBuf + vChrBufSize;
692 const int16_t **alpSrcPtr = (CONFIG_SWSCALE_ALPHA && alpPixBuf) ?
693 (const int16_t **)(void*) alpPixBuf + lumBufIndex + firstLumSrcY - lastInLumBuf + vLumBufSize : NULL;
694 int16_t *vLumFilter = c->vLumFilter;
695 int16_t *vChrFilter = c->vChrFilter;
696
697 if (isPlanarYUV(dstFormat) ||
698 (isGray(dstFormat) && !isALPHA(dstFormat))) { // YV12 like
699 const int chrSkipMask = (1 << c->chrDstVSubSample) - 1;
700
701 vLumFilter += dstY * vLumFilterSize;
702 vChrFilter += chrDstY * vChrFilterSize;
703
704// av_assert0(use_mmx_vfilter != (
705// yuv2planeX == yuv2planeX_10BE_c
706// || yuv2planeX == yuv2planeX_10LE_c
707// || yuv2planeX == yuv2planeX_9BE_c
708// || yuv2planeX == yuv2planeX_9LE_c
709// || yuv2planeX == yuv2planeX_16BE_c
710// || yuv2planeX == yuv2planeX_16LE_c
711// || yuv2planeX == yuv2planeX_8_c) || !ARCH_X86);
712
713 if(use_mmx_vfilter){
714 vLumFilter= (int16_t *)c->lumMmxFilter;
715 vChrFilter= (int16_t *)c->chrMmxFilter;
716 }
717
718 if (vLumFilterSize == 1) {
719 yuv2plane1(lumSrcPtr[0], dest[0], dstW, c->lumDither8, 0);
720 } else {
721 yuv2planeX(vLumFilter, vLumFilterSize,
722 lumSrcPtr, dest[0],
723 dstW, c->lumDither8, 0);
724 }
725
726 if (!((dstY & chrSkipMask) || isGray(dstFormat))) {
727 if (yuv2nv12cX) {
728 yuv2nv12cX(c, vChrFilter,
729 vChrFilterSize, chrUSrcPtr, chrVSrcPtr,
730 dest[1], chrDstW);
731 } else if (vChrFilterSize == 1) {
732 yuv2plane1(chrUSrcPtr[0], dest[1], chrDstW, c->chrDither8, 0);
733 yuv2plane1(chrVSrcPtr[0], dest[2], chrDstW, c->chrDither8, 3);
734 } else {
735 yuv2planeX(vChrFilter,
736 vChrFilterSize, chrUSrcPtr, dest[1],
737 chrDstW, c->chrDither8, 0);
738 yuv2planeX(vChrFilter,
739 vChrFilterSize, chrVSrcPtr, dest[2],
740 chrDstW, c->chrDither8, use_mmx_vfilter ? (c->uv_offx2 >> 1) : 3);
741 }
742 }
743
744 if (CONFIG_SWSCALE_ALPHA && alpPixBuf) {
745 if(use_mmx_vfilter){
746 vLumFilter= (int16_t *)c->alpMmxFilter;
747 }
748 if (vLumFilterSize == 1) {
749 yuv2plane1(alpSrcPtr[0], dest[3], dstW,
750 c->lumDither8, 0);
751 } else {
752 yuv2planeX(vLumFilter,
753 vLumFilterSize, alpSrcPtr, dest[3],
754 dstW, c->lumDither8, 0);
755 }
756 }
757 } else if (yuv2packedX) {
758 av_assert1(lumSrcPtr + vLumFilterSize - 1 < (const int16_t **)lumPixBuf + vLumBufSize * 2);
759 av_assert1(chrUSrcPtr + vChrFilterSize - 1 < (const int16_t **)chrUPixBuf + vChrBufSize * 2);
760 if (c->yuv2packed1 && vLumFilterSize == 1 &&
761 vChrFilterSize <= 2) { // unscaled RGB
762 int chrAlpha = vChrFilterSize == 1 ? 0 : vChrFilter[2 * dstY + 1];
763 yuv2packed1(c, *lumSrcPtr, chrUSrcPtr, chrVSrcPtr,
764 alpPixBuf ? *alpSrcPtr : NULL,
765 dest[0], dstW, chrAlpha, dstY);
766 } else if (c->yuv2packed2 && vLumFilterSize == 2 &&
767 vChrFilterSize == 2) { // bilinear upscale RGB
768 int lumAlpha = vLumFilter[2 * dstY + 1];
769 int chrAlpha = vChrFilter[2 * dstY + 1];
770 lumMmxFilter[2] =
771 lumMmxFilter[3] = vLumFilter[2 * dstY] * 0x10001;
772 chrMmxFilter[2] =
773 chrMmxFilter[3] = vChrFilter[2 * chrDstY] * 0x10001;
774 yuv2packed2(c, lumSrcPtr, chrUSrcPtr, chrVSrcPtr,
775 alpPixBuf ? alpSrcPtr : NULL,
776 dest[0], dstW, lumAlpha, chrAlpha, dstY);
777 } else { // general RGB
778 yuv2packedX(c, vLumFilter + dstY * vLumFilterSize,
779 lumSrcPtr, vLumFilterSize,
780 vChrFilter + dstY * vChrFilterSize,
781 chrUSrcPtr, chrVSrcPtr, vChrFilterSize,
782 alpSrcPtr, dest[0], dstW, dstY);
783 }
784 } else {
785 av_assert1(!yuv2packed1 && !yuv2packed2);
786 yuv2anyX(c, vLumFilter + dstY * vLumFilterSize,
787 lumSrcPtr, vLumFilterSize,
788 vChrFilter + dstY * vChrFilterSize,
789 chrUSrcPtr, chrVSrcPtr, vChrFilterSize,
790 alpSrcPtr, dest, dstW, dstY);
791 }
792 if (perform_gamma)
793 gamma_convert(dest, dstW, c->gamma);
794#endif
795 }501 }
796 }502 }
797 if (isPlanar(dstFormat) && isALPHA(dstFormat) && !alpPixBuf) {503 if (isPlanar(dstFormat) && isALPHA(dstFormat) && !needAlpha) {
798 int length = dstW;504 int length = dstW;
799 int height = dstY - lastDstY;505 int height = dstY - lastDstY;
800 506
libswscale/swscale_internal.h+1−9
@@ -350,12 +350,6 @@ typedef struct SwsContext { · 349 unmodified lines
350 * vertical scaler is called.350 * vertical scaler is called.
351 */351 */
352 //@{352 //@{
353 int16_t **lumPixBuf; ///< Ring buffer for scaled horizontal luma plane lines to be fed to the vertical scaler.
354 int16_t **chrUPixBuf; ///< Ring buffer for scaled horizontal chroma plane lines to be fed to the vertical scaler.
355 int16_t **chrVPixBuf; ///< Ring buffer for scaled horizontal chroma plane lines to be fed to the vertical scaler.
356 int16_t **alpPixBuf; ///< Ring buffer for scaled horizontal alpha plane lines to be fed to the vertical scaler.
357 int vLumBufSize; ///< Number of vertical luma/alpha lines allocated in the ring buffer.
358 int vChrBufSize; ///< Number of vertical chroma lines allocated in the ring buffer.
359 int lastInLumBuf; ///< Last scaled horizontal luma/alpha line from source in the ring buffer.353 int lastInLumBuf; ///< Last scaled horizontal luma/alpha line from source in the ring buffer.
360 int lastInChrBuf; ///< Last scaled horizontal chroma line from source in the ring buffer.354 int lastInChrBuf; ///< Last scaled horizontal chroma line from source in the ring buffer.
361 int lumBufIndex; ///< Index in ring buffer of the last scaled horizontal luma/alpha line from source.355 int lumBufIndex; ///< Index in ring buffer of the last scaled horizontal luma/alpha line from source.
@@ -363,6 +357,7 @@ typedef struct SwsContext { · 1 unmodified line
363 //@}357 //@}
364 358
365 uint8_t *formatConvBuffer;359 uint8_t *formatConvBuffer;
360 int needAlpha;
366 361
367 /**362 /**
368 * @name Horizontal and vertical filters.363 * @name Horizontal and vertical filters.
@@ -1038,7 +1033,4 @@ void ff_init_vscale_pfn(SwsContext *c, yuv2planar1_fn yuv2plane1, yuv2planarX_fn · 669 unmodified lines
1038//number of extra lines to process1033//number of extra lines to process
1039#define MAX_LINES_AHEAD 41034#define MAX_LINES_AHEAD 4
1040 1035
1041// enable use of refactored scaler code
1042#define NEW_FILTER
1043
1044#endif /* SWSCALE_SWSCALE_INTERNAL_H */1036#endif /* SWSCALE_SWSCALE_INTERNAL_H */
libswscale/utils.c+2−76
@@ -1696,69 +1696,14 @@ av_cold int sws_init_context(SwsContext *c, SwsFilter *srcFilter, · 1695 unmodified lines
1696#endif1696#endif
1697 }1697 }
1698 1698
1699 // calculate buffer sizes so that they won't run out while handling these damn slices
1700 c->vLumBufSize = c->vLumFilterSize;
1701 c->vChrBufSize = c->vChrFilterSize;
1702 for (i = 0; i < dstH; i++) {
1703 int chrI = (int64_t)i * c->chrDstH / dstH;
1704 int nextSlice = FFMAX(c->vLumFilterPos[i] + c->vLumFilterSize - 1,
1705 ((c->vChrFilterPos[chrI] + c->vChrFilterSize - 1)
1706 << c->chrSrcVSubSample));
1707
1708 nextSlice >>= c->chrSrcVSubSample;
1709 nextSlice <<= c->chrSrcVSubSample;
1710 if (c->vLumFilterPos[i] + c->vLumBufSize < nextSlice)
1711 c->vLumBufSize = nextSlice - c->vLumFilterPos[i];
1712 if (c->vChrFilterPos[chrI] + c->vChrBufSize <
1713 (nextSlice >> c->chrSrcVSubSample))
1714 c->vChrBufSize = (nextSlice >> c->chrSrcVSubSample) -
1715 c->vChrFilterPos[chrI];
1716 }
1717
1718 for (i = 0; i < 4; i++)1699 for (i = 0; i < 4; i++)
1719 FF_ALLOCZ_OR_GOTO(c, c->dither_error[i], (c->dstW+2) * sizeof(int), fail);1700 FF_ALLOCZ_OR_GOTO(c, c->dither_error[i], (c->dstW+2) * sizeof(int), fail);
1720 1701
1721 /* Allocate pixbufs (we use dynamic allocation because otherwise we would1702 c->needAlpha = (CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat) && isALPHA(c->dstFormat)) ? 1 : 0;
1722 * need to allocate several megabytes to handle all possible cases) */1703
1723 FF_ALLOCZ_OR_GOTO(c, c->lumPixBuf, c->vLumBufSize * 3 * sizeof(int16_t *), fail);
1724 FF_ALLOCZ_OR_GOTO(c, c->chrUPixBuf, c->vChrBufSize * 3 * sizeof(int16_t *), fail);
1725 FF_ALLOCZ_OR_GOTO(c, c->chrVPixBuf, c->vChrBufSize * 3 * sizeof(int16_t *), fail);
1726 if (CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat) && isALPHA(c->dstFormat))
1727 FF_ALLOCZ_OR_GOTO(c, c->alpPixBuf, c->vLumBufSize * 3 * sizeof(int16_t *), fail);
1728 /* Note we need at least one pixel more at the end because of the MMX code
1729 * (just in case someone wants to replace the 4000/8000). */
1730 /* align at 16 bytes for AltiVec */
1731 for (i = 0; i < c->vLumBufSize; i++) {
1732 FF_ALLOCZ_OR_GOTO(c, c->lumPixBuf[i + c->vLumBufSize],
1733 dst_stride + 16, fail);
1734 c->lumPixBuf[i] = c->lumPixBuf[i + c->vLumBufSize];
1735 }
1736 // 64 / c->scalingBpp is the same as 16 / sizeof(scaling_intermediate)1704 // 64 / c->scalingBpp is the same as 16 / sizeof(scaling_intermediate)
1737 c->uv_off = (dst_stride>>1) + 64 / (c->dstBpc &~ 7);1705 c->uv_off = (dst_stride>>1) + 64 / (c->dstBpc &~ 7);
1738 c->uv_offx2 = dst_stride + 16;1706 c->uv_offx2 = dst_stride + 16;
1739 for (i = 0; i < c->vChrBufSize; i++) {
1740 FF_ALLOC_OR_GOTO(c, c->chrUPixBuf[i + c->vChrBufSize],
1741 dst_stride * 2 + 32, fail);
1742 c->chrUPixBuf[i] = c->chrUPixBuf[i + c->vChrBufSize];
1743 c->chrVPixBuf[i] = c->chrVPixBuf[i + c->vChrBufSize]
1744 = c->chrUPixBuf[i] + (dst_stride >> 1) + 8;
1745 }
1746 if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf)
1747 for (i = 0; i < c->vLumBufSize; i++) {
1748 FF_ALLOCZ_OR_GOTO(c, c->alpPixBuf[i + c->vLumBufSize],
1749 dst_stride + 16, fail);
1750 c->alpPixBuf[i] = c->alpPixBuf[i + c->vLumBufSize];
1751 }
1752
1753 // try to avoid drawing green stuff between the right end and the stride end
1754 for (i = 0; i < c->vChrBufSize; i++)
1755 if(desc_dst->comp[0].depth == 16){
1756 av_assert0(c->dstBpc > 14);
1757 for(j=0; j<dst_stride/2+1; j++)
1758 ((int32_t*)(c->chrUPixBuf[i]))[j] = 1<<18;
1759 } else
1760 for(j=0; j<dst_stride+1; j++)
1761 ((int16_t*)(c->chrUPixBuf[i]))[j] = 1<<14;
1762 1707
1763 av_assert0(c->chrDstH <= dstH);1708 av_assert0(c->chrDstH <= dstH);
1764 1709
@@ -2325,25 +2270,6 @@ void sws_freeContext(SwsContext *c) · 560 unmodified lines
2325 if (!c)2270 if (!c)
2326 return;2271 return;
2327 2272
2328 if (c->lumPixBuf) {
2329 for (i = 0; i < c->vLumBufSize; i++)
2330 av_freep(&c->lumPixBuf[i]);
2331 av_freep(&c->lumPixBuf);
2332 }
2333
2334 if (c->chrUPixBuf) {
2335 for (i = 0; i < c->vChrBufSize; i++)
2336 av_freep(&c->chrUPixBuf[i]);
2337 av_freep(&c->chrUPixBuf);
2338 av_freep(&c->chrVPixBuf);
2339 }
2340
2341 if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf) {
2342 for (i = 0; i < c->vLumBufSize; i++)
2343 av_freep(&c->alpPixBuf[i]);
2344 av_freep(&c->alpPixBuf);
2345 }
2346
2347 for (i = 0; i < 4; i++)2273 for (i = 0; i < 4; i++)
2348 av_freep(&c->dither_error[i]);2274 av_freep(&c->dither_error[i]);
2349 2275
libswscale/vscale.c+2−2
@@ -218,7 +218,7 @@ int ff_init_vscale(SwsContext *c, SwsFilterDescriptor *desc, SwsSlice *src, SwsS · 217 unmodified lines
218 desc[0].instance = lumCtx;218 desc[0].instance = lumCtx;
219 desc[0].src = src;219 desc[0].src = src;
220 desc[0].dst = dst;220 desc[0].dst = dst;
221 desc[0].alpha = c->alpPixBuf != 0;221 desc[0].alpha = c->needAlpha;
222 222
223 if (!isGray(c->dstFormat)) {223 if (!isGray(c->dstFormat)) {
224 chrCtx = av_mallocz(sizeof(VScalerContext));224 chrCtx = av_mallocz(sizeof(VScalerContext));
@@ -239,7 +239,7 @@ int ff_init_vscale(SwsContext *c, SwsFilterDescriptor *desc, SwsSlice *src, SwsS · 14 unmodified lines
239 desc[0].instance = lumCtx;239 desc[0].instance = lumCtx;
240 desc[0].src = src;240 desc[0].src = src;
241 desc[0].dst = dst;241 desc[0].dst = dst;
242 desc[0].alpha = c->alpPixBuf != 0;242 desc[0].alpha = c->needAlpha;
243 }243 }
244 244
245 ff_init_vscale_pfn(c, c->yuv2plane1, c->yuv2planeX, c->yuv2nv12cX,245 ff_init_vscale_pfn(c, c->yuv2plane1, c->yuv2planeX, c->yuv2nv12cX,
libswscale/x86/swscale.c+8−30
@@ -85,18 +85,12 @@ void ff_updateMMXDitherTables(SwsContext *c, int dstY, int lumBufIndex, int chrB · 84 unmodified lines
85{85{
86 const int dstH= c->dstH;86 const int dstH= c->dstH;
87 const int flags= c->flags;87 const int flags= c->flags;
88#ifdef NEW_FILTER88
89 SwsPlane *lumPlane = &c->slice[c->numSlice-2].plane[0];89 SwsPlane *lumPlane = &c->slice[c->numSlice-2].plane[0];
90 SwsPlane *chrUPlane = &c->slice[c->numSlice-2].plane[1];90 SwsPlane *chrUPlane = &c->slice[c->numSlice-2].plane[1];
91 SwsPlane *alpPlane = &c->slice[c->numSlice-2].plane[3];91 SwsPlane *alpPlane = &c->slice[c->numSlice-2].plane[3];
92#else92
93 int16_t **lumPixBuf= c->lumPixBuf;93 int hasAlpha = c->needAlpha;
94 int16_t **chrUPixBuf= c->chrUPixBuf;
95 int16_t **alpPixBuf= c->alpPixBuf;
96 const int vLumBufSize= c->vLumBufSize;
97 const int vChrBufSize= c->vChrBufSize;
98#endif
99 int hasAlpha = c->alpPixBuf != NULL;
100 int32_t *vLumFilterPos= c->vLumFilterPos;94 int32_t *vLumFilterPos= c->vLumFilterPos;
101 int32_t *vChrFilterPos= c->vChrFilterPos;95 int32_t *vChrFilterPos= c->vChrFilterPos;
102 int16_t *vLumFilter= c->vLumFilter;96 int16_t *vLumFilter= c->vLumFilter;
@@ -117,22 +111,14 @@ void ff_updateMMXDitherTables(SwsContext *c, int dstY, int lumBufIndex, int chrB · 14 unmodified lines
117 c->greenDither= ff_dither4[dstY&1];111 c->greenDither= ff_dither4[dstY&1];
118 c->redDither= ff_dither8[(dstY+1)&1];112 c->redDither= ff_dither8[(dstY+1)&1];
119 if (dstY < dstH - 2) {113 if (dstY < dstH - 2) {
120#ifdef NEW_FILTER
121 const int16_t **lumSrcPtr = (const int16_t **)(void*) lumPlane->line + firstLumSrcY - lumPlane->sliceY;114 const int16_t **lumSrcPtr = (const int16_t **)(void*) lumPlane->line + firstLumSrcY - lumPlane->sliceY;
122 const int16_t **chrUSrcPtr = (const int16_t **)(void*) chrUPlane->line + firstChrSrcY - chrUPlane->sliceY;115 const int16_t **chrUSrcPtr = (const int16_t **)(void*) chrUPlane->line + firstChrSrcY - chrUPlane->sliceY;
123 const int16_t **alpSrcPtr = (CONFIG_SWSCALE_ALPHA && c->alpPixBuf) ? (const int16_t **)(void*) alpPlane->line + firstLumSrcY - alpPlane->sliceY : NULL;116 const int16_t **alpSrcPtr = (CONFIG_SWSCALE_ALPHA && hasAlpha) ? (const int16_t **)(void*) alpPlane->line + firstLumSrcY - alpPlane->sliceY : NULL;
124#else117
125 const int16_t **lumSrcPtr= (const int16_t **)(void*) lumPixBuf + lumBufIndex + firstLumSrcY - lastInLumBuf + vLumBufSize;
126 const int16_t **chrUSrcPtr= (const int16_t **)(void*) chrUPixBuf + chrBufIndex + firstChrSrcY - lastInChrBuf + vChrBufSize;
127 const int16_t **alpSrcPtr= (CONFIG_SWSCALE_ALPHA && alpPixBuf) ? (const int16_t **)(void*) alpPixBuf + lumBufIndex + firstLumSrcY - lastInLumBuf + vLumBufSize : NULL;
128#endif
129 int i;118 int i;
130 if (firstLumSrcY < 0 || firstLumSrcY + vLumFilterSize > c->srcH) {119 if (firstLumSrcY < 0 || firstLumSrcY + vLumFilterSize > c->srcH) {
131#ifdef NEW_FILTER
132 const int16_t **tmpY = (const int16_t **) lumPlane->tmp;120 const int16_t **tmpY = (const int16_t **) lumPlane->tmp;
133#else121
134 const int16_t **tmpY = (const int16_t **) lumPixBuf + 2 * vLumBufSize;
135#endif
136 int neg = -firstLumSrcY, i, end = FFMIN(c->srcH - firstLumSrcY, vLumFilterSize);122 int neg = -firstLumSrcY, i, end = FFMIN(c->srcH - firstLumSrcY, vLumFilterSize);
137 for (i = 0; i < neg; i++)123 for (i = 0; i < neg; i++)
138 tmpY[i] = lumSrcPtr[neg];124 tmpY[i] = lumSrcPtr[neg];
@@ -143,11 +129,7 @@ void ff_updateMMXDitherTables(SwsContext *c, int dstY, int lumBufIndex, int chrB · 4 unmodified lines
143 lumSrcPtr = tmpY;129 lumSrcPtr = tmpY;
144 130
145 if (alpSrcPtr) {131 if (alpSrcPtr) {
146#ifdef NEW_FILTER
147 const int16_t **tmpA = (const int16_t **) alpPlane->tmp;132 const int16_t **tmpA = (const int16_t **) alpPlane->tmp;
148#else
149 const int16_t **tmpA = (const int16_t **) alpPixBuf + 2 * vLumBufSize;
150#endif
151 for (i = 0; i < neg; i++)133 for (i = 0; i < neg; i++)
152 tmpA[i] = alpSrcPtr[neg];134 tmpA[i] = alpSrcPtr[neg];
153 for ( ; i < end; i++)135 for ( ; i < end; i++)
@@ -158,11 +140,7 @@ void ff_updateMMXDitherTables(SwsContext *c, int dstY, int lumBufIndex, int chrB · 4 unmodified lines
158 }140 }
159 }141 }
160 if (firstChrSrcY < 0 || firstChrSrcY + vChrFilterSize > c->chrSrcH) {142 if (firstChrSrcY < 0 || firstChrSrcY + vChrFilterSize > c->chrSrcH) {
161#ifdef NEW_FILTER
162 const int16_t **tmpU = (const int16_t **) chrUPlane->tmp;143 const int16_t **tmpU = (const int16_t **) chrUPlane->tmp;
163#else
164 const int16_t **tmpU = (const int16_t **) chrUPixBuf + 2 * vChrBufSize;
165#endif
166 int neg = -firstChrSrcY, i, end = FFMIN(c->chrSrcH - firstChrSrcY, vChrFilterSize);144 int neg = -firstChrSrcY, i, end = FFMIN(c->chrSrcH - firstChrSrcY, vChrFilterSize);
167 for (i = 0; i < neg; i++) {145 for (i = 0; i < neg; i++) {
168 tmpU[i] = chrUSrcPtr[neg];146 tmpU[i] = chrUSrcPtr[neg];
@@ -479,7 +457,7 @@ switch(c->dstBpc){ \ · 310 unmodified lines
479 switch (c->srcFormat) {457 switch (c->srcFormat) {
480 case AV_PIX_FMT_YA8:458 case AV_PIX_FMT_YA8:
481 c->lumToYV12 = ff_yuyvToY_mmx;459 c->lumToYV12 = ff_yuyvToY_mmx;
482 if (c->alpPixBuf)460 if (c->needAlpha)
483 c->alpToYV12 = ff_uyvyToY_mmx;461 c->alpToYV12 = ff_uyvyToY_mmx;
484 break;462 break;
485 case AV_PIX_FMT_YUYV422:463 case AV_PIX_FMT_YUYV422:
@@ -528,7 +506,7 @@ switch(c->dstBpc){ \ · 42 unmodified lines
528 switch (c->srcFormat) {506 switch (c->srcFormat) {
529 case AV_PIX_FMT_YA8:507 case AV_PIX_FMT_YA8:
530 c->lumToYV12 = ff_yuyvToY_sse2;508 c->lumToYV12 = ff_yuyvToY_sse2;
531 if (c->alpPixBuf)509 if (c->needAlpha)
532 c->alpToYV12 = ff_uyvyToY_sse2;510 c->alpToYV12 = ff_uyvyToY_sse2;
533 break;511 break;
534 case AV_PIX_FMT_YUYV422:512 case AV_PIX_FMT_YUYV422:
libswscale/x86/swscale_template.c+6−6
@@ -348,7 +348,7 @@ static void RENAME(yuv2rgb32_X_ar)(SwsContext *c, const int16_t *lumFilter, · 347 unmodified lines
348 x86_reg dstW_reg = dstW;348 x86_reg dstW_reg = dstW;
349 x86_reg uv_off = c->uv_offx2;349 x86_reg uv_off = c->uv_offx2;
350 350
351 if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf) {351 if (CONFIG_SWSCALE_ALPHA && c->needAlpha) {
352 YSCALEYUV2PACKEDX_ACCURATE352 YSCALEYUV2PACKEDX_ACCURATE
353 YSCALEYUV2RGBX353 YSCALEYUV2RGBX
354 "movq %%mm2, "U_TEMP"(%0) \n\t"354 "movq %%mm2, "U_TEMP"(%0) \n\t"
@@ -381,7 +381,7 @@ static void RENAME(yuv2rgb32_X)(SwsContext *c, const int16_t *lumFilter, · 26 unmodified lines
381 x86_reg dstW_reg = dstW;381 x86_reg dstW_reg = dstW;
382 x86_reg uv_off = c->uv_offx2;382 x86_reg uv_off = c->uv_offx2;
383 383
384 if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf) {384 if (CONFIG_SWSCALE_ALPHA && c->needAlpha) {
385 YSCALEYUV2PACKEDX385 YSCALEYUV2PACKEDX
386 YSCALEYUV2RGBX386 YSCALEYUV2RGBX
387 YSCALEYUV2PACKEDX_YA(ALP_MMX_FILTER_OFFSET, %%mm0, %%mm3, %%mm6, %%mm1, %%mm7)387 YSCALEYUV2PACKEDX_YA(ALP_MMX_FILTER_OFFSET, %%mm0, %%mm3, %%mm6, %%mm1, %%mm7)
@@ -410,7 +410,7 @@ static void RENAME(yuv2bgr32_X)(SwsContext *c, const int16_t *lumFilter, · 22 unmodified lines
410 x86_reg dstW_reg = dstW;410 x86_reg dstW_reg = dstW;
411 x86_reg uv_off = c->uv_offx2;411 x86_reg uv_off = c->uv_offx2;
412 412
413 if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf) {413 if (CONFIG_SWSCALE_ALPHA && c->needAlpha) {
414 YSCALEYUV2PACKEDX414 YSCALEYUV2PACKEDX
415 YSCALEYUV2RGBX415 YSCALEYUV2RGBX
416 YSCALEYUV2PACKEDX_YA(ALP_MMX_FILTER_OFFSET, %%mm0, %%mm3, %%mm6, %%mm1, %%mm7)416 YSCALEYUV2PACKEDX_YA(ALP_MMX_FILTER_OFFSET, %%mm0, %%mm3, %%mm6, %%mm1, %%mm7)
@@ -889,7 +889,7 @@ static void RENAME(yuv2rgb32_2)(SwsContext *c, const int16_t *buf[2], · 472 unmodified lines
889 const int16_t *buf0 = buf[0], *buf1 = buf[1],889 const int16_t *buf0 = buf[0], *buf1 = buf[1],
890 *ubuf0 = ubuf[0], *ubuf1 = ubuf[1];890 *ubuf0 = ubuf[0], *ubuf1 = ubuf[1];
891 891
892 if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf) {892 if (CONFIG_SWSCALE_ALPHA && c->needAlpha) {
893 const int16_t *abuf0 = abuf[0], *abuf1 = abuf[1];893 const int16_t *abuf0 = abuf[0], *abuf1 = abuf[1];
894#if ARCH_X86_64894#if ARCH_X86_64
895 __asm__ volatile(895 __asm__ volatile(
@@ -1215,7 +1215,7 @@ static void RENAME(yuv2rgb32_1)(SwsContext *c, const int16_t *buf0, · 319 unmodified lines
1215 1215
1216 if (uvalpha < 2048) { // note this is not correct (shifts chrominance by 0.5 pixels) but it is a bit faster1216 if (uvalpha < 2048) { // note this is not correct (shifts chrominance by 0.5 pixels) but it is a bit faster
1217 const int16_t *ubuf1 = ubuf[0];1217 const int16_t *ubuf1 = ubuf[0];
1218 if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf) {1218 if (CONFIG_SWSCALE_ALPHA && c->needAlpha) {
1219 __asm__ volatile(1219 __asm__ volatile(
1220 "mov %%"REG_b", "ESP_OFFSET"(%5) \n\t"1220 "mov %%"REG_b", "ESP_OFFSET"(%5) \n\t"
1221 "mov %4, %%"REG_b" \n\t"1221 "mov %4, %%"REG_b" \n\t"
@@ -1244,7 +1244,7 @@ static void RENAME(yuv2rgb32_1)(SwsContext *c, const int16_t *buf0, · 22 unmodified lines
1244 }1244 }
1245 } else {1245 } else {
1246 const int16_t *ubuf1 = ubuf[1];1246 const int16_t *ubuf1 = ubuf[1];
1247 if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf) {1247 if (CONFIG_SWSCALE_ALPHA && c->needAlpha) {
1248 __asm__ volatile(1248 __asm__ volatile(
1249 "mov %%"REG_b", "ESP_OFFSET"(%5) \n\t"1249 "mov %%"REG_b", "ESP_OFFSET"(%5) \n\t"
1250 "mov %4, %%"REG_b" \n\t"1250 "mov %4, %%"REG_b" \n\t"

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t