[Mplayer-cvslog] CVS: main/libvo vo_fbdev.c,1.22,1.23
Szabolcs Berecz
szabii at users.sourceforge.net
Sat Apr 14 23:23:08 CEST 2001
Update of /cvsroot/mplayer/main/libvo
In directory usw-pr-cvs1:/tmp/cvs-serv3748
Modified Files:
vo_fbdev.c
Log Message:
lots of changes
Index: vo_fbdev.c
===================================================================
RCS file: /cvsroot/mplayer/main/libvo/vo_fbdev.c,v
retrieving revision 1.22
retrieving revision 1.23
diff -C2 -r1.22 -r1.23
*** vo_fbdev.c 2001/04/13 20:34:11 1.22
--- vo_fbdev.c 2001/04/14 21:23:06 1.23
***************
*** 370,378 ****
float min;
float max;
! } range;
! static int in_range(range *r, float f)
{
! for (/* NOTHING */; r; r++) {
if (f >= r->min && f <= r->max)
return 1;
--- 370,378 ----
float min;
float max;
! } range_t;
! static int in_range(range_t *r, float f)
{
! for (/* NOTHING */; (r->min != -1 && r->max != -1); r++) {
if (f >= r->min && f <= r->max)
return 1;
***************
*** 381,386 ****
}
! static fb_mode_t *find_best_mode(int xres, int yres, range *hfreq,
! range *vfreq, range *dotclock)
{
int i;
--- 381,386 ----
}
! static fb_mode_t *find_best_mode(int xres, int yres, range_t *hfreq,
! range_t *vfreq, range_t *dotclock)
{
int i;
***************
*** 409,412 ****
--- 409,518 ----
}
+ static void set_bpp(struct fb_var_screeninfo *p, int bpp)
+ {
+ p->bits_per_pixel = (bpp == 15) ? 16 : bpp;
+ p->red.msb_right = p->green.msb_right = p->blue.msb_right = 0;
+ switch (bpp) {
+ case 32:
+ case 24:
+ p->red.offset = 16;
+ p->red.length = 8;
+ p->green.offset = 8;
+ p->green.length = 8;
+ p->blue.offset = 0;
+ p->blue.length = 8;
+ break;
+ case 16:
+ p->red.offset = 11;
+ p->red.length = 5;
+ p->green.offset = 5;
+ p->green.length = 6;
+ p->blue.offset = 0;
+ p->blue.length = 5;
+ break;
+ case 15:
+ p->red.offset = 10;
+ p->red.length = 5;
+ p->green.offset = 5;
+ p->green.length = 5;
+ p->blue.offset = 0;
+ p->blue.length = 5;
+ break;
+ }
+ }
+
+ static void fb_mode2fb_vinfo(fb_mode_t *m, struct fb_var_screeninfo *v)
+ {
+ v->xres = m->xres;
+ v->yres = m->yres;
+ v->xres_virtual = m->vxres;
+ v->yres_virtual = m->vyres;
+ set_bpp(v, m->depth);
+ v->pixclock = m->pixclock;
+ v->left_margin = m->left;
+ v->right_margin = m->right;
+ v->upper_margin = m->upper;
+ v->lower_margin = m->lower;
+ v->hsync_len = m->hslen;
+ v->vsync_len = m->vslen;
+ v->sync = m->sync;
+ v->vmode = m->vmode;
+ }
+
+ static range_t *str2range(char *s)
+ {
+ float tmp_min, tmp_max;
+ char *endptr = s; // to start the loop
+ range_t *r = NULL;
+ int i, j;
+
+ if (!s)
+ return NULL;
+ for (i = 0; *endptr; i++) {
+ if (*s == ',')
+ goto out_err;
+ if (!(r = (range_t *) realloc(r, sizeof(*r) * i + 2))) {
+ printf("can't realloc 'r'\n");
+ return NULL;
+ }
+ tmp_min = strtod(s, &endptr);
+ if (*endptr == 'k' || *endptr == 'K') {
+ tmp_min *= 1000.0;
+ endptr++;
+ } else if (*endptr == 'm' || *endptr == 'M') {
+ tmp_min *= 1000000.0;
+ endptr++;
+ }
+ if (*endptr == '-') {
+ tmp_max = strtod(endptr + 1, &endptr);
+ if (*endptr == 'k' || *endptr == 'K') {
+ tmp_max *= 1000.0;
+ endptr++;
+ } else if (*endptr == 'm' || *endptr == 'M') {
+ tmp_max *= 1000000.0;
+ endptr++;
+ }
+ if (*endptr != ',' && *endptr)
+ goto out_err;
+ } else if (*endptr == ',' || !*endptr) {
+ tmp_max = tmp_min;
+ } else
+ goto out_err;
+ r[i].min = tmp_min;
+ r[i].max = tmp_max;
+ s = endptr + 1;
+ }
+ /* check if we have negative numbers... */
+ for (j = 0; j < i; j++)
+ if (r[j].min < 0 || r[j].max < 0)
+ goto out_err;
+ r[i].min = r[i].max = -1;
+ return r;
+ out_err:
+ if (r)
+ free(r);
+ return NULL;
+ }
+
/******************************
* vo_fbdev *
***************
*** 419,427 ****
char *fb_mode_cfgfile = "/etc/fb.modes";
char *fb_mode_name = NULL;
! int fb_mode_depth = 0;
! int fb_mode_auto = 0;
! char *monitor_hfreq = NULL;
! char *monitor_vfreq = NULL;
! char *monitor_dotclock = NULL;
static int fb_preinit_done = 0;
--- 525,535 ----
char *fb_mode_cfgfile = "/etc/fb.modes";
char *fb_mode_name = NULL;
! char *monitor_hfreq_str = NULL;
! char *monitor_vfreq_str = NULL;
! char *monitor_dotclock_str = NULL;
!
! range_t *monitor_hfreq = NULL;
! range_t *monitor_vfreq = NULL;
! range_t *monitor_dotclock = NULL;
static int fb_preinit_done = 0;
***************
*** 441,444 ****
--- 549,557 ----
static fb_mode_t *fb_mode = NULL;
+ static void (*put_frame)(void);
+ static int left_band_width;
+ static int right_band_width;
+ static int upper_band_height;
+ static int lower_band_height;
static uint8_t *next_frame;
static int in_width;
***************
*** 519,555 ****
}
- static void set_bpp(struct fb_var_screeninfo *p, int bpp)
- {
- p->bits_per_pixel = (bpp == 15) ? 16 : bpp;
- p->red.msb_right = p->green.msb_right = p->blue.msb_right = 0;
- switch (bpp) {
- case 32:
- case 24:
- p->red.offset = 16;
- p->red.length = 8;
- p->green.offset = 8;
- p->green.length = 8;
- p->blue.offset = 0;
- p->blue.length = 8;
- break;
- case 16:
- p->red.offset = 11;
- p->red.length = 5;
- p->green.offset = 5;
- p->green.length = 6;
- p->blue.offset = 0;
- p->blue.length = 5;
- break;
- case 15:
- p->red.offset = 10;
- p->red.length = 5;
- p->green.offset = 5;
- p->green.length = 5;
- p->blue.offset = 0;
- p->blue.length = 5;
- break;
- }
- }
-
static int fb_preinit(void)
{
--- 632,635 ----
***************
*** 567,605 ****
goto err_out_fd;
}
fb_bpp = (fb_vinfo.bits_per_pixel == 32) ? 32 :
(fb_vinfo.red.length + fb_vinfo.green.length +
fb_vinfo.blue.length);
!
! if ((!!fb_mode_name + !!fb_mode_depth + !!fb_mode_auto) > 1) {
! printf(FBDEV "Use can use only one of the following parameters:"
! "-fbmode, -fbdepth, -fbauto\n");
! goto err_out;
! }
! if (fb_mode_name || fb_mode_auto)
! if (parse_fbmode_cfg(fb_mode_cfgfile) < 0)
goto err_out;
-
- if (fb_mode_name) {
- if (!(fb_mode = find_mode_by_name(fb_mode_name))) {
- printf(FBDEV "can't find requested video mode\n");
- goto err_out;
- }
- fb_bpp = fb_mode->depth;
- } else if (fb_mode_depth) {
- printf(FBDEV "Do _not_ use the 'fbdepth' parameter! "
- "this parameter will be removed\n");
- if (fb_mode_depth != 15 && fb_mode_depth != 16 &&
- fb_mode_depth != 24 && fb_mode_depth != 32) {
- printf(FBDEV "can't switch to %d bpp\n", fb_mode_depth);
- goto err_out;
}
! fb_bpp = fb_mode_depth;
! } else if (fb_mode_auto) {
! printf(FBDEV "Not implemented. try later... :)\n");
! goto err_out;
! fb_bpp = fb_mode->depth;
}
- fb_bpp_we_want = fb_bpp;
fb_preinit_done = 1;
--- 647,663 ----
goto err_out_fd;
}
+ fb_orig_vinfo = fb_vinfo;
fb_bpp = (fb_vinfo.bits_per_pixel == 32) ? 32 :
(fb_vinfo.red.length + fb_vinfo.green.length +
fb_vinfo.blue.length);
! if (vo_dbpp) {
! if (vo_dbpp != 15 && vo_dbpp != 16 && vo_dbpp != 24 &&
! vo_dbpp != 32) {
! printf(FBDEV "can't switch to %d bpp\n", vo_dbpp);
goto err_out;
}
! fb_bpp = vo_dbpp;
}
fb_preinit_done = 1;
***************
*** 614,621 ****
--- 672,686 ----
}
+ static void put_frame_without_bands(void);
+ static void put_frame_with_bands(void);
+
static uint32_t init(uint32_t width, uint32_t height, uint32_t d_width,
uint32_t d_height, uint32_t fullscreen, char *title,
uint32_t format)
{
+ #define FS (fullscreen & 0x01)
+ #define VM (fullscreen & 0x02)
+ #define ZOOM (fullscreen & 0x04)
+
struct fb_cmap *cmap;
***************
*** 626,648 ****
return 1;
! fb_orig_vinfo = fb_vinfo;
if (fb_mode_name) {
! fb_vinfo.xres = fb_mode->xres;
! fb_vinfo.yres = fb_mode->yres;
! fb_vinfo.xres_virtual = fb_mode->vxres;
! fb_vinfo.yres_virtual = fb_mode->vyres;
! set_bpp(&fb_vinfo, fb_mode->depth);
! fb_vinfo.pixclock = fb_mode->pixclock;
! fb_vinfo.left_margin = fb_mode->left;
! fb_vinfo.right_margin = fb_mode->right;
! fb_vinfo.upper_margin = fb_mode->upper;
! fb_vinfo.lower_margin = fb_mode->lower;
! fb_vinfo.hsync_len = fb_mode->hslen;
! fb_vinfo.vsync_len = fb_mode->vslen;
! fb_vinfo.sync = fb_mode->sync;
! fb_vinfo.vmode = fb_mode->vmode;
! } else if (fb_mode_depth) {
! set_bpp(&fb_vinfo, fb_mode_depth);
}
fb_vinfo.xres_virtual = fb_vinfo.xres;
fb_vinfo.yres_virtual = fb_vinfo.yres;
--- 691,746 ----
return 1;
! if (ZOOM) {
! printf(FBDEV "-zoom is not supported\n");
! return 1;
! }
! if (fb_mode_name && !VM) {
! printf(FBDEV "-fbmode can be used only with -vm"
! " (is it the right behaviour?)\n");
! return 1;
! }
! if (VM)
! if (parse_fbmode_cfg(fb_mode_cfgfile) < 0)
! return 1;
! if ((!d_width + !d_height) == 1) {
! printf(FBDEV "use both -x and -y, or none of them\n");
! return 1;
! }
! if (d_width) {
! out_width = d_width;
! out_height = d_height;
! } else {
! out_width = width;
! out_height = height;
! }
! in_width = width;
! in_height = height;
! pixel_format = format;
!
if (fb_mode_name) {
! if (!(fb_mode = find_mode_by_name(fb_mode_name))) {
! printf(FBDEV "can't find requested video mode\n");
! return 1;
! }
! fb_mode2fb_vinfo(fb_mode, &fb_vinfo);
! } else if (VM) {
! monitor_hfreq = str2range(monitor_hfreq_str);
! monitor_vfreq = str2range(monitor_vfreq_str);
! monitor_dotclock = str2range(monitor_dotclock_str);
! if (!monitor_hfreq || !monitor_vfreq || !monitor_dotclock) {
! printf(FBDEV "you have to specify the capabilities of"
! " the monitor.\n");
! return 1;
! }
! if (!(fb_mode = find_best_mode(out_width, out_height,
! monitor_hfreq, monitor_vfreq,
! monitor_dotclock))) {
! printf(FBDEV "can't find best video mode\n");
! return 1;
! }
! fb_mode2fb_vinfo(fb_mode, &fb_vinfo);
}
+ fb_bpp_we_want = fb_bpp;
+ set_bpp(&fb_vinfo, fb_bpp);
fb_vinfo.xres_virtual = fb_vinfo.xres;
fb_vinfo.yres_virtual = fb_vinfo.yres;
***************
*** 783,786 ****
--- 881,901 ----
return 1;
}
+ if (FS || (d_width && VM)) {
+ out_width = fb_vinfo.xres;
+ out_height = fb_vinfo.yres;
+ }
+ if (out_width < in_width || out_height < in_height) {
+ printf(FBDEV "screensize is smaller than video size\n");
+ return 1;
+ }
+ left_band_width = (out_width - in_width) / 2;
+ right_band_width = (out_width - in_width + 1) / 2;
+ upper_band_height = (out_height - in_height) / 2;
+ lower_band_height = (out_height - in_height + 1) / 2;
+ if (left_band_width || right_band_width || upper_band_height ||
+ lower_band_height)
+ put_frame = put_frame_with_bands;
+ else
+ put_frame = put_frame_without_bands;
fb_pixel_size = fb_vinfo.bits_per_pixel / 8;
***************
*** 789,793 ****
fb_bpp = (fb_pixel_size == 4) ? 32 : fb_real_bpp;
if (fb_bpp_we_want != fb_bpp)
! printf(FBDEV "can't set bpp (requested %d, got %d bpp)!!!\n",
fb_bpp_we_want, fb_bpp);
fb_screen_width = fb_finfo.line_length;
--- 904,908 ----
fb_bpp = (fb_pixel_size == 4) ? 32 : fb_real_bpp;
if (fb_bpp_we_want != fb_bpp)
! printf(FBDEV "requested %d bpp, got %d bpp)!!!\n",
fb_bpp_we_want, fb_bpp);
fb_screen_width = fb_finfo.line_length;
***************
*** 809,817 ****
}
- in_width = width;
- in_height = height;
- out_width = width;
- out_height = height;
- pixel_format = format;
if (!(next_frame = (uint8_t *) malloc(in_width * in_height * fb_pixel_size))) {
printf(FBDEV "Can't malloc next_frame: %s\n", strerror(errno));
--- 924,927 ----
***************
*** 934,938 ****
}
! static void put_frame(void)
{
int i, out_offset = 0, in_offset = 0;
--- 1044,1048 ----
}
! static void put_frame_without_bands(void)
{
int i, out_offset = 0, in_offset = 0;
***************
*** 940,944 ****
for (i = 0; i < in_height; i++) {
memcpy(frame_buffer + out_offset, next_frame + in_offset,
! in_width * fb_pixel_size);
out_offset += fb_screen_width;
in_offset += in_width * fb_pixel_size;
--- 1050,1054 ----
for (i = 0; i < in_height; i++) {
memcpy(frame_buffer + out_offset, next_frame + in_offset,
! in_width * fb_pixel_size);
out_offset += fb_screen_width;
in_offset += in_width * fb_pixel_size;
***************
*** 946,949 ****
--- 1056,1093 ----
}
+ static void put_frame_with_bands(void)
+ {
+ int i, out_offset = 0, in_offset = 0, w, bw, tmp;
+
+ if (upper_band_height) {
+ out_offset = upper_band_height * out_width * fb_pixel_size;
+ memset(frame_buffer, 0x00, out_offset);
+ }
+ if (left_band_width) {
+ tmp = left_band_width * fb_pixel_size;
+ memset(frame_buffer + out_offset, 0x00, tmp);
+ out_offset += tmp;
+ }
+ w = in_width * fb_pixel_size;
+ bw = (left_band_width + right_band_width) * fb_pixel_size;
+ for (i = 0; i < in_height - 1; i++) {
+ memcpy(frame_buffer + out_offset, next_frame + in_offset, w);
+ if (bw)
+ memset(frame_buffer + out_offset + w, 0x00, bw);
+ out_offset += fb_screen_width;
+ in_offset += w;
+ }
+ memcpy(frame_buffer + out_offset, next_frame + in_offset, w);
+ out_offset += w;
+ if (right_band_width) {
+ tmp = right_band_width * fb_pixel_size;
+ memset(frame_buffer + out_offset, 0x00, tmp);
+ out_offset += tmp;
+ }
+ if (lower_band_height)
+ memset(frame_buffer + out_offset, 0x00, lower_band_height *
+ out_width * fb_pixel_size);
+ }
+
extern void vo_draw_text(int dxs, int dys, void (*draw_alpha)(int x0, int y0,
int w, int h, unsigned char *src, unsigned char *srca,
***************
*** 954,958 ****
vo_draw_text(in_width, in_height, draw_alpha);
check_events();
! put_frame();
}
--- 1098,1102 ----
vo_draw_text(in_width, in_height, draw_alpha);
check_events();
! (*put_frame)();
}
_______________________________________________
Mplayer-cvslog mailing list
Mplayer-cvslog at lists.sourceforge.net
http://lists.sourceforge.net/lists/listinfo/mplayer-cvslog
More information about the MPlayer-cvslog
mailing list