mirror of
https://github.com/mpv-player/mpv
synced 2025-03-25 04:38:01 +00:00
Bad fix of libmpeg2 zooming
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@2329 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
c6e658f8b7
commit
ac12e3b6a4
@ -72,6 +72,8 @@ struct win_frame
|
||||
static int vesa_zoom=0; /* software scaling */
|
||||
static unsigned int scale_xinc=0;
|
||||
static unsigned int scale_yinc=0;
|
||||
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 */
|
||||
@ -233,10 +235,36 @@ static void __vbeCopyData(uint8_t *image)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void __vbeCopySliceData(uint8_t *image,int x, int y, int w, int h)
|
||||
{
|
||||
unsigned long i,j,image_offset,offset;
|
||||
unsigned pixel_size,image_line_size,screen_line_size,x_shift;
|
||||
pixel_size = (video_mode_info.BitsPerPixel+7)/8;
|
||||
screen_line_size = video_mode_info.XResolution*pixel_size;
|
||||
image_line_size = w*pixel_size;
|
||||
#if 0
|
||||
if(image_width == video_mode_info.XResolution && w == image_width)
|
||||
{
|
||||
/* Special case for zooming */
|
||||
__vbeCopyBlock((y_offset+y)*screen_line_size,image,image_line_size*image_height);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
x_shift = (x_offset+x)*pixel_size;
|
||||
for(j=0,i=y_offset+y;j<h;i++,j++)
|
||||
{
|
||||
offset = i*screen_line_size+x_shift;
|
||||
image_offset = j*image_line_size;
|
||||
__vbeCopyBlock(offset,&image[image_offset],image_line_size);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* is called for yuv only */
|
||||
static uint32_t draw_slice(uint8_t *image[], int stride[], int w,int h,int x,int y)
|
||||
{
|
||||
uint8_t *yuv_slice;
|
||||
if(vesa_zoom)
|
||||
{
|
||||
SwScale_YV12slice_brg24(image,stride,y,h,
|
||||
@ -244,29 +272,22 @@ static uint32_t draw_slice(uint8_t *image[], int stride[], int w,int h,int x,int
|
||||
image_width*((video_mode_info.BitsPerPixel+7)/8),
|
||||
image_width, video_mode_info.BitsPerPixel,
|
||||
scale_xinc, scale_yinc);
|
||||
if(y || x || w != image_width || h != image_height)
|
||||
{
|
||||
w = image_width;
|
||||
h = image_height;
|
||||
y = 0;
|
||||
x = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
yuv_slice=yuv_buffer+(image_width*y+x)*(video_mode_info.BitsPerPixel+7)/8;
|
||||
yuv2rgb(yuv_slice, image[0], image[1], image[2], w, h,
|
||||
yuv2rgb(yuv_buffer, image[0], image[1], image[2], w, h,
|
||||
image_width * ((video_mode_info.BitsPerPixel+7)/8),
|
||||
stride[0], stride[1]);
|
||||
}
|
||||
if(y || x || w != image_width || h != image_height)
|
||||
{
|
||||
unsigned long i,j,image_offset,offset;
|
||||
unsigned pixel_size,image_line_size,screen_line_size,x_shift;
|
||||
pixel_size = (video_mode_info.BitsPerPixel+7)/8;
|
||||
screen_line_size = video_mode_info.XResolution*pixel_size;
|
||||
image_line_size = w*pixel_size;
|
||||
x_shift = (x_offset+x)*pixel_size;
|
||||
for(j=0,i=(y_offset+y);j<h;i++,j++)
|
||||
{
|
||||
offset = i*screen_line_size+x_shift;
|
||||
image_offset = j*image_line_size;
|
||||
__vbeCopyBlock(offset,&yuv_slice[image_offset],image_line_size);
|
||||
}
|
||||
}
|
||||
__vbeCopySliceData((uint8_t*)yuv_buffer,x,y,w,h);
|
||||
else __vbeCopyData((uint8_t *)yuv_buffer);
|
||||
return 0;
|
||||
}
|
||||
@ -321,15 +342,14 @@ static void vesa_aspect(uint32_t width,uint32_t height,
|
||||
uint32_t xres,uint32_t yres,
|
||||
uint32_t *image_width,uint32_t *image_height)
|
||||
{
|
||||
float factor;
|
||||
factor = (float)width / height;
|
||||
aspect_factor = (float)width / height;
|
||||
*image_width = xres;
|
||||
*image_height = xres / factor;
|
||||
if(verbose) printf("vo_vesa: aspect factor = %f(%ux%u) *image=%ux%u screen=%ux%u\n",factor,width,height,*image_width,*image_height,xres,yres);
|
||||
*image_height = xres /aspect_factor;
|
||||
if(verbose) printf("vo_vesa: aspect factor = %f(%ux%u) *image=%ux%u screen=%ux%u\n",aspect_factor,width,height,*image_width,*image_height,xres,yres);
|
||||
if((*image_height) > yres)
|
||||
{
|
||||
*image_height = yres;
|
||||
*image_width = yres * factor;
|
||||
*image_width = yres * aspect_factor;
|
||||
if(verbose) printf("vo_vesa: Y > X tehrefore *image=%ux%u\n",*image_width,*image_height);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user