[SCM] libav/experimental: Add support for nv12/nv21 input.

siretart at users.alioth.debian.org siretart at users.alioth.debian.org
Sun Jun 30 16:55:27 UTC 2013


The following commit has been merged in the experimental branch:
commit f415be684dda3958332d19e0854c080378eef4c2
Author: Ramiro Polla <ramiro.polla at gmail.com>
Date:   Thu Dec 3 18:18:13 2009 +0000

    Add support for nv12/nv21 input.
    
    Originally committed as revision 29974 to svn://svn.mplayerhq.hu/mplayer/trunk/libswscale

diff --git a/libswscale/swscale.c b/libswscale/swscale.c
index fb50c8b..222c0c0 100644
--- a/libswscale/swscale.c
+++ b/libswscale/swscale.c
@@ -135,6 +135,8 @@ const char * swscale_license(void)
         || (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     \
diff --git a/libswscale/swscale_template.c b/libswscale/swscale_template.c
index 036766a..9ad7d45 100644
--- a/libswscale/swscale_template.c
+++ b/libswscale/swscale_template.c
@@ -1784,6 +1784,54 @@ static inline void RENAME(BEToUV)(uint8_t *dstU, uint8_t *dstV, const uint8_t *s
 #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 @@ static void RENAME(sws_init_swScale)(SwsContext *c)
     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     :

-- 
Libav/FFmpeg packaging



More information about the pkg-multimedia-commits mailing list