Merge commit '335c31293baec6e6cf5907bd29840af3de8ff735'
authorMichael Niedermayer <michaelni@gmx.at>
Wed, 10 Apr 2013 16:11:15 +0000 (18:11 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Wed, 10 Apr 2013 16:11:15 +0000 (18:11 +0200)
* commit '335c31293baec6e6cf5907bd29840af3de8ff735':
  vf_drawbox: switch to an AVOptions-based system.

Conflicts:
doc/filters.texi
libavfilter/vf_drawbox.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
doc/filters.texi
libavfilter/avfilter.c
libavfilter/vf_drawbox.c

@@@ -1728,969 -807,117 +1728,964 @@@ sine=frequency=220:beep_factor=4:durati
  
  @end itemize
  
 -@section drawbox
 +@c man end AUDIO SOURCES
  
 -Draw a colored box on the input image.
 +@chapter Audio Sinks
 +@c man begin AUDIO SINKS
  
 -This filter accepts the following options:
 +Below is a description of the currently available audio sinks.
  
 -@table @option
 +@section abuffersink
  
 -@item x, y
 -Specify the top left corner coordinates of the box. Default to 0.
 +Buffer audio frames, and make them available to the end of filter chain.
  
 -@item width, height
 -Specify the width and height of the box, if 0 they are interpreted as
 -the input width and height. Default to 0.
 +This sink is mainly intended for programmatic use, in particular
 +through the interface defined in @file{libavfilter/buffersink.h}.
  
 -@item color
 -Specify the color of the box to write, it can be the name of a color
 -(case insensitive match) or a 0xRRGGBB[AA] sequence.
 -@end table
 +It requires a pointer to an AVABufferSinkContext structure, which
 +defines the incoming buffers' formats, to be passed as the opaque
 +parameter to @code{avfilter_init_filter} for initialization.
  
 -Follow some examples:
 -@example
 -# draw a black box around the edge of the input image
 -drawbox
 +@section anullsink
  
 -# draw a box with color red and an opacity of 50%
 -drawbox=x=10:y=20:width=200:height=60:color=red@@0.5"
 -@end example
 +Null audio sink, do absolutely nothing with the input audio. It is
 +mainly useful as a template and to be employed in analysis / debugging
 +tools.
  
 -@section drawtext
 +@section abuffersink
 +This sink is intended for programmatic use. Frames that arrive on this sink can
 +be retrieved by the calling program using the interface defined in
 +@file{libavfilter/buffersink.h}.
  
 -Draw text string or text from specified file on top of video using the
 -libfreetype library.
 +This filter accepts no parameters.
  
 -To enable compilation of this filter you need to configure Libav with
 -@code{--enable-libfreetype}.
 +@c man end AUDIO SINKS
  
 -The filter also recognizes strftime() sequences in the provided text
 -and expands them accordingly. Check the documentation of strftime().
 +@chapter Video Filters
 +@c man begin VIDEO FILTERS
  
 -The filter accepts parameters as a list of @var{key}=@var{value} pairs,
 -separated by ":".
 +When you configure your FFmpeg build, you can disable any of the
 +existing filters using @code{--disable-filters}.
 +The configure output will show the video filters included in your
 +build.
  
 -The description of the accepted parameters follows.
 +Below is a description of the currently available video filters.
  
 -@table @option
 +@section alphaextract
  
 -@item fontfile
 -The font file to be used for drawing text. Path must be included.
 -This parameter is mandatory.
 +Extract the alpha component from the input as a grayscale video. This
 +is especially useful with the @var{alphamerge} filter.
  
 -@item text
 -The text string to be drawn. The text must be a sequence of UTF-8
 -encoded characters.
 -This parameter is mandatory if no file is specified with the parameter
 -@var{textfile}.
 +@section alphamerge
  
 -@item textfile
 -A text file containing text to be drawn. The text must be a sequence
 -of UTF-8 encoded characters.
 +Add or replace the alpha component of the primary input with the
 +grayscale value of a second input. This is intended for use with
 +@var{alphaextract} to allow the transmission or storage of frame
 +sequences that have alpha in a format that doesn't support an alpha
 +channel.
  
 -This parameter is mandatory if no text string is specified with the
 -parameter @var{text}.
 +For example, to reconstruct full frames from a normal YUV-encoded video
 +and a separate video created with @var{alphaextract}, you might use:
 +@example
 +movie=in_alpha.mkv [alpha]; [in][alpha] alphamerge [out]
 +@end example
  
 -If both text and textfile are specified, an error is thrown.
 +Since this filter is designed for reconstruction, it operates on frame
 +sequences without considering timestamps, and terminates when either
 +input reaches end of stream. This will cause problems if your encoding
 +pipeline drops frames. If you're trying to apply an image as an
 +overlay to a video stream, consider the @var{overlay} filter instead.
  
 -@item x, y
 -The offsets where text will be drawn within the video frame.
 -Relative to the top/left border of the output image.
 -They accept expressions similar to the @ref{overlay} filter:
 -@table @option
 +@section ass
  
 -@item x, y
 -the computed values for @var{x} and @var{y}. They are evaluated for
 -each new frame.
 +Same as the @ref{subtitles} filter, except that it doesn't require libavcodec
 +and libavformat to work. On the other hand, it is limited to ASS (Advanced
 +Substation Alpha) subtitles files.
  
 -@item main_w, main_h
 -main input width and height
 +@section bbox
  
 -@item W, H
 -same as @var{main_w} and @var{main_h}
 +Compute the bounding box for the non-black pixels in the input frame
 +luminance plane.
  
 -@item text_w, text_h
 -rendered text width and height
 +This filter computes the bounding box containing all the pixels with a
 +luminance value greater than the minimum allowed value.
 +The parameters describing the bounding box are printed on the filter
 +log.
  
 -@item w, h
 -same as @var{text_w} and @var{text_h}
 +@section blackdetect
  
 -@item n
 -the number of frames processed, starting from 0
 +Detect video intervals that are (almost) completely black. Can be
 +useful to detect chapter transitions, commercials, or invalid
 +recordings. Output lines contains the time for the start, end and
 +duration of the detected black interval expressed in seconds.
  
 -@item t
 -timestamp expressed in seconds, NAN if the input timestamp is unknown
 +In order to display the output lines, you need to set the loglevel at
 +least to the AV_LOG_INFO value.
  
 -@end table
 +This filter accepts a list of options in the form of
 +@var{key}=@var{value} pairs separated by ":". A description of the
 +accepted options follows.
  
 -The default value of @var{x} and @var{y} is 0.
 +@table @option
 +@item black_min_duration, d
 +Set the minimum detected black duration expressed in seconds. It must
 +be a non-negative floating point number.
  
 -@item fontsize
 -The font size to be used for drawing text.
 -The default value of @var{fontsize} is 16.
 +Default value is 2.0.
  
 -@item fontcolor
 -The color to be used for drawing fonts.
 -Either a string (e.g. "red") or in 0xRRGGBB[AA] format
 -(e.g. "0xff000033"), possibly followed by an alpha specifier.
 -The default value of @var{fontcolor} is "black".
 +@item picture_black_ratio_th, pic_th
 +Set the threshold for considering a picture "black".
 +Express the minimum value for the ratio:
 +@example
 +@var{nb_black_pixels} / @var{nb_pixels}
 +@end example
  
 -@item boxcolor
 -The color to be used for drawing box around text.
 -Either a string (e.g. "yellow") or in 0xRRGGBB[AA] format
 +for which a picture is considered black.
 +Default value is 0.98.
 +
 +@item pixel_black_th, pix_th
 +Set the threshold for considering a pixel "black".
 +
 +The threshold expresses the maximum pixel luminance value for which a
 +pixel is considered "black". The provided value is scaled according to
 +the following equation:
 +@example
 +@var{absolute_threshold} = @var{luminance_minimum_value} + @var{pixel_black_th} * @var{luminance_range_size}
 +@end example
 +
 +@var{luminance_range_size} and @var{luminance_minimum_value} depend on
 +the input video format, the range is [0-255] for YUV full-range
 +formats and [16-235] for YUV non full-range formats.
 +
 +Default value is 0.10.
 +@end table
 +
 +The following example sets the maximum pixel threshold to the minimum
 +value, and detects only black intervals of 2 or more seconds:
 +@example
 +blackdetect=d=2:pix_th=0.00
 +@end example
 +
 +@section blackframe
 +
 +Detect frames that are (almost) completely black. Can be useful to
 +detect chapter transitions or commercials. Output lines consist of
 +the frame number of the detected frame, the percentage of blackness,
 +the position in the file if known or -1 and the timestamp in seconds.
 +
 +In order to display the output lines, you need to set the loglevel at
 +least to the AV_LOG_INFO value.
 +
 +The filter accepts parameters as a list of @var{key}=@var{value}
 +pairs, separated by ":". If the key of the first options is omitted,
 +the arguments are interpreted according to the syntax
 +blackframe[=@var{amount}[:@var{threshold}]].
 +
 +The filter accepts the following options:
 +
 +@table @option
 +
 +@item amount
 +The percentage of the pixels that have to be below the threshold, defaults to
 +98.
 +
 +@item threshold
 +Threshold below which a pixel value is considered black, defaults to 32.
 +
 +@end table
 +
 +@section blend
 +
 +Blend two video frames into each other.
 +
 +It takes two input streams and outputs one stream, the first input is the
 +"top" layer and second input is "bottom" layer.
 +Output terminates when shortest input terminates.
 +
 +This filter accepts a list of options in the form of @var{key}=@var{value}
 +pairs separated by ":". A description of the accepted options follows.
 +
 +@table @option
 +@item c0_mode
 +@item c1_mode
 +@item c2_mode
 +@item c3_mode
 +@item all_mode
 +Set blend mode for specific pixel component or all pixel components in case
 +of @var{all_mode}. Default value is @code{normal}.
 +
 +Available values for component modes are:
 +@table @samp
 +@item addition
 +@item and
 +@item average
 +@item burn
 +@item darken
 +@item difference
 +@item divide
 +@item dodge
 +@item exclusion
 +@item hardlight
 +@item lighten
 +@item multiply
 +@item negation
 +@item normal
 +@item or
 +@item overlay
 +@item phoenix
 +@item pinlight
 +@item reflect
 +@item screen
 +@item softlight
 +@item subtract
 +@item vividlight
 +@item xor
 +@end table
 +
 +@item c0_opacity
 +@item c1_opacity
 +@item c2_opacity
 +@item c3_opacity
 +@item all_opacity
 +Set blend opacity for specific pixel component or all pixel components in case
 +of @var{all_opacity}. Only used in combination with pixel component blend modes.
 +
 +@item c0_expr
 +@item c1_expr
 +@item c2_expr
 +@item c3_expr
 +@item all_expr
 +Set blend expression for specific pixel component or all pixel components in case
 +of @var{all_expr}. Note that related mode options will be ignored if those are set.
 +
 +The expressions can use the following variables:
 +
 +@table @option
 +@item N
 +The sequential number of the filtered frame, starting from @code{0}.
 +
 +@item X
 +@item Y
 +the coordinates of the current sample
 +
 +@item W
 +@item H
 +the width and height of currently filtered plane
 +
 +@item SW
 +@item SH
 +Width and height scale depending on the currently filtered plane. It is the
 +ratio between the corresponding luma plane number of pixels and the current
 +plane ones. E.g. for YUV4:2:0 the values are @code{1,1} for the luma plane, and
 +@code{0.5,0.5} for chroma planes.
 +
 +@item T
 +Time of the current frame, expressed in seconds.
 +
 +@item TOP, A
 +Value of pixel component at current location for first video frame (top layer).
 +
 +@item BOTTOM, B
 +Value of pixel component at current location for second video frame (bottom layer).
 +@end table
 +@end table
 +
 +@subsection Examples
 +
 +@itemize
 +@item
 +Apply transition from bottom layer to top layer in first 10 seconds:
 +@example
 +blend=all_expr='A*(if(gte(T,10),1,T/10))+B*(1-(if(gte(T,10),1,T/10)))'
 +@end example
 +
 +@item
 +Apply 1x1 checkerboard effect:
 +@example
 +blend=all_expr='if(eq(mod(X,2),mod(Y,2)),A,B)'
 +@end example
 +@end itemize
 +
 +@section boxblur
 +
 +Apply boxblur algorithm to the input video.
 +
 +The filter accepts parameters as a list of @var{key}=@var{value}
 +pairs, separated by ":". If the key of the first options is omitted,
 +the arguments are interpreted according to the syntax
 +@option{luma_radius}:@option{luma_power}:@option{chroma_radius}:@option{chroma_power}:@option{alpha_radius}:@option{alpha_power}.
 +
 +This filter accepts the following options:
 +
 +@table @option
 +
 +@item luma_radius
 +@item luma_power
 +@item chroma_radius
 +@item chroma_power
 +@item alpha_radius
 +@item alpha_power
 +
 +@end table
 +
 +A description of the accepted options follows.
 +
 +@table @option
 +@item luma_radius, lr
 +@item chroma_radius, cr
 +@item alpha_radius, ar
 +Set an expression for the box radius in pixels used for blurring the
 +corresponding input plane.
 +
 +The radius value must be a non-negative number, and must not be
 +greater than the value of the expression @code{min(w,h)/2} for the
 +luma and alpha planes, and of @code{min(cw,ch)/2} for the chroma
 +planes.
 +
 +Default value for @option{luma_radius} is "2". If not specified,
 +@option{chroma_radius} and @option{alpha_radius} default to the
 +corresponding value set for @option{luma_radius}.
 +
 +The expressions can contain the following constants:
 +@table @option
 +@item w, h
 +the input width and height in pixels
 +
 +@item cw, ch
 +the input chroma image width and height in pixels
 +
 +@item hsub, vsub
 +horizontal and vertical chroma subsample values. For example for the
 +pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1.
 +@end table
 +
 +@item luma_power, lp
 +@item chroma_power, cp
 +@item alpha_power, ap
 +Specify how many times the boxblur filter is applied to the
 +corresponding plane.
 +
 +Default value for @option{luma_power} is 2. If not specified,
 +@option{chroma_power} and @option{alpha_power} default to the
 +corresponding value set for @option{luma_power}.
 +
 +A value of 0 will disable the effect.
 +@end table
 +
 +@subsection Examples
 +
 +@itemize
 +@item
 +Apply a boxblur filter with luma, chroma, and alpha radius
 +set to 2:
 +@example
 +boxblur=luma_radius=2:luma_power=1
 +boxblur=2:1
 +@end example
 +
 +@item
 +Set luma radius to 2, alpha and chroma radius to 0:
 +@example
 +boxblur=2:1:cr=0:ar=0
 +@end example
 +
 +@item
 +Set luma and chroma radius to a fraction of the video dimension:
 +@example
 +boxblur=luma_radius=min(h\,w)/10:luma_power=1:chroma_radius=min(cw\,ch)/10:chroma_power=1
 +@end example
 +@end itemize
 +
 +@section colormatrix
 +
 +Convert color matrix.
 +
 +The filter accepts parameters as a list of @var{key}=@var{value}
 +pairs, separated by ":". If the key of the first options is omitted,
 +the arguments are interpreted according to the syntax
 +@var{src}:@var{dst}.
 +
 +A description of the accepted options follows:
 +@table @option
 +@item src
 +@item dst
 +Specify the source and destination color matrix. Both values must be
 +specified.
 +
 +The accepted values are:
 +@table @samp
 +@item bt709
 +BT.709
 +
 +@item bt601
 +BT.601
 +
 +@item smpte240m
 +SMPTE-240M
 +
 +@item fcc
 +FCC
 +@end table
 +@end table
 +
 +For example to convert from BT.601 to SMPTE-240M, use the command:
 +@example
 +colormatrix=bt601:smpte240m
 +@end example
 +
 +@section copy
 +
 +Copy the input source unchanged to the output. Mainly useful for
 +testing purposes.
 +
 +@section crop
 +
 +Crop the input video to given dimensions.
 +
 +This filter accepts a list of @var{key}=@var{value} pairs as argument,
 +separated by ':'. If the key of the first options is omitted, the
 +arguments are interpreted according to the syntax
 +@var{out_w}:@var{out_h}:@var{x}:@var{y}:@var{keep_aspect}.
 +
 +A description of the accepted options follows:
 +@table @option
 +@item w, out_w
 +Width of the output video. It defaults to @code{iw}.
 +This expression is evaluated only once during the filter
 +configuration.
 +
 +@item h, out_h
 +Height of the output video. It defaults to @code{ih}.
 +This expression is evaluated only once during the filter
 +configuration.
 +
 +@item x
 +Horizontal position, in the input video, of the left edge of the output video.
 +It defaults to @code{(in_w-out_w)/2}.
 +This expression is evaluated per-frame.
 +
 +@item y
 +Vertical position, in the input video, of the top edge of the output video.
 +It defaults to @code{(in_h-out_h)/2}.
 +This expression is evaluated per-frame.
 +
 +@item keep_aspect
 +If set to 1 will force the output display aspect ratio
 +to be the same of the input, by changing the output sample aspect
 +ratio. It defaults to 0.
 +@end table
 +
 +The @var{out_w}, @var{out_h}, @var{x}, @var{y} parameters are
 +expressions containing the following constants:
 +
 +@table @option
 +@item x, y
 +the computed values for @var{x} and @var{y}. They are evaluated for
 +each new frame.
 +
 +@item in_w, in_h
 +the input width and height
 +
 +@item iw, ih
 +same as @var{in_w} and @var{in_h}
 +
 +@item out_w, out_h
 +the output (cropped) width and height
 +
 +@item ow, oh
 +same as @var{out_w} and @var{out_h}
 +
 +@item a
 +same as @var{iw} / @var{ih}
 +
 +@item sar
 +input sample aspect ratio
 +
 +@item dar
 +input display aspect ratio, it is the same as (@var{iw} / @var{ih}) * @var{sar}
 +
 +@item hsub, vsub
 +horizontal and vertical chroma subsample values. For example for the
 +pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1.
 +
 +@item n
 +the number of input frame, starting from 0
 +
 +@item t
 +timestamp expressed in seconds, NAN if the input timestamp is unknown
 +
 +@end table
 +
 +The expression for @var{out_w} may depend on the value of @var{out_h},
 +and the expression for @var{out_h} may depend on @var{out_w}, but they
 +cannot depend on @var{x} and @var{y}, as @var{x} and @var{y} are
 +evaluated after @var{out_w} and @var{out_h}.
 +
 +The @var{x} and @var{y} parameters 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 expression for @var{x} may depend on @var{y}, and the expression
 +for @var{y} may depend on @var{x}.
 +
 +@subsection Examples
 +
 +@itemize
 +@item
 +Crop area with size 100x100 at position (12,34).
 +@example
 +crop=100:100:12:34
 +@end example
 +
 +Using named options, the example above becomes:
 +@example
 +crop=w=100:h=100:x=12:y=34
 +@end example
 +
 +@item
 +Crop the central input area with size 100x100:
 +@example
 +crop=100:100
 +@end example
 +
 +@item
 +Crop the central input area with size 2/3 of the input video:
 +@example
 +crop=2/3*in_w:2/3*in_h
 +@end example
 +
 +@item
 +Crop the input video central square:
 +@example
 +crop=out_w=in_h
 +crop=in_h
 +@end example
 +
 +@item
 +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:
 +@example
 +crop=in_w-100:in_h-100:100:100
 +@end example
 +
 +@item
 +Crop 10 pixels from the left and right borders, and 20 pixels from
 +the top and bottom borders
 +@example
 +crop=in_w-2*10:in_h-2*20
 +@end example
 +
 +@item
 +Keep only the bottom right quarter of the input image:
 +@example
 +crop=in_w/2:in_h/2:in_w/2:in_h/2
 +@end example
 +
 +@item
 +Crop height for getting Greek harmony:
 +@example
 +crop=in_w:1/PHI*in_w
 +@end example
 +
 +@item
 +Appply trembling effect:
 +@example
 +crop=in_w/2:in_h/2:(in_w-out_w)/2+((in_w-out_w)/2)*sin(n/10):(in_h-out_h)/2 +((in_h-out_h)/2)*sin(n/7)
 +@end example
 +
 +@item
 +Apply erratic camera effect depending on timestamp:
 +@example
 +crop=in_w/2:in_h/2:(in_w-out_w)/2+((in_w-out_w)/2)*sin(t*10):(in_h-out_h)/2 +((in_h-out_h)/2)*sin(t*13)"
 +@end example
 +
 +@item
 +Set x depending on the value of y:
 +@example
 +crop=in_w/2:in_h/2:y:10+10*sin(n/10)
 +@end example
 +@end itemize
 +
 +@section cropdetect
 +
 +Auto-detect crop size.
 +
 +Calculate necessary cropping parameters and prints the recommended
 +parameters through the logging system. The detected dimensions
 +correspond to the non-black area of the input video.
 +
 +The filter accepts parameters as a list of @var{key}=@var{value}
 +pairs, separated by ":". If the key of the first options is omitted,
 +the arguments are interpreted according to the syntax
 +[@option{limit}[:@option{round}[:@option{reset}]]].
 +
 +A description of the accepted options follows.
 +
 +@table @option
 +
 +@item limit
 +Set higher black value threshold, which can be optionally specified
 +from nothing (0) to everything (255). An intensity value greater
 +to the set value is considered non-black. Default value is 24.
 +
 +@item round
 +Set the value for which the width/height should be divisible by. The
 +offset is automatically adjusted to center the video. Use 2 to get
 +only even dimensions (needed for 4:2:2 video). 16 is best when
 +encoding to most video codecs. Default value is 16.
 +
 +@item reset
 +Set the counter that determines after how many frames cropdetect will
 +reset the previously detected largest video area and start over to
 +detect the current optimal crop area. Default value is 0.
 +
 +This can be useful when channel logos distort the video area. 0
 +indicates never reset and return the largest area encountered during
 +playback.
 +@end table
 +
 +@section curves
 +
 +Apply color adjustments using curves.
 +
 +This filter is similar to the Adobe Photoshop and GIMP curves tools. Each
 +component (red, green and blue) has its values defined by @var{N} key points
 +tied from each other using a smooth curve. The x-axis represents the pixel
 +values from the input frame, and the y-axis the new pixel values to be set for
 +the output frame.
 +
 +By default, a component curve is defined by the two points @var{(0;0)} and
 +@var{(1;1)}. This creates a straight line where each original pixel value is
 +"adjusted" to its own value, which means no change to the image.
 +
 +The filter allows you to redefine these two points and add some more. A new
 +curve (using a natural cubic spline interpolation) will be define to pass
 +smoothly through all these new coordinates. The new defined points needs to be
 +strictly increasing over the x-axis, and their @var{x} and @var{y} values must
 +be in the @var{[0;1]} interval.  If the computed curves happened to go outside
 +the vector spaces, the values will be clipped accordingly.
 +
 +If there is no key point defined in @code{x=0}, the filter will automatically
 +insert a @var{(0;0)} point. In the same way, if there is no key point defined
 +in @code{x=1}, the filter will automatically insert a @var{(1;1)} point.
 +
 +The filter accepts parameters as a list of @var{key}=@var{value}
 +pairs, separated by ":". If the key of the first options is omitted,
 +the arguments are interpreted according to the syntax
 +curves[=@var{preset}].
 +
 +A description of the accepted parameters follows.
 +
 +@table @option
 +@item red, r
 +Set the key points for the red component.
 +@item green, g
 +Set the key points for the green component.
 +@item blue, b
 +Set the key points for the blue component.
 +@item preset
 +Select one of the available color presets. This option can not be used in
 +addition to the @option{r}, @option{g}, @option{b} parameters.
 +Available presets are:
 +@table @samp
 +@item color_negative
 +@item cross_process
 +@item darker
 +@item increase_contrast
 +@item lighter
 +@item linear_contrast
 +@item medium_contrast
 +@item negative
 +@item strong_contrast
 +@item vintage
 +@end table
 +Default is unset.
 +@end table
 +
 +To avoid some filtergraph syntax conflicts, each key points list need to be
 +defined using the following syntax: @code{x0/y0 x1/y1 x2/y2 ...}.
 +
 +@subsection Examples
 +
 +@itemize
 +@item
 +Increase slightly the middle level of blue:
 +@example
 +curves=blue='0.5/0.58'
 +@end example
 +
 +@item
 +Vintage effect:
 +@example
 +curves=r='0/0.11 .42/.51 1/0.95':g='0.50/0.48':b='0/0.22 .49/.44 1/0.8'
 +@end example
 +Here we obtain the following coordinates for each components:
 +@table @var
 +@item red
 +@code{(0;0.11) (0.42;0.51) (1;0.95)}
 +@item green
 +@code{(0;0) (0.50;0.48) (1;1)}
 +@item blue
 +@code{(0;0.22) (0.49;0.44) (1;0.80)}
 +@end table
 +
 +@item
 +The previous example can also be achieved with the associated built-in preset:
 +@example
 +curves=preset=vintage
 +@end example
 +
 +@item
 +Or simply:
 +@example
 +curves=vintage
 +@end example
 +@end itemize
 +
 +@section decimate
 +
 +Drop frames that do not differ greatly from the previous frame in
 +order to reduce frame rate.
 +
 +The main use of this filter is for very-low-bitrate encoding
 +(e.g. streaming over dialup modem), but it could in theory be used for
 +fixing movies that were inverse-telecined incorrectly.
 +
 +The filter accepts parameters as a list of @var{key}=@var{value}
 +pairs, separated by ":". If the key of the first options is omitted,
 +the arguments are interpreted according to the syntax:
 +@option{max}:@option{hi}:@option{lo}:@option{frac}.
 +
 +A description of the accepted options follows.
 +
 +@table @option
 +@item max
 +Set the maximum number of consecutive frames which can be dropped (if
 +positive), or the minimum interval between dropped frames (if
 +negative). If the value is 0, the frame is dropped unregarding the
 +number of previous sequentially dropped frames.
 +
 +Default value is 0.
 +
 +@item hi
 +@item lo
 +@item frac
 +Set the dropping threshold values.
 +
 +Values for @option{hi} and @option{lo} are for 8x8 pixel blocks and
 +represent actual pixel value differences, so a threshold of 64
 +corresponds to 1 unit of difference for each pixel, or the same spread
 +out differently over the block.
 +
 +A frame is a candidate for dropping if no 8x8 blocks differ by more
 +than a threshold of @option{hi}, and if no more than @option{frac} blocks (1
 +meaning the whole image) differ by more than a threshold of @option{lo}.
 +
 +Default value for @option{hi} is 64*12, default value for @option{lo} is
 +64*5, and default value for @option{frac} is 0.33.
 +@end table
 +
 +@section delogo
 +
 +Suppress a TV station logo by a simple interpolation of the surrounding
 +pixels. Just set a rectangle covering the logo and watch it disappear
 +(and sometimes something even uglier appear - your mileage may vary).
 +
 +This filter accepts the following options:
 +@table @option
 +
 +@item x, y
 +Specify the top left corner coordinates of the logo. They must be
 +specified.
 +
 +@item w, h
 +Specify the width and height of the logo to clear. They must be
 +specified.
 +
 +@item band, t
 +Specify the thickness of the fuzzy edge of the rectangle (added to
 +@var{w} and @var{h}). The default value is 4.
 +
 +@item show
 +When set to 1, a green rectangle is drawn on the screen to simplify
 +finding the right @var{x}, @var{y}, @var{w}, @var{h} parameters, and
 +@var{band} is set to 4. The default value is 0.
 +
 +@end table
 +
 +@subsection Examples
 +
 +@itemize
 +@item
 +Set a rectangle covering the area with top left corner coordinates 0,0
 +and size 100x77, setting a band of size 10:
 +@example
 +delogo=x=0:y=0:w=100:h=77:band=10
 +@end example
 +
 +@end itemize
 +
 +@section deshake
 +
 +Attempt to fix small changes in horizontal and/or vertical shift. This
 +filter helps remove camera shake from hand-holding a camera, bumping a
 +tripod, moving on a vehicle, etc.
 +
 +The filter accepts parameters as a list of @var{key}=@var{value}
 +pairs, separated by ":". If the key of the first options is omitted,
 +the arguments are interpreted according to the syntax
 +@var{x}:@var{y}:@var{w}:@var{h}:@var{rx}:@var{ry}:@var{edge}:@var{blocksize}:@var{contrast}:@var{search}:@var{filename}:@var{opencl}.
 +
 +A description of the accepted parameters follows.
 +
 +@table @option
 +
 +@item x, y, w, h
 +Specify a rectangular area where to limit the search for motion
 +vectors.
 +If desired the search for motion vectors can be limited to a
 +rectangular area of the frame defined by its top left corner, width
 +and height. These parameters have the same meaning as the drawbox
 +filter which can be used to visualise the position of the bounding
 +box.
 +
 +This is useful when simultaneous movement of subjects within the frame
 +might be confused for camera motion by the motion vector search.
 +
 +If any or all of @var{x}, @var{y}, @var{w} and @var{h} are set to -1
 +then the full frame is used. This allows later options to be set
 +without specifying the bounding box for the motion vector search.
 +
 +Default - search the whole frame.
 +
 +@item rx, ry
 +Specify the maximum extent of movement in x and y directions in the
 +range 0-64 pixels. Default 16.
 +
 +@item edge
 +Specify how to generate pixels to fill blanks at the edge of the
 +frame. Available values are:
 +@table @samp
 +@item blank, 0
 +Fill zeroes at blank locations
 +@item original, 1
 +Original image at blank locations
 +@item clamp, 2
 +Extruded edge value at blank locations
 +@item mirror, 3
 +Mirrored edge at blank locations
 +@end table
 +Default value is @samp{mirror}.
 +
 +@item blocksize
 +Specify the blocksize to use for motion search. Range 4-128 pixels,
 +default 8.
 +
 +@item contrast
 +Specify the contrast threshold for blocks. Only blocks with more than
 +the specified contrast (difference between darkest and lightest
 +pixels) will be considered. Range 1-255, default 125.
 +
 +@item search
 +Specify the search strategy. Available values are:
 +@table @samp
 +@item exhaustive, 0
 +Set exhaustive search
 +@item less, 1
 +Set less exhaustive search.
 +@end table
 +Default value is @samp{exhaustive}.
 +
 +@item filename
 +If set then a detailed log of the motion search is written to the
 +specified file.
 +
 +@item opencl
 +If set to 1, specify using OpenCL capabilities, only available if
 +FFmpeg was configured with @code{--enable-opencl}. Default value is 0.
 +
 +@end table
 +
 +@section drawbox
 +
 +Draw a colored box on the input image.
 +
- The filter accepts parameters as a list of @var{key}=@var{value}
- pairs, separated by ":". If the key of the first options is omitted,
- the arguments are interpreted according to the syntax
- @option{x}:@option{y}:@option{width}:@option{height}:@option{color}:@option{thickness}.
- A description of the accepted options follows.
++This filter accepts the following options:
 +
 +@table @option
 +@item x, y
 +Specify the top left corner coordinates of the box. Default to 0.
 +
 +@item width, w
 +@item height, h
 +Specify the width and height of the box, if 0 they are interpreted as
 +the input width and height. Default to 0.
 +
 +@item color, c
 +Specify the color of the box to write, it can be the name of a color
 +(case insensitive match) or a 0xRRGGBB[AA] sequence. If the special
 +value @code{invert} is used, the box edge color is the same as the
 +video with inverted luma.
 +
 +@item thickness, t
 +Set the thickness of the box edge. Default value is @code{4}.
 +@end table
 +
 +@subsection Examples
 +
 +@itemize
 +@item
 +Draw a black box around the edge of the input image:
 +@example
 +drawbox
 +@end example
 +
 +@item
 +Draw a box with color red and an opacity of 50%:
 +@example
 +drawbox=10:20:200:60:red@@0.5
 +@end example
 +
 +The previous example can be specified as:
 +@example
 +drawbox=x=10:y=20:w=200:h=60:color=red@@0.5
 +@end example
 +
 +@item
 +Fill the box with pink color:
 +@example
 +drawbox=x=10:y=10:w=100:h=100:color=pink@@0.5:t=max
 +@end example
 +@end itemize
 +
 +@anchor{drawtext}
 +@section drawtext
 +
 +Draw text string or text from specified file on top of video using the
 +libfreetype library.
 +
 +To enable compilation of this filter you need to configure FFmpeg with
 +@code{--enable-libfreetype}.
 +
 +@subsection Syntax
 +
 +The filter accepts parameters as a list of @var{key}=@var{value} pairs,
 +separated by ":".
 +
 +The description of the accepted parameters follows.
 +
 +@table @option
 +
 +@item box
 +Used to draw a box around text using background color.
 +Value should be either 1 (enable) or 0 (disable).
 +The default value of @var{box} is 0.
 +
 +@item boxcolor
 +The color to be used for drawing box around text.
 +Either a string (e.g. "yellow") or in 0xRRGGBB[AA] format
  (e.g. "0xff00ff"), possibly followed by an alpha specifier.
  The default value of @var{boxcolor} is "white".
  
@@@ -655,31 -479,8 +655,32 @@@ int avfilter_init_filter(AVFilterContex
      AVDictionary *options = NULL;
      AVDictionaryEntry *e;
      int ret=0;
 +    int anton_options =
 +        !strcmp(filter->filter->name,  "aformat") ||
 +        !strcmp(filter->filter->name,  "blackframe") ||
 +        !strcmp(filter->filter->name,  "boxblur"   ) ||
 +        !strcmp(filter->filter->name,  "crop"      ) ||
 +        !strcmp(filter->filter->name,  "cropdetect") ||
 +        !strcmp(filter->filter->name,  "delogo"    ) ||
++        !strcmp(filter->filter->name,  "drawbox"   ) ||
 +        !strcmp(filter->filter->name,   "format") ||
 +        !strcmp(filter->filter->name, "noformat") ||
 +        !strcmp(filter->filter->name, "resample")
 +        ;
 +
 +    if (filter->filter->shorthand) {
 +        av_assert0(filter->priv);
 +        av_assert0(filter->filter->priv_class);
 +        *(const AVClass **)filter->priv = filter->filter->priv_class;
 +        av_opt_set_defaults(filter->priv);
 +        ret = av_opt_set_from_string(filter->priv, args,
 +                                     filter->filter->shorthand, "=", ":");
 +        if (ret < 0)
 +            return ret;
 +        args = NULL;
 +    }
  
 -    if (args && *args && filter->filter->priv_class) {
 +    if (anton_options && args && *args && filter->filter->priv_class) {
          if (strchr(args, '=')) {
              /* assume a list of key1=value1:key2=value2:... */
              ret = av_dict_parse_string(&options, args, "=", ":", 0);
@@@ -45,41 -44,18 +45,22 @@@ typedef struct 
      int vsub, hsub;   ///< chroma subsampling
  } DrawBoxContext;
  
- #define OFFSET(x) offsetof(DrawBoxContext, x)
- #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
- static const AVOption drawbox_options[] = {
-     { "x",           "set the box top-left corner x position", OFFSET(x), AV_OPT_TYPE_INT, {.i64=0}, INT_MIN, INT_MAX, FLAGS },
-     { "y",           "set the box top-left corner y position", OFFSET(y), AV_OPT_TYPE_INT, {.i64=0}, INT_MIN, INT_MAX, FLAGS },
-     { "width",       "set the box width",  OFFSET(w), AV_OPT_TYPE_INT, {.i64=0}, 0, INT_MAX, FLAGS },
-     { "w",           "set the box width",  OFFSET(w), AV_OPT_TYPE_INT, {.i64=0}, 0, INT_MAX, FLAGS },
-     { "height",      "set the box height", OFFSET(h), AV_OPT_TYPE_INT, {.i64=0}, 0, INT_MAX, FLAGS },
-     { "h",           "set the box height", OFFSET(h), AV_OPT_TYPE_INT, {.i64=0}, 0, INT_MAX, FLAGS },
-     { "color",       "set the box edge color", OFFSET(color_str), AV_OPT_TYPE_STRING, {.str="black"}, CHAR_MIN, CHAR_MAX, FLAGS },
-     { "c",           "set the box edge color", OFFSET(color_str), AV_OPT_TYPE_STRING, {.str="black"}, CHAR_MIN, CHAR_MAX, FLAGS },
-     { "thickness",   "set the box maximum thickness", OFFSET(thickness), AV_OPT_TYPE_INT, {.i64=4}, 0, INT_MAX, FLAGS },
-     { "t",           "set the box maximum thickness", OFFSET(thickness), AV_OPT_TYPE_INT, {.i64=4}, 0, INT_MAX, FLAGS },
-     {NULL},
- };
- AVFILTER_DEFINE_CLASS(drawbox);
  static av_cold int init(AVFilterContext *ctx, const char *args)
  {
 -    DrawBoxContext *drawbox= ctx->priv;
 +    DrawBoxContext *drawbox = ctx->priv;
      uint8_t rgba_color[4];
  
 -    if (av_parse_color(rgba_color, drawbox->color_str, -1, ctx) < 0)
 +    if (!strcmp(drawbox->color_str, "invert"))
 +        drawbox->invert_color = 1;
 +    else if (av_parse_color(rgba_color, drawbox->color_str, -1, ctx) < 0)
          return AVERROR(EINVAL);
  
 -    drawbox->yuv_color[Y] = RGB_TO_Y_CCIR(rgba_color[0], rgba_color[1], rgba_color[2]);
 -    drawbox->yuv_color[U] = RGB_TO_U_CCIR(rgba_color[0], rgba_color[1], rgba_color[2], 0);
 -    drawbox->yuv_color[V] = RGB_TO_V_CCIR(rgba_color[0], rgba_color[1], rgba_color[2], 0);
 -    drawbox->yuv_color[A] = rgba_color[3];
 +    if (!drawbox->invert_color) {
 +        drawbox->yuv_color[Y] = RGB_TO_Y_CCIR(rgba_color[0], rgba_color[1], rgba_color[2]);
 +        drawbox->yuv_color[U] = RGB_TO_U_CCIR(rgba_color[0], rgba_color[1], rgba_color[2], 0);
 +        drawbox->yuv_color[V] = RGB_TO_V_CCIR(rgba_color[0], rgba_color[1], rgba_color[2], 0);
 +        drawbox->yuv_color[A] = rgba_color[3];
 +    }
  
      return 0;
  }
@@@ -151,6 -120,24 +132,25 @@@ static int filter_frame(AVFilterLink *i
      return ff_filter_frame(inlink->dst->outputs[0], frame);
  }
  
 -#define FLAGS AV_OPT_FLAG_VIDEO_PARAM
 -static const AVOption options[] = {
+ #define OFFSET(x) offsetof(DrawBoxContext, x)
 -    { "color",  "Color of the box",                         OFFSET(color_str), AV_OPT_TYPE_STRING, { .str = "black" },    .flags = FLAGS },
++#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
++
++static const AVOption drawbox_options[] = {
+     { "x",      "Horizontal position of the left box edge", OFFSET(x),         AV_OPT_TYPE_INT,    { .i64 = 0 }, INT_MIN, INT_MAX, FLAGS },
+     { "y",      "Vertical position of the top box edge",    OFFSET(y),         AV_OPT_TYPE_INT,    { .i64 = 0 }, INT_MIN, INT_MAX, FLAGS },
+     { "width",  "Width of the box",                         OFFSET(w),         AV_OPT_TYPE_INT,    { .i64 = 0 }, 0,       INT_MAX, FLAGS },
++    { "w",      "Width of the box",                         OFFSET(w),         AV_OPT_TYPE_INT,    { .i64 = 0 }, 0,       INT_MAX, FLAGS },
+     { "height", "Height of the box",                        OFFSET(h),         AV_OPT_TYPE_INT,    { .i64 = 0 }, 0,       INT_MAX, FLAGS },
 -static const AVClass drawbox_class = {
 -    .class_name = "drawbox",
 -    .item_name  = av_default_item_name,
 -    .option     = options,
 -    .version    = LIBAVUTIL_VERSION_INT,
 -};
++    { "h",      "Height of the box",                        OFFSET(h),         AV_OPT_TYPE_INT,    { .i64 = 0 }, 0,       INT_MAX, FLAGS },
++    { "color",  "Color of the box",                         OFFSET(color_str), AV_OPT_TYPE_STRING, { .str = "black" }, CHAR_MIN, CHAR_MAX, .flags = FLAGS },
++    { "c",      "Color of the box",                         OFFSET(color_str), AV_OPT_TYPE_STRING, { .str = "black" }, CHAR_MIN, CHAR_MAX, .flags = FLAGS },
++    { "thickness",   "set the box maximum thickness",       OFFSET(thickness), AV_OPT_TYPE_INT, {.i64=4}, 0, INT_MAX, FLAGS },
++    { "t",           "set the box maximum thickness",       OFFSET(thickness), AV_OPT_TYPE_INT, {.i64=4}, 0, INT_MAX, FLAGS },
+     { NULL },
+ };
++AVFILTER_DEFINE_CLASS(drawbox);
  static const AVFilterPad avfilter_vf_drawbox_inputs[] = {
      {
          .name             = "default",