[FFmpeg-devel] [PATCH 4/4] lavfi/bbox: export drawbox, crop & bbox info to metadata

Stefano Sabatini stefasab at gmail.com
Sun May 26 14:12:03 CEST 2013


On date Sunday 2013-05-26 10:00:58 +0000, Paul B Mahol encoded:
> Signed-off-by: Paul B Mahol <onemda at gmail.com>
> ---
>  libavfilter/vf_bbox.c | 24 ++++++++++++++++++++++++
>  1 file changed, 24 insertions(+)
> 
> diff --git a/libavfilter/vf_bbox.c b/libavfilter/vf_bbox.c
> index 2081e68..11ed395 100644
> --- a/libavfilter/vf_bbox.c
> +++ b/libavfilter/vf_bbox.c
> @@ -60,12 +60,17 @@ static int query_formats(AVFilterContext *ctx)
>      return 0;
>  }
>  
> +#define SET_META(key, value) \
> +    snprintf(buf, sizeof(buf), "%d", value);  \
> +    av_dict_set(metadata, #key, buf, 0); \
> +
>  static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
>  {
>      AVFilterContext *ctx = inlink->dst;
>      BBoxContext *bbox = ctx->priv;
>      FFBoundingBox box;
>      int has_bbox, w, h;
> +    char buf[32];
>  
>      has_bbox =
>          ff_calculate_bounding_box(&box,
> @@ -79,6 +84,25 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
>             av_ts2str(frame->pts), av_ts2timestr(frame->pts, &inlink->time_base));
>  
>      if (has_bbox) {
> +        AVDictionary **metadata = avpriv_frame_get_metadatap(frame);
> +

> +        SET_META("lavfi.drawbox.x", box.x1)
> +        SET_META("lavfi.drawbox.y", box.y1)
> +        SET_META("lavfi.drawbox.w", w)
> +        SET_META("lavfi.drawbox.h", h)
> +
> +        SET_META("lavfi.crop.w", w)
> +        SET_META("lavfi.crop.h", h)
> +        SET_META("lavfi.crop.x", box.x1)
> +        SET_META("lavfi.crop.y", box.y1)

I don't like this one. Indeed I don't think that a filter should set
metadata for other filters, or we end up messing around with metadata
all over the place.

Also crop.w/h data might change at each frame, while it can't be
changed on the fly by the crop filter (with no reconfiguration).

A more generic way to deal with this would involve (again)
scripting. In this specific case, you could create a custom filter
which reads bbox data, and convert it to different metadata meant to
be processed by another filter.

> +
> +        SET_META("lavfi.bbox.x1", box.x1)
> +        SET_META("lavfi.bbox.x2", box.x2)
> +        SET_META("lavfi.bbox.y1", box.y1)
> +        SET_META("lavfi.bbox.y2", box.y2)
> +        SET_META("lavfi.bbox.w",  w)
> +        SET_META("lavfi.bbox.h",  h)

So I'd rather keep only this one for the moment, and avoid the user to
rely on something which could/should be removed later when we have a
more flexible mechanism. In the meanwhile it is still possible to
write a custom C filter.
-- 
FFmpeg = Fascinating and Fancy Majestic Purposeless Egregious Gadget


More information about the ffmpeg-devel mailing list