[FFmpeg-devel] [PATCH 01/10] lavfi: add avfilter_get_audio_buffer_ref_from_arrays_channels.

Stefano Sabatini stefasab at gmail.com
Mon Dec 31 19:08:18 CET 2012


On date Monday 2012-12-31 18:57:58 +0100, Nicolas George encoded:
> It is the same as avfilter_get_audio_buffer_ref_from_arrays
> except it has a "channels" and the channel layout can be 0.
> 
> Signed-off-by: Nicolas George <nicolas.george at normalesup.org>
> ---
>  libavfilter/audio.c      |   34 +++++++++++++++++++++++++---------
>  libavfilter/avcodec.c    |    7 ++++---
>  libavfilter/avfilter.h   |   21 +++++++++++++++++++++
>  libavfilter/src_buffer.c |    2 ++
>  4 files changed, 52 insertions(+), 12 deletions(-)
> 
> 
> Changed the name.
> 
> 
> diff --git a/libavfilter/audio.c b/libavfilter/audio.c
> index 3564896..ca076fc 100644
> --- a/libavfilter/audio.c
> +++ b/libavfilter/audio.c
> @@ -58,9 +58,9 @@ AVFilterBufferRef *ff_default_get_audio_buffer(AVFilterLink *link, int perms,
>      if (av_samples_alloc(data, &linesize, nb_channels, nb_samples, link->format, 0) < 0)
>          goto fail;
>  
> -    samplesref = avfilter_get_audio_buffer_ref_from_arrays(data, linesize, full_perms,
> -                                                           nb_samples, link->format,
> -                                                           link->channel_layout);
> +    samplesref = avfilter_get_audio_buffer_ref_from_arrays_channels(
> +        data, linesize, full_perms, nb_samples, link->format,
> +        link->channels, link->channel_layout);
>      if (!samplesref)
>          goto fail;
>  
> @@ -92,13 +92,13 @@ AVFilterBufferRef *ff_get_audio_buffer(AVFilterLink *link, int perms,
>      return ret;
>  }
>  
> -AVFilterBufferRef* avfilter_get_audio_buffer_ref_from_arrays(uint8_t **data,
> -                                                             int linesize,int perms,
> -                                                             int nb_samples,
> -                                                             enum AVSampleFormat sample_fmt,
> -                                                             uint64_t channel_layout)

> +AVFilterBufferRef* avfilter_get_audio_buffer_ref_from_arrays_channels(uint8_t **data,
> +                                                                      int linesize,int perms,

nit++++: ,_int

> +                                                                      int nb_samples,
> +                                                                      enum AVSampleFormat sample_fmt,
> +                                                                      int channels,
> +                                                                      uint64_t channel_layout)
>  {
> -    int channels = av_get_channel_layout_nb_channels(channel_layout);
>      int planes;
>      AVFilterBuffer    *samples    = av_mallocz(sizeof(*samples));
>      AVFilterBufferRef *samplesref = av_mallocz(sizeof(*samplesref));
> @@ -106,6 +106,10 @@ AVFilterBufferRef* avfilter_get_audio_buffer_ref_from_arrays(uint8_t **data,
>      if (!samples || !samplesref)
>          goto fail;
>  
> +    av_assert0(channels);
> +    av_assert0(channel_layout == 0 || 
> +               channels == av_get_channel_layout_nb_channels(channel_layout));
> +
>      samplesref->buf         = samples;
>      samplesref->buf->free   = ff_avfilter_default_free_buffer;
>      if (!(samplesref->audio = av_mallocz(sizeof(*samplesref->audio))))
> @@ -163,6 +167,18 @@ fail:
>      return NULL;
>  }
>  
> +AVFilterBufferRef* avfilter_get_audio_buffer_ref_from_arrays(uint8_t **data,
> +                                                             int linesize,int perms,
> +                                                             int nb_samples,
> +                                                             enum AVSampleFormat sample_fmt,
> +                                                             uint64_t channel_layout)
> +{
> +    int channels = av_get_channel_layout_nb_channels(channel_layout);
> +    return avfilter_get_audio_buffer_ref_from_arrays_channels(data, linesize, perms,
> +                                                              nb_samples, sample_fmt,
> +                                                              channels, channel_layout);
> +}
> +
>  static int default_filter_frame(AVFilterLink *link, AVFilterBufferRef *frame)
>  {
>      return ff_filter_frame(link->dst->outputs[0], frame);
> diff --git a/libavfilter/avcodec.c b/libavfilter/avcodec.c
> index 2533bd8..dcd6bb6 100644
> --- a/libavfilter/avcodec.c
> +++ b/libavfilter/avcodec.c
> @@ -93,6 +93,7 @@ AVFilterBufferRef *avfilter_get_audio_buffer_ref_from_frame(const AVFrame *frame
>                                                              int perms)
>  {
>      AVFilterBufferRef *samplesref;
> +    int channels = av_frame_get_channels(frame);
>      int64_t layout = av_frame_get_channel_layout(frame);
>  
>      if(av_frame_get_channels(frame) > 8) // libavfilter does not suport more than 8 channels FIXME, remove once libavfilter is fixed
> @@ -103,9 +104,9 @@ AVFilterBufferRef *avfilter_get_audio_buffer_ref_from_frame(const AVFrame *frame
>          return NULL;
>      }
>  
> -    samplesref = avfilter_get_audio_buffer_ref_from_arrays((uint8_t **)frame->data, frame->linesize[0], perms,
> -                                                  frame->nb_samples, frame->format,
> -                                                  av_frame_get_channel_layout(frame));
> +    samplesref = avfilter_get_audio_buffer_ref_from_arrays_channels(
> +        (uint8_t **)frame->data, frame->linesize[0], perms,
> +        frame->nb_samples, frame->format, channels, layout);
>      if (!samplesref)
>          return NULL;
>      if (avfilter_copy_frame_props(samplesref, frame) < 0) {
> diff --git a/libavfilter/avfilter.h b/libavfilter/avfilter.h
> index 3849c7b..d7995fc 100644
> --- a/libavfilter/avfilter.h
> +++ b/libavfilter/avfilter.h
> @@ -778,6 +778,27 @@ AVFilterBufferRef *avfilter_get_audio_buffer_ref_from_arrays(uint8_t **data,
>                                                               int nb_samples,
>                                                               enum AVSampleFormat sample_fmt,
>                                                               uint64_t channel_layout);
> +/**
> + * Create an audio buffer reference wrapped around an already
> + * allocated samples buffer.
> + *
> + * @param data           pointers to the samples plane buffers
> + * @param linesize       linesize for the samples plane buffers
> + * @param perms          the required access permissions
> + * @param nb_samples     number of samples per channel
> + * @param sample_fmt     the format of each sample in the buffer to allocate
> + * @param channels       the number of channels of the buffer

> + * @param channel_layout the channel layout of the buffer,
> + *                       must be either 0 or consistent with channels

must be either 0 *if unknown* ...

You may also add a @see
avfilter_get_audio_buffer_ref_from_arrays_channels() to the
avfilter_get_audio_buffer_ref_from_arrays() doxy.

> + */
> +AVFilterBufferRef *avfilter_get_audio_buffer_ref_from_arrays_channels(uint8_t **data,
> +                                                                      int linesize,
> +                                                                      int perms,
> +                                                                      int nb_samples,
> +                                                                      enum AVSampleFormat sample_fmt,
> +                                                                      int channels,
> +                                                                      uint64_t channel_layout);
> +
>  
>  
>  #define AVFILTER_CMD_FLAG_ONE   1 ///< Stop once a filter understood the command (for target=all for example), fast filters are favored automatically
> diff --git a/libavfilter/src_buffer.c b/libavfilter/src_buffer.c
> index acd490b..a997034 100644
> --- a/libavfilter/src_buffer.c
> +++ b/libavfilter/src_buffer.c
> @@ -81,6 +81,8 @@ int av_asrc_buffer_add_samples(AVFilterContext *ctx,
>  {
>      AVFilterBufferRef *samplesref;
>  
> +    if (!channel_layout)
> +        return AVERROR(EINVAL);
>      samplesref = avfilter_get_audio_buffer_ref_from_arrays(
>                       data, linesize[0], AV_PERM_WRITE,
>                       nb_samples,

LGTM, feel free to ignore the nits and apply as is, thanks.
-- 
FFmpeg = Furious & Frenzy Minimal Puristic Exploitable Game


More information about the ffmpeg-devel mailing list