[FFmpeg-devel] [PATCH] lavfi audio framework

Stefano Sabatini stefano.sabatini-lala
Sat Jul 31 20:06:54 CEST 2010


On date Saturday 2010-07-31 10:43:53 -0700, S.N. Hemanth Meenakshisundaram encoded:
> On 07/30/2010 01:29 AM, Stefano Sabatini wrote:
> > On date Thursday 2010-07-22 01:18:36 -0700, S.N. Hemanth Meenakshisundaram encoded:
> >   
> >> [...]
> >>  #define MAX_REGISTERED_AVFILTERS_NB 64
> >>  
> >>  static AVFilter *registered_avfilters[MAX_REGISTERED_AVFILTERS_NB + 1];
> >> diff --git a/libavfilter/avfilter.h b/libavfilter/avfilter.h
> >> index a9bec02..faeb3b6 100644
> >> --- a/libavfilter/avfilter.h
> >> +++ b/libavfilter/avfilter.h
> >> @@ -38,6 +38,7 @@
> >>  
> >>  #include <stddef.h>
> >>  #include "libavcodec/avcodec.h"
> >> +#include "libavcodec/audioconvert.h"
> >>  
> >>  /**
> >>   * Return the LIBAVFILTER_VERSION_INT constant.
> >> @@ -66,7 +67,7 @@ typedef struct AVFilterPad     AVFilterPad;
> >>   */
> >>  typedef struct AVFilterBuffer
> >>  {
> >> -    uint8_t *data[8];           ///< buffer data for each plane
> >> +    uint8_t *data[8];           ///< buffer data for each plane/channel
> >>      int linesize[8];            ///< number of bytes per line
> >>      int format;                 ///< media format
> >>  
> >> @@ -130,6 +131,32 @@ static inline void avfilter_copy_picref_props(AVFilterPicRef *dst, AVFilterPicRe
> >>  }
> >>  
> >>  /**
> >> + * A reference to an AVFilterBuffer for audio. Since filters can manipulate the
> >> + * origin of an audio buffer to, for example, reduce precision without any memcpy,
> >> + * sample format and channel_layout are per-reference properties. Sample step is
> >> + * also useful when reducing the number of channels, etc, and so is also per-reference.
> >> + */
> >> +typedef struct AVFilterSamplesRef
> >> +{
> >> +    AVFilterBuffer *samples;      ///< the audio buffer that this is a reference to
> >> +    uint8_t *data[8];             ///< audio data for each channel
> >> +    int linesize[8];              ///< number of bytes to next sample
> >> +    int64_t pts;                  ///< presentation timestamp in units of 1/AV_TIME_BASE
> >> +
> >> +    int64_t channel_layout;       ///< channel layout of current buffer
> >> +    int64_t sample_rate;          ///< samples per second
> >> +    enum SampleFormat sample_fmt; ///< sample format
> >> +
> >> +    int samples_nb;               ///< number of samples in this buffer
> >> +    /* Should this go here or in the AVFilterBuffer struct? */
> >> +    int size;                     ///< size of buffer
> >> +
> >> +    int perms;                    ///< permissions
> >> +
> >> +    int planar;                   ///< is buffer planar or packed
> >> +} AVFilterSamplesRef;
> >>     
> > The alternative here if we don't want to duplicate the generic fields:
> > AVFilterBuffer -> actually contains the data
> >
> > AVFilterBufferRef[erence] in place of AVFilterSamplesRef and
> > AVFilterSamplesPic.
> >
> > Then we may share the common fields (perms, size, pts, buffer, data,
> > linesize), use a media type field and put the media specific stuff in
> > an union.
> >
> > This requires more work to re-adapt the patch, but will avoid evil
> > code duplication.
> >
> > Michael?
> >
> > Same technique may be used for AVFilterLink.
> >
> > [...]
> >
> > Regards.
> >   
> 
> I noticed that sample_rate is only an int or uint32_t in other places,
> will change it in lavfi too to uint32_t. Also 'int format' can be moved
> from AVFilterBuffer to AVFilterPicRef since SamplesRef already has it
> and only two filters (vsrc_buffer and vf_overlay) need to be changed to
> use format field in PicRef instead of AVFilterBuffer.
> 
> Also I need to add pos to AVFilterSamplesRef.
> 
> With those two changes, things should fit nicely into unions and making
> AVFilterBufferRef will be simpler.
> 
> pic/samples, data, linesize, format, pts, pos and perms common,
> AVRational pixel_aspect(2 integers) in PicRef and channel layout (int64)
> in SamplesRef forming a union,
> 
> 4 other ints in PicRef (w, h, interlaced, top_field_first) and 4 ints in
> SamplesRef (samples_nb, size, planar and sample_rate).
> 
> Can I go ahead with this?

Perfect. And as usual split the changes in separate patches/threads,
one for each atomic logical change.

Regards.
-- 
FFmpeg = Foolish and Fucking Marvellous Picky Entertaining Gigant



More information about the ffmpeg-devel mailing list