# HG changeset patch # User nick # Date 1003660363 0 # Node ID fc52a0a1626ffecc1b40c24f477bcd0de5807b4d # Parent 00f64d5858b88c71e67eceeb4566849eb45c5667 Support of: -x -y -bpp diff -r 00f64d5858b8 -r fc52a0a1626f libvo/vo_vesa.c --- a/libvo/vo_vesa.c Sun Oct 21 07:02:40 2001 +0000 +++ b/libvo/vo_vesa.c Sun Oct 21 10:32:43 2001 +0000 @@ -76,7 +76,7 @@ static uint32_t image_width, image_height; /* source image dimension */ -static uint32_t x_offset,y_offset; /* to center image on screen */ +static int32_t x_offset,y_offset; /* to center image on screen */ static unsigned init_mode; /* mode before run of mplayer */ static void *init_state = NULL; /* state before run of mplayer */ static struct win_frame win; /* real-mode window to video memory */ @@ -350,7 +350,7 @@ { *image_height = yres; *image_width = yres * aspect_factor; - if(verbose) printf("vo_vesa: Y > X tehrefore *image=%ux%u\n",*image_width,*image_height); + if(verbose) printf("vo_vesa: Y > X therefore *image=%ux%u\n",*image_width,*image_height); } } @@ -379,21 +379,23 @@ * bit 3 (0x08) enables flipping (-flip) */ 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) +init(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint32_t flags, char *title, uint32_t format) { struct VbeInfoBlock vib; struct VesaModeInfoBlock vmib; size_t i,num_modes; + uint32_t w,h; unsigned short *mode_ptr,win_seg; unsigned bpp,best_x = UINT_MAX,best_y=UINT_MAX,best_mode_idx = UINT_MAX; int err; image_width = width; image_height = height; - if(fullscreen & (0x1|0x8)) + if(flags & 0x8) { - printf("vo_vesa: switches: -fs, -flip are not supported\n"); + printf("vo_vesa: switch -flip is not supported\n"); } - if(fullscreen & 0x04) vesa_zoom = 1; + if(flags & 0x04) vesa_zoom = 1; + if(flags & 0x01) vesa_zoom = 2; if((err=vbeInit()) != VBE_OK) { PRINT_VBE_ERR("vbeInit",err); return -1; } memcpy(vib.VESASignature,"VBE2",4); if((err=vbeGetControllerInfo(&vib)) != VBE_OK) @@ -427,6 +429,13 @@ num_modes = 0; mode_ptr = vib.VideoModePtr; while(*mode_ptr++ != 0xffff) num_modes++; + if(vo_dbpp) + { + bpp = vo_dbpp; + if(format == IMGFMT_YV12 || format == IMGFMT_I420 || format == IMGFMT_IYUV) + yuv2rgb_init(bpp, MODE_RGB); + } + else switch(format) { case IMGFMT_BGR8: @@ -458,6 +467,8 @@ printf("\nvo_vesa: Modes in detail:\n"); } mode_ptr = vib.VideoModePtr; + w = d_width ? d_width : width; + h = d_height ? d_height : height; for(i=0;i < num_modes;i++) { if((err=vbeGetModeInfo(mode_ptr[i],&vmib)) != VBE_OK) @@ -465,8 +476,8 @@ PRINT_VBE_ERR("vbeGetModeInfo",err); return -1; } - if(vmib.XResolution >= image_width && - vmib.YResolution >= image_height && + if(vmib.XResolution >= w && + vmib.YResolution >= h && (vmib.ModeAttributes & MOVIE_MODE) == MOVIE_MODE && vmib.BitsPerPixel == bpp && vmib.MemoryModel == memRGB) @@ -498,7 +509,6 @@ if(best_mode_idx != UINT_MAX) { video_mode = vib.VideoModePtr[best_mode_idx]; - printf("vo_vesa: Using VESA mode (%u) = %x\n",best_mode_idx,video_mode); fflush(stdout); if((err=vbeGetMode(&init_mode)) != VBE_OK) { @@ -511,21 +521,23 @@ PRINT_VBE_ERR("vbeGetModeInfo",err); return -1; } - if(!(yuv_buffer = malloc(video_mode_info.XResolution*video_mode_info.YResolution*4))) - { - printf("vo_vesa: Can't allocate temporary buffer\n"); - return -1; - } + printf("vo_vesa: Using VESA mode (%u) = %x [%ux%u@%u]\n" + ,best_mode_idx,video_mode,video_mode_info.XResolution + ,video_mode_info.YResolution,video_mode_info.BitsPerPixel); if( vesa_zoom ) { if( format==IMGFMT_YV12 ) { /* software scale */ + if(vesa_zoom > 1) + { + image_width = video_mode_info.XResolution; + image_height = video_mode_info.YResolution; + } + else vesa_aspect(width,height, video_mode_info.XResolution,video_mode_info.YResolution, &image_width,&image_height); -/* image_width = video_mode_info.XResolution; - image_height = video_mode_info.YResolution; */ scale_xinc=(width << 16) / image_width - 2; /* needed for proper rounding */ scale_yinc=(height << 16) / image_height + 2; SwScale_Init(); @@ -553,13 +565,22 @@ win.ptr = PhysToVirtSO(win_seg,0); win.low = 0L; win.high= video_mode_info.WinSize*1024; - x_offset = (video_mode_info.XResolution - image_width) / 2; - y_offset = (video_mode_info.YResolution - image_height) / 2; + if(video_mode_info.XResolution > image_width) + x_offset = (video_mode_info.XResolution - image_width) / 2; + else x_offset = 0; + if(video_mode_info.YResolution > image_height) + y_offset = (video_mode_info.YResolution - image_height) / 2; + else y_offset = 0; if(verbose) printf("vo_vesa: image: %ux%u screen = %ux%u x_offset = %u y_offset = %u\n" ,image_width,image_height ,video_mode_info.XResolution,video_mode_info.YResolution ,x_offset,y_offset); + if(!(yuv_buffer = malloc(image_width*image_height*bpp))) + { + printf("vo_vesa: Can't allocate temporary buffer\n"); + return -1; + } if((err=vbeSaveState(&init_state)) != VBE_OK) { PRINT_VBE_ERR("vbeSaveState",err);