swscale/graph: expose ff_sws_graph_add_pass

So we can move pass-adding business logic outside of graph.c.
This commit is contained in:
Niklas Haas 2025-02-21 16:09:38 +01:00
parent f297ebf97a
commit 51e912466f
2 changed files with 38 additions and 21 deletions

View file

@ -44,10 +44,9 @@ static int pass_alloc_output(SwsPass *pass)
pass->num_slices * pass->slice_h, pass->format, 64);
}
/* slice_align should be a power of two, or 0 to disable slice threading */
static SwsPass *pass_add(SwsGraph *graph, void *priv, enum AVPixelFormat fmt,
int w, int h, SwsPass *input, int slice_align,
sws_filter_run_t run)
SwsPass *ff_sws_graph_add_pass(SwsGraph *graph, enum AVPixelFormat fmt,
int width, int height, SwsPass *input,
int align, void *priv, sws_filter_run_t run)
{
int ret;
SwsPass *pass = av_mallocz(sizeof(*pass));
@ -58,8 +57,8 @@ static SwsPass *pass_add(SwsGraph *graph, void *priv, enum AVPixelFormat fmt,
pass->run = run;
pass->priv = priv;
pass->format = fmt;
pass->width = w;
pass->height = h;
pass->width = width;
pass->height = height;
pass->input = input;
pass->output.fmt = AV_PIX_FMT_NONE;
@ -69,12 +68,12 @@ static SwsPass *pass_add(SwsGraph *graph, void *priv, enum AVPixelFormat fmt,
return NULL;
}
if (!slice_align) {
if (!align) {
pass->slice_h = pass->height;
pass->num_slices = 1;
} else {
pass->slice_h = (pass->height + graph->num_threads - 1) / graph->num_threads;
pass->slice_h = FFALIGN(pass->slice_h, slice_align);
pass->slice_h = FFALIGN(pass->slice_h, align);
pass->num_slices = (pass->height + pass->slice_h - 1) / pass->slice_h;
}
@ -84,12 +83,11 @@ static SwsPass *pass_add(SwsGraph *graph, void *priv, enum AVPixelFormat fmt,
return pass;
}
/* Wrapper around pass_add that chains a pass "in-place" */
static int pass_append(SwsGraph *graph, void *priv, enum AVPixelFormat fmt,
int w, int h, SwsPass **pass, int slice_align,
sws_filter_run_t run)
/* Wrapper around ff_sws_graph_add_pass() that chains a pass "in-place" */
static int pass_append(SwsGraph *graph, enum AVPixelFormat fmt, int w, int h,
SwsPass **pass, int align, void *priv, sws_filter_run_t run)
{
SwsPass *new = pass_add(graph, priv, fmt, w, h, *pass, slice_align, run);
SwsPass *new = ff_sws_graph_add_pass(graph, fmt, w, h, *pass, align, priv, run);
if (!new)
return AVERROR(ENOMEM);
*pass = new;
@ -325,19 +323,19 @@ static int init_legacy_subpass(SwsGraph *graph, SwsContext *sws,
align = 0; /* disable slice threading */
if (c->src0Alpha && !c->dst0Alpha && isALPHA(sws->dst_format)) {
ret = pass_append(graph, c, AV_PIX_FMT_RGBA, src_w, src_h, &input, 1, run_rgb0);
ret = pass_append(graph, AV_PIX_FMT_RGBA, src_w, src_h, &input, 1, c, run_rgb0);
if (ret < 0)
return ret;
}
if (c->srcXYZ && !(c->dstXYZ && unscaled)) {
ret = pass_append(graph, c, AV_PIX_FMT_RGB48, src_w, src_h, &input, 1, run_xyz2rgb);
ret = pass_append(graph, AV_PIX_FMT_RGB48, src_w, src_h, &input, 1, c, run_xyz2rgb);
if (ret < 0)
return ret;
}
pass = pass_add(graph, sws, sws->dst_format, dst_w, dst_h, input, align,
c->convert_unscaled ? run_legacy_unscaled : run_legacy_swscale);
pass = ff_sws_graph_add_pass(graph, sws->dst_format, dst_w, dst_h, input, align, sws,
c->convert_unscaled ? run_legacy_unscaled : run_legacy_swscale);
if (!pass)
return AVERROR(ENOMEM);
pass->setup = setup_legacy_swscale;
@ -387,7 +385,7 @@ static int init_legacy_subpass(SwsGraph *graph, SwsContext *sws,
}
if (c->dstXYZ && !(c->srcXYZ && unscaled)) {
ret = pass_append(graph, c, AV_PIX_FMT_RGB48, dst_w, dst_h, &pass, 1, run_rgb2xyz);
ret = pass_append(graph, AV_PIX_FMT_RGB48, dst_w, dst_h, &pass, 1, c, run_rgb2xyz);
if (ret < 0)
return ret;
}
@ -548,8 +546,8 @@ static int adapt_colors(SwsGraph *graph, SwsFormat src, SwsFormat dst,
return ret;
}
pass = pass_add(graph, lut, fmt_out, src.width, src.height,
input, 1, run_lut3d);
pass = ff_sws_graph_add_pass(graph, fmt_out, src.width, src.height,
input, 1, lut, run_lut3d);
if (!pass) {
ff_sws_lut3d_free(&lut);
return AVERROR(ENOMEM);
@ -589,7 +587,8 @@ static int init_passes(SwsGraph *graph)
graph->noop = 1;
/* Add threaded memcpy pass */
pass = pass_add(graph, NULL, dst.format, dst.width, dst.height, pass, 1, run_copy);
pass = ff_sws_graph_add_pass(graph, dst.format, dst.width, dst.height,
pass, 1, NULL, run_copy);
if (!pass)
return AVERROR(ENOMEM);
}

View file

@ -128,6 +128,24 @@ typedef struct SwsGraph {
int ff_sws_graph_create(SwsContext *ctx, const SwsFormat *dst, const SwsFormat *src,
int field, SwsGraph **out_graph);
/**
* Allocate and add a new pass to the filter graph.
*
* @param graph Filter graph to add the pass to.
* @param fmt Pixel format of the output image.
* @param w Width of the output image.
* @param h Height of the output image.
* @param input Previous pass to read from, or NULL for the input image.
* @param align Minimum slice alignment for this pass, or 0 for no threading.
* @param priv Private state for the filter run function.
* @param run Filter function to run.
* @return The newly created pass, or NULL on error.
*/
SwsPass *ff_sws_graph_add_pass(SwsGraph *graph, enum AVPixelFormat fmt,
int width, int height, SwsPass *input,
int align, void *priv, sws_filter_run_t run);
/**
* Uninitialize any state associate with this filter graph and free it.
*/