# HG changeset patch # User reimar # Date 1303463432 0 # Node ID c53543375b06174317c1aa5d397c2b46ba13273a # Parent 70a2195b4904981ef7c2366374d8c76797143bde Suport RGB frambuffers in vo_fbdev.c diff -r 70a2195b4904 -r c53543375b06 libvo/vo_fbdev.c --- a/libvo/vo_fbdev.c Fri Apr 22 09:06:03 2011 +0000 +++ b/libvo/vo_fbdev.c Fri Apr 22 09:10:32 2011 +0000 @@ -487,7 +487,7 @@ return best; } -static void set_bpp(struct fb_var_screeninfo *p, int bpp) +static void set_bpp(struct fb_var_screeninfo *p, int bpp, int rgb) { p->bits_per_pixel = FFALIGN(bpp, 2); p->red.msb_right = p->green.msb_right = p->blue.msb_right = p->transp.msb_right = 0; @@ -526,15 +526,19 @@ p->blue.length = 4; break; } + if (rgb) { + p->blue.offset = p->red.offset; + p->red.offset = 0; + } } -static void fb_mode2fb_vinfo(fb_mode_t *m, struct fb_var_screeninfo *v) +static void fb_mode2fb_vinfo(fb_mode_t *m, struct fb_var_screeninfo *v, int rgb) { v->xres = m->xres; v->yres = m->yres; v->xres_virtual = m->vxres; v->yres_virtual = m->vyres; - set_bpp(v, m->depth); + set_bpp(v, m->depth, rgb); v->pixclock = m->pixclock; v->left_margin = m->left; v->right_margin = m->right; @@ -570,6 +574,7 @@ static unsigned short fb_ored[256], fb_ogreen[256], fb_oblue[256]; static struct fb_cmap fb_oldcmap = { 0, 256, fb_ored, fb_ogreen, fb_oblue }; static int fb_cmap_changed = 0; +static int fb_rgb; static int fb_pixel_size; // 32: 4 24: 3 16: 2 15: 2 static int fb_bpp; // 32: 32 24: 24 16: 16 15: 15 static int fb_bpp_we_want; // 32: 32 24: 24 16: 16 15: 15 @@ -694,6 +699,7 @@ mp_msg(MSGT_VO, MSGL_ERR, "notice: Can't open /dev/tty: %s\n", strerror(errno)); } + fb_rgb = !fb_vinfo.red.offset; fb_bpp = fb_vinfo.bits_per_pixel; if (fb_bpp == 16) fb_bpp = fb_vinfo.red.length + fb_vinfo.green.length + fb_vinfo.blue.length; @@ -787,7 +793,7 @@ mp_msg(MSGT_VO, MSGL_ERR, "can't find requested video mode\n"); return 1; } - fb_mode2fb_vinfo(fb_mode, &fb_vinfo); + fb_mode2fb_vinfo(fb_mode, &fb_vinfo, fb_rgb); } else if (vm) { monitor_hfreq = str2range(monitor_hfreq_str); monitor_vfreq = str2range(monitor_vfreq_str); @@ -804,10 +810,10 @@ } mp_msg(MSGT_VO, MSGL_V, "using mode %dx%d @ %.1fHz\n", fb_mode->xres, fb_mode->yres, vsf(fb_mode)); - fb_mode2fb_vinfo(fb_mode, &fb_vinfo); + fb_mode2fb_vinfo(fb_mode, &fb_vinfo, fb_rgb); } fb_bpp_we_want = fb_bpp; - set_bpp(&fb_vinfo, fb_bpp); + set_bpp(&fb_vinfo, fb_bpp, fb_rgb); fb_vinfo.xres_virtual = fb_vinfo.xres; fb_vinfo.yres_virtual = fb_vinfo.yres; fb_page = 0; @@ -1012,7 +1018,7 @@ if (vidix_name) return vidix_query_fourcc(format); #endif - if ((format & IMGFMT_BGR_MASK) == IMGFMT_BGR) { + if ((format & IMGFMT_BGR_MASK) == (fb_rgb ? IMGFMT_RGB : IMGFMT_BGR)) { int bpp = format & 0xff; if (bpp == fb_bpp)