[FFmpeg-devel] [PATCH] swscale: add API to convert AVFrames directly
Ronald S. Bultje
rsbultje at gmail.com
Mon Sep 30 19:54:28 CEST 2013
Hi,
On Mon, Sep 30, 2013 at 11:39 AM, Michael Niedermayer <michaelni at gmx.at>wrote:
> On Sun, Sep 29, 2013 at 08:21:35PM +0200, wm4 wrote:
> > On Sun, 29 Sep 2013 17:50:52 +0200
> > Michael Niedermayer <michaelni at gmx.at> wrote:
> [...]
> > >
> > >
> > > > diff --git a/libswscale/swscale.h b/libswscale/swscale.h
> > > > index 42702b7..60733f0 100644
> > > > --- a/libswscale/swscale.h
> > > > +++ b/libswscale/swscale.h
> > > > @@ -39,6 +39,8 @@
> > > > #include "libavutil/pixfmt.h"
> > > > #include "version.h"
> > > >
> > > > +struct AVFrame;
> > > > +
> > > > /**
> > > > * Return the LIBSWSCALE_VERSION_INT constant.
> > > > */
> > > > @@ -169,6 +171,81 @@ struct SwsContext *sws_alloc_context(void);
> > > > int sws_init_context(struct SwsContext *sws_context, SwsFilter
> *srcFilter, SwsFilter *dstFilter);
> > > >
> > > > /**
> > > > + * Set source filter. This works only with
> sws_reinit_cached_context() and
> > > > + * sws_scale_frame().
> > > > + *
> > > > + * @return zero or positive value on success, a negative value on
> > > > + * error
> > > > + */
> > > > +int sws_set_src_filter(struct SwsContext *sws_context, SwsFilter
> *srcFilter);
> > > > +
> > > > +/**
> > > > + * Set destination filter. This works only with
> sws_reinit_cached_context() and
> > > > + * sws_scale_frame().
> > > > + *
> > > > + * @return zero or positive value on success, a negative value on
> > > > + * error
> > > > + */
> > > > +int sws_set_dst_filter(struct SwsContext *sws_context, SwsFilter
> *dstFilter);
> > >
> > > would it make sense to allow seting the filter via AVOption as a
> > > char* ?
> > > iam wondering because this maybe would avoid these 2 functions
> >
> > SwsFilter is a struct with 4 SwsVector members, so I'm not sure how
> > that would work. Also, I need to know if the filter changes. These
> > functions basically set a flag that they changed, and if they use the
> > AVOption API, I'd have to compare the SwsFilters with the old state to
> > detect a change.
>
> the char * string could allow something like
>
> "1,2,1" (simple lowpass applied to luma & chroma & horizontal and vertical)
> "v:1,2,1" same lowpass applied only to vertical luma & chroma that is poor
> deinterlace
> "lh:0,0,1,ch:0,0.5,0.5" horizontal shift luma by 1 pixelm chroma by half a
> pixel
>
> thats just a quick and random idea for a syntax and probably a bit of topic
> so its more for consideration of future design direction ...
>
> one advantage of such string based system with AVOptions is that it
> shouldnt require any specific code in a user application that supports
> avoptions
>
>
> >
> > >
> > > [...]
> > > > +static void sws_set_src_frame_options(struct SwsContext *c, struct
> AVFrame *src)
> > > > +{
> > > > + c->srcFormat = src->format;
> > > > + c->srcW = src->width;
> > > > + c->srcH = src->height;
> > > > + c->srcRange = src->color_range;
> > > > + sws_set_avframe_colorspace_table(c->srcColorspaceTable,
> src->colorspace);
> > > > +}
> > > > +
> > > > +static void sws_set_dst_frame_options(struct SwsContext *c, struct
> AVFrame *dst)
> > > > +{
> > > > + c->dstFormat = dst->format;
> > > > + c->dstW = dst->width;
> > > > + c->dstH = dst->height;
> > > > + c->dstRange = dst->color_range;
> > > > + sws_set_avframe_colorspace_table(c->dstColorspaceTable,
> dst->colorspace);
> > > > +}
> > >
> > > static functions dont need sws_ prefixes, if you want to shorten them
> >
> > I removed it from some functions. I left it for others, because maybe
> > they should actually be public.
> >
> > By the way, I'm not all that sure whether my patch is correct.
> > libswscale is very scary, and there could be some things I missed. In
> > particular, there's the question whether sws_uninit_context followed
> > sws_init_context really does full reinitialization, or if there are
> > additional members that must be reset in sws_uninit_context. (Members
> > which are set only by some init code paths, but are read by everything
> > would belong into this category.)
>
> you could try to memset the context to some non 0 value on alloc
> and clear just the values from uninit and then try fate
>
>
> [...]
> > options.c | 2 +-
> > 1 file changed, 1 insertion(+), 1 deletion(-)
> > ca2e03fcb8ed9b12e9a96e1d3e97e238dcdf9eff
> 0001-swscale-make-bilinear-scaling-the-default.patch
> > From 06ec0cacb9e59c009e61b920c7ac645f5c9fda46 Mon Sep 17 00:00:00 2001
> > From: wm4 <nfxjfg at googlemail.com>
> > Date: Sun, 29 Sep 2013 19:52:37 +0200
> > Subject: [PATCH 1/2] swscale: make bilinear scaling the default
> >
> > Before this commit, sws_init_context() failed with an error if no scaler
> > was explicitly set.
> >
> > Defaulting to something reasonable is better behavior.
> > ---
> > libswscale/options.c | 2 +-
> > 1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/libswscale/options.c b/libswscale/options.c
> > index 8985e6b..2b3147b 100644
> > --- a/libswscale/options.c
> > +++ b/libswscale/options.c
> > @@ -34,7 +34,7 @@ static const char *sws_context_to_name(void *ptr)
> > #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
> >
> > static const AVOption swscale_options[] = {
> > - { "sws_flags", "scaler flags",
> OFFSET(flags), AV_OPT_TYPE_FLAGS, { .i64 = DEFAULT }, 0,
> UINT_MAX, VE, "sws_flags" },
> > + { "sws_flags", "scaler flags",
> OFFSET(flags), AV_OPT_TYPE_FLAGS, { .i64 = SWS_BILINEAR }, 0,
> UINT_MAX, VE, "sws_flags" },
> > { "fast_bilinear", "fast bilinear", 0,
> AV_OPT_TYPE_CONST, { .i64 = SWS_FAST_BILINEAR }, INT_MIN, INT_MAX,
> VE, "sws_flags" },
> > { "bilinear", "bilinear", 0,
> AV_OPT_TYPE_CONST, { .i64 = SWS_BILINEAR }, INT_MIN, INT_MAX,
> VE, "sws_flags" },
> > { "bicubic", "bicubic", 0,
> AV_OPT_TYPE_CONST, { .i64 = SWS_BICUBIC }, INT_MIN, INT_MAX,
> VE, "sws_flags" },
> > --
>
> applied
Bilinear seems kind of ... poor as a default?
Ronald
More information about the ffmpeg-devel
mailing list