[FFmpeg-devel] [PATCH] Re: How can I determine color_range from a filter?
Stefano Sabatini
stefano.sabatini-lala
Sun Jan 9 20:26:25 CET 2011
On date Sunday 2011-01-09 19:42:27 +0100, Michael Niedermayer encoded:
> On Sun, Jan 09, 2011 at 12:11:02AM +0100, Stefano Sabatini wrote:
> > On date Friday 2011-01-07 11:12:59 -0800, Larry Robinson encoded:
> > > So here's the easy part, adding the new properties to AVFilterLink.
> > > Let me know if this is inconsistent with style, architecture, etc.
> > >
> > > Now - how to fill them:
> > > It looks like configure_filters(...) in ffmpeg.c starts the filter
> > > chain on line 364 by calling avfilter_graph_create_filter(&ist...).
> > > I propose to do the following:
> > >
> > > 1) Create a new data structure, located in cmdutils.h:
> > > typedef struct AVVolatileVideoProperties
> > > {
> > > enum AVColorPrimaries color_primaries;
> > > enum AVColorTransferCharacteristic color_trc;
> > > enum AVColorSpace colorspace;
> > > enum AVColorRange color_range;
> > > AVChromaLocation chroma_sample_location;
> > > } AVVolatileVideoProperties;
> > >
> > > NOTE:
> > > If I do this, cmdutils.h will have to be included after avcodec.h,
> > > because that's where AVColorPrimaries, etc. are declared.
> > > The second option is to #include avcodec.h in cmdutils.h - this
> > > will prevent breaking code that includes cmdutils but not avcodec.
> > > The last option is to declare the structure in both ffmpeg.c and
> > > ffplay.c and keep it out of cmdutils.h altogether.
> > >
> > > Is there any guidance to help me make the decision?
> >
> > I can't see the problem, cmdutils.h already includes avcodec.h.
> >
> > > 2) Add a new function: set_volatile_video_properties(
> > > AVCodecContext * ctx ) to {cmdutils.h, cmdutils.c}
> > > which will copy the values into the AVVolatileVideoProperties
> > > structure.
> > >
> > > The issues and options noted in (1) apply here also. Guidance would
> > > be appreciated.
> > >
> > > 3) Add an additional parameter to avfilter_graph_create_filter, i.e.
> > >
> > > int avfilter_graph_create_filter(AVFilterContext **filt_ctx, AVFilter *filt,
> > > const char *name, const char *args,
> > > void *opaque,
> > > AVFilterGraph *graph_ctx,
> > > AVVolatileVideoProperties *vvp);
> > >
> > > If vvp is not NULL, the properties in vvp will be copied to the
> > > AVFilterLink.
> > >
> > > 4) The new properties will need to be propagated along the filter
> > > chain (I'll figure out how to do this), and ultimately used by
> > > encoders (beyond my expertise).
> >
> > Maybe a better solution would be to use the option (libavutil/opt.h)
> > system in AVFilterGraph.
>
> iam not so sure if opt.h is a good idea
>
>
> >
> > Also I'm not sure colorspace should be a global property of the filter
> > graph, rather than a property of the single link/filter.
>
> yes, agree here, and they could even change when the input changes
> (thats more a architectural design note and not a request to actually support
> it at first)
>
>
> >
> > > On 1/6/2011 6:28 PM, Michael Niedermayer wrote:
> > > >On Thu, Jan 06, 2011 at 04:06:33PM -0800, Larry Robinson wrote:
> > > >>Let me know what the (few others) are and I will try to add them :-) .
> > > > /**
> > > > * Chromaticity coordinates of the source primaries.
> > > > * - encoding: Set by user
> > > > * - decoding: Set by libavcodec
> > > > */
> > > > enum AVColorPrimaries color_primaries;
> > > >
> > > > /**
> > > > * Color Transfer Characteristic.
> > > > * - encoding: Set by user
> > > > * - decoding: Set by libavcodec
> > > > */
> > > > enum AVColorTransferCharacteristic color_trc;
> > > >
> > > > /**
> > > > * YUV colorspace type.
> > > > * - encoding: Set by user
> > > > * - decoding: Set by libavcodec
> > > > */
> > > > enum AVColorSpace colorspace;
> > > >
> > > > /**
> > > > * MPEG vs JPEG YUV range.
> > > > * - encoding: Set by user
> > > > * - decoding: Set by libavcodec
> > > > */
> > > > enum AVColorRange color_range;
> > > >
> > > > /**
> > > > * This defines the location of chroma samples.
> > > > * - encoding: Set by user
> > > > * - decoding: Set by libavcodec
> > > > */
> > > > enum AVChromaLocation chroma_sample_location;
> > [...]
> >
> > > Index: libavfilter/avfilter.h
> > > ===================================================================
> > > --- libavfilter/avfilter.h (revision 26253)
> > > +++ libavfilter/avfilter.h (working copy)
> > > @@ -25,6 +25,7 @@
> > > #include "libavutil/avutil.h"
> > > #include "libavcore/avcore.h"
> > > #include "libavcore/samplefmt.h"
> > > +#include "libavcodec/avcodec.h"
> > >
> > > #define LIBAVFILTER_VERSION_MAJOR 1
> > > #define LIBAVFILTER_VERSION_MINOR 72
> > > @@ -614,6 +615,42 @@
> > > * input link is assumed to be an unchangeable property.
> > > */
> > > AVRational time_base;
> > > +
> > > + /**
> > > + * Chromaticity coordinates of the source primaries.
> > > + * - input link: Set by previous filter, read only
> > > + * - output link: May be changed by filter
> > > + */
> > > + enum AVColorPrimaries color_primaries;
> >
> > I want to avoid unconditional dependency of libavfilter on libavcodec.
>
> using enums from avcodec.h does not create a runtime dependancy so i dont
> see a problem
I believe that assuming the existence of libavcodec headers when you
compile a libavfilter application is wrong, indeed you could even
compile/install libavfilter without installing libavcodec (configure
--enable-libavfilter --disable-libavcodec), in a distro you could have
libavfilter-dev and yet not libavcodec-dev.
--
FFmpeg = Fancy and Fast Magic Programmable Elaborated Gadget
More information about the ffmpeg-devel
mailing list