diff --git a/libswscale/input.c b/libswscale/input.c
index 9f2ef72894f7b7f3b5ae21a3fc8bee03ff304516..d8560a1f2b4c04f4c032b12bb73560064dbbe8b6 100644
--- a/libswscale/input.c
+++ b/libswscale/input.c
@@ -1120,6 +1120,7 @@ av_cold void ff_sws_init_input_funcs(SwsContext *c)
     case AV_PIX_FMT_YUV420P16LE:
     case AV_PIX_FMT_YUV422P16LE:
     case AV_PIX_FMT_YUV444P16LE:
+    case AV_PIX_FMT_GRAY12LE:
     case AV_PIX_FMT_GRAY16LE:
         c->lumToYV12 = bswap16Y_c;
         break;
@@ -1148,6 +1149,7 @@ av_cold void ff_sws_init_input_funcs(SwsContext *c)
     case AV_PIX_FMT_YUV420P16BE:
     case AV_PIX_FMT_YUV422P16BE:
     case AV_PIX_FMT_YUV444P16BE:
+    case AV_PIX_FMT_GRAY12BE:
     case AV_PIX_FMT_GRAY16BE:
         c->lumToYV12 = bswap16Y_c;
         break;
diff --git a/libswscale/swscale_internal.h b/libswscale/swscale_internal.h
index abcdb9f41b8fb77a132a0084c5031adc31c40107..e7a6eedd22b05cb1d0c75f3f8c139b9390299643 100644
--- a/libswscale/swscale_internal.h
+++ b/libswscale/swscale_internal.h
@@ -603,6 +603,8 @@ static av_always_inline int isRGB(enum AVPixelFormat pix_fmt)
 #define isGray(x)                      \
     ((x) == AV_PIX_FMT_GRAY8       ||  \
      (x) == AV_PIX_FMT_YA8         ||  \
+     (x) == AV_PIX_FMT_GRAY12BE    ||  \
+     (x) == AV_PIX_FMT_GRAY12LE    ||  \
      (x) == AV_PIX_FMT_GRAY16BE    ||  \
      (x) == AV_PIX_FMT_GRAY16LE    ||  \
      (x) == AV_PIX_FMT_YA16BE      ||  \
diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c
index 24c65ccd22d5b2350d351a9823ebb7dcd253c88c..d3863bba1089e9ed17d886a6a83bb867fff51fa1 100644
--- a/libswscale/swscale_unscaled.c
+++ b/libswscale/swscale_unscaled.c
@@ -1097,6 +1097,7 @@ void ff_get_unscaled_swscale(SwsContext *c)
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_BGR555) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_BGR565) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_BGRA64) ||
+        IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GRAY12) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GRAY16) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YA16)   ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GBRAP12)||
diff --git a/libswscale/utils.c b/libswscale/utils.c
index 1c3bbb3305dde004fe06265851e5aa9a89b0d859..6034b704658d14b9e7967eb5493f1ac2790f67fe 100644
--- a/libswscale/utils.c
+++ b/libswscale/utils.c
@@ -107,6 +107,8 @@ static const FormatEntry format_entries[AV_PIX_FMT_NB] = {
     [AV_PIX_FMT_RGBA]        = { 1, 1 },
     [AV_PIX_FMT_ABGR]        = { 1, 1 },
     [AV_PIX_FMT_BGRA]        = { 1, 1 },
+    [AV_PIX_FMT_GRAY12BE]    = { 1, 1 },
+    [AV_PIX_FMT_GRAY12LE]    = { 1, 1 },
     [AV_PIX_FMT_GRAY16BE]    = { 1, 1 },
     [AV_PIX_FMT_GRAY16LE]    = { 1, 1 },
     [AV_PIX_FMT_YUV440P]     = { 1, 1 },
diff --git a/tests/ref/fate/filter-pixdesc-gray12be b/tests/ref/fate/filter-pixdesc-gray12be
new file mode 100644
index 0000000000000000000000000000000000000000..de997347d5c28f697aececfe73e92ee556385f6e
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-gray12be
@@ -0,0 +1 @@
+pixdesc-gray12be    bff4fa5910e99725b275fb70270b0cf9
diff --git a/tests/ref/fate/filter-pixdesc-gray12le b/tests/ref/fate/filter-pixdesc-gray12le
new file mode 100644
index 0000000000000000000000000000000000000000..c2c5f68684c32d24571a61e802a28cac334023bc
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-gray12le
@@ -0,0 +1 @@
+pixdesc-gray12le    d0900fab4e757ef17fff8c1ffd0b3816
diff --git a/tests/ref/fate/filter-pixfmts-copy b/tests/ref/fate/filter-pixfmts-copy
index d9a5166e117409603253ffa873efbfbb373f577e..bd16f110757c40894dc3a03b3a3d944362bf9a1c 100644
--- a/tests/ref/fate/filter-pixfmts-copy
+++ b/tests/ref/fate/filter-pixfmts-copy
@@ -23,6 +23,8 @@ gbrp12le            654861b1837d312569395f598da1a2a1
 gbrp9be             cbe1bf8ead497a92362a749bd4b0a57e
 gbrp9le             f88c68df5d699a4a7f1b0152df9f25fe
 gray                8c941e9bbf6da5336384c57f15a4a454
+gray12be            aecffce8ea67ab93527dc74c1a523454
+gray12le            eac4b15c8686f04ea73751294f40b8e0
 gray16be            43bda75c197b0d59a9b87ee941553644
 gray16le            a4ea1369ef1efff0e1341a1dc42dbfdf
 monob               e13b2cbfb93d3ed6fdc1f256662ea959
diff --git a/tests/ref/fate/filter-pixfmts-null b/tests/ref/fate/filter-pixfmts-null
index d9a5166e117409603253ffa873efbfbb373f577e..bd16f110757c40894dc3a03b3a3d944362bf9a1c 100644
--- a/tests/ref/fate/filter-pixfmts-null
+++ b/tests/ref/fate/filter-pixfmts-null
@@ -23,6 +23,8 @@ gbrp12le            654861b1837d312569395f598da1a2a1
 gbrp9be             cbe1bf8ead497a92362a749bd4b0a57e
 gbrp9le             f88c68df5d699a4a7f1b0152df9f25fe
 gray                8c941e9bbf6da5336384c57f15a4a454
+gray12be            aecffce8ea67ab93527dc74c1a523454
+gray12le            eac4b15c8686f04ea73751294f40b8e0
 gray16be            43bda75c197b0d59a9b87ee941553644
 gray16le            a4ea1369ef1efff0e1341a1dc42dbfdf
 monob               e13b2cbfb93d3ed6fdc1f256662ea959
diff --git a/tests/ref/fate/filter-pixfmts-scale b/tests/ref/fate/filter-pixfmts-scale
index 2a60f72f8bd755faa0372a86d1d2298048201df9..e1737f0b206e7fd2597151a5e4ab6838b93dc58f 100644
--- a/tests/ref/fate/filter-pixfmts-scale
+++ b/tests/ref/fate/filter-pixfmts-scale
@@ -23,6 +23,8 @@ gbrp12le            735061c07442657580577d1cede3a636
 gbrp9be             01c837e1def99abec205b80d21b68bf0
 gbrp9le             dd982d59c3d71c3b201f2d9363d8952c
 gray                4c571fb634a75f177b64cee168fbf3a1
+gray12be            d237d56e08482038ebc5f3943d6ec8d5
+gray12le            dcd15a0ed89bd019cc367b552fc9b1c0
 gray16be            9b57ff7d2090b47e4427bee79dba0d9e
 gray16le            17d2c00c6ffe346dfb632d927ebbf30a
 monob               e28955319a03f1850c467f8fe65b2a22
diff --git a/tests/ref/fate/filter-pixfmts-vflip b/tests/ref/fate/filter-pixfmts-vflip
index 93a292d6bc5317e80c2ca74d6823de8d4772787c..11a48c7c71506f98cb9997fe082cb8774726f70d 100644
--- a/tests/ref/fate/filter-pixfmts-vflip
+++ b/tests/ref/fate/filter-pixfmts-vflip
@@ -23,6 +23,8 @@ gbrp12le            b7b27715bc9054a93ba81f110cf42ee5
 gbrp9be             2ae8f0d3b079d6550a2b1d4a7c4a6e4b
 gbrp9le             c62df0f386c957cc9cacb3c8014542eb
 gray                684ba667effbbf5983f46a9bea4afaae
+gray12be            e33397832d19ec628f3e887e0a16ccc7
+gray12le            c8a8d7267e2595a0c4ce5d582bea23a1
 gray16be            112077b2f1c85cbd44907ed271901b28
 gray16le            1d7be18af19f4ff847ff4bc7c610c8cc
 monob               0e4946183903fea3ef246c16385e236c