# HG changeset patch # User ods15 # Date 1120766098 0 # Node ID 4119b6ef4e879dbf45046d50c33bb1b41fba131b # Parent cf34ac76bd15d1f52b90930af77e605d1a7aff94 add 'aspect' and 'round' params to vf_expand. (my first commit! I hope I did this correctly ;) diff -r cf34ac76bd15 -r 4119b6ef4e87 DOCS/man/en/mplayer.1 --- a/DOCS/man/en/mplayer.1 Thu Jul 07 17:35:05 2005 +0000 +++ b/DOCS/man/en/mplayer.1 Thu Jul 07 19:54:58 2005 +0000 @@ -4177,7 +4177,7 @@ .PD 1 . .TP -.B expand[=w:h:x:y:o] +.B expand[=w:h:x:y:o:a:r] Expands (not scales) movie resolution to the given value and places the unscaled original at coordinates x, y. Can be used for placing subtitles/\:OSD in the resulting black bands. @@ -4202,6 +4202,19 @@ .br 1: enable .REss +.IPs \ \ +Expands to an aspect instead of a resolution. (default: 0) +.sp 1 +.I EXAMPLE: +.PD 0 +.RSs +.IP expand=800::::3/4 +Expands to 800x600, unless the movie is higher resolution, then it +expands to fill a 3/4 aspect. +.RE +.PD 1 +.IPs \ \ +Rounds up to make both width and height divisable by r. (default: 1) .RE . .TP diff -r cf34ac76bd15 -r 4119b6ef4e87 libmpcodecs/vf_expand.c --- a/libmpcodecs/vf_expand.c Thu Jul 07 17:35:05 2005 +0000 +++ b/libmpcodecs/vf_expand.c Thu Jul 07 19:54:58 2005 +0000 @@ -27,12 +27,16 @@ int exp_w,exp_h; int exp_x,exp_y; int osd; + double aspect; + int round; unsigned char* fb_ptr; int first_slice; } vf_priv_dflt = { -1,-1, -1,-1, 0, + 0., + 1, NULL, 0 }; @@ -178,6 +182,18 @@ else if ( vf->priv->exp_h < -1 ) vf->priv->exp_h=height - vf->priv->exp_h; else if( vf->priv->exp_hpriv->exp_h=height; #endif + if (vf->priv->aspect) { + if (vf->priv->exp_h < vf->priv->exp_w * vf->priv->aspect) { + vf->priv->exp_h = vf->priv->exp_w * vf->priv->aspect; + } else { + vf->priv->exp_w = vf->priv->exp_h / vf->priv->aspect; + } + } + if (vf->priv->round > 1) { + vf->priv->exp_w = (1 + (vf->priv->exp_w - 1) / vf->priv->round) * vf->priv->round; + vf->priv->exp_h = (1 + (vf->priv->exp_h - 1) / vf->priv->round) * vf->priv->round; + } + 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; @@ -377,27 +393,14 @@ vf->draw_slice=draw_slice; vf->get_image=get_image; vf->put_image=put_image; - if(!vf->priv) { - vf->priv=malloc(sizeof(struct vf_priv_s)); - vf->priv->exp_x= - vf->priv->exp_y= - vf->priv->exp_w= - vf->priv->exp_h=-1; - vf->priv->osd=0; - // parse args -> - } // if(!vf->priv) - if(args) sscanf(args, "%d:%d:%d:%d:%d", - &vf->priv->exp_w, - &vf->priv->exp_h, - &vf->priv->exp_x, - &vf->priv->exp_y, - &vf->priv->osd); - mp_msg(MSGT_VFILTER, MSGL_INFO, "Expand: %d x %d, %d ; %d (-1=autodetect) osd: %d\n", + mp_msg(MSGT_VFILTER, MSGL_INFO, "Expand: %d x %d, %d ; %d, osd: %d, aspect: %lf, round: %d\n", vf->priv->exp_w, vf->priv->exp_h, vf->priv->exp_x, vf->priv->exp_y, - vf->priv->osd); + vf->priv->osd, + vf->priv->aspect, + vf->priv->round); return 1; } @@ -408,6 +411,8 @@ {"x", ST_OFF(exp_x), CONF_TYPE_INT, M_OPT_MIN, -1, 0, NULL}, {"y", ST_OFF(exp_y), CONF_TYPE_INT, M_OPT_MIN, -1, 0, NULL}, {"osd", ST_OFF(osd), CONF_TYPE_FLAG, 0 , 0, 1, NULL}, + {"aspect", ST_OFF(aspect), CONF_TYPE_DOUBLE, M_OPT_MIN, 0, 0, NULL}, + {"round", ST_OFF(round), CONF_TYPE_INT, M_OPT_MIN, 1, 0, NULL}, { NULL, NULL, 0, 0, 0, 0, NULL } };