[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