Update of /cvsroot/mplayer/main/libvo In directory usw-pr-cvs1:/tmp/cvs-serv7054/libvo Modified Files: vo_svga.c Log Message: Tons of code rewrites. Index: vo_svga.c =================================================================== RCS file: /cvsroot/mplayer/main/libvo/vo_svga.c,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -r1.16 -r1.17 *** vo_svga.c 2001/04/17 06:22:48 1.16 --- vo_svga.c 2001/04/17 17:35:27 1.17 *************** *** 13,16 **** --- 13,18 ---- #include <vgagl.h> + #include <limits.h> + #include "config.h" #include "video_out.h" *************** *** 21,24 **** --- 23,27 ---- extern void rgb15to16_mmx(char* s0,char* d0,int count); + extern int vo_dbpp; LIBVO_EXTERN(svga) *************** *** 63,83 **** static uint8_t checked = 0; ! static int add_mode(uint16_t mode, vga_modeinfo minfo) { vga_modelist_t *list; if (modelist == NULL) { ! modelist = malloc(sizeof(vga_modelist_t)); ! modelist->modenum = mode; ! modelist->modeinfo = minfo; ! modelist->next = NULL; if (modelist == NULL) { printf("vo_svga: add_mode() failed. Not enough memory for modelist."); return(1); // error } } else { list = modelist; while (list->next != NULL) list = list->next; ! list->next = malloc(sizeof(vga_modelist_t)); if (list->next == NULL) { printf("vo_svga: add_mode() failed. Not enough memory for modelist."); --- 66,86 ---- static uint8_t checked = 0; ! static uint32_t add_mode(uint16_t mode, vga_modeinfo minfo) { vga_modelist_t *list; if (modelist == NULL) { ! modelist = (vga_modelist_t *) malloc(sizeof(vga_modelist_t)); if (modelist == NULL) { printf("vo_svga: add_mode() failed. Not enough memory for modelist."); return(1); // error } + modelist->modenum = mode; + modelist->modeinfo = minfo; + modelist->next = NULL; } else { list = modelist; while (list->next != NULL) list = list->next; ! list->next = (vga_modelist_t *) malloc(sizeof(vga_modelist_t)); if (list->next == NULL) { printf("vo_svga: add_mode() failed. Not enough memory for modelist."); *************** *** 89,96 **** list->next = NULL; } } static int checksupportedmodes() { ! uint16_t i; vga_modeinfo *minfo; --- 92,100 ---- list->next = NULL; } + return (0); } static int checksupportedmodes() { ! uint16_t i, max; vga_modeinfo *minfo; *************** *** 98,102 **** vga_init(); vga_disabledriverreport(); ! for (i = 1; i < vga_lastmodenumber(); i++) if (vga_hasmode(i) > 0) { minfo = vga_getmodeinfo(i); --- 102,107 ---- vga_init(); vga_disabledriverreport(); ! max = vga_lastmodenumber(); ! for (i = 1; i < max; i++) if (vga_hasmode(i) > 0) { minfo = vga_getmodeinfo(i); *************** *** 112,115 **** --- 117,121 ---- return(1); } + return(0); } *************** *** 121,128 **** uint16_t vid_mode = 0; uint8_t widescreen = (((req_w*1.0)/req_h) > (4.0/3)) ? 1 : 0; vga_modelist_t *list = modelist; if (!checked) { ! if (checksupportedmodes()) // Looking for available video modes return(1); } --- 127,135 ---- uint16_t vid_mode = 0; uint8_t widescreen = (((req_w*1.0)/req_h) > (4.0/3)) ? 1 : 0; + uint16_t buf_w = USHRT_MAX, buf_h = USHRT_MAX; vga_modelist_t *list = modelist; if (!checked) { ! if (checksupportedmodes()) // Looking for available video modes return(1); } *************** *** 131,134 **** --- 138,142 ---- while (list != NULL) { if ((list->modeinfo.width >= req_w) && (list->modeinfo.height >= req_h)) { + // printf("w: %d, h: %d, bpp: %d, colors: %d\n",list->modeinfo.width,list->modeinfo.height,list->modeinfo.bytesperpixel,list->modeinfo.colors); switch (list->modeinfo.colors) { case 32768: bpp_avail |= BPP_15; break; *************** *** 150,157 **** if (format == IMGFMT_YV12) bpp = 32; else bpp = format & 255; switch (bpp) { case 32: if (!(bpp_avail & BPP_32)) { printf("vo_svga: Haven't found video mode which fit to: %dx%d %dbpp\n",req_w,req_h,bpp); ! printf("vo_svga: Maybe you should try -bpp\n"); return(1); } --- 158,166 ---- if (format == IMGFMT_YV12) bpp = 32; else bpp = format & 255; + // printf("bpp: %d\n",bpp); switch (bpp) { case 32: if (!(bpp_avail & BPP_32)) { printf("vo_svga: Haven't found video mode which fit to: %dx%d %dbpp\n",req_w,req_h,bpp); ! printf("vo_svga: Maybe you should try -bpp\n"); return(1); } *************** *** 160,164 **** if (!(bpp_avail & BPP_32)) { printf("vo_svga: Haven't found video mode which fit to: %dx%d %dbpp\n",req_w,req_h,bpp); ! printf("vo_svga: Maybe you should try -bpp\n"); return(1); } else { --- 169,173 ---- if (!(bpp_avail & BPP_32)) { printf("vo_svga: Haven't found video mode which fit to: %dx%d %dbpp\n",req_w,req_h,bpp); ! printf("vo_svga: Maybe you should try -bpp\n"); return(1); } else { *************** *** 188,233 **** switch (bpp) { case 32: if (!(bpp_avail & BPP_32)) { ! printf("vo_svga: %dbpp not supported by HW or SVGAlib\n",bpp); return(1); } case 24: if (!(bpp_avail & BPP_24)) { ! printf("vo_svga: %dbpp not supported by HW or SVGAlib\n",bpp); return(1); } case 16: if (!(bpp_avail & BPP_16)) { ! printf("vo_svga: %dbpp not supported by HW or SVGAlib\n",bpp); return(1); } case 15: if (!(bpp_avail & BPP_15)) { ! printf("vo_svga: %dbpp not supported by HW or SVGAlib\n",bpp); return(1); } } } list = modelist; ! while ((list != NULL) && (!vid_mode)) { if ((list->modeinfo.width >= req_w) && (list->modeinfo.height >= req_h)) { switch (bpp) { case 32: if (list->modeinfo.bytesperpixel == 4) ! vid_mode = list->modenum; case 24: if (list->modeinfo.bytesperpixel == 3) ! vid_mode = list->modenum; case 16: if (list->modeinfo.colors == 65536) ! vid_mode = list->modenum; case 15: if (list->modeinfo.colors == 32768) ! vid_mode = list->modenum; } } list = list->next; } ! vga_setlinearaddressing(); ! if (vga_setmode(vid_mode) == -1){ printf("vo_svga: vga_setmode(%d) failed.\n",vid_mode); uninit(); return(1); // error ! } ! if (gl_setcontextvga(vid_mode)){ printf("vo_svga: gl_setcontextvga(%d) failed.\n",vid_mode); uninit(); --- 197,269 ---- switch (bpp) { case 32: if (!(bpp_avail & BPP_32)) { ! printf("vo_svga: %dbpp not supported in %dx%d (or larger resoltuion) by HW or SVGAlib\n",bpp,req_w,req_h); return(1); } + break; case 24: if (!(bpp_avail & BPP_24)) { ! printf("vo_svga: %dbpp not supported in %dx%d (or larger resoltuion) by HW or SVGAlib\n",bpp,req_w,req_h); return(1); } + break; case 16: if (!(bpp_avail & BPP_16)) { ! printf("vo_svga: %dbpp not supported in %dx%d (or larger resoltuion) by HW or SVGAlib\n",bpp,req_w,req_h); return(1); } + break; case 15: if (!(bpp_avail & BPP_15)) { ! printf("vo_svga: %dbpp not supported in %dx%d (or larger resoltuion) by HW or SVGAlib\n",bpp,req_w,req_h); return(1); } + break; } } list = modelist; ! // printf("req_w: %d, req_h: %d\n",req_w,req_h); ! while (list != NULL) { if ((list->modeinfo.width >= req_w) && (list->modeinfo.height >= req_h)) { + // printf("w: %d, h: %d, bpp: %d, colors: %d, req_bpp: %d\n",list->modeinfo.width,list->modeinfo.height,list->modeinfo.bytesperpixel,list->modeinfo.colors,bpp); switch (bpp) { case 32: if (list->modeinfo.bytesperpixel == 4) ! if ((list->modeinfo.width < buf_w) || (list->modeinfo.height < buf_h)) { ! vid_mode = list->modenum; ! buf_w = list->modeinfo.width; ! buf_h = list->modeinfo.height; ! } ! break; case 24: if (list->modeinfo.bytesperpixel == 3) ! if ((list->modeinfo.width < buf_w) || (list->modeinfo.height < buf_h)) { ! vid_mode = list->modenum; ! buf_w = list->modeinfo.width; ! buf_h = list->modeinfo.height; ! } ! break; case 16: if (list->modeinfo.colors == 65536) ! if ((list->modeinfo.width < buf_w) || (list->modeinfo.height < buf_h)) { ! vid_mode = list->modenum; ! buf_w = list->modeinfo.width; ! buf_h = list->modeinfo.height; ! } ! break; case 15: if (list->modeinfo.colors == 32768) ! if ((list->modeinfo.width < buf_w) || (list->modeinfo.height < buf_h)) { ! vid_mode = list->modenum; ! buf_w = list->modeinfo.width; ! buf_h = list->modeinfo.height; ! } ! break; } } list = list->next; } ! ! // printf("vid_mode: %d\n",vid_mode); vga_setlinearaddressing(); ! if (vga_setmode(vid_mode) == -1) { printf("vo_svga: vga_setmode(%d) failed.\n",vid_mode); uninit(); return(1); // error ! } ! if (gl_setcontextvga(vid_mode)) { printf("vo_svga: gl_setcontextvga(%d) failed.\n",vid_mode); uninit(); *************** *** 236,240 **** screen = gl_allocatecontext(); gl_getcontext(screen); ! if (gl_setcontextvgavirtual(vid_mode)){ printf("vo_svga: gl_setcontextvgavirtual(%d) failed.\n",vid_mode); uninit(); --- 272,276 ---- screen = gl_allocatecontext(); gl_getcontext(screen); ! if (gl_setcontextvgavirtual(vid_mode)) { printf("vo_svga: gl_setcontextvgavirtual(%d) failed.\n",vid_mode); uninit(); *************** *** 246,255 **** gl_clearscreen(0); ! if (bpp_conv) bppbuf = malloc(maxw * maxh * BYTESPERPIXEL); ! if (bppbuf == NULL) { ! printf("vo_svga: Not enough memory for buffering!\n"); ! uninit(); ! return (1); } --- 282,292 ---- gl_clearscreen(0); ! if (bpp_conv) { bppbuf = malloc(maxw * maxh * BYTESPERPIXEL); ! if (bppbuf == NULL) { ! printf("vo_svga: bppbuf -> Not enough memory for buffering!\n"); ! uninit(); ! return (1); ! } } *************** *** 263,267 **** scalebuf = malloc(maxw * maxh * BYTESPERPIXEL); if (scalebuf == NULL) { ! printf("vo_svga: Not enough memory for buffering!\n"); uninit(); return (1); --- 300,304 ---- scalebuf = malloc(maxw * maxh * BYTESPERPIXEL); if (scalebuf == NULL) { ! printf("vo_svga: scalebuf -> Not enough memory for buffering!\n"); uninit(); return (1); *************** *** 273,277 **** scalebuf = malloc(maxw * maxh * BYTESPERPIXEL); if (scalebuf == NULL) { ! printf("vo_svga: Not enough memory for buffering!\n"); uninit(); return (1); --- 310,314 ---- scalebuf = malloc(maxw * maxh * BYTESPERPIXEL); if (scalebuf == NULL) { ! printf("vo_svga: scalebuf -> Not enough memory for buffering!\n"); uninit(); return (1); *************** *** 289,293 **** yuvbuf = malloc(maxw * maxh * BYTESPERPIXEL); if (yuvbuf == NULL) { ! printf("vo_svga: Not enough memory for buffering!\n"); uninit(); return (1); --- 326,330 ---- yuvbuf = malloc(maxw * maxh * BYTESPERPIXEL); if (yuvbuf == NULL) { ! printf("vo_svga: yuvbuf -> Not enough memory for buffering!\n"); uninit(); return (1); *************** *** 295,298 **** --- 332,336 ---- } + // printf("bpp_conv: %d\n",bpp_conv); printf("SVGAlib resolution: %dx%d %dbpp - ", WIDTH, HEIGHT, bpp); if (maxw != orig_w || maxh != orig_h) printf("Video scaled to: %dx%d\n",maxw,maxh); *************** *** 303,307 **** static uint32_t query_format(uint32_t format) { ! uint8_t res = 0; if (!checked) { --- 341,345 ---- static uint32_t query_format(uint32_t format) { ! uint32_t res = 0; if (!checked) { *************** *** 309,341 **** return(0); } ! switch (format) { ! case IMGFMT_RGB32: ! case IMGFMT_BGR|32: { ! return ((bpp_avail & BPP_32) ? 1 : 0); ! } ! case IMGFMT_RGB24: ! case IMGFMT_BGR|24: { ! res = (bpp_avail & BPP_24) ? 1 : 0; ! if (!res) { ! res = (bpp_avail & BPP_32) ? 1 : 0; ! bpp_conv = 1; ! } ! return (res); ! } ! case IMGFMT_RGB16: ! case IMGFMT_BGR|16: { ! return ((bpp_avail & BPP_16) ? 1 : 0); ! } ! case IMGFMT_RGB15: ! case IMGFMT_BGR|15: { ! res = (bpp_avail & BPP_15) ? 1 : 0; ! if (!res) { ! res = (bpp_avail & BPP_16) ? 1 : 0; ! bpp_conv = 1; } - return (res); - } - case IMGFMT_YV12: return (1); - } return (0); } --- 347,389 ---- return(0); } ! ! // if (vo_dbpp) => There is NO conversion!!! ! if (vo_dbpp) { ! switch (vo_dbpp) { ! case 32: if ((format == IMGFMT_RGB32) || (format == IMGFMT_BGR|32)) ! return ((bpp_avail & BPP_32) ? 1 : 0); ! break; ! case 24: if ((format == IMGFMT_RGB24) || (format == IMGFMT_BGR|24)) ! return ((bpp_avail & BPP_24) ? 1 : 0); ! break; ! case 16: if ((format == IMGFMT_RGB16) || (format == IMGFMT_BGR|16)) ! return ((bpp_avail & BPP_16) ? 1 : 0); ! break; ! case 15: if ((format == IMGFMT_RGB15) || (format == IMGFMT_BGR|15)) ! return ((bpp_avail & BPP_15) ? 1 : 0); ! break; ! } ! } else ! switch (format) { ! case IMGFMT_RGB32: ! case IMGFMT_BGR|32: return ((bpp_avail & BPP_32) ? 1 : 0); break; ! case IMGFMT_RGB24: ! case IMGFMT_BGR|24: { ! res = (bpp_avail & BPP_24) ? 1 : 0; ! if (!res) ! res = (bpp_avail & BPP_32) ? 1 : 0; ! return (res); ! } break; ! case IMGFMT_RGB16: ! case IMGFMT_BGR|16: return ((bpp_avail & BPP_16) ? 1 : 0); break; ! case IMGFMT_RGB15: ! case IMGFMT_BGR|15: { ! res = (bpp_avail & BPP_15) ? 1 : 0; ! if (!res) ! res = (bpp_avail & BPP_16) ? 1 : 0; ! return (res); ! } break; ! case IMGFMT_YV12: return (1); break; } return (0); } *************** *** 373,391 **** } if (bpp_conv) { ! uint16_t *src = (uint16_t *) src[0]; uint16_t *dest = (uint16_t *) bppbuf; uint16_t *end; switch(bpp) { ! case 32: ! end = src + (maxw * maxh * 2); ! while (src < end) { ! *dest++ = *src++; ! (uint8_t *)dest = (uint8_t *)src; *(((uint8_t *)dest)+1) = 0; dest++; ! src++; } ! case 16: #ifdef HAVE_MMX rgb15to16_mmx(src[0],bppbuf,maxw * maxh * 2); --- 421,440 ---- } if (bpp_conv) { ! uint16_t *source = (uint16_t *) src[0]; uint16_t *dest = (uint16_t *) bppbuf; uint16_t *end; switch(bpp) { ! case 32: { ! end = source + (maxw * maxh * 2); ! while (source < end) { ! *dest++ = *source++; ! (uint8_t *)dest = (uint8_t *)source; *(((uint8_t *)dest)+1) = 0; dest++; ! source++; } ! } break; ! case 16: { #ifdef HAVE_MMX rgb15to16_mmx(src[0],bppbuf,maxw * maxh * 2); *************** *** 393,402 **** register uint16_t srcdata; ! end = src + (maxw * maxh); ! while (src < end) { ! srcdata = *src++; *dest++ = (srcdata & 0x1f) | ((srcdata & 0x7fe0) << 1); } #endif } src[0] = bppbuf; --- 442,452 ---- register uint16_t srcdata; ! end = source + (maxw * maxh); ! while (source < end) { ! srcdata = *source++; *dest++ = (srcdata & 0x1f) | ((srcdata & 0x7fe0) << 1); } #endif + } break; } src[0] = bppbuf; *************** *** 429,433 **** gl_fillbox(WIDTH - x_pos, 0, x_pos, HEIGHT, 0); } ! vo_draw_text(WIDTH, HEIGHT, draw_alpha); gl_copyscreen(screen); } --- 479,483 ---- gl_fillbox(WIDTH - x_pos, 0, x_pos, HEIGHT, 0); } ! // vo_draw_text(WIDTH, HEIGHT, draw_alpha); gl_copyscreen(screen); } _______________________________________________ Mplayer-cvslog mailing list Mplayer-cvslog@lists.sourceforge.net http://lists.sourceforge.net/lists/listinfo/mplayer-cvslog