[XviD-devel] Improved YV12 -> YUYV color conversion

carlo.bramix carlo.bramix at libero.it
Fri Jun 2 23:27:00 CEST 2006


Hello,
I did some changes to "colorspace_yuyv_mmx.asm".
I rewrote the YV12_TO_YUYV macro and now on my old PC I'm getting smoother playback, with lot less frameskips.
The YUYV and UYVY routines are coded separately because the YV12->UYVY conversion is the same one used in previous version.
Perhaps it could be done for it too, but my videocard doesn't support the UYVY colorspace (only YUYV works) so I couldn't test it.

Sincerely,

Carlo Bramini.


diff -urN xvidcore-1.1.0/src/image/x86_asm/colorspace_yuyv_mmx.asm xvidcore-1.2.0/src/image/x86_asm/colorspace_yuyv_mmx.asm
--- xvidcore-1.1.0/src/image/x86_asm/colorspace_yuyv_mmx.asm	Fri Dec 30 13:34:58 2005
+++ xvidcore-1.2.0/src/image/x86_asm/colorspace_yuyv_mmx.asm	Fri Jun  2 21:01:18 2006
@@ -172,9 +172,7 @@
 ;-----------------------------------------------------------------------------
 ; YV12_TO_YUYV( TYPE )
 ;
-; TYPE  0=yuyv, 1=uyvy
-;
-; bytes=2, pixels = 8, vpixels=2
+; bytes=2, pixels = 16, vpixels=2
 ;-----------------------------------------------------------------------------
 
 %macro YV12_TO_YUYV_INIT        2
@@ -182,24 +180,52 @@
 
 
 %macro YV12_TO_YUYV             2
-  movd mm4, [ebx]               ; [    |uuuu]
-  movd mm5, [ecx]               ; [    |vvvv]
-  movq mm0, [esi]               ; [yyyy|yyyy] ; y row 0
-  movq mm1, [esi+eax]           ; [yyyy|yyyy] ; y row 1
-  punpcklbw mm4, mm5            ; [vuvu|vuvu] ; uv row 0
-
-%if %1 == 0     ; YUYV
+  movq mm6, [ebx]               ; [uuuu|uuuu]
+  movq mm2, [ecx]               ; [vvvv|vvvv]
+  movq mm0, [esi]               ; [yyyy|yyyy] ; y[0..7] row 0
+  movq mm1, [esi+eax]           ; [yyyy|yyyy] ; y[0..7] row 1
+  movq mm7, mm6
+  punpcklbw mm6, mm2            ; [vuvu|vuvu] ; uv[0..3]
+  punpckhbw mm7, mm2            ; [vuvu|vuvu] ; uv[4..7]
   movq mm2, mm0
   movq mm3, mm1
-  punpcklbw mm0, mm4            ; [vyuy|vyuy] ; y row 0 + 0
-  punpckhbw mm2, mm4            ; [vyuy|vyuy] ; y row 0 + 8
-  punpcklbw mm1, mm4            ; [vyuy|vyuy] ; y row 1 + 0
-  punpckhbw mm3, mm4            ; [vyuy|vyuy] ; y row 1 + 8
+  movq mm4, [esi+8]             ; [yyyy|yyyy] ; y[8..15] row 0
+  movq mm5, [esi+eax+8]         ; [yyyy|yyyy] ; y[8..15] row 1
+  punpcklbw mm0, mm6            ; [vyuy|vyuy] ; y row 0 + 0
+  punpckhbw mm2, mm6            ; [vyuy|vyuy] ; y row 0 + 8
+  punpcklbw mm1, mm6            ; [vyuy|vyuy] ; y row 1 + 0
+  punpckhbw mm3, mm6            ; [vyuy|vyuy] ; y row 1 + 8
   movq [edi], mm0
   movq [edi+8], mm2
   movq [edi+edx], mm1
   movq [edi+edx+8], mm3
-%else           ; UYVY
+  movq mm0, mm4
+  movq mm2, mm5
+  punpcklbw mm0, mm7            ; [vyuy|vyuy] ; y row 0 + 16
+  punpckhbw mm4, mm7            ; [vyuy|vyuy] ; y row 0 + 24
+  punpcklbw mm2, mm7            ; [vyuy|vyuy] ; y row 1 + 16
+  punpckhbw mm5, mm7            ; [vyuy|vyuy] ; y row 1 + 24
+  movq [edi+16], mm0
+  movq [edi+24], mm4
+  movq [edi+edx+16], mm2
+  movq [edi+edx+24], mm5
+%endmacro
+
+;-----------------------------------------------------------------------------

+; YV12_TO_UYVY( TYPE )
+;
+; bytes=2, pixels = 8, vpixels=2
+;-----------------------------------------------------------------------------
+
+%macro YV12_TO_UYVY_INIT        2
+%endmacro
+
+%macro YV12_TO_UYVY             2
+  movd mm4, [ebx]               ; [    |uuuu]
+  movd mm5, [ecx]               ; [    |vvvv]
+  movq mm0, [esi]               ; [yyyy|yyyy] ; y row 0
+  movq mm1, [esi+eax]           ; [yyyy|yyyy] ; y row 1
+  punpcklbw mm4, mm5            ; [vuvu|vuvu] ; uv row 0
   movq mm5, mm4
   movq mm6, mm4
   movq mm7, mm4
@@ -211,7 +237,6 @@
   movq [edi+8], mm5
   movq [edi+edx], mm6
   movq [edi+edx+8], mm7
-%endif
 %endmacro
 
 ;------------------------------------------------------------------------------
@@ -324,8 +349,8 @@
 
 ; output
 
-MAKE_COLORSPACE  yv12_to_yuyv_mmx,0,    2,8,2,  YV12_TO_YUYV, 0, -1
-MAKE_COLORSPACE  yv12_to_uyvy_mmx,0,    2,8,2,  YV12_TO_YUYV, 1, -1
+MAKE_COLORSPACE  yv12_to_yuyv_mmx,0,    2,16,2,  YV12_TO_YUYV, 0, -1
+MAKE_COLORSPACE  yv12_to_uyvy_mmx,0,    2,8,2,  YV12_TO_UYVY, 1, -1
 
 MAKE_COLORSPACE  yv12_to_yuyvi_mmx,0,   2,8,4,  YV12_TO_YUYVI, 0, -1
 MAKE_COLORSPACE  yv12_to_uyvyi_mmx,0,   2,8,4,  YV12_TO_YUYVI, 1, -1




More information about the XviD-devel mailing list