This is an automated email from the git hooks/post-receive script. Git pushed a commit to branch master in repository ffmpeg.
commit 7b773aba82ea91af24e711262725a462fe71c12c Author: Niklas Haas <[email protected]> AuthorDate: Fri Dec 5 20:57:55 2025 +0100 Commit: Niklas Haas <[email protected]> CommitDate: Tue Dec 9 09:47:48 2025 +0000 swscale/format: merge fmt_* helpers into a single fmt_analyze() Handles the split between "regular" and "irregular" pixel formats in a single place, and opens up the door for more complicated formats. --- libswscale/format.c | 160 ++++++++++++++++++++++++---------------------------- 1 file changed, 75 insertions(+), 85 deletions(-) diff --git a/libswscale/format.c b/libswscale/format.c index ff41503915..9ef79ed7dc 100644 --- a/libswscale/format.c +++ b/libswscale/format.c @@ -771,13 +771,13 @@ static int cmp_comp(const void *a, const void *b) { return ca->offset - cb->offset; } -static SwsSwizzleOp fmt_swizzle(enum AVPixelFormat fmt) +static int fmt_analyze_regular(const AVPixFmtDescriptor *desc, SwsReadWriteOp *rw_op, + SwsSwizzleOp *swizzle, int *shift) { - const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(fmt); if (desc->nb_components == 2) { /* YA formats */ - return SWS_SWIZZLE(0, 3, 1, 2); - } else if (is_regular_fmt(fmt)) { + *swizzle = SWS_SWIZZLE(0, 3, 1, 2); + } else { /* Sort by increasing component order */ struct comp sorted[4] = { {0}, {1}, {2}, {3} }; for (int i = 0; i < desc->nb_components; i++) { @@ -790,11 +790,64 @@ static SwsSwizzleOp fmt_swizzle(enum AVPixelFormat fmt) SwsSwizzleOp swiz = SWS_SWIZZLE(0, 1, 2, 3); for (int i = 0; i < desc->nb_components; i++) swiz.in[i] = sorted[i].index; - return swiz; + *swizzle = swiz; } - /* This function is only ever called if fmt_read_write() already passes */ - return fmt_info_irregular(fmt).swizzle; + *shift = desc->comp[0].shift; + *rw_op = (SwsReadWriteOp) { + .elems = desc->nb_components, + .packed = desc->nb_components > 1 && !(desc->flags & AV_PIX_FMT_FLAG_PLANAR), + }; + return 0; +} + +static int fmt_analyze(enum AVPixelFormat fmt, SwsReadWriteOp *rw_op, + SwsPackOp *pack_op, SwsSwizzleOp *swizzle, int *shift, + SwsPixelType *pixel_type, SwsPixelType *raw_type) +{ + const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(fmt); + if (!desc) + return AVERROR(EINVAL); + + /* No support for subsampled formats at the moment */ + if (desc->log2_chroma_w || desc->log2_chroma_h) + return AVERROR(ENOTSUP); + + /* No support for semi-planar formats at the moment */ + if (desc->flags & AV_PIX_FMT_FLAG_PLANAR && + av_pix_fmt_count_planes(fmt) < desc->nb_components) + return AVERROR(ENOTSUP); + + *pixel_type = *raw_type = fmt_pixel_type(fmt); + if (!*pixel_type) + return AVERROR(ENOTSUP); + + if (is_regular_fmt(fmt)) { + *pack_op = (SwsPackOp) {0}; + return fmt_analyze_regular(desc, rw_op, swizzle, shift); + } + + FmtInfo info = fmt_info_irregular(fmt); + if (!info.rw.elems) + return AVERROR(ENOTSUP); + + *rw_op = info.rw; + *pack_op = info.pack; + *swizzle = info.swizzle; + *shift = info.shift; + + if (info.pack.pattern[0]) { + const int sum = info.pack.pattern[0] + info.pack.pattern[1] + + info.pack.pattern[2] + info.pack.pattern[3]; + if (sum > 16) + *raw_type = SWS_PIXEL_U32; + else if (sum > 8) + *raw_type = SWS_PIXEL_U16; + else + *raw_type = SWS_PIXEL_U8; + } + + return 0; } static SwsSwizzleOp swizzle_inv(SwsSwizzleOp swiz) { @@ -807,18 +860,6 @@ static SwsSwizzleOp swizzle_inv(SwsSwizzleOp swiz) { return (SwsSwizzleOp) {{ .x = out[0], out[1], out[2], out[3] }}; } -/* Shift factor for MSB aligned formats */ -static int fmt_shift(enum AVPixelFormat fmt) -{ - if (is_regular_fmt(fmt)) { - const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(fmt); - return desc->comp[0].shift; - } - - /* This function is only ever called if fmt_read_write() already passes */ - return fmt_info_irregular(fmt).shift; -} - /** * This initializes all absent components explicitly to zero. There is no * need to worry about the correct neutral value as fmt_decode() will @@ -842,56 +883,6 @@ static SwsConst fmt_clear(enum AVPixelFormat fmt) return c; } -static int fmt_read_write(enum AVPixelFormat fmt, SwsReadWriteOp *rw_op, - SwsPackOp *pack_op, SwsPixelType *pixel_type) -{ - const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(fmt); - if (!desc) - return AVERROR(EINVAL); - - /* No support for subsampled formats at the moment */ - if (desc->log2_chroma_w || desc->log2_chroma_h) - return AVERROR(ENOTSUP); - - /* No support for semi-planar formats at the moment */ - if (desc->flags & AV_PIX_FMT_FLAG_PLANAR && - av_pix_fmt_count_planes(fmt) < desc->nb_components) - return AVERROR(ENOTSUP); - - *pixel_type = fmt_pixel_type(fmt); - if (!*pixel_type) - return AVERROR(ENOTSUP); - - if (is_regular_fmt(fmt)) { - *pack_op = (SwsPackOp) {0}; - *rw_op = (SwsReadWriteOp) { - .elems = desc->nb_components, - .packed = desc->nb_components > 1 && !(desc->flags & AV_PIX_FMT_FLAG_PLANAR), - }; - return 0; - } - - FmtInfo info = fmt_info_irregular(fmt); - if (!info.rw.elems) - return AVERROR(ENOTSUP); - - *pack_op = info.pack; - *rw_op = info.rw; - return 0; -} - -static SwsPixelType get_packed_type(SwsPackOp pack) -{ - const int sum = pack.pattern[0] + pack.pattern[1] + - pack.pattern[2] + pack.pattern[3]; - if (sum > 16) - return SWS_PIXEL_U32; - else if (sum > 8) - return SWS_PIXEL_U16; - else - return SWS_PIXEL_U8; -} - #if HAVE_BIGENDIAN # define NATIVE_ENDIAN_FLAG AV_PIX_FMT_FLAG_BE #else @@ -901,15 +892,14 @@ static SwsPixelType get_packed_type(SwsPackOp pack) int ff_sws_decode_pixfmt(SwsOpList *ops, enum AVPixelFormat fmt) { const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(fmt); - SwsPixelType pixel_type; + SwsPixelType pixel_type, raw_type; SwsReadWriteOp rw_op; + SwsSwizzleOp swizzle; SwsPackOp unpack; + int shift; - RET(fmt_read_write(fmt, &rw_op, &unpack, &pixel_type)); - - SwsPixelType raw_type = pixel_type; - if (unpack.pattern[0]) - raw_type = get_packed_type(unpack); + RET(fmt_analyze(fmt, &rw_op, &unpack, &swizzle, &shift, + &pixel_type, &raw_type)); /* TODO: handle subsampled or semipacked input formats */ RET(ff_sws_op_list_append(ops, &(SwsOp) { @@ -942,13 +932,13 @@ int ff_sws_decode_pixfmt(SwsOpList *ops, enum AVPixelFormat fmt) RET(ff_sws_op_list_append(ops, &(SwsOp) { .op = SWS_OP_SWIZZLE, .type = pixel_type, - .swizzle = swizzle_inv(fmt_swizzle(fmt)), + .swizzle = swizzle_inv(swizzle), })); RET(ff_sws_op_list_append(ops, &(SwsOp) { .op = SWS_OP_RSHIFT, .type = pixel_type, - .c.u = fmt_shift(fmt), + .c.u = shift, })); RET(ff_sws_op_list_append(ops, &(SwsOp) { @@ -963,20 +953,19 @@ int ff_sws_decode_pixfmt(SwsOpList *ops, enum AVPixelFormat fmt) int ff_sws_encode_pixfmt(SwsOpList *ops, enum AVPixelFormat fmt) { const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(fmt); - SwsPixelType pixel_type; + SwsPixelType pixel_type, raw_type; SwsReadWriteOp rw_op; + SwsSwizzleOp swizzle; SwsPackOp pack; + int shift; - RET(fmt_read_write(fmt, &rw_op, &pack, &pixel_type)); - - SwsPixelType raw_type = pixel_type; - if (pack.pattern[0]) - raw_type = get_packed_type(pack); + RET(fmt_analyze(fmt, &rw_op, &pack, &swizzle, &shift, + &pixel_type, &raw_type)); RET(ff_sws_op_list_append(ops, &(SwsOp) { .op = SWS_OP_LSHIFT, .type = pixel_type, - .c.u = fmt_shift(fmt), + .c.u = shift, })); if (rw_op.elems > desc->nb_components) { @@ -992,7 +981,7 @@ int ff_sws_encode_pixfmt(SwsOpList *ops, enum AVPixelFormat fmt) RET(ff_sws_op_list_append(ops, &(SwsOp) { .op = SWS_OP_SWIZZLE, .type = pixel_type, - .swizzle = fmt_swizzle(fmt), + .swizzle = swizzle, })); if (pack.pattern[0]) { @@ -1021,6 +1010,7 @@ int ff_sws_encode_pixfmt(SwsOpList *ops, enum AVPixelFormat fmt) .type = raw_type, .rw = rw_op, })); + return 0; } _______________________________________________ ffmpeg-cvslog mailing list -- [email protected] To unsubscribe send an email to [email protected]
