diff options
author | Niklas Haas <git@haasn.dev> | 2024-10-09 19:44:33 +0200 |
---|---|---|
committer | Niklas Haas <git@haasn.dev> | 2024-10-24 22:50:00 +0200 |
commit | 67adb303228a5d8e2abe860b7748004cc83ca65f (patch) | |
tree | 5b987107804eb246b68414da8e43789658594c7c /libswscale/utils.c | |
parent | 153a6dc8faafc4de263a493484ffc1dc2b5b26b2 (diff) | |
download | ffmpeg-67adb303228a5d8e2abe860b7748004cc83ca65f.tar.gz |
swscale: rename SwsContext to SwsInternal
And preserve the public SwsContext as separate name. The motivation here
is that I want to turn SwsContext into a public struct, while keeping the
internal implementation hidden. Additionally, I also want to be able to
use multiple internal implementations, e.g. for GPU devices.
This commit does not include any functional changes. For the most part, it is
a simple rename. The only complications arise from the public facing API
functions, which preserve their current type (and hence require an additional
unwrapping step internally), and the checkasm test framework, which directly
accesses SwsInternal.
For consistency, the affected functions that need to maintain a distionction
have generally been changed to refer to the SwsContext as *sws, and the
SwsInternal as *c.
In an upcoming commit, I will provide a backing definition for the public
SwsContext, and update `sws_internal()` to dereference the internal struct
instead of merely casting it.
Sponsored-by: Sovereign Tech Fund
Signed-off-by: Niklas Haas <git@haasn.dev>
Diffstat (limited to 'libswscale/utils.c')
-rw-r--r-- | libswscale/utils.c | 117 |
1 files changed, 63 insertions, 54 deletions
diff --git a/libswscale/utils.c b/libswscale/utils.c index 3008d4db4d..31c136ad15 100644 --- a/libswscale/utils.c +++ b/libswscale/utils.c @@ -290,7 +290,8 @@ static SwsContext *alloc_set_opts(int srcW, int srcH, enum AVPixelFormat srcForm int dstW, int dstH, enum AVPixelFormat dstFormat, int flags, const double *param) { - SwsContext *c = sws_alloc_context(); + SwsContext *sws = sws_alloc_context(); + SwsInternal *c = sws_internal(sws); if (!c) return NULL; @@ -308,10 +309,10 @@ static SwsContext *alloc_set_opts(int srcW, int srcH, enum AVPixelFormat srcForm c->param[1] = param[1]; } - return c; + return sws; } -int ff_shuffle_filter_coefficients(SwsContext *c, int *filterPos, +int ff_shuffle_filter_coefficients(SwsInternal *c, int *filterPos, int filterSize, int16_t *filter, int dstW) { @@ -399,7 +400,7 @@ static double getSplineCoeff(double a, double b, double c, double d, dist - 1.0); } -static av_cold int get_local_pos(SwsContext *s, int chr_subsample, int pos, int dir) +static av_cold int get_local_pos(SwsInternal *s, int chr_subsample, int pos, int dir) { if (pos == -1 || pos <= -513) { pos = (128 << chr_subsample) - 128; @@ -837,7 +838,7 @@ done: return ret; } -static void fill_rgb2yuv_table(SwsContext *c, const int table[4], int dstRange) +static void fill_rgb2yuv_table(SwsInternal *c, const int table[4], int dstRange) { int64_t W, V, Z, Cy, Cu, Cv; int64_t vr = table[0]; @@ -931,7 +932,7 @@ static void fill_rgb2yuv_table(SwsContext *c, const int table[4], int dstRange) AV_WL16(p + 16*4 + 2*i, map[i] >= 0 ? c->input_rgb2yuv_table[map[i]] : 0); } -static void fill_xyztables(struct SwsContext *c) +static void fill_xyztables(SwsInternal *c) { int i; double xyzgamma = XYZ_GAMMA; @@ -1025,7 +1026,7 @@ static int handle_xyz(enum AVPixelFormat *format) } } -static void handle_formats(SwsContext *c) +static void handle_formats(SwsInternal *c) { c->src0Alpha |= handle_0alpha(&c->srcFormat); c->dst0Alpha |= handle_0alpha(&c->dstFormat); @@ -1040,10 +1041,11 @@ static int range_override_needed(enum AVPixelFormat format) return !isYUV(format) && !isGray(format); } -int sws_setColorspaceDetails(struct SwsContext *c, const int inv_table[4], +int sws_setColorspaceDetails(SwsContext *sws, const int inv_table[4], int srcRange, const int table[4], int dstRange, int brightness, int contrast, int saturation) { + SwsInternal *c = sws_internal(sws); const AVPixFmtDescriptor *desc_dst; const AVPixFmtDescriptor *desc_src; int need_reinit = 0; @@ -1157,7 +1159,7 @@ int sws_setColorspaceDetails(struct SwsContext *c, const int inv_table[4], if (!c->cascaded_context[0]) return -1; - c->cascaded_context[0]->alphablend = c->alphablend; + sws_internal(c->cascaded_context[0])->alphablend = c->alphablend; ret = sws_init_context(c->cascaded_context[0], NULL , NULL); if (ret < 0) return ret; @@ -1171,8 +1173,8 @@ int sws_setColorspaceDetails(struct SwsContext *c, const int inv_table[4], c->flags, c->param); if (!c->cascaded_context[1]) return -1; - c->cascaded_context[1]->srcRange = srcRange; - c->cascaded_context[1]->dstRange = dstRange; + sws_internal(c->cascaded_context[1])->srcRange = srcRange; + sws_internal(c->cascaded_context[1])->dstRange = dstRange; ret = sws_init_context(c->cascaded_context[1], NULL , NULL); if (ret < 0) return ret; @@ -1203,11 +1205,12 @@ int sws_setColorspaceDetails(struct SwsContext *c, const int inv_table[4], return 0; } -int sws_getColorspaceDetails(struct SwsContext *c, int **inv_table, +int sws_getColorspaceDetails(SwsContext *sws, int **inv_table, int *srcRange, int **table, int *dstRange, int *brightness, int *contrast, int *saturation) { - if (!c ) + SwsInternal *c = sws_internal(sws); + if (!c) return -1; if (c->nb_slice_ctx) { @@ -1229,9 +1232,9 @@ int sws_getColorspaceDetails(struct SwsContext *c, int **inv_table, SwsContext *sws_alloc_context(void) { - SwsContext *c = av_mallocz(sizeof(SwsContext)); + SwsInternal *c = av_mallocz(sizeof(SwsInternal)); - av_assert0(offsetof(SwsContext, redDither) + DITHER32_INT == offsetof(SwsContext, dither32)); + av_assert0(offsetof(SwsInternal, redDither) + DITHER32_INT == offsetof(SwsInternal, dither32)); if (c) { c->av_class = &ff_sws_context_class; @@ -1240,7 +1243,7 @@ SwsContext *sws_alloc_context(void) atomic_init(&c->data_unaligned_warned, 0); } - return c; + return (SwsContext *) c; } static uint16_t * alloc_gamma_tbl(double e) @@ -1318,15 +1321,13 @@ static enum AVPixelFormat alphaless_fmt(enum AVPixelFormat fmt) } } -static int sws_init_single_context(SwsContext *c, SwsFilter *srcFilter, - SwsFilter *dstFilter); - -static av_cold int sws_init_single_context(SwsContext *c, SwsFilter *srcFilter, +static av_cold int sws_init_single_context(SwsContext *sws, SwsFilter *srcFilter, SwsFilter *dstFilter) { int i; int usesVFilter, usesHFilter; int unscaled; + SwsInternal *c = sws_internal(sws); SwsFilter dummyFilter = { NULL, NULL, NULL, NULL }; int srcW = c->srcW; int srcH = c->srcH; @@ -1348,7 +1349,7 @@ static av_cold int sws_init_single_context(SwsContext *c, SwsFilter *srcFilter, unscaled = (srcW == dstW && srcH == dstH); if (!c->contrast && !c->saturation && !c->dstFormatBpp) - sws_setColorspaceDetails(c, ff_yuv2rgb_coeffs[SWS_CS_DEFAULT], c->srcRange, + sws_setColorspaceDetails(sws, ff_yuv2rgb_coeffs[SWS_CS_DEFAULT], c->srcRange, ff_yuv2rgb_coeffs[SWS_CS_DEFAULT], c->dstRange, 0, 1 << 16, 1 << 16); @@ -1623,7 +1624,7 @@ static av_cold int sws_init_single_context(SwsContext *c, SwsFilter *srcFilter, if (!unscaled && c->gamma_flag && (srcFormat != tmpFmt || dstFormat != tmpFmt)) { - SwsContext *c2; + SwsInternal *c2; c->cascaded_context[0] = NULL; ret = av_image_alloc(c->cascaded_tmp[0], c->cascaded_tmpStride[0], @@ -1645,7 +1646,7 @@ static av_cold int sws_init_single_context(SwsContext *c, SwsFilter *srcFilter, if (!c->cascaded_context[1]) return AVERROR(ENOMEM); - c2 = c->cascaded_context[1]; + c2 = sws_internal(c->cascaded_context[1]); c2->is_internal_gamma = 1; c2->gamma = alloc_gamma_tbl( c->gamma_value); c2->inv_gamma = alloc_gamma_tbl(1.f/c->gamma_value); @@ -1657,7 +1658,7 @@ static av_cold int sws_init_single_context(SwsContext *c, SwsFilter *srcFilter, // we have to re-initialize it ff_free_filters(c2); if ((ret = ff_init_filters(c2)) < 0) { - sws_freeContext(c2); + sws_freeContext(c->cascaded_context[1]); c->cascaded_context[1] = NULL; return ret; } @@ -1737,7 +1738,7 @@ static av_cold int sws_init_single_context(SwsContext *c, SwsFilter *srcFilter, flags, c->param); if (!c->cascaded_context[0]) return AVERROR(EINVAL); - c->cascaded_context[0]->alphablend = c->alphablend; + sws_internal(c->cascaded_context[0])->alphablend = c->alphablend; ret = sws_init_context(c->cascaded_context[0], NULL , NULL); if (ret < 0) return ret; @@ -1748,8 +1749,8 @@ static av_cold int sws_init_single_context(SwsContext *c, SwsFilter *srcFilter, if (!c->cascaded_context[1]) return AVERROR(EINVAL); - c->cascaded_context[1]->srcRange = c->srcRange; - c->cascaded_context[1]->dstRange = c->dstRange; + sws_internal(c->cascaded_context[1])->srcRange = c->srcRange; + sws_internal(c->cascaded_context[1])->dstRange = c->dstRange; ret = sws_init_context(c->cascaded_context[1], srcFilter , dstFilter); if (ret < 0) return ret; @@ -2030,12 +2031,13 @@ fail: // FIXME replace things by appropriate error codes return ret; } -static int context_init_threaded(SwsContext *c, +static int context_init_threaded(SwsContext *sws, SwsFilter *src_filter, SwsFilter *dst_filter) { + SwsInternal *c = sws_internal(sws); int ret; - ret = avpriv_slicethread_create(&c->slicethread, (void*)c, + ret = avpriv_slicethread_create(&c->slicethread, (void*) sws, ff_sws_slice_worker, NULL, c->nb_threads); if (ret == AVERROR(ENOSYS)) { c->nb_threads = 1; @@ -2051,24 +2053,26 @@ static int context_init_threaded(SwsContext *c, return AVERROR(ENOMEM); for (int i = 0; i < c->nb_threads; i++) { + SwsInternal *c2; c->slice_ctx[i] = sws_alloc_context(); if (!c->slice_ctx[i]) return AVERROR(ENOMEM); + c2 = sws_internal(c->slice_ctx[i]); c->nb_slice_ctx++; - c->slice_ctx[i]->parent = c; + c2->parent = sws; ret = av_opt_copy((void*)c->slice_ctx[i], (void*)c); if (ret < 0) return ret; - c->slice_ctx[i]->nb_threads = 1; + c2->nb_threads = 1; ret = sws_init_single_context(c->slice_ctx[i], src_filter, dst_filter); if (ret < 0) return ret; - if (c->slice_ctx[i]->dither == SWS_DITHER_ED) { + if (c2->dither == SWS_DITHER_ED) { av_log(c, AV_LOG_VERBOSE, "Error-diffusion dither is in use, scaling will be single-threaded."); break; @@ -2078,9 +2082,10 @@ static int context_init_threaded(SwsContext *c, return 0; } -av_cold int sws_init_context(SwsContext *c, SwsFilter *srcFilter, +av_cold int sws_init_context(SwsContext *sws, SwsFilter *srcFilter, SwsFilter *dstFilter) { + SwsInternal *c = sws_internal(sws); static AVOnce rgb2rgb_once = AV_ONCE_INIT; enum AVPixelFormat src_format, dst_format; int ret; @@ -2102,13 +2107,13 @@ av_cold int sws_init_context(SwsContext *c, SwsFilter *srcFilter, av_log(c, AV_LOG_WARNING, "deprecated pixel format used, make sure you did set range correctly\n"); if (c->nb_threads != 1) { - ret = context_init_threaded(c, srcFilter, dstFilter); + ret = context_init_threaded(sws, srcFilter, dstFilter); if (ret < 0 || c->nb_threads > 1) return ret; // threading disabled in this build, init as single-threaded } - return sws_init_single_context(c, srcFilter, dstFilter); + return sws_init_single_context(sws, srcFilter, dstFilter); } SwsContext *sws_getContext(int srcW, int srcH, enum AVPixelFormat srcFormat, @@ -2116,20 +2121,20 @@ SwsContext *sws_getContext(int srcW, int srcH, enum AVPixelFormat srcFormat, int flags, SwsFilter *srcFilter, SwsFilter *dstFilter, const double *param) { - SwsContext *c; + SwsContext *sws; - c = alloc_set_opts(srcW, srcH, srcFormat, - dstW, dstH, dstFormat, - flags, param); - if (!c) + sws = alloc_set_opts(srcW, srcH, srcFormat, + dstW, dstH, dstFormat, + flags, param); + if (!sws) return NULL; - if (sws_init_context(c, srcFilter, dstFilter) < 0) { - sws_freeContext(c); + if (sws_init_context(sws, srcFilter, dstFilter) < 0) { + sws_freeContext(sws); return NULL; } - return c; + return sws; } static int isnan_vec(SwsVector *a) @@ -2442,8 +2447,9 @@ fail: return NULL; } -void sws_freeContext(SwsContext *c) +void sws_freeContext(SwsContext *sws) { + SwsInternal *c = sws_internal(sws); int i; if (!c) return; @@ -2514,7 +2520,7 @@ void sws_freeContext(SwsContext *c) ff_free_filters(c); - av_free(c); + av_free(sws); } void sws_free_context(SwsContext **pctx) @@ -2527,7 +2533,7 @@ void sws_free_context(SwsContext **pctx) *pctx = NULL; } -SwsContext *sws_getCachedContext(SwsContext *context, int srcW, +SwsContext *sws_getCachedContext(SwsContext *sws, int srcW, int srcH, enum AVPixelFormat srcFormat, int dstW, int dstH, enum AVPixelFormat dstFormat, int flags, @@ -2535,6 +2541,8 @@ SwsContext *sws_getCachedContext(SwsContext *context, int srcW, SwsFilter *dstFilter, const double *param) { + SwsInternal *context; + static const double default_param[2] = { SWS_PARAM_DEFAULT, SWS_PARAM_DEFAULT }; int64_t src_h_chr_pos = -513, dst_h_chr_pos = -513, @@ -2543,7 +2551,7 @@ SwsContext *sws_getCachedContext(SwsContext *context, int srcW, if (!param) param = default_param; - if (context && + if ((context = sws_internal(sws)) && (context->srcW != srcW || context->srcH != srcH || context->srcFormat != srcFormat || @@ -2558,13 +2566,14 @@ SwsContext *sws_getCachedContext(SwsContext *context, int srcW, av_opt_get_int(context, "src_v_chr_pos", 0, &src_v_chr_pos); av_opt_get_int(context, "dst_h_chr_pos", 0, &dst_h_chr_pos); av_opt_get_int(context, "dst_v_chr_pos", 0, &dst_v_chr_pos); - sws_freeContext(context); - context = NULL; + sws_freeContext(sws); + sws = NULL; } - if (!context) { - if (!(context = sws_alloc_context())) + if (!sws) { + if (!(sws = sws_alloc_context())) return NULL; + context = sws_internal(sws); context->srcW = srcW; context->srcH = srcH; context->srcFormat = srcFormat; @@ -2580,12 +2589,12 @@ SwsContext *sws_getCachedContext(SwsContext *context, int srcW, av_opt_set_int(context, "dst_h_chr_pos", dst_h_chr_pos, 0); av_opt_set_int(context, "dst_v_chr_pos", dst_v_chr_pos, 0); - if (sws_init_context(context, srcFilter, dstFilter) < 0) { - sws_freeContext(context); + if (sws_init_context(sws, srcFilter, dstFilter) < 0) { + sws_freeContext(sws); return NULL; } } - return context; + return sws; } int ff_range_add(RangeList *rl, unsigned int start, unsigned int len) |