mirror of
https://github.com/mpv-player/mpv
synced 2025-02-01 04:31:39 +00:00
Support of: -x -y -bpp
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@2330 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
ac12e3b6a4
commit
2255b29bfd
@ -76,7 +76,7 @@ static float aspect_factor;
|
||||
|
||||
|
||||
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 @@ static void vesa_aspect(uint32_t width,uint32_t height,
|
||||
{
|
||||
*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 @@ static char *model2str(unsigned char type)
|
||||
* 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 @@ init(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint3
|
||||
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 @@ init(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint3
|
||||
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 @@ init(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint3
|
||||
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 @@ init(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint3
|
||||
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 @@ init(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint3
|
||||
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 @@ init(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint3
|
||||
win.ptr = PhysToVirtSO(win_seg,0);
|
||||
win.low = 0L;
|
||||
win.high= video_mode_info.WinSize*1024;
|
||||
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);
|
||||
|
Loading…
Reference in New Issue
Block a user