[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