changeset 29932:7c5fd4b35889

Add support for nv12/nv21 input.
author ramiro
date Thu, 03 Dec 2009 18:18:13 +0000
parents aa70aba2bbcb
children 95a14f94aa15
files libswscale/swscale.c libswscale/swscale_template.c
diffstat 2 files changed, 52 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/libswscale/swscale.c	Tue Dec 01 05:02:26 2009 +0000
+++ b/libswscale/swscale.c	Thu Dec 03 18:18:13 2009 +0000
@@ -135,6 +135,8 @@
         || (x)==PIX_FMT_GRAY8       \
         || (x)==PIX_FMT_YUV410P     \
         || (x)==PIX_FMT_YUV440P     \
+        || (x)==PIX_FMT_NV12        \
+        || (x)==PIX_FMT_NV21        \
         || (x)==PIX_FMT_GRAY16BE    \
         || (x)==PIX_FMT_GRAY16LE    \
         || (x)==PIX_FMT_YUV444P     \
--- a/libswscale/swscale_template.c	Tue Dec 01 05:02:26 2009 +0000
+++ b/libswscale/swscale_template.c	Thu Dec 03 18:18:13 2009 +0000
@@ -1784,6 +1784,54 @@
 #endif
 }
 
+static inline void RENAME(nvXXtoUV)(uint8_t *dst1, uint8_t *dst2,
+                                    const uint8_t *src, long width)
+{
+#if COMPILE_TEMPLATE_MMX
+    __asm__ volatile(
+        "movq "MANGLE(bm01010101)", %%mm4           \n\t"
+        "mov                    %0, %%"REG_a"       \n\t"
+        "1:                                         \n\t"
+        "movq    (%1, %%"REG_a",2), %%mm0           \n\t"
+        "movq   8(%1, %%"REG_a",2), %%mm1           \n\t"
+        "movq                %%mm0, %%mm2           \n\t"
+        "movq                %%mm1, %%mm3           \n\t"
+        "pand                %%mm4, %%mm0           \n\t"
+        "pand                %%mm4, %%mm1           \n\t"
+        "psrlw                  $8, %%mm2           \n\t"
+        "psrlw                  $8, %%mm3           \n\t"
+        "packuswb            %%mm1, %%mm0           \n\t"
+        "packuswb            %%mm3, %%mm2           \n\t"
+        "movq                %%mm0, (%2, %%"REG_a") \n\t"
+        "movq                %%mm2, (%3, %%"REG_a") \n\t"
+        "add                    $8, %%"REG_a"       \n\t"
+        " js                    1b                  \n\t"
+        : : "g" ((x86_reg)-width), "r" (src+width*2), "r" (dst1+width), "r" (dst2+width)
+        : "%"REG_a
+    );
+#else
+    int i;
+    for (i = 0; i < width; i++) {
+        dst1[i] = src[2*i+0];
+        dst2[i] = src[2*i+1];
+    }
+#endif
+}
+
+static inline void nv12ToUV(uint8_t *dstU, uint8_t *dstV,
+                            const uint8_t *src1, const uint8_t *src2,
+                            long width, uint32_t *unused)
+{
+    RENAME(nvXXtoUV)(dstU, dstV, src1, width);
+}
+
+static inline void nv21ToUV(uint8_t *dstU, uint8_t *dstV,
+                            const uint8_t *src1, const uint8_t *src2,
+                            long width, uint32_t *unused)
+{
+    RENAME(nvXXtoUV)(dstV, dstU, src1, width);
+}
+
 #if COMPILE_TEMPLATE_MMX
 static inline void RENAME(bgr24ToY_mmx)(uint8_t *dst, const uint8_t *src, long width, enum PixelFormat srcFormat)
 {
@@ -2914,6 +2962,8 @@
     switch(srcFormat) {
         case PIX_FMT_YUYV422  : c->hcscale_internal = RENAME(yuy2ToUV); break;
         case PIX_FMT_UYVY422  : c->hcscale_internal = RENAME(uyvyToUV); break;
+        case PIX_FMT_NV12     : c->hcscale_internal = nv12ToUV; break;
+        case PIX_FMT_NV21     : c->hcscale_internal = nv21ToUV; break;
         case PIX_FMT_RGB8     :
         case PIX_FMT_BGR8     :
         case PIX_FMT_PAL8     :