summaryrefslogtreecommitdiffstats
path: root/libvo
diff options
context:
space:
mode:
authoralex <alex@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-12-21 22:08:14 +0000
committeralex <alex@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-12-21 22:08:14 +0000
commit08346ddf826a1211654397e5d0995faf55e62409 (patch)
tree9552a11f70c82d8e443f91d95b97f1642ee281a7 /libvo
parent3d51a6039ae009c5f8ef22bfa5169da6134afb88 (diff)
downloadmpv-08346ddf826a1211654397e5d0995faf55e62409.tar.bz2
mpv-08346ddf826a1211654397e5d0995faf55e62409.tar.xz
vidix support and better device options handler by Matan Ziv-Av <matan@svgalib.org>
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@8516 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libvo')
-rw-r--r--libvo/vo_svga.c147
1 files changed, 106 insertions, 41 deletions
diff --git a/libvo/vo_svga.c b/libvo/vo_svga.c
index 3f9d623862..bf56591734 100644
--- a/libvo/vo_svga.c
+++ b/libvo/vo_svga.c
@@ -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 uint8_t *GRAPH_MEM;
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 @@ static vo_info_t info = {
""
};
+#ifdef CONFIG_VIDIX
+static char vidix_name[32] = "";
+#endif
+
LIBVO_EXTERN(svga)
static uint32_t preinit(const char *arg)
@@ -93,13 +105,55 @@ static uint32_t preinit(const char *arg)
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 control(uint32_t request, void *data, ...)
}
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 @@ static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width,
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 @@ static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width,
// 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 @@ static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width,
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 @@ static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width,
}
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 @@ static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width,
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 @@ static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width,
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 @@ static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width,
}
}
+ 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 @@ static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width,
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 config(uint32_t width, uint32_t height, uint32_t d_width,
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 @@ static uint32_t draw_slice(uint8_t *image[], int stride[],
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 check_events(void) {
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 void uninit(void) {
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 @@ static uint32_t query_format(uint32_t format) {
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);