diff mbox series

[FFmpeg-devel,v1,3/9] swscale: Add swscale input support for P012

Message ID 20200619015248.21873-3-fei.w.wang@intel.com
State New
Headers show
Series [FFmpeg-devel,v1,1/9] lavu/pix_fmt: add P012 pixel format
Related show

Checks

Context Check Description
andriy/default pending
andriy/make success Make finished
andriy/make_fate success Make fate finished

Commit Message

Wang, Fei W June 19, 2020, 1:52 a.m. UTC
Signed-off-by: Fei Wang <fei.w.wang@intel.com>
---
 libswscale/input.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++
 libswscale/utils.c |  1 +
 2 files changed, 53 insertions(+)
diff mbox series

Patch

diff --git a/libswscale/input.c b/libswscale/input.c
index 0bd1aa7bc9..b0a7d21e60 100644
--- a/libswscale/input.c
+++ b/libswscale/input.c
@@ -739,6 +739,46 @@  static void p010BEToUV_c(uint8_t *dstU, uint8_t *dstV,
     }
 }
 
+static void p012LEToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1,
+                        const uint8_t *unused2, int width, uint32_t *unused)
+{
+    int i;
+    for (i = 0; i < width; i++) {
+        AV_WN16(dst + i * 2, AV_RL16(src + i * 2) >> 4);
+    }
+}
+
+static void p012BEToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1,
+                        const uint8_t *unused2, int width, uint32_t *unused)
+{
+    int i;
+    for (i = 0; i < width; i++) {
+        AV_WN16(dst + i * 2, AV_RB16(src + i * 2) >> 4);
+    }
+}
+
+static void p012LEToUV_c(uint8_t *dstU, uint8_t *dstV,
+                       const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
+                       int width, uint32_t *unused)
+{
+    int i;
+    for (i = 0; i < width; i++) {
+        AV_WN16(dstU + i * 2, AV_RL16(src1 + i * 4 + 0) >> 4);
+        AV_WN16(dstV + i * 2, AV_RL16(src1 + i * 4 + 2) >> 4);
+    }
+}
+
+static void p012BEToUV_c(uint8_t *dstU, uint8_t *dstV,
+                       const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
+                       int width, uint32_t *unused)
+{
+    int i;
+    for (i = 0; i < width; i++) {
+        AV_WN16(dstU + i * 2, AV_RB16(src1 + i * 4 + 0) >> 4);
+        AV_WN16(dstV + i * 2, AV_RB16(src1 + i * 4 + 2) >> 4);
+    }
+}
+
 static void p016LEToUV_c(uint8_t *dstU, uint8_t *dstV,
                        const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
                        int width, uint32_t *unused)
@@ -1249,6 +1289,12 @@  av_cold void ff_sws_init_input_funcs(SwsContext *c)
     case AV_PIX_FMT_P010BE:
         c->chrToYV12 = p010BEToUV_c;
         break;
+    case AV_PIX_FMT_P012LE:
+        c->chrToYV12 = p012LEToUV_c;
+        break;
+    case AV_PIX_FMT_P012BE:
+        c->chrToYV12 = p012BEToUV_c;
+        break;
     case AV_PIX_FMT_P016LE:
         c->chrToYV12 = p016LEToUV_c;
         break;
@@ -1692,6 +1738,12 @@  av_cold void ff_sws_init_input_funcs(SwsContext *c)
     case AV_PIX_FMT_P010BE:
         c->lumToYV12 = p010BEToY_c;
         break;
+    case AV_PIX_FMT_P012LE:
+        c->lumToYV12 = p012LEToY_c;
+        break;
+    case AV_PIX_FMT_P012BE:
+        c->lumToYV12 = p012BEToY_c;
+        break;
     case AV_PIX_FMT_GRAYF32LE:
 #if HAVE_BIGENDIAN
         c->lumToYV12 = grayf32ToY16_bswap_c;
diff --git a/libswscale/utils.c b/libswscale/utils.c
index dcd1dbaa76..dd2e3f6a75 100644
--- a/libswscale/utils.c
+++ b/libswscale/utils.c
@@ -272,6 +272,7 @@  static const FormatEntry format_entries[] = {
     [AV_PIX_FMT_NV42]        = { 1, 1 },
     [AV_PIX_FMT_Y210LE]      = { 1, 0 },
     [AV_PIX_FMT_X2RGB10LE]   = { 1, 1 },
+    [AV_PIX_FMT_P012LE]      = { 1, 0 },
 };
 
 int sws_isSupportedInput(enum AVPixelFormat pix_fmt)