summaryrefslogtreecommitdiffstats
path: root/libvo
diff options
context:
space:
mode:
authorrfelker <rfelker@b3059339-0415-0410-9bf9-f77b7e298cf2>2003-08-12 08:24:24 +0000
committerrfelker <rfelker@b3059339-0415-0410-9bf9-f77b7e298cf2>2003-08-12 08:24:24 +0000
commita035351921e578387a5150f3d0c8e7cf1baef47c (patch)
tree51521f2bb8cb621fcfe81ae3d20d8ef0198c3aaf /libvo
parente8a173deecac93b427febb3a85ebe726a0cf09ca (diff)
downloadmpv-a035351921e578387a5150f3d0c8e7cf1baef47c.tar.bz2
mpv-a035351921e578387a5150f3d0c8e7cf1baef47c.tar.xz
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). git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@10579 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libvo')
-rw-r--r--libvo/vo_fbdev.c29
1 files changed, 5 insertions, 24 deletions
diff --git a/libvo/vo_fbdev.c b/libvo/vo_fbdev.c
index e58690dbe9..6419450784 100644
--- a/libvo/vo_fbdev.c
+++ b/libvo/vo_fbdev.c
@@ -559,7 +559,6 @@ static void (*draw_alpha_p)(int w, int h, unsigned char *src,
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 @@ static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width,
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 @@ static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width,
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 @@ static void draw_alpha(int x0, int y0, int w, int h, unsigned char *src,
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 @@ static uint32_t draw_slice(uint8_t *src[], int stride[], int w, int h, int x,
{
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 check_events(void)
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 @@ static void uninit(void)
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 @@ static void uninit(void)
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