This is an automated email from the git hooks/post-receive script.

Git pushed a commit to branch master
in repository ffmpeg.

commit a8dc3a543cf3dc723df1b9ab448d00def6113d70
Author:     Niklas Haas <[email protected]>
AuthorDate: Fri Dec 5 19:35:39 2025 +0100
Commit:     Niklas Haas <[email protected]>
CommitDate: Tue Dec 9 09:47:48 2025 +0000

    swscale/format: consolidate format information into a single struct
    
    I use a switch/case instead of an array because this is only needed for
    irregular formats, which are very sparse.
---
 libswscale/format.c | 240 ++++++++++++++++++++++++----------------------------
 1 file changed, 111 insertions(+), 129 deletions(-)

diff --git a/libswscale/format.c b/libswscale/format.c
index 013ff040b4..ff41503915 100644
--- a/libswscale/format.c
+++ b/libswscale/format.c
@@ -655,6 +655,107 @@ static int is_regular_fmt(enum AVPixelFormat fmt)
     return total_bits == step * 8;
 }
 
+typedef struct FmtInfo {
+    SwsReadWriteOp rw;
+    SwsSwizzleOp   swizzle;
+    SwsPackOp      pack;
+    int            shift;
+} FmtInfo;
+
+#define BITSTREAM_FMT(SWIZ, FRAC, PACKED, ...) (FmtInfo) {      \
+    .rw = { .elems = 1, .frac = FRAC, .packed = PACKED },       \
+    .swizzle = SWIZ,                                            \
+    __VA_ARGS__                                                 \
+}
+
+#define SUBPACKED_FMT(SWIZ, ...) (FmtInfo) {                    \
+    .rw = { .elems = 1, .packed = true },                       \
+    .swizzle = SWIZ,                                            \
+    .pack.pattern = {__VA_ARGS__},                              \
+}
+
+#define PACKED_FMT(SWIZ, N, ...) (FmtInfo) {                    \
+    .rw = { .elems = N, .packed = (N) > 1 },                    \
+    .swizzle = SWIZ,                                            \
+    __VA_ARGS__                                                 \
+}
+
+#define RGBA SWS_SWIZZLE(0, 1, 2, 3)
+#define BGRA SWS_SWIZZLE(2, 1, 0, 3)
+#define ARGB SWS_SWIZZLE(3, 0, 1, 2)
+#define ABGR SWS_SWIZZLE(3, 2, 1, 0)
+#define AVYU SWS_SWIZZLE(3, 2, 0, 1)
+#define VYUA SWS_SWIZZLE(2, 0, 1, 3)
+#define UYVA SWS_SWIZZLE(1, 0, 2, 3)
+#define VUYA BGRA
+
+static FmtInfo fmt_info_irregular(enum AVPixelFormat fmt)
+{
+    switch (fmt) {
+    /* Bitstream formats */
+    case AV_PIX_FMT_MONOWHITE:
+    case AV_PIX_FMT_MONOBLACK:
+        return BITSTREAM_FMT(RGBA, 3, false);
+    case AV_PIX_FMT_RGB4: return BITSTREAM_FMT(RGBA, 1, true, .pack = {{ 1, 2, 
1 }});
+    case AV_PIX_FMT_BGR4: return BITSTREAM_FMT(BGRA, 1, true, .pack = {{ 1, 2, 
1 }});
+
+    /* Sub-packed 8-bit aligned formats */
+    case AV_PIX_FMT_RGB4_BYTE:  return SUBPACKED_FMT(RGBA, 1, 2, 1);
+    case AV_PIX_FMT_BGR4_BYTE:  return SUBPACKED_FMT(BGRA, 1, 2, 1);
+    case AV_PIX_FMT_RGB8:       return SUBPACKED_FMT(RGBA, 3, 3, 2);
+    case AV_PIX_FMT_BGR8:       return SUBPACKED_FMT(BGRA, 2, 3, 3);
+
+    /* Sub-packed 16-bit aligned formats */
+    case AV_PIX_FMT_RGB565LE:
+    case AV_PIX_FMT_RGB565BE:
+        return SUBPACKED_FMT(RGBA, 5, 6, 5);
+    case AV_PIX_FMT_BGR565LE:
+    case AV_PIX_FMT_BGR565BE:
+        return SUBPACKED_FMT(BGRA, 5, 6, 5);
+    case AV_PIX_FMT_RGB555LE:
+    case AV_PIX_FMT_RGB555BE:
+        return SUBPACKED_FMT(RGBA, 5, 5, 5);
+    case AV_PIX_FMT_BGR555LE:
+    case AV_PIX_FMT_BGR555BE:
+        return SUBPACKED_FMT(BGRA, 5, 5, 5);
+    case AV_PIX_FMT_RGB444LE:
+    case AV_PIX_FMT_RGB444BE:
+        return SUBPACKED_FMT(RGBA, 4, 4, 4);
+    case AV_PIX_FMT_BGR444LE:
+    case AV_PIX_FMT_BGR444BE:
+        return SUBPACKED_FMT(BGRA, 4, 4, 4);
+
+    /* Sub-packed 32-bit aligned formats */
+    case AV_PIX_FMT_X2RGB10LE:
+    case AV_PIX_FMT_X2RGB10BE:
+        return SUBPACKED_FMT(ARGB, 2, 10, 10, 10);
+    case AV_PIX_FMT_X2BGR10LE:
+    case AV_PIX_FMT_X2BGR10BE:
+        return SUBPACKED_FMT(ABGR, 2, 10, 10, 10);
+    case AV_PIX_FMT_XV30LE:
+    case AV_PIX_FMT_XV30BE:
+        return SUBPACKED_FMT(AVYU, 2, 10, 10, 10);
+    case AV_PIX_FMT_V30XLE:
+    case AV_PIX_FMT_V30XBE:
+        return SUBPACKED_FMT(VYUA, 10, 10, 10, 2);
+
+    /* 3-component formats with extra padding */
+    case AV_PIX_FMT_RGB0:   return PACKED_FMT(RGBA, 4);
+    case AV_PIX_FMT_BGR0:   return PACKED_FMT(BGRA, 4);
+    case AV_PIX_FMT_0RGB:   return PACKED_FMT(ARGB, 4);
+    case AV_PIX_FMT_0BGR:   return PACKED_FMT(ABGR, 4);
+    case AV_PIX_FMT_VUYX:   return PACKED_FMT(VUYA, 4);
+    case AV_PIX_FMT_XV36LE:
+    case AV_PIX_FMT_XV36BE:
+        return PACKED_FMT(UYVA, 4, .shift = 4);
+    case AV_PIX_FMT_XV48LE:
+    case AV_PIX_FMT_XV48BE:
+        return PACKED_FMT(UYVA, 4);
+    }
+
+    return (FmtInfo) {0};
+}
+
 struct comp {
     int index;
     int plane;
@@ -692,41 +793,8 @@ static SwsSwizzleOp fmt_swizzle(enum AVPixelFormat fmt)
         return swiz;
     }
 
