[Mplayer-cvslog] CVS: main/libvo vo_fbdev.c,1.81,1.82

Richard Felker CVS rfelker at mplayerhq.hu
Tue Aug 12 10:24:56 CEST 2003


Update of /cvsroot/mplayer/main/libvo
In directory mail:/var/tmp.root/cvs-serv12617/libvo

Modified Files:
	vo_fbdev.c 
Log Message:
10000l, the old code was slow as hell, copying stuff extra times and
actually broken -- blanking the whole screen at each 'page flip' with
-dr enabled. benchmarks:

before:
56% cpu for decode
56% cpu for vo with no -dr
25% cpu for vo with -dr

after:
56% cpu for decode
25% cpu for vo without -dr
0% cpu for vo with -dr

if vo_fbdev is going to do pageflip, it needs to do it for REAL, using
vertical scroll registers (like g2), not copying a temp buffer (which
will shear anyway and is super-slow).


Index: vo_fbdev.c
===================================================================
RCS file: /cvsroot/mplayer/main/libvo/vo_fbdev.c,v
retrieving revision 1.81
retrieving revision 1.82
diff -u -r1.81 -r1.82
--- vo_fbdev.c	12 Aug 2003 06:57:19 -0000	1.81
+++ vo_fbdev.c	12 Aug 2003 08:24:24 -0000	1.82
@@ -559,7 +559,6 @@
 		unsigned char *srca, int stride, unsigned char *dst,
 		int dstride);
 
-static uint8_t *next_frame;
 static int in_width;
 static int in_height;
 static int out_width;
@@ -950,7 +949,6 @@
 	fb_line_len = fb_finfo.line_length;
 	fb_size = fb_finfo.smem_len;
 	frame_buffer = NULL;
-	next_frame = NULL;
 #ifdef CONFIG_VIDIX
 	if(vidix_name)
 	{
@@ -1002,10 +1000,6 @@
 	    mp_msg(MSGT_VO, MSGL_DBG2, "center @ %p\n", center);
 	    mp_msg(MSGT_VO, MSGL_V, "pixel per line: %d\n", fb_line_len / fb_pixel_size);
 
-	    if (!(next_frame = (uint8_t *) malloc(in_width * in_height * fb_pixel_size))) {
-		mp_msg(MSGT_VO, MSGL_ERR, "Can't malloc next_frame: %s\n", strerror(errno));
-		return 1;
-	    }
 	    if (fs || vm)
 		memset(frame_buffer, '\0', fb_line_len * fb_yres);
 	}
@@ -1045,12 +1039,10 @@
 		unsigned char *srca, int stride)
 {
 	unsigned char *dst;
-	int dstride;
 
-	dst = next_frame + (in_width * y0 + x0) * fb_pixel_size;
-	dstride = in_width * fb_pixel_size;
+	dst = center + (fb_line_len * y0 + x0) * fb_pixel_size;
 
-	(*draw_alpha_p)(w, h, src, srca, stride, dst, dstride);
+	(*draw_alpha_p)(w, h, src, srca, stride, dst, fb_line_len);
 }
 
 static uint32_t draw_frame(uint8_t *src[]) { return 1; }
@@ -1060,15 +1052,13 @@
 {
 	uint8_t *d;
 	uint8_t *s;
-	int next;
 
-	d = next_frame + (in_width * y + x) * fb_pixel_size;
-	next = in_width * fb_pixel_size;
+	d = center + (fb_line_len * y + x) * fb_pixel_size;
 
 	s = src[0];
 	while (h) {
 		memcpy(d, s, w * fb_pixel_size);
-		d += next;
+		d += fb_line_len;
 		s += stride[0];
 		h--;
 	}
@@ -1082,14 +1072,6 @@
 
 static void flip_page(void)
 {
-	int i, out_offset = 0, in_offset = 0;
-
-	for (i = 0; i < in_height; i++) {
-		memcpy(center + out_offset, next_frame + in_offset,
-				in_width * fb_pixel_size);
-		out_offset += fb_line_len;
-		in_offset += in_width * fb_pixel_size;
-	}
 }
 
 static void draw_osd(void)
@@ -1104,7 +1086,6 @@
 			mp_msg(MSGT_VO, MSGL_WARN, "Can't restore original cmap\n");
 		fb_cmap_changed = 0;
 	}
-	if(next_frame) free(next_frame);
 	if (ioctl(fb_dev_fd, FBIOGET_VSCREENINFO, &fb_vinfo))
 		mp_msg(MSGT_VO, MSGL_WARN, "ioctl FBIOGET_VSCREENINFO: %s\n", strerror(errno));
 	fb_orig_vinfo.xoffset = fb_vinfo.xoffset;
@@ -1120,7 +1101,7 @@
         close(fb_tty_fd);
 	close(fb_dev_fd);
 	if(frame_buffer) munmap(frame_buffer, fb_size);
-	frame_buffer = next_frame = NULL;
+	frame_buffer = NULL;
 #ifdef CONFIG_VIDIX
 	if(vidix_name) vidix_term();
 #endif



More information about the MPlayer-cvslog mailing list