This is an automated email from the git hooks/post-receive script. Git pushed a commit to branch master in repository ffmpeg.
commit 841ca7a2cbbff12d19b90e779007e68de9409cc7 Author: Niklas Haas <[email protected]> AuthorDate: Fri Feb 20 17:39:46 2026 +0100 Commit: Niklas Haas <[email protected]> CommitDate: Thu Feb 26 18:08:49 2026 +0000 swscale/format: pass SwsFormat by ref instead of by value where possible The one exception is in adapt_colors(), which mutates these structs on its own stack anyways. --- libswscale/format.c | 66 ++++++++++++++++++++++---------------------- libswscale/format.h | 4 +-- libswscale/graph.c | 68 ++++++++++++++++++++++++---------------------- libswscale/ops.c | 12 ++++---- libswscale/ops.h | 4 +-- libswscale/tests/sws_ops.c | 4 +-- 6 files changed, 80 insertions(+), 78 deletions(-) diff --git a/libswscale/format.c b/libswscale/format.c index 017df9f69a..db3bf78a72 100644 --- a/libswscale/format.c +++ b/libswscale/format.c @@ -1080,7 +1080,7 @@ static inline AVRational av_neg_q(AVRational x) return (AVRational) { -x.num, x.den }; } -static SwsLinearOp fmt_encode_range(const SwsFormat fmt, bool *incomplete) +static SwsLinearOp fmt_encode_range(const SwsFormat *fmt, bool *incomplete) { SwsLinearOp c = { .m = { { Q1, Q0, Q0, Q0, Q0 }, @@ -1089,22 +1089,22 @@ static SwsLinearOp fmt_encode_range(const SwsFormat fmt, bool *incomplete) { Q0, Q0, Q0, Q1, Q0 }, }}; - const int depth0 = fmt.desc->comp[0].depth; - const int depth1 = fmt.desc->comp[1].depth; - const int depth2 = fmt.desc->comp[2].depth; - const int depth3 = fmt.desc->comp[3].depth; + const int depth0 = fmt->desc->comp[0].depth; + const int depth1 = fmt->desc->comp[1].depth; + const int depth2 = fmt->desc->comp[2].depth; + const int depth3 = fmt->desc->comp[3].depth; - if (fmt.desc->flags & AV_PIX_FMT_FLAG_FLOAT) + if (fmt->desc->flags & AV_PIX_FMT_FLAG_FLOAT) return c; /* floats are directly output as-is */ - if (fmt.csp == AVCOL_SPC_RGB || (fmt.desc->flags & AV_PIX_FMT_FLAG_XYZ)) { + if (fmt->csp == AVCOL_SPC_RGB || (fmt->desc->flags & AV_PIX_FMT_FLAG_XYZ)) { c.m[0][0] = Q((1 << depth0) - 1); c.m[1][1] = Q((1 << depth1) - 1); c.m[2][2] = Q((1 << depth2) - 1); - } else if (fmt.range == AVCOL_RANGE_JPEG) { + } else if (fmt->range == AVCOL_RANGE_JPEG) { /* Full range YUV */ c.m[0][0] = Q((1 << depth0) - 1); - if (fmt.desc->nb_components >= 3) { + if (fmt->desc->nb_components >= 3) { /* This follows the ITU-R convention, which is slightly different * from the JFIF convention. */ c.m[1][1] = Q((1 << depth1) - 1); @@ -1114,11 +1114,11 @@ static SwsLinearOp fmt_encode_range(const SwsFormat fmt, bool *incomplete) } } else { /* Limited range YUV */ - if (fmt.range == AVCOL_RANGE_UNSPECIFIED) + if (fmt->range == AVCOL_RANGE_UNSPECIFIED) *incomplete = true; c.m[0][0] = Q(219 << (depth0 - 8)); c.m[0][4] = Q( 16 << (depth0 - 8)); - if (fmt.desc->nb_components >= 3) { + if (fmt->desc->nb_components >= 3) { c.m[1][1] = Q(224 << (depth1 - 8)); c.m[2][2] = Q(224 << (depth2 - 8)); c.m[1][4] = Q(128 << (depth1 - 8)); @@ -1126,12 +1126,12 @@ static SwsLinearOp fmt_encode_range(const SwsFormat fmt, bool *incomplete) } } - if (fmt.desc->flags & AV_PIX_FMT_FLAG_ALPHA) { - const bool is_ya = fmt.desc->nb_components == 2; + if (fmt->desc->flags & AV_PIX_FMT_FLAG_ALPHA) { + const bool is_ya = fmt->desc->nb_components == 2; c.m[3][3] = Q((1 << (is_ya ? depth1 : depth3)) - 1); } - if (fmt.format == AV_PIX_FMT_MONOWHITE) { + if (fmt->format == AV_PIX_FMT_MONOWHITE) { /* This format is inverted, 0 = white, 1 = black */ c.m[0][4] = av_add_q(c.m[0][4], c.m[0][0]); c.m[0][0] = av_neg_q(c.m[0][0]); @@ -1141,7 +1141,7 @@ static SwsLinearOp fmt_encode_range(const SwsFormat fmt, bool *incomplete) return c; } -static SwsLinearOp fmt_decode_range(const SwsFormat fmt, bool *incomplete) +static SwsLinearOp fmt_decode_range(const SwsFormat *fmt, bool *incomplete) { SwsLinearOp c = fmt_encode_range(fmt, incomplete); @@ -1153,7 +1153,7 @@ static SwsLinearOp fmt_decode_range(const SwsFormat fmt, bool *incomplete) } /* Explicitly initialize alpha for sanity */ - if (!(fmt.desc->flags & AV_PIX_FMT_FLAG_ALPHA)) + if (!(fmt->desc->flags & AV_PIX_FMT_FLAG_ALPHA)) c.m[3][4] = Q1; c.mask = ff_sws_linear_mask(c); @@ -1219,15 +1219,15 @@ static bool trc_is_hdr(enum AVColorTransferCharacteristic trc) static int fmt_dither(SwsContext *ctx, SwsOpList *ops, const SwsPixelType type, - const SwsFormat src, const SwsFormat dst) + const SwsFormat *src, const SwsFormat *dst) { SwsDither mode = ctx->dither; SwsDitherOp dither; - const int bpc = dst.desc->comp[0].depth; + const int bpc = dst->desc->comp[0].depth; if (mode == SWS_DITHER_AUTO) { /* Visual threshold of perception: 12 bits for SDR, 14 bits for HDR */ - const int jnd_bits = trc_is_hdr(dst.color.trc) ? 14 : 12; + const int jnd_bits = trc_is_hdr(dst->color.trc) ? 14 : 12; mode = bpc >= jnd_bits ? SWS_DITHER_NONE : SWS_DITHER_BAYER; } @@ -1266,7 +1266,7 @@ static int fmt_dither(SwsContext *ctx, SwsOpList *ops, dither.y_offset[i] = offsets_16x16[i]; } - if (src.desc->nb_components < 3 && bpc >= 8) { + if (src->desc->nb_components < 3 && bpc >= 8) { /** * For high-bit-depth sources without chroma, use same matrix * offset for all color channels. This prevents introducing color @@ -1316,13 +1316,13 @@ linear_mat3(const AVRational m00, const AVRational m01, const AVRational m02, } int ff_sws_decode_colors(SwsContext *ctx, SwsPixelType type, - SwsOpList *ops, const SwsFormat fmt, bool *incomplete) + SwsOpList *ops, const SwsFormat *fmt, bool *incomplete) { - const AVLumaCoefficients *c = av_csp_luma_coeffs_from_avcsp(fmt.csp); + const AVLumaCoefficients *c = av_csp_luma_coeffs_from_avcsp(fmt->csp); RET(ff_sws_op_list_append(ops, &(SwsOp) { .op = SWS_OP_CONVERT, - .type = fmt_pixel_type(fmt.format), + .type = fmt_pixel_type(fmt->format), .convert.to = type, })); @@ -1334,7 +1334,7 @@ int ff_sws_decode_colors(SwsContext *ctx, SwsPixelType type, })); /* Final step, decode colorspace */ - switch (fmt.csp) { + switch (fmt->csp) { case AVCOL_SPC_RGB: return 0; case AVCOL_SPC_UNSPECIFIED: @@ -1398,12 +1398,12 @@ int ff_sws_decode_colors(SwsContext *ctx, SwsPixelType type, } int ff_sws_encode_colors(SwsContext *ctx, SwsPixelType type, - SwsOpList *ops, const SwsFormat src, - const SwsFormat dst, bool *incomplete) + SwsOpList *ops, const SwsFormat *src, + const SwsFormat *dst, bool *incomplete) { - const AVLumaCoefficients *c = av_csp_luma_coeffs_from_avcsp(dst.csp); + const AVLumaCoefficients *c = av_csp_luma_coeffs_from_avcsp(dst->csp); - switch (dst.csp) { + switch (dst->csp) { case AVCOL_SPC_RGB: break; case AVCOL_SPC_UNSPECIFIED: @@ -1469,14 +1469,14 @@ int ff_sws_encode_colors(SwsContext *ctx, SwsPixelType type, .lin = fmt_encode_range(dst, incomplete), })); - if (!(dst.desc->flags & AV_PIX_FMT_FLAG_FLOAT)) { + if (!(dst->desc->flags & AV_PIX_FMT_FLAG_FLOAT)) { SwsConst range = {0}; - const bool is_ya = dst.desc->nb_components == 2; - for (int i = 0; i < dst.desc->nb_components; i++) { + const bool is_ya = dst->desc->nb_components == 2; + for (int i = 0; i < dst->desc->nb_components; i++) { /* Clamp to legal pixel range */ const int idx = i * (is_ya ? 3 : 1); - range.q4[idx] = Q((1 << dst.desc->comp[i].depth) - 1); + range.q4[idx] = Q((1 << dst->desc->comp[i].depth) - 1); } RET(fmt_dither(ctx, ops, type, src, dst)); @@ -1496,7 +1496,7 @@ int ff_sws_encode_colors(SwsContext *ctx, SwsPixelType type, return ff_sws_op_list_append(ops, &(SwsOp) { .type = type, .op = SWS_OP_CONVERT, - .convert.to = fmt_pixel_type(dst.format), + .convert.to = fmt_pixel_type(dst->format), }); } diff --git a/libswscale/format.h b/libswscale/format.h index ee7a07e951..509554492e 100644 --- a/libswscale/format.h +++ b/libswscale/format.h @@ -168,9 +168,9 @@ int ff_sws_encode_pixfmt(SwsOpList *ops, enum AVPixelFormat fmt); * Returns 0 on success, or a negative error code on failure. */ int ff_sws_decode_colors(SwsContext *ctx, SwsPixelType type, SwsOpList *ops, - const SwsFormat fmt, bool *incomplete); + const SwsFormat *fmt, bool *incomplete); int ff_sws_encode_colors(SwsContext *ctx, SwsPixelType type, SwsOpList *ops, - const SwsFormat src, const SwsFormat dst, + const SwsFormat *src, const SwsFormat *dst, bool *incomplete); #endif /* SWSCALE_FORMAT_H */ diff --git a/libswscale/graph.c b/libswscale/graph.c index c566a3ff32..1c3a089cfe 100644 --- a/libswscale/graph.c +++ b/libswscale/graph.c @@ -457,12 +457,13 @@ static int init_legacy_subpass(SwsGraph *graph, SwsContext *sws, return 0; } -static int add_legacy_sws_pass(SwsGraph *graph, SwsFormat src, SwsFormat dst, - SwsPass *input, SwsPass **output) +static int add_legacy_sws_pass(SwsGraph *graph, const SwsFormat *src, + const SwsFormat *dst, SwsPass *input, + SwsPass **output) { int ret, warned = 0; SwsContext *const ctx = graph->ctx; - if (src.hw_format != AV_PIX_FMT_NONE || dst.hw_format != AV_PIX_FMT_NONE) + if (src->hw_format != AV_PIX_FMT_NONE || dst->hw_format != AV_PIX_FMT_NONE) return AVERROR(ENOTSUP); SwsContext *sws = sws_alloc_context(); @@ -474,20 +475,20 @@ static int add_legacy_sws_pass(SwsGraph *graph, SwsFormat src, SwsFormat dst, sws->alpha_blend = ctx->alpha_blend; sws->gamma_flag = ctx->gamma_flag; - sws->src_w = src.width; - sws->src_h = src.height; - sws->src_format = src.format; - sws->src_range = src.range == AVCOL_RANGE_JPEG; + sws->src_w = src->width; + sws->src_h = src->height; + sws->src_format = src->format; + sws->src_range = src->range == AVCOL_RANGE_JPEG; - sws->dst_w = dst.width; - sws->dst_h = dst.height; - sws->dst_format = dst.format; - sws->dst_range = dst.range == AVCOL_RANGE_JPEG; - get_chroma_pos(graph, &sws->src_h_chr_pos, &sws->src_v_chr_pos, &src); - get_chroma_pos(graph, &sws->dst_h_chr_pos, &sws->dst_v_chr_pos, &dst); + sws->dst_w = dst->width; + sws->dst_h = dst->height; + sws->dst_format = dst->format; + sws->dst_range = dst->range == AVCOL_RANGE_JPEG; + get_chroma_pos(graph, &sws->src_h_chr_pos, &sws->src_v_chr_pos, src); + get_chroma_pos(graph, &sws->dst_h_chr_pos, &sws->dst_v_chr_pos, dst); - graph->incomplete |= src.range == AVCOL_RANGE_UNSPECIFIED; - graph->incomplete |= dst.range == AVCOL_RANGE_UNSPECIFIED; + graph->incomplete |= src->range == AVCOL_RANGE_UNSPECIFIED; + graph->incomplete |= dst->range == AVCOL_RANGE_UNSPECIFIED; /* Allow overriding chroma position with the legacy API */ legacy_chr_pos(graph, &sws->src_h_chr_pos, ctx->src_h_chr_pos, &warned); @@ -512,12 +513,12 @@ static int add_legacy_sws_pass(SwsGraph *graph, SwsFormat src, SwsFormat dst, (int **)&table, &out_full, &brightness, &contrast, &saturation); - inv_table = sws_getCoefficients(src.csp); - table = sws_getCoefficients(dst.csp); + inv_table = sws_getCoefficients(src->csp); + table = sws_getCoefficients(dst->csp); - graph->incomplete |= src.csp != dst.csp && - (src.csp == AVCOL_SPC_UNSPECIFIED || - dst.csp == AVCOL_SPC_UNSPECIFIED); + graph->incomplete |= src->csp != dst->csp && + (src->csp == AVCOL_SPC_UNSPECIFIED || + dst->csp == AVCOL_SPC_UNSPECIFIED); sws_setColorspaceDetails(sws, inv_table, in_full, table, out_full, brightness, contrast, saturation); @@ -531,8 +532,9 @@ static int add_legacy_sws_pass(SwsGraph *graph, SwsFormat src, SwsFormat dst, *********************/ #if CONFIG_UNSTABLE -static int add_convert_pass(SwsGraph *graph, SwsFormat src, SwsFormat dst, - SwsPass *input, SwsPass **output) +static int add_convert_pass(SwsGraph *graph, const SwsFormat *src, + const SwsFormat *dst, SwsPass *input, + SwsPass **output) { const SwsPixelType type = SWS_PIXEL_F32; @@ -545,23 +547,23 @@ static int add_convert_pass(SwsGraph *graph, SwsFormat src, SwsFormat dst, goto fail; /* The new format conversion layer cannot scale for now */ - if (src.width != dst.width || src.height != dst.height || - src.desc->log2_chroma_h || src.desc->log2_chroma_w || - dst.desc->log2_chroma_h || dst.desc->log2_chroma_w) + if (src->width != dst->width || src->height != dst->height || + src->desc->log2_chroma_h || src->desc->log2_chroma_w || + dst->desc->log2_chroma_h || dst->desc->log2_chroma_w) goto fail; /* The new code does not yet support alpha blending */ - if (src.desc->flags & AV_PIX_FMT_FLAG_ALPHA && + if (src->desc->flags & AV_PIX_FMT_FLAG_ALPHA && ctx->alpha_blend != SWS_ALPHA_BLEND_NONE) goto fail; ops = ff_sws_op_list_alloc(); if (!ops) return AVERROR(ENOMEM); - ops->src = src; - ops->dst = dst; + ops->src = *src; + ops->dst = *dst; - ret = ff_sws_decode_pixfmt(ops, src.format); + ret = ff_sws_decode_pixfmt(ops, src->format); if (ret < 0) goto fail; ret = ff_sws_decode_colors(ctx, type, ops, src, &graph->incomplete); @@ -570,12 +572,12 @@ static int add_convert_pass(SwsGraph *graph, SwsFormat src, SwsFormat dst, ret = ff_sws_encode_colors(ctx, type, ops, src, dst, &graph->incomplete); if (ret < 0) goto fail; - ret = ff_sws_encode_pixfmt(ops, dst.format); + ret = ff_sws_encode_pixfmt(ops, dst->format); if (ret < 0) goto fail; av_log(ctx, AV_LOG_VERBOSE, "Conversion pass for %s -> %s:\n", - av_get_pix_fmt_name(src.format), av_get_pix_fmt_name(dst.format)); + av_get_pix_fmt_name(src->format), av_get_pix_fmt_name(dst->format)); av_log(ctx, AV_LOG_DEBUG, "Unoptimized operation list:\n"); ff_sws_op_list_print(ctx, AV_LOG_DEBUG, AV_LOG_TRACE, ops); @@ -673,7 +675,7 @@ static int adapt_colors(SwsGraph *graph, SwsFormat src, SwsFormat dst, if (fmt_in != src.format) { SwsFormat tmp = src; tmp.format = fmt_in; - ret = add_convert_pass(graph, src, tmp, input, &input); + ret = add_convert_pass(graph, &src, &tmp, input, &input); if (ret < 0) return ret; } @@ -715,7 +717,7 @@ static int init_passes(SwsGraph *graph) src.color = dst.color; if (!ff_fmt_equal(&src, &dst)) { - ret = add_convert_pass(graph, src, dst, pass, &pass); + ret = add_convert_pass(graph, &src, &dst, pass, &pass); if (ret < 0) return ret; } diff --git a/libswscale/ops.c b/libswscale/ops.c index e90960832e..3aba144246 100644 --- a/libswscale/ops.c +++ b/libswscale/ops.c @@ -1153,8 +1153,8 @@ static int rw_pixel_bits(const SwsOp *op) return elems * size * bits; } -int ff_sws_compile_pass(SwsGraph *graph, SwsOpList *ops, int flags, SwsFormat dst, - SwsPass *input, SwsPass **output) +int ff_sws_compile_pass(SwsGraph *graph, SwsOpList *ops, int flags, + const SwsFormat *dst, SwsPass *input, SwsPass **output) { SwsContext *ctx = graph->ctx; SwsOpPass *p = NULL; @@ -1198,8 +1198,8 @@ int ff_sws_compile_pass(SwsGraph *graph, SwsOpList *ops, int flags, SwsFormat ds p->pixel_bits_in = rw_pixel_bits(read); p->pixel_bits_out = rw_pixel_bits(write); p->exec_base = (SwsOpExec) { - .width = dst.width, - .height = dst.height, + .width = dst->width, + .height = dst->height, .block_size_in = p->comp.block_size * p->pixel_bits_in >> 3, .block_size_out = p->comp.block_size * p->pixel_bits_out >> 3, }; @@ -1209,8 +1209,8 @@ int ff_sws_compile_pass(SwsGraph *graph, SwsOpList *ops, int flags, SwsFormat ds p->idx_out[i] = i < p->planes_out ? ops->order_dst.in[i] : -1; } - pass = ff_sws_graph_add_pass(graph, dst.format, dst.width, dst.height, input, - p->comp.slice_align, p, op_pass_run); + pass = ff_sws_graph_add_pass(graph, dst->format, dst->width, dst->height, + input, p->comp.slice_align, p, op_pass_run); if (!pass) { ret = AVERROR(ENOMEM); goto fail; diff --git a/libswscale/ops.h b/libswscale/ops.h index d1576b9325..f7a5a8c1ee 100644 --- a/libswscale/ops.h +++ b/libswscale/ops.h @@ -297,7 +297,7 @@ enum SwsOpCompileFlags { * * Note: `ops` may be modified by this function. */ -int ff_sws_compile_pass(SwsGraph *graph, SwsOpList *ops, int flags, SwsFormat dst, - SwsPass *input, SwsPass **output); +int ff_sws_compile_pass(SwsGraph *graph, SwsOpList *ops, int flags, + const SwsFormat *dst, SwsPass *input, SwsPass **output); #endif diff --git a/libswscale/tests/sws_ops.c b/libswscale/tests/sws_ops.c index a558c07119..504fc34f6b 100644 --- a/libswscale/tests/sws_ops.c +++ b/libswscale/tests/sws_ops.c @@ -46,9 +46,9 @@ static int run_test(SwsContext *const ctx, AVFrame *frame, if (ff_sws_decode_pixfmt(ops, src.format) < 0) goto fail; - if (ff_sws_decode_colors(ctx, SWS_PIXEL_F32, ops, src, &incomplete) < 0) + if (ff_sws_decode_colors(ctx, SWS_PIXEL_F32, ops, &src, &incomplete) < 0) goto fail; - if (ff_sws_encode_colors(ctx, SWS_PIXEL_F32, ops, src, dst, &incomplete) < 0) + if (ff_sws_encode_colors(ctx, SWS_PIXEL_F32, ops, &src, &dst, &incomplete) < 0) goto fail; if (ff_sws_encode_pixfmt(ops, dst.format) < 0) goto fail; _______________________________________________ ffmpeg-cvslog mailing list -- [email protected] To unsubscribe send an email to [email protected]
