changeset 8515:b4e5d87b878b

vidix support and better device options handler by Matan Ziv-Av <matan@svgalib.org>
author alex
date Sat, 21 Dec 2002 22:08:14 +0000
parents a1ff87c254ff
children 71e2ba5d6cdc
files libvo/vo_svga.c
diffstat 1 files changed, 106 insertions(+), 41 deletions(-) [+]
line wrap: on
line diff
--- a/libvo/vo_svga.c	Sat Dec 21 21:07:16 2002 +0000
+++ b/libvo/vo_svga.c	Sat Dec 21 22:08:14 2002 +0000
@@ -18,6 +18,10 @@
 #include "video_out.h"
 #include "video_out_internal.h"
 
+#ifdef CONFIG_VIDIX
+#include "vosub_vidix.h"
+#endif
+
 #include "sub.h"
 #include "../postproc/rgb2rgb.h"
 
@@ -41,6 +45,10 @@
 
 static int BYTESPERPIXEL, WIDTH, HEIGHT, LINEWIDTH;
 static int frame, maxframes, oldmethod=0;
+static int directrender;
+
+static int force_vm=0;
+static int squarepix=0;
 
 static uint32_t pformat;
 static uint32_t orig_w, orig_h, maxw, maxh; // Width, height
@@ -79,6 +87,10 @@
         ""
 };
 
+#ifdef CONFIG_VIDIX
+static char vidix_name[32] = "";
+#endif
+
 LIBVO_EXTERN(svga)
 
 static uint32_t preinit(const char *arg)
@@ -93,13 +105,55 @@
       maxframes=1;
   }
 
+  if(arg)while(*arg) {
+	  if(!strncmp(arg,"old",3)) {
+			oldmethod=1;
+			arg+=3;
+			if( *arg == ':' ) arg++;
+	  }
+
+#ifdef CONFIG_VIDIX  
+	  if(memcmp(arg,"vidix",5)==0) {
+		  int i;
+		  i=6;
+		  while(arg[i] && arg[i]!=':') i++;
+		  strncpy(vidix_name, arg+6, i-6);
+		  vidix_name[i-5]=0;
+		  if(arg[i]==':')i++;
+		  arg+=i;
+		  vidix_preinit(vidix_name, &video_out_svga);
+	  }
+#endif
+	  if(!strncmp(arg,"sq",2)) {
+	  	squarepix=1;
+		arg+=2;
+		if( *arg == ':' ) arg++;
+	  }
+ 
+	  if(*arg) {
+		  int i;
+		  char s[64];
+printf("arg is %s\n",arg);
+		  i=0;
+		  while(arg[i] && arg[i]!=':')i++;
+		  strncpy(s, arg, i);
+		  s[i]=0;
+		  arg+=i;
+		  if(*arg==':')arg++;
+printf("i=%i new arg is %s\n",i, arg);
+		  i=vga_getmodenumber(s);
+		  if(i>0) {
+			  force_vm = i;
+			  if(verbose)printf("vo_svga: Forcing mode %i\n",force_vm);
+	  	  }
+	  }
+  }
+
   if (!checked) {
     if (checksupportedmodes()) // Looking for available video modes 
       return(1);
   }
 
-// printf("vo_svga: preinit - maxframes=%i\n",maxframes);
-  
   return 0;
 }
 
@@ -115,7 +169,7 @@
 }
 
 static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width,
