aboutsummaryrefslogtreecommitdiffstats
path: root/libswscale/utils.c
diff options
context:
space:
mode:
authorNiklas Haas <git@haasn.dev>2024-10-09 19:44:33 +0200
committerNiklas Haas <git@haasn.dev>2024-10-24 22:50:00 +0200
commit67adb303228a5d8e2abe860b7748004cc83ca65f (patch)
tree5b987107804eb246b68414da8e43789658594c7c /libswscale/utils.c
parent153a6dc8faafc4de263a493484ffc1dc2b5b26b2 (diff)
downloadffmpeg-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.c117
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)