changeset 33202:c53543375b06

Suport RGB frambuffers in vo_fbdev.c
author reimar
date Fri, 22 Apr 2011 09:10:32 +0000
parents 70a2195b4904
children 6ef39cd0d5e1
files libvo/vo_fbdev.c
diffstat 1 files changed, 13 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- 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)