swscale/x86/rgb2rgb_template: add mmx/sse2/avx optimized deinterleaveBytes
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 19 Nov 2013 13:57:52 +0000 (14:57 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 19 Nov 2013 14:13:48 +0000 (15:13 +0100)
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libswscale/x86/rgb2rgb_template.c

index 0c2c728..00704f4 100644 (file)
@@ -1924,6 +1924,32 @@ static void RENAME(interleaveBytes)(const uint8_t *src1, const uint8_t *src2, ui
             ::: "memory"
             );
 }
+#endif /* !COMPILE_TEMPLATE_AMD3DNOW && !COMPILE_TEMPLATE_AVX*/
+
+#if !COMPILE_TEMPLATE_AMD3DNOW && (ARCH_X86_32 || COMPILE_TEMPLATE_SSE2) && COMPILE_TEMPLATE_MMXEXT == COMPILE_TEMPLATE_SSE2
+void RENAME(ff_nv12ToUV)(uint8_t *dstU, uint8_t *dstV,
+                                const uint8_t *unused0,
+                                const uint8_t *src1,
+                                const uint8_t *src2,
+                                int w, uint32_t *unused);
+static void RENAME(deinterleaveBytes)(const uint8_t *src, uint8_t *dst1, uint8_t *dst2,
+                                      int width, int height, int srcStride,
+                                      int dst1Stride, int dst2Stride)
+{
+    int h;
+
+    for (h=0; h < height; h++) {
+        RENAME(ff_nv12ToUV)(dst1, dst2, NULL, src, NULL, width, NULL);
+        src += srcStride;
+        dst1 += dst1Stride;
+        dst2 += dst2Stride;
+    }
+    __asm__(
+            EMMS"       \n\t"
+            SFENCE"     \n\t"
+            ::: "memory"
+            );
+}
 #endif /* !COMPILE_TEMPLATE_AMD3DNOW */
 
 #if !COMPILE_TEMPLATE_SSE2
@@ -2497,4 +2523,7 @@ static av_cold void RENAME(rgb2rgb_init)(void)
 #if !COMPILE_TEMPLATE_AMD3DNOW && !COMPILE_TEMPLATE_AVX
     interleaveBytes    = RENAME(interleaveBytes);
 #endif /* !COMPILE_TEMPLATE_AMD3DNOW  && !COMPILE_TEMPLATE_AVX*/
+#if !COMPILE_TEMPLATE_AMD3DNOW && (ARCH_X86_32 || COMPILE_TEMPLATE_SSE2) && COMPILE_TEMPLATE_MMXEXT == COMPILE_TEMPLATE_SSE2
+    deinterleaveBytes  = RENAME(deinterleaveBytes);
+#endif
 }