[FFmpeg-cvslog] swscale: support AV_PIX_FMT_YA16 as input

Vittorio Giovara git at videolan.org
Mon Aug 4 22:32:58 CEST 2014


ffmpeg | branch: master | Vittorio Giovara <vittorio.giovara at gmail.com> | Sun Jul 20 01:05:35 2014 -0400| [f84a1b597c29dc035b8d5529ef88c2d7ff057820] | committer: Vittorio Giovara

swscale: support AV_PIX_FMT_YA16 as input

Based on a long debug session with Kostya.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=f84a1b597c29dc035b8d5529ef88c2d7ff057820
---

 libswscale/input.c            |   40 ++++++++++++++++++++++++++++++++++++++++
 libswscale/swscale-test.c     |    4 +++-
 libswscale/swscale_internal.h |    4 +++-
 libswscale/swscale_unscaled.c |    1 +
 libswscale/utils.c            |    2 ++
 5 files changed, 49 insertions(+), 2 deletions(-)

diff --git a/libswscale/input.c b/libswscale/input.c
index 1ffdfe5..f583b3f 100644
--- a/libswscale/input.c
+++ b/libswscale/input.c
@@ -419,6 +419,38 @@ static void bswap16UV_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *_src1,
     }
 }
 
+static void read_ya16le_gray_c(uint8_t *dst, const uint8_t *src, int width,
+                               uint32_t *unused)
+{
+    int i;
+    for (i = 0; i < width; i++)
+        AV_WN16(dst + i * 2, AV_RL16(src + i * 4));
+}
+
+static void read_ya16le_alpha_c(uint8_t *dst, const uint8_t *src, int width,
+                                uint32_t *unused)
+{
+    int i;
+    for (i = 0; i < width; i++)
+        AV_WN16(dst + i * 2, AV_RL16(src + i * 4 + 2));
+}
+
+static void read_ya16be_gray_c(uint8_t *dst, const uint8_t *src, int width,
+                               uint32_t *unused)
+{
+    int i;
+    for (i = 0; i < width; i++)
+        AV_WN16(dst + i * 2, AV_RB16(src + i * 4));
+}
+
+static void read_ya16be_alpha_c(uint8_t *dst, const uint8_t *src, int width,
+                                uint32_t *unused)
+{
+    int i;
+    for (i = 0; i < width; i++)
+        AV_WN16(dst + i * 2, AV_RB16(src + i * 4 + 2));
+}
+
 /* This is almost identical to the previous, end exists only because
  * yuy2ToY/UV)(dst, src + 1, ...) would have 100% unaligned accesses. */
 static void uyvyToY_c(uint8_t *dst, const uint8_t *src, int width,
@@ -987,6 +1019,14 @@ av_cold void ff_sws_init_input_funcs(SwsContext *c)
         c->alpToYV12 = bswap16Y_c;
         break;
 #endif
+    case AV_PIX_FMT_YA16LE:
+        c->lumToYV12 = read_ya16le_gray_c;
+        c->alpToYV12 = read_ya16le_alpha_c;
+        break;
+    case AV_PIX_FMT_YA16BE:
+        c->lumToYV12 = read_ya16be_gray_c;
+        c->alpToYV12 = read_ya16be_alpha_c;
+        break;
     case AV_PIX_FMT_YUYV422:
     case AV_PIX_FMT_YVYU422:
     case AV_PIX_FMT_YA8:
diff --git a/libswscale/swscale-test.c b/libswscale/swscale-test.c
index 7cf2dc0..8063519 100644
--- a/libswscale/swscale-test.c
+++ b/libswscale/swscale-test.c
@@ -39,7 +39,9 @@
     ((x) == AV_PIX_FMT_GRAY8       ||     \
      (x) == AV_PIX_FMT_YA8         ||     \
      (x) == AV_PIX_FMT_GRAY16BE    ||     \
-     (x) == AV_PIX_FMT_GRAY16LE)
+     (x) == AV_PIX_FMT_GRAY16LE    ||     \
+     (x) == AV_PIX_FMT_YA16BE      ||     \
+     (x) == AV_PIX_FMT_YA16LE)
 #define hasChroma(x)                   \
     (!(isGray(x)                ||     \
        (x) == AV_PIX_FMT_MONOBLACK ||     \
diff --git a/libswscale/swscale_internal.h b/libswscale/swscale_internal.h
index 4aef961..a0daa07 100644
--- a/libswscale/swscale_internal.h
+++ b/libswscale/swscale_internal.h
@@ -608,7 +608,9 @@ static av_always_inline int isRGB(enum AVPixelFormat pix_fmt)
     ((x) == AV_PIX_FMT_GRAY8       ||  \
      (x) == AV_PIX_FMT_YA8         ||  \
      (x) == AV_PIX_FMT_GRAY16BE    ||  \
-     (x) == AV_PIX_FMT_GRAY16LE)
+     (x) == AV_PIX_FMT_GRAY16LE    ||  \
+     (x) == AV_PIX_FMT_YA16BE      ||  \
+     (x) == AV_PIX_FMT_YA16LE)
 #endif
 
 #define isRGBinInt(x)                  \
diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c
index 21762a7..ffc813e 100644
--- a/libswscale/swscale_unscaled.c
+++ b/libswscale/swscale_unscaled.c
@@ -1053,6 +1053,7 @@ void ff_get_unscaled_swscale(SwsContext *c)
         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_GRAY16) ||
+        IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YA16)   ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_RGB444) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_RGB48)  ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_RGB555) ||
diff --git a/libswscale/utils.c b/libswscale/utils.c
index ae121f8..3a8531d 100644
--- a/libswscale/utils.c
+++ b/libswscale/utils.c
@@ -155,6 +155,8 @@ static const FormatEntry format_entries[AV_PIX_FMT_NB] = {
     [AV_PIX_FMT_BGR444LE]    = { 1, 1 },
     [AV_PIX_FMT_BGR444BE]    = { 1, 1 },
     [AV_PIX_FMT_YA8]         = { 1, 0 },
+    [AV_PIX_FMT_YA16BE]      = { 1, 0 },
+    [AV_PIX_FMT_YA16LE]      = { 1, 0 },
     [AV_PIX_FMT_BGR48BE]     = { 1, 1 },
     [AV_PIX_FMT_BGR48LE]     = { 1, 1 },
     [AV_PIX_FMT_BGRA64BE]    = { 0, 0, 1 },



More information about the ffmpeg-cvslog mailing list