[FFmpeg-devel] [PATCH] Channel Layout Negotiation

Stefano Sabatini stefano.sabatini-lala at poste.it
Fri Jun 17 23:21:04 CEST 2011


On date Friday 2011-06-17 20:41:05 +0300, Mina Nagy Zaki encoded:
> On Friday 17 June 2011 18:45:36 Stefano Sabatini wrote:
> > On date Friday 2011-06-17 18:07:39 +0300, MNZ encoded:
> > > Another iteration over this.
> > > 
> > > This time an avfilter_make_format64_list() was added and the original was
> > > retained. Also instead of avfilter_set_common_formats() there are now separate
> > > functions for pixel_formats, sample_formats and channel_layouts. The names are a
> > > bit too long though.
> > > 
> > > --
> > > Mina
> > 
> > > From 8de1ad310758db13fea3e2f5fc093b52de178c75 Mon Sep 17 00:00:00 2001
> > > From: Mina Nagy Zaki <mnzaki at gmail.com>
> > > Date: Tue, 7 Jun 2011 21:17:23 +0300
> > > Subject: [PATCH 1/2] lavfi: Use int64_t lists in AVFilteFormats.
> > > 
> > > The list type was changed to int64_t to be able to hold
> > > channel layouts.
> > > 
> > > avfilter_make_format_list() still takes a int32_t array and converts
> > > it to int64_t. A new function, avfilter_make_format64_list, that
> > > takes int64_t arrays has been added.
> > > ---
> > >  libavfilter/avfilter.h |    5 +++--
> > >  libavfilter/formats.c  |   36 ++++++++++++++++++++++++------------
> > >  2 files changed, 27 insertions(+), 14 deletions(-)
> > > 
> > > diff --git a/libavfilter/avfilter.h b/libavfilter/avfilter.h
> > > index 7628cd5..9651d86 100644
> > > --- a/libavfilter/avfilter.h
> > > +++ b/libavfilter/avfilter.h
> > > @@ -223,7 +223,7 @@ void avfilter_unref_buffer(AVFilterBufferRef *ref);
> > >   */
> > >  typedef struct AVFilterFormats {
> > >      unsigned format_count;      ///< number of formats
> > > -    int *formats;               ///< list of media formats
> > > +    int64_t *formats;           ///< list of media formats
> > >  
> > >      unsigned refcount;          ///< number of references to this list
> > >      struct AVFilterFormats ***refs; ///< references to this list
> > > @@ -238,6 +238,7 @@ typedef struct AVFilterFormats {
> > >   * @return the format list, with no existing references
> > >   */
> > >  AVFilterFormats *avfilter_make_format_list(const int *fmts);
> > > +AVFilterFormats *avfilter_make_format64_list(const int64_t *fmts);
> > >  
> > >  /**
> > >   * Add fmt to the list of media formats contained in *avff.
> > > @@ -247,7 +248,7 @@ AVFilterFormats *avfilter_make_format_list(const int *fmts);
> > >   * @return a non negative value in case of success, or a negative
> > >   * value corresponding to an AVERROR code in case of error
> > >   */
> > > -int avfilter_add_format(AVFilterFormats **avff, int fmt);
> > > +int avfilter_add_format(AVFilterFormats **avff, int64_t fmt);
> > >  
> > >  /**
> > >   * Return a list of all formats supported by FFmpeg for the given media type.
> > > diff --git a/libavfilter/formats.c b/libavfilter/formats.c
> > > index 58593fc..40254a0 100644
> > > --- a/libavfilter/formats.c
> > > +++ b/libavfilter/formats.c
> > > @@ -72,28 +72,40 @@ AVFilterFormats *avfilter_merge_formats(AVFilterFormats *a, AVFilterFormats *b)
> > >      return ret;
> > >  }
> > >  
> > 
> > > +#define MAKE_FORMAT_LIST()                                              \
> > > +    AVFilterFormats *formats;                                           \
> > > +    int count = 0;                                                      \
> > > +do {                                                                    \
> > > +    if (fmts)                                                           \
> > > +        for (count = 0; fmts[count] != -1; count++)                     \
> > > +            ;                                                           \
> > > +    formats = av_mallocz(sizeof(AVFilterFormats));                      \
> > > +    formats->format_count = count;                                      \
> > > +    if (count)                                                          \
> > > +        formats->formats  = av_malloc(sizeof(*formats->formats)*count); \
> > > +} while (0)
> > 
> > Missing NULL check => return NULL
> 
> Added NULL checks.
> 
> > Alternatively, you could create a function
> > static AVFilterFormats *make_format_list(int count);
> > which returns NULL in case of failure.
> > 
> 
> I think the macro is more fitting since a static function leads to unnecessary
> duplication of code. Also using a macro highlights the main difference between
> the two functions: the list copying code.
> 
> I have also removed the do..while(0) wrapper  since it is useless in this case,
> as pointed out by ubitux on IRC. 
> 
> Other nits taken care of.
[...]

No more comments from me, I'll apply both patches in a few days if I
see no comments from other devs, maybe Michael?
-- 
FFmpeg = Funny Foolish Mournful Prodigious Exploitable Gorilla


More information about the ffmpeg-devel mailing list