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
This commit is contained in:
alex 2002-12-21 22:08:14 +00:00
parent 3d51a6039a
commit 08346ddf82
1 changed files with 106 additions and 41 deletions

View File

@ -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);