diff libvo/vesa_lvo.c @ 3019:64ce4a515a78

Bad attempt of YV12 direct support
author nick
date Tue, 20 Nov 2001 10:00:58 +0000
parents fb792e58aac5
children e5ebde3ebdd6
line wrap: on
line diff
--- a/libvo/vesa_lvo.c	Tue Nov 20 09:26:44 2001 +0000
+++ b/libvo/vesa_lvo.c	Tue Nov 20 10:00:58 2001 +0000
@@ -144,6 +144,49 @@
 	if(lvo_handler != -1) close(lvo_handler);
 }
 
+static void
+CopyData420(
+   unsigned char *src1,
+   unsigned char *src2,
+   unsigned char *src3,
+   unsigned char *dst1,
+   unsigned char *dst2,
+   unsigned char *dst3,
+   int srcPitch,
+   int srcPitch2,
+   int dstPitch,
+   int h,
+   int w
+){
+   int count;
+
+       count = h;
+       while(count--) {
+	   memcpy(dst1, src1, w);
+	   src1 += srcPitch;
+	   dst1 += dstPitch;
+       }
+
+   w >>= 1;
+   h >>= 1;
+   dstPitch >>= 1;
+
+       count = h;
+       while(count--) {
+	   memcpy(dst2, src2, w);
+	   src2 += srcPitch2;
+	   dst2 += dstPitch;
+       }
+
+       count = h;
+       while(count--) {
+	   memcpy(dst3, src3, w);
+	   src3 += srcPitch2;
+	   dst3 += dstPitch;
+       }
+}
+
+
 uint32_t vlvo_draw_slice(uint8_t *image[], int stride[], int w,int h,int x,int y)
 {
 #if 0
@@ -195,6 +238,25 @@
                  ,w,h,stride[0],stride[1],w*2);
     }
     else
+#else
+    if(src_format == IMGFMT_YV12)
+    {
+        uint32_t dstPitch,d1line,d2line,d3line,d1offset,d2offset,d3offset;
+	dstPitch = (mga_vid_config.src_width + 15) & ~15;  /* of luma */
+	d1line = y * dstPitch;
+	d2line = (mga_vid_config.src_height * dstPitch) + ((y >> 1) * (dstPitch >> 1));
+	d3line = d2line + ((mga_vid_config.src_height >> 1) * (dstPitch >> 1));
+
+	y &= ~1;
+
+	d1offset = (y * dstPitch) + x;
+	d2offset = d2line + (x >> 1);
+	d3offset = d3line + (x >> 1);
+      CopyData420(image[0],image[1],image[2],
+    		  dst+d1offset,dst+d2offset,dst+d3offset,
+		  stride[0],stride[1],dstPitch,h,w);
+    }
+    else
 #endif
       memcpy(dst,image[0],mga_vid_config.frame_size);
 #endif