[FFmpeg-devel] [PATCH] libavfilter-soc: make scale algorithm configurable

Stefano Sabatini stefano.sabatini-lala
Tue Feb 17 01:40:47 CET 2009


On date Sunday 2009-02-15 20:41:30 +0100, Michael Niedermayer encoded:
> On Fri, Feb 13, 2009 at 02:13:38AM +0100, Stefano Sabatini wrote:
> > On date Monday 2009-02-09 19:45:06 +0100, Michael Niedermayer encoded:
> > > On Sun, Feb 08, 2009 at 11:45:34PM +0100, Stefano Sabatini wrote:
> > > > On date Sunday 2009-02-08 03:01:37 +0100, Michael Niedermayer encoded:
> > > > > On Sat, Feb 07, 2009 at 08:30:01PM +0100, Stefano Sabatini wrote:
> > [...]
> > > > > > But I agree on the limitation of the libswscale API, ideally maybe we
> > > > > > should be able to pass in the opaque a pointer to an already allocated
> > > > > > swscale context already containing sws flags + vectors + whatever,
> > > > > > which we could allocate with something like:
> > > > > 
> > > > > am i missing something that make this opaque stuff needed, compared to
> > > > > simply passing char* ?
> > > > 
> > > > I'd like to avoid to convert the sws_flags of the AVFilterGraph to a
> > > > string when creating and inserting the scale filter.
> > > > 
> > > > The scale filter should be able to accept in input the sws context
> > > > parameters from the args string.
> > > > 
> > > > But using the args interface for passing the flags from the
> > > > AVFilterGraph sws_flags to the scale filter is quite awkward, and
> > > > involves doing snprintf in the
> > > > query_formats/avfilter_graph_config_formats() code.
> > > 
> > > i think i prefer if args is used instead of doing funny things with
> > > opaque dummy contexts
> > 
> > New patch, but I still would prefer a solution using somehow a
> > SwsContext in the AVFilterGraph.
> > 
> > Regression tests passed.
> > 
> > Regards.
> > -- 
> > FFmpeg = Friendly and Friendly Meaningless Portable Elastic Geek
> 
> > Index: libavfilter-soc/ffmpeg/libavfilter/vf_scale.c
> > ===================================================================
> > --- libavfilter-soc.orig/ffmpeg/libavfilter/vf_scale.c	2009-02-12 23:38:53.000000000 +0100
> > +++ libavfilter-soc/ffmpeg/libavfilter/vf_scale.c	2009-02-13 01:53:42.000000000 +0100
> > @@ -22,6 +22,7 @@
> >  #include <stdio.h>
> >  
> >  #include "avfilter.h"
> > +#include "libavcodec/opt.h"
> >  #include "libswscale/swscale.h"
> >  
> >  typedef struct
> > @@ -35,19 +36,48 @@
> >       */
> >      int w, h;
> >  
> > +    int sws_flags;
> >      int sliceY;                 ///< top of current output slice
> >  } ScaleContext;
> >  
> >  static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque)
> >  {
> >      ScaleContext *scale = ctx->priv;
> > +    char sws_opts[255] = "";
> >  
> >      /* default to no scaling */
> >      scale->w =
> >      scale->h = 0;
> > +    scale->sws_flags = SWS_BILINEAR;
> >  
> >      if(args)
> > -        sscanf(args, "%d:%d", &scale->w, &scale->h);
> > +        sscanf(args, "%d:%d:%255s", &scale->w, &scale->h, sws_opts);
> > +
> > +    if(*sws_opts) {
> > +        const char *p;
> > +        char sws_flags[255];
> > +        struct SwsContext *sws_ctx;
> > +
> 
> > +        if (!(sws_ctx = sws_getContext(16,16,0, 16,16,0, scale->sws_flags, NULL,NULL,NULL)))
> > +            return -1;
> 
> i dont like this
> 
> 
> [...]
> > Index: libavfilter-soc/ffmpeg/libavfilter/avfiltergraph.c
> > ===================================================================
> > --- libavfilter-soc.orig/ffmpeg/libavfilter/avfiltergraph.c	2009-02-13 01:52:15.000000000 +0100
> > +++ libavfilter-soc/ffmpeg/libavfilter/avfiltergraph.c	2009-02-13 02:03:08.000000000 +0100
> > @@ -111,13 +111,15 @@
> >                  if(!avfilter_merge_formats(link->in_formats,
> >                                             link->out_formats)) {
> >                      AVFilterContext *scale;
> > +                    char sws_flags_str[128];
> >                      /* couldn't merge format lists. auto-insert scale filter */
> >                      snprintf(inst_name, sizeof(inst_name), "auto-inserted scaler %d",
> >                               scaler_count);
> >                      scale =
> >                          avfilter_open(avfilter_get_by_name("scale"),inst_name);
> >  
> > -                    if(!scale || scale->filter->init(scale, NULL, NULL) ||
> > +                    snprintf(sws_flags_str, sizeof(sws_flags_str), "0:0:sws_flags=%d", graph->sws_flags);
> > +                    if(!scale || scale->filter->init(scale, sws_flags_str, NULL) ||
> >                                   avfilter_insert_filter(link, scale, 0, 0)) {
> >                          avfilter_destroy(scale);
> >                          return -1;
> 
> why is this needed?
> there should be a char * variable in the context and that should be passed as
> arg string to each scale vf or what am i missing?

You right, nicer and more extensible.
 
> > Index: libavfilter-soc/ffmpeg/libavfilter/avfiltergraph.h
> > ===================================================================
> > --- libavfilter-soc.orig/ffmpeg/libavfilter/avfiltergraph.h	2009-02-13 01:52:15.000000000 +0100
> > +++ libavfilter-soc/ffmpeg/libavfilter/avfiltergraph.h	2009-02-13 01:57:52.000000000 +0100
> > @@ -27,6 +27,8 @@
> >  typedef struct AVFilterGraph {
> >      unsigned filter_count;
> >      AVFilterContext **filters;
> > +
> > +    int sws_flags; ///< flags to be used for the auto-inserted scale filters
> >  } AVFilterGraph;
> >  
> >  /**
> 
> char *

New round, no hurry to review it since I want to think something more
about it.

Regards.
-- 
FFmpeg = Furious and Freak MultiPurpose Eager Goblin
-------------- next part --------------
A non-text attachment was scrubbed...
Name: set-scale-flags.patch
Type: text/x-diff
Size: 2439 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20090217/5e2e234d/attachment.patch>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: vf-scale-reindent.patch
Type: text/x-diff
Size: 1174 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20090217/5e2e234d/attachment-0001.patch>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: filtergraph-sws-flags.patch
Type: text/x-diff
Size: 1830 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20090217/5e2e234d/attachment-0002.patch>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ffmpeg-send-sws-flags.patch
Type: text/x-diff
Size: 1326 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20090217/5e2e234d/attachment-0003.patch>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ffplay-send-sws-flags.patch
Type: text/x-diff
Size: 500 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20090217/5e2e234d/attachment-0004.patch>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ffmpeg-cosmetics.patch
Type: text/x-diff
Size: 970 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20090217/5e2e234d/attachment-0005.patch>



More information about the ffmpeg-devel mailing list