[FFmpeg-devel] [PATCH 4/4] Make the crop filter accept parametric expressions.

Michael Niedermayer michaelni
Tue Sep 14 16:58:11 CEST 2010


On Tue, Sep 14, 2010 at 12:30:46PM +0200, Stefano Sabatini wrote:
> On date Tuesday 2010-09-14 01:23:34 +0200, Stefano Sabatini encoded:
> > Updated (I'll update the docs and the rest of FFmpeg when the rest is
> > approved).
> 
> Updated.
> -- 
> FFmpeg = Foolish & Friendly Minimalistic Powered Extended Gem

>  doc/ffmpeg-doc.texi       |    8 +-
>  doc/filters.texi          |   98 +++++++++++++++++++++-----
>  ffmpeg.c                  |    4 -
>  libavfilter/vf_crop.c     |  169 +++++++++++++++++++++++++++++++++++++++++++---
>  tests/lavfi-regression.sh |   10 +-
>  5 files changed, 250 insertions(+), 39 deletions(-)
> 5164e1a297084a68313fac8bc34297ff09688d77  0001-Make-the-crop-filter-accept-parametric-expressions.patch
> From a3a0bad25f20510180ab0b064f3f3d2c79c245a2 Mon Sep 17 00:00:00 2001
> From: Stefano Sabatini <stefano.sabatini-lala at poste.it>
> Date: Thu, 9 Sep 2010 01:05:04 +0200
> Subject: [PATCH] Make the crop filter accept parametric expressions.
> 
> ---
>  doc/ffmpeg-doc.texi       |    8 +-
>  doc/filters.texi          |   98 +++++++++++++++++++++-----
>  ffmpeg.c                  |    4 +-
>  libavfilter/vf_crop.c     |  169 ++++++++++++++++++++++++++++++++++++++++++---
>  tests/lavfi-regression.sh |   10 ++--
>  5 files changed, 250 insertions(+), 39 deletions(-)
> 
> diff --git a/doc/ffmpeg-doc.texi b/doc/ffmpeg-doc.texi
> index d9c5c14..e43e87e 100644
> --- a/doc/ffmpeg-doc.texi
> +++ b/doc/ffmpeg-doc.texi
> @@ -226,13 +226,13 @@ The following abbreviations are recognized:
>  
>  @item -aspect @var{aspect}
>  Set aspect ratio (4:3, 16:9 or 1.3333, 1.7777).
> - at item -croptop @var{size} (deprecated - use -vf crop=x:y:width:height instead)
> + at item -croptop @var{size} (deprecated - use the crop filter instead)
>  Set top crop band size (in pixels).
> - at item -cropbottom @var{size} (deprecated - use -vf crop=x:y:width:height instead)
> + at item -cropbottom @var{size} (deprecated - use the crop filter instead)
>  Set bottom crop band size (in pixels).
> - at item -cropleft @var{size} (deprecated - use -vf crop=x:y:width:height instead)
> + at item -cropleft @var{size} (deprecated - use the crop filter instead)
>  Set left crop band size (in pixels).
> - at item -cropright @var{size} (deprecated - use -vf crop=x:y:width:height instead)
> + at item -cropright @var{size} (deprecated - use the crop filter instead)
>  Set right crop band size (in pixels).
>  @item -padtop @var{size}
>  @item -padbottom @var{size}
> diff --git a/doc/filters.texi b/doc/filters.texi
> index 60ecf56..199b634 100644
> --- a/doc/filters.texi
> +++ b/doc/filters.texi
> @@ -26,34 +26,96 @@ Below is a description of the currently available video filters.
>  
>  @section crop
>  
> -Crop the input video to @var{x}:@var{y}:@var{width}:@var{height}.
> +Crop the input video to @var{crop_w}:@var{crop_h}:@var{x}:@var{y}.
>  
> - at example
> -./ffmpeg -i in.avi -vf "crop=0:0:0:240" out.avi
> - at end example
> +The parameters are expressions containing the following constants:
>  
> - at var{x} and @var{y} specify the position of the top-left corner of the
> -output (non-cropped) area.
> + at table @option
> + at item E, PI, PHI
> +the corresponding mathematical approximated values for e
> +(euler number), pi (greek PI), PHI (golden ratio)
>  
> -The default value of @var{x} and @var{y} is 0.
> + at item x, y
> +the computed values for @var{x} and @var{y}. They are evaluated for
> +each new frame.
> +
> + at item w, h
> +the input width and heigth
> +
> + at item crop_w, crop_h
> +the output (cropped) width and heigth
> +
> + at item n
> +the number of input frame, starting from 0
> +
> + at item pos
> +the position in the file of the input frame, NAN if unknown
> +
> + at item t
> +timestamp expressed in seconds, NAN if the input timestamp is invalid
> +
> + at end table
> +
> + at var{crop_width} and @var{crop_height} parameters specify the expressions for
> +the width and height of the output (cropped) video. They are
> +evaluated just at the configuration of the filter.
>  
> -The @var{width} and @var{height} parameters specify the width and height
> -of the output (non-cropped) area.
> +The default value of @var{crop_width} is "w", and the default value of
> + at var{crop_height} is "h".
>  
> -A value of 0 is interpreted as the maximum possible size contained in
> -the area delimited by the top-left corner at position x:y.
> +The expression for @var{crop_w} may depend on the value of
> + at var{crop_h}, and the expression for @var{crop_h} may depend on
> + at var{crop_h}, but they cannot depend on @var{y} and @var{y}, as
> + at var{x} and @var{y} are evaluated are evaluated after @var{crop_w} and
> + at var{crop_h}.
>  
> -For example the parameters:
> + at var{x} and @var{y} specify the expressions for the position of the
> +top-left corner of the output (non-cropped) area. They are evaluated
> +for each frame. If the evaluated value is not valid, it is
> +approximated to the nearest valid value.
>  
> +The default value of @var{x} is "(w-crop_w)/2", the default value for
> + at var{y} is "(h-crop_h)/2", which set the cropped area at the center of
> +the input image.
> +
> +The expression for @var{x} may depend on @var{y}, and the expression
> +for @var{y} may depend on @var{x}.
> +
> +Follow some examples:
>  @example
> -"crop=100:100:0:0"
> - at end example
> +# crop the central input area with size 100x100
> +crop=100:100
>  
> -will delimit the rectangle with the top-left corner placed at position
> -100:100 and the right-bottom corner corresponding to the right-bottom
> -corner of the input image.
> +# crop the central input area with size 2/3 of the input video
> +crop='2/3*w:2/3*h"
>  
> -The default value of @var{width} and @var{height} is 0.
> +# crop the input video central square
> +crop=h
> +
> +# delimit the rectangle with the top-left corner placed at position
> +# 100:100 and the right-bottom corner corresponding to the right-bottom
> +# corner of the input image.
> +crop=w-100:h-100:100:100
> +
> +# crop 10 pixels from the lefth and right borders, and 20 pixels from
> +# the top and bottom borders
> +"crop=w-2*10:h-2*20"
> +
> +# keep only the bottom right quarter of the input image
> +"crop=w/2:h/2:w/2:h/2"
> +
> +# crop height for getting Greek harmony
> +"crop=w:1/PHI*w"
> +
> +# trembling effect
> +crop='w/2:h/2:(w-crop_w)/2+((w-crop_w)/2)*sin(n/10):(h-crop_h)/2 +((h-crop_h)/2)*sin(n/7)'
> +
> +# erratic camera effect depending on timestamp
> +crop='20+20*sin(3*t):10+10*sin(2*t):w-2*x:h-2*y'
> +
> +# set x depending on the value of y
> +crop='y:10+10*sin(n/10):w-2*x:h-2*y'
> + at end example
>  
>  @section fifo
>  
> diff --git a/ffmpeg.c b/ffmpeg.c
> index da92581..edf7beb 100644
> --- a/ffmpeg.c
> +++ b/ffmpeg.c
> @@ -430,9 +430,7 @@ static int configure_filters(AVInputStream *ist, AVOutputStream *ost)
>      last_filter = ist->input_video_filter;
>  
>      if (ost->video_crop) {
> -        snprintf(args, 255, "%d:%d:%d:%d", ost->leftBand, ost->topBand,
> -                 codec->width,
> -                 codec->height);
> +        snprintf(args, 255, "%d:%d:%d:%d", codec->width, codec->height, ost->leftBand, ost->topBand);
>          if ((ret = avfilter_open(&filter, avfilter_get_by_name("crop"), NULL)) < 0)
>              return ret;
>          if ((ret = avfilter_init_filter(filter, args, NULL)) < 0)
> diff --git a/libavfilter/vf_crop.c b/libavfilter/vf_crop.c
> index 4f8a382..e7d798a 100644
> --- a/libavfilter/vf_crop.c
> +++ b/libavfilter/vf_crop.c
> @@ -24,8 +24,42 @@
>   */
>  
>  #include "avfilter.h"
> +#include "libavutil/eval.h"
> +#include "libavutil/avstring.h"
>  #include "libavcore/imgutils.h"
>  
> +static const char *var_names[] = {
> +    "E",
> +    "PHI",
> +    "PI",

> +    "w",      ///< width  of the input video
> +    "h",      ///< height of the input video
> +    "crop_w", ///< width  of the cropped video
> +    "crop_h", ///< height of the cropped video

i think these are poorly named as every filter (not just crop) has in and
out width/height and we should be consistent amongth all filters
iw/ow could be in/out with


except that ok if tested with slices and occasional NAN values as x/y

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

The misfortune of the wise is better than the prosperity of the fool.
-- Epicurus
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20100914/cf56aaf6/attachment.pgp>



More information about the ffmpeg-devel mailing list