-    switch (fmt) {
-    case AV_PIX_FMT_0RGB:
-    case AV_PIX_FMT_X2RGB10LE:
-    case AV_PIX_FMT_X2RGB10BE:
-        return (SwsSwizzleOp) {{ .x = 3, 0, 1, 2 }};
-    case AV_PIX_FMT_BGR8:
-    case AV_PIX_FMT_BGR4:
-    case AV_PIX_FMT_BGR4_BYTE:
-    case AV_PIX_FMT_BGR565BE:
-    case AV_PIX_FMT_BGR565LE:
-    case AV_PIX_FMT_BGR555BE:
-    case AV_PIX_FMT_BGR555LE:
-    case AV_PIX_FMT_BGR444BE:
-    case AV_PIX_FMT_BGR444LE:
-    case AV_PIX_FMT_BGR0:
-    case AV_PIX_FMT_VUYX:
-        return (SwsSwizzleOp) {{ .x = 2, 1, 0, 3 }};
-    case AV_PIX_FMT_0BGR:
-    case AV_PIX_FMT_X2BGR10LE:
-    case AV_PIX_FMT_X2BGR10BE:
-        return (SwsSwizzleOp) {{ .x = 3, 2, 1, 0 }};
-    case AV_PIX_FMT_XV30BE:
-    case AV_PIX_FMT_XV30LE:
-        return (SwsSwizzleOp) {{ .x = 3, 2, 0, 1 }};
-    case AV_PIX_FMT_V30XBE:
-    case AV_PIX_FMT_V30XLE:
-        return (SwsSwizzleOp) {{ .x = 2, 0, 1, 3 }};
-    case AV_PIX_FMT_XV36BE:
-    case AV_PIX_FMT_XV36LE:
-    case AV_PIX_FMT_XV48BE:
-    case AV_PIX_FMT_XV48LE:
-        return (SwsSwizzleOp) {{ .x = 1, 0, 2, 3 }};
-    default:
-        return (SwsSwizzleOp) {{ .x = 0, 1, 2, 3 }};
-    }
+    /* This function is only ever called if fmt_read_write() already passes */
+    return fmt_info_irregular(fmt).swizzle;
 }
 
 static SwsSwizzleOp swizzle_inv(SwsSwizzleOp swiz) {
@@ -747,14 +815,8 @@ static int fmt_shift(enum AVPixelFormat fmt)
         return desc->comp[0].shift;
     }
 
-    switch (fmt) {
-    case AV_PIX_FMT_XV36BE:
-    case AV_PIX_FMT_XV36LE:
-        return 4;
-    default:
-        /* Sub-byte irregular formats are always handled by SWS_OP_(UN)PACK */
-        return 0;
-    }
+    /* This function is only ever called if fmt_read_write() already passes */
+    return fmt_info_irregular(fmt).shift;
 }
 
 /**
@@ -809,93 +871,13 @@ static int fmt_read_write(enum AVPixelFormat fmt, 
SwsReadWriteOp *rw_op,
         return 0;
     }
 
-    switch (fmt) {
-    /* Packed bitstream formats */
-    case AV_PIX_FMT_MONOWHITE:
-    case AV_PIX_FMT_MONOBLACK:
-        *pack_op = (SwsPackOp) {0};
-        *rw_op = (SwsReadWriteOp) {
-            .elems = 1,
-            .frac  = 3,
-        };
-        return 0;
-    case AV_PIX_FMT_RGB4:
-    case AV_PIX_FMT_BGR4:
-        *pack_op = (SwsPackOp) {{ 1, 2, 1 }};
-        *rw_op = (SwsReadWriteOp) {
-            .elems = 1,
-            .packed = true,
-            .frac  = 1,
-        };
-        return 0;
-    /* Packed 8-bit aligned formats */
-    case AV_PIX_FMT_RGB4_BYTE:
-    case AV_PIX_FMT_BGR4_BYTE:
-        *pack_op = (SwsPackOp) {{ 1, 2, 1 }};
-        *rw_op = (SwsReadWriteOp) { .elems = 1, .packed = true };
-        return 0;
-    case AV_PIX_FMT_BGR8:
-        *pack_op = (SwsPackOp) {{ 2, 3, 3 }};
-        *rw_op = (SwsReadWriteOp) { .elems = 1, .packed = true };
-        return 0;
-    case AV_PIX_FMT_RGB8:
-        *pack_op = (SwsPackOp) {{ 3, 3, 2 }};
-        *rw_op = (SwsReadWriteOp) { .elems = 1, .packed = true };
-        return 0;
-
-    /* Packed 16-bit aligned formats */
-    case AV_PIX_FMT_RGB565BE:
-    case AV_PIX_FMT_RGB565LE:
-    case AV_PIX_FMT_BGR565BE:
-    case AV_PIX_FMT_BGR565LE:
-        *pack_op = (SwsPackOp) {{ 5, 6, 5 }};
-        *rw_op = (SwsReadWriteOp) { .elems = 1, .packed = true };
-        return 0;
-    case AV_PIX_FMT_RGB555BE:
-    case AV_PIX_FMT_RGB555LE:
-    case AV_PIX_FMT_BGR555BE:
-    case AV_PIX_FMT_BGR555LE:
-        *pack_op = (SwsPackOp) {{ 5, 5, 5 }};
-        *rw_op = (SwsReadWriteOp) { .elems = 1, .packed = true };
-        return 0;
-    case AV_PIX_FMT_RGB444BE:
-    case AV_PIX_FMT_RGB444LE:
-    case AV_PIX_FMT_BGR444BE:
-    case AV_PIX_FMT_BGR444LE:
-        *pack_op = (SwsPackOp) {{ 4, 4, 4 }};
-        *rw_op = (SwsReadWriteOp) { .elems = 1, .packed = true };
-        return 0;
-    /* Packed 32-bit aligned 4:4:4 formats */
-    case AV_PIX_FMT_X2RGB10BE:
-    case AV_PIX_FMT_X2RGB10LE:
-    case AV_PIX_FMT_X2BGR10BE:
-    case AV_PIX_FMT_X2BGR10LE:
-    case AV_PIX_FMT_XV30BE:
-    case AV_PIX_FMT_XV30LE:
-        *pack_op = (SwsPackOp) {{ 2, 10, 10, 10 }};
-        *rw_op = (SwsReadWriteOp) { .elems = 1, .packed = true };
-        return 0;
-    case AV_PIX_FMT_V30XBE:
-    case AV_PIX_FMT_V30XLE:
-        *pack_op = (SwsPackOp) {{ 10, 10, 10, 2 }};
-        *rw_op = (SwsReadWriteOp) { .elems = 1, .packed = true };
-        return 0;
-    /* 3 component formats with one channel ignored */
-    case AV_PIX_FMT_RGB0:
-    case AV_PIX_FMT_BGR0:
-    case AV_PIX_FMT_0RGB:
-    case AV_PIX_FMT_0BGR:
-    case AV_PIX_FMT_XV36BE:
-    case AV_PIX_FMT_XV36LE:
-    case AV_PIX_FMT_XV48BE:
-    case AV_PIX_FMT_XV48LE:
-    case AV_PIX_FMT_VUYX:
-        *pack_op = (SwsPackOp) {0};
-        *rw_op = (SwsReadWriteOp) { .elems = 4, .packed = true };
-        return 0;
-    }
+    FmtInfo info = fmt_info_irregular(fmt);
+    if (!info.rw.elems)
+        return AVERROR(ENOTSUP);
 
-    return AVERROR(ENOTSUP);
+    *pack_op = info.pack;
+    *rw_op   = info.rw;
+    return 0;
 }
 
 static SwsPixelType get_packed_type(SwsPackOp pack)

_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to