diff options
author | nick <nick@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2001-10-21 07:02:40 +0000 |
---|---|---|
committer | nick <nick@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2001-10-21 07:02:40 +0000 |
commit | ac12e3b6a455e71ebf8f4a86739d4b7cf302510b (patch) | |
tree | 6e50d84a0693c94f1e3969ed42bf851f8cef05bc /libvo | |
parent | c6e658f8b75971e6eac86baa8b7a0c6be0c70b16 (diff) |
Bad fix of libmpeg2 zooming
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@2329 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libvo')
-rw-r--r-- | libvo/vo_vesa.c | 64 |
1 files changed, 42 insertions, 22 deletions
diff --git a/libvo/vo_vesa.c b/libvo/vo_vesa.c index 8b5edacb84..9a100bb122 100644 --- a/libvo/vo_vesa.c +++ b/libvo/vo_vesa.c @@ -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); } } |