diff --git a/libswscale/swscale.c b/libswscale/swscale.c index 2db40a6807..4b577ef263 100644 --- a/libswscale/swscale.c +++ b/libswscale/swscale.c @@ -579,7 +579,7 @@ static av_cold void sws_init_swscale(SwsContext *c) c->needs_hcscale = 1; } -SwsFunc ff_getSwsFunc(SwsContext *c) +void ff_sws_init_scale(SwsContext *c) { sws_init_swscale(c); @@ -591,8 +591,6 @@ SwsFunc ff_getSwsFunc(SwsContext *c) ff_sws_init_swscale_aarch64(c); if (ARCH_ARM) ff_sws_init_swscale_arm(c); - - return swscale; } static void reset_ptr(const uint8_t *src[], enum AVPixelFormat format) @@ -988,7 +986,11 @@ int attribute_align_arg sws_scale(struct SwsContext *c, /* reset slice direction at end of frame */ if (srcSliceY_internal + srcSliceH == c->srcH) c->sliceDir = 0; - ret = c->swscale(c, src2, srcStride2, srcSliceY_internal, srcSliceH, dst2, dstStride2); + + if (c->swscale) + ret = c->swscale(c, src2, srcStride2, srcSliceY_internal, srcSliceH, dst2, dstStride2); + else + ret = swscale(c, src2, srcStride2, srcSliceY_internal, srcSliceH, dst2, dstStride2); if (c->dstXYZ && !(c->srcXYZ && c->srcW==c->dstW && c->srcH==c->dstH)) { int dstY = c->dstY ? c->dstY : srcSliceY + srcSliceH; diff --git a/libswscale/swscale_internal.h b/libswscale/swscale_internal.h index 9304a5ef42..193bc383e1 100644 --- a/libswscale/swscale_internal.h +++ b/libswscale/swscale_internal.h @@ -878,11 +878,7 @@ void ff_get_unscaled_swscale_ppc(SwsContext *c); void ff_get_unscaled_swscale_arm(SwsContext *c); void ff_get_unscaled_swscale_aarch64(SwsContext *c); -/** - * Return function pointer to fastest main scaler path function depending - * on architecture and available optimizations. - */ -SwsFunc ff_getSwsFunc(SwsContext *c); +void ff_sws_init_scale(SwsContext *c); void ff_sws_init_input_funcs(SwsContext *c); void ff_sws_init_output_funcs(SwsContext *c, diff --git a/libswscale/utils.c b/libswscale/utils.c index 974e2d5179..aab7cdb2a2 100644 --- a/libswscale/utils.c +++ b/libswscale/utils.c @@ -1847,7 +1847,8 @@ av_cold int sws_init_context(SwsContext *c, SwsFilter *srcFilter, } } - c->swscale = ff_getSwsFunc(c); + ff_sws_init_scale(c); + return ff_init_filters(c); nomem: ret = AVERROR(ENOMEM); diff --git a/tests/checkasm/sw_scale.c b/tests/checkasm/sw_scale.c index 3ac0f9082f..40c5eb3aa8 100644 --- a/tests/checkasm/sw_scale.c +++ b/tests/checkasm/sw_scale.c @@ -93,7 +93,7 @@ static void check_yuv2yuvX(void) if (sws_init_context(ctx, NULL, NULL) < 0) fail(); - ff_getSwsFunc(ctx); + ff_sws_init_scale(ctx); for(isi = 0; isi < INPUT_SIZES; ++isi){ dstW = input_sizes[isi]; for(osi = 0; osi < 64; osi += 16){ @@ -210,7 +210,7 @@ static void check_hscale(void) filter[SRC_PIXELS * width + i] = rnd(); } - ff_getSwsFunc(ctx); + ff_sws_init_scale(ctx); if (check_func(ctx->hcScale, "hscale_%d_to_%d_width%d", ctx->srcBpc, ctx->dstBpc + 1, width)) { memset(dst0, 0, SRC_PIXELS * sizeof(dst0[0]));