summaryrefslogtreecommitdiffstats
path: root/libswscale
diff options
context:
space:
mode:
authorramiro <ramiro@b3059339-0415-0410-9bf9-f77b7e298cf2>2009-12-03 18:18:13 +0000
committerramiro <ramiro@b3059339-0415-0410-9bf9-f77b7e298cf2>2009-12-03 18:18:13 +0000
commitbf29785d5a617072a72deb43579d4017dffe8e4d (patch)
treec87ab14097364003d7b60ba3a076f598412a6184 /libswscale
parentcb8ae3fe63a2d58cf29d23dfb733781563186b08 (diff)
downloadmpv-bf29785d5a617072a72deb43579d4017dffe8e4d.tar.bz2
mpv-bf29785d5a617072a72deb43579d4017dffe8e4d.tar.xz
Add support for nv12/nv21 input.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@29974 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libswscale')
-rw-r--r--libswscale/swscale.c2
-rw-r--r--libswscale/swscale_template.c50
2 files changed, 52 insertions, 0 deletions
diff --git a/libswscale/swscale.c b/libswscale/swscale.c
index fb50c8bbe7..222c0c0136 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 036766afef..9ad7d45bad 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 :