-                     uint32_t d_height, uint32_t fullscreen, char *title, 
+                     uint32_t d_height, uint32_t flags, char *title, 
 		     uint32_t format) {
   uint32_t req_w = (d_width > 0 ? d_width : width);
   uint32_t req_h = (d_height > 0 ? d_height : height);
@@ -124,6 +178,10 @@
   uint16_t buf_w = USHRT_MAX, buf_h = USHRT_MAX;
   vga_modelist_t *list = modelist;
 
+  if(verbose)
+	  printf("vo_svga: config(%i, %i, %i, %i, %08x, %s, %08x)\n", width, height, 
+			  d_width, d_height, flags, title, format);
+  
   bpp_avail = 0;
   while (list != NULL) {
     if ((list->modeinfo.width >= req_w) && (list->modeinfo.height >= req_h)) {
@@ -147,7 +205,7 @@
   // bpp check
   bpp_conv = 0;
   if (!vo_dbpp) {
-    if (format == IMGFMT_YV12) bpp = 32;
+    if (!IMGFMT_IS_RGB(format) && !IMGFMT_IS_BGR(format)) bpp = 32;
     else bpp = format & 255;
     if (verbose)
       printf("vo_svga: vo_dbpp == 0, bpp: %d\n",bpp);
@@ -346,20 +404,10 @@
     list = list->next;
   }
 
-  if((vo_subdevice) && (strlen(vo_subdevice)>2)) {
-     if(!strncmp(vo_subdevice,"old",3)) {
-        oldmethod=1;
-        vo_subdevice+=3;
-        if( *vo_subdevice == ',' ) vo_subdevice++;
-     }
-  }
-
-  if((vo_subdevice)  && *vo_subdevice) {
-      int vm;
-      vm=vga_getmodenumber(vo_subdevice);
+  if(force_vm) {
       list=modelist;
       while(list) {
-          if(list->modenum == vm) {
+          if(list->modenum == force_vm) {
              buf_w = list->modeinfo.width;
              buf_h = list->modeinfo.height;
 	     res_widescr = (((buf_w*1.0)/buf_h) > (4.0/3)) ? 1 : 0;
@@ -394,12 +442,13 @@
                      }
                      break;
              }
-             vid_mode=vm;
+             vid_mode=force_vm;
              list=NULL;
       	  } else list=list->next;
       }
   }
 
+ 
   if (verbose)
     printf("vo_svga: vid_mode: %d\n",vid_mode);
   if (vga_setmode(vid_mode) == -1) {
@@ -427,13 +476,17 @@
   if(bpp==1)
     LINEWIDTH=(WIDTH+7)/8;
   else
-    LINEWIDTH=WIDTH*BYTESPERPIXEL;
+    LINEWIDTH=vga_getmodeinfo(vid_mode)->linewidth;
 
   vga_setlinearaddressing();
   if(oldmethod) {
      buffer=malloc(HEIGHT*LINEWIDTH);
      maxframes=0;
+  } else if ((vga_getmodeinfo(vid_mode)->flags&IS_LINEAR)) {
+  	directrender=1;
+	if(verbose) printf("vo_svga: Using direct rendering to linear video ram.\n");
   }
+  
   vga_claimvideomemory((maxframes+1)*HEIGHT*LINEWIDTH);
   GRAPH_MEM=vga_getgraphmem();
   frame=0;
@@ -441,8 +494,8 @@
   
   orig_w = width;
   orig_h = height;
-  maxw = orig_w;
-  maxh = orig_h;
+  maxw = req_w;
+  maxh = req_h;
 
   if (bpp_conv) {
     bppbuf = malloc(maxw * maxh * BYTESPERPIXEL);
@@ -453,11 +506,26 @@
     }  
   }
   
+  if(!vidix_name[0]){
+  	maxw = width; /* No scaling */
+  	maxh = height;
+  }	
+  if (pformat == IMGFMT_YV12) {
+    yuv2rgb_init(bpp, MODE_RGB);
+  }
+
   x_pos = (WIDTH - maxw) / 2;
   y_pos = (HEIGHT - maxh) / 2;
   
-  if (pformat == IMGFMT_YV12) {
-    yuv2rgb_init(bpp, MODE_RGB);
+#ifdef CONFIG_VIDIX
+  if(vidix_name[0]){ 
+  	vidix_init(width, height, x_pos, y_pos, maxw, maxh, format, bpp, 
+		  WIDTH, HEIGHT);
+  	printf("vo_svga: Using VIDIX. w=%i h=%i  mw=%i mh=%i\n",width,height,maxw,maxh);
+  	vidix_start();
+  }
+#endif    
+
     if(bpp==1)
       yuvbuf = malloc((maxw+7)/8 * maxh);
     else
@@ -468,8 +536,6 @@
       uninit();
       return (1);
     }
-  }
-
   printf("vo_svga: SVGAlib resolution: %dx%d %dbpp - ", WIDTH, HEIGHT, bpp);
   if (maxw != orig_w || maxh != orig_h) printf("Video scaled to: %dx%d\n",maxw,maxh);
   else printf("No video scaling\n");
@@ -481,16 +547,6 @@
 
 static uint32_t draw_frame(uint8_t *src[]) {
   uint8_t *s=src[0];
-#if 0
-  // draw_frame() is never called for YV12
-  if (pformat == IMGFMT_YV12) {
-    if(bpp==1)
-      yuv2rgb(yuvbuf, src[0], src[1], src[2], orig_w, orig_h, (orig_w+7)/8, orig_w, orig_w / 2);
-    else
-      yuv2rgb(yuvbuf, src[0], src[1], src[2], orig_w, orig_h, orig_w * BYTESPERPIXEL, orig_w, orig_w / 2);
-    s = yuvbuf;
-  }
-#endif
   if (bpp_conv) {
     switch(bpp) {
       case 32:
@@ -510,12 +566,19 @@
                            int w, int h, int x, int y) {
   uint8_t *src = yuvbuf;
   uint32_t sw, sh;
+
+  if(directrender) {
+  	  yuv2rgb(GRAPH_MEM+(frame*HEIGHT+y+y_pos)*LINEWIDTH+(x+x_pos)*BYTESPERPIXEL,
+		  	  image[0], image[1], image[2], w, h, LINEWIDTH, stride[0], stride[1]);
+  } else {
   if(bpp==1)
     yuv2rgb(yuvbuf, image[0], image[1], image[2], w, h, (orig_w+7)/8, stride[0], stride[1]);
   else
-    yuv2rgb(yuvbuf, image[0], image[1], image[2], w, h, orig_w * BYTESPERPIXEL, stride[0], stride[1]);
+		yuv2rgb(yuvbuf, image[0], image[1], image[2], w, h, orig_w * BYTESPERPIXEL, 
+				stride[0], stride[1]);
 
   putbox(x + x_pos, y + y_pos, w, h, src, 1);
+  }
 
   return (0);
 }
@@ -564,12 +627,18 @@
 static void uninit(void) {
   vga_modelist_t *list = modelist;
 
+#ifdef CONFIG_VIDIX
+  if(vidix_name[0])vidix_term();
+#endif
+  
   vga_setmode(TEXT);
 
   if (bppbuf != NULL)
     free(bppbuf);
+  bppbuf=NULL;
   if (yuvbuf != NULL)
     free(yuvbuf);
+  
   while (modelist != NULL) {
        list=modelist;
        modelist=modelist->next;
@@ -584,6 +653,8 @@
 static uint32_t add_mode(uint16_t mode, vga_modeinfo minfo) {
   vga_modelist_t *list;
 
+  if(squarepix && (minfo.height*4 != minfo.width*3)) return 0;
+  
   if (modelist == NULL) {
     modelist = (vga_modelist_t *) malloc(sizeof(vga_modelist_t));
     if (modelist == NULL) {
@@ -699,12 +770,6 @@
           return (res);
         } break;
         case IMGFMT_YV12: return (1); break;
-        case IMGFMT_RGB8:
-        case IMGFMT_BGR8: return ((bpp_avail & BPP_8) ? 1 : 0); break;
-        case IMGFMT_RGB4:
-        case IMGFMT_BGR4: return ((bpp_avail & BPP_4) ? 1 : 0); break;
-        case IMGFMT_RGB1:
-        case IMGFMT_BGR1: return ((bpp_avail & BPP_1) ? 1 : 0); break;
       }
     }
   return (0);