From 6ab0d987add91595f0d01116d9506d06620719d1 Mon Sep 17 00:00:00 2001 From: arpi Date: Sun, 12 May 2002 19:06:15 +0000 Subject: keep aspect ratio - based on Fredrik Kuivinen's idea git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@6061 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libmpcodecs/vf_crop.c | 20 +++++++++++++------- libmpcodecs/vf_expand.c | 12 +++++++++--- libmpcodecs/vf_scale.c | 9 ++++++++- 3 files changed, 30 insertions(+), 11 deletions(-) (limited to 'libmpcodecs') diff --git a/libmpcodecs/vf_crop.c b/libmpcodecs/vf_crop.c index 9288b4f477..8b90621ebf 100644 --- a/libmpcodecs/vf_crop.c +++ b/libmpcodecs/vf_crop.c @@ -13,24 +13,30 @@ struct vf_priv_s { int crop_x,crop_y; }; +extern int opt_screen_size_x; +extern int opt_screen_size_y; + //===========================================================================// static int config(struct vf_instance_s* vf, int width, int height, int d_width, int d_height, unsigned int flags, unsigned int outfmt){ - int ret; - printf("crop->config() called\n"); // calculate the missing parameters: if(vf->priv->crop_w<=0 || vf->priv->crop_w>width) vf->priv->crop_w=width; if(vf->priv->crop_h<=0 || vf->priv->crop_h>height) vf->priv->crop_h=height; if(vf->priv->crop_x<0) vf->priv->crop_x=(width-vf->priv->crop_w)/2; if(vf->priv->crop_y<0) vf->priv->crop_y=(height-vf->priv->crop_h)/2; // check: - if(vf->priv->crop_w+vf->priv->crop_x>width) return 0; // bad width - if(vf->priv->crop_h+vf->priv->crop_y>height) return 0; // bad height - ret=vf_next_config(vf,vf->priv->crop_w,vf->priv->crop_h,d_width,d_height,flags,outfmt); - printf("crop->config() return %d\n",ret); - return ret; + if(vf->priv->crop_w+vf->priv->crop_x>width || + vf->priv->crop_h+vf->priv->crop_y>height){ + printf("crop: bad position/width/height - cropped area is out of the original!\n"); + return 0; + } + if(!opt_screen_size_x && !opt_screen_size_y){ + d_width=d_width*vf->priv->crop_w/width; + d_height=d_height*vf->priv->crop_h/height; + } + return vf_next_config(vf,vf->priv->crop_w,vf->priv->crop_h,d_width,d_height,flags,outfmt); } static void put_image(struct vf_instance_s* vf, mp_image_t *mpi){ diff --git a/libmpcodecs/vf_expand.c b/libmpcodecs/vf_expand.c index 0d4030adfb..b612ab390d 100644 --- a/libmpcodecs/vf_expand.c +++ b/libmpcodecs/vf_expand.c @@ -26,6 +26,9 @@ struct vf_priv_s { unsigned char* fb_ptr; }; +extern int opt_screen_size_x; +extern int opt_screen_size_y; + //===========================================================================// #ifdef OSD_SUPPORT @@ -143,7 +146,6 @@ static void draw_osd(struct vf_instance_s* vf_,int w,int h){ static int config(struct vf_instance_s* vf, int width, int height, int d_width, int d_height, unsigned int flags, unsigned int outfmt){ - int ret; // calculate the missing parameters: #if 0 if(vf->priv->exp_wpriv->exp_w=width; @@ -159,8 +161,12 @@ static int config(struct vf_instance_s* vf, if(vf->priv->exp_x<0 || vf->priv->exp_x+width>vf->priv->exp_w) vf->priv->exp_x=(vf->priv->exp_w-width)/2; if(vf->priv->exp_y<0 || vf->priv->exp_y+height>vf->priv->exp_h) vf->priv->exp_y=(vf->priv->exp_h-height)/2; vf->priv->fb_ptr=NULL; - ret=vf_next_config(vf,vf->priv->exp_w,vf->priv->exp_h,d_width,d_height,flags,outfmt); - return ret; + + if(!opt_screen_size_x && !opt_screen_size_y){ + d_width=d_width*vf->priv->exp_w/width; + d_height=d_height*vf->priv->exp_h/height; + } + return vf_next_config(vf,vf->priv->exp_w,vf->priv->exp_h,d_width,d_height,flags,outfmt); } // there are 4 cases: diff --git a/libmpcodecs/vf_scale.c b/libmpcodecs/vf_scale.c index 59fc956311..73c58574d8 100644 --- a/libmpcodecs/vf_scale.c +++ b/libmpcodecs/vf_scale.c @@ -19,6 +19,9 @@ struct vf_priv_s { SwsContext *ctx; }; +extern int opt_screen_size_x; +extern int opt_screen_size_y; + //===========================================================================// static unsigned int outfmt_list[]={ @@ -105,7 +108,11 @@ static int config(struct vf_instance_s* vf, return 0; } vf->priv->fmt=best; - + + if(!opt_screen_size_x && !opt_screen_size_y){ + d_width=d_width*vf->priv->w/width; + d_height=d_height*vf->priv->h/height; + } return vf_next_config(vf,vf->priv->w,vf->priv->h,d_width,d_height,flags,best); } -- cgit v1.2.3