From: Stefano Sabatini <[email protected]>

Remove AVFilterBufferRefAudioProps.size, and use nb_samples in its place
everywhere.
This is required as the size in the audio buffer may be aligned, so it
may not contain a well defined number of samples.

Also remove the useless planar parameter, which can be deduced from the
sample format.

This is technically an API and ABI break, but since the audio part of
lavfi is not usable now, this should not be a problem in practice.

Signed-off-by: Anton Khirnov <[email protected]>
---
 libavfilter/avfilter.c |   22 ++++++++++++----------
 libavfilter/avfilter.h |   20 ++++++++++----------
 libavfilter/defaults.c |   23 +++++++++++------------
 3 files changed, 33 insertions(+), 32 deletions(-)

diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c
index a14669a..a0cb7db 100644
--- a/libavfilter/avfilter.c
+++ b/libavfilter/avfilter.c
@@ -265,10 +265,9 @@ static void ff_dlog_ref(void *ctx, AVFilterBufferRef *ref, 
int end)
                 av_get_picture_type_char(ref->video->pict_type));
     }
     if (ref->audio) {
-        av_dlog(ctx, " cl:%"PRId64"d sn:%d s:%d sr:%d p:%d",
+        av_dlog(ctx, " cl:%"PRId64"d n:%d r:%d p:%d",
                 ref->audio->channel_layout,
                 ref->audio->nb_samples,
-                ref->audio->size,
                 ref->audio->sample_rate,
                 ref->audio->planar);
     }
@@ -368,16 +367,16 @@ fail:
 }
 
 AVFilterBufferRef *avfilter_get_audio_buffer(AVFilterLink *link, int perms,
-                                             enum AVSampleFormat sample_fmt, 
int size,
-                                             uint64_t channel_layout, int 
planar)
+                                             enum AVSampleFormat sample_fmt, 
int nb_samples,
+                                             uint64_t channel_layout)
 {
     AVFilterBufferRef *ret = NULL;
 
     if (link->dstpad->get_audio_buffer)
-        ret = link->dstpad->get_audio_buffer(link, perms, sample_fmt, size, 
channel_layout, planar);
+        ret = link->dstpad->get_audio_buffer(link, perms, sample_fmt, 
nb_samples, channel_layout);
 
     if (!ret)
-        ret = avfilter_default_get_audio_buffer(link, perms, sample_fmt, size, 
channel_layout, planar);
+        ret = avfilter_default_get_audio_buffer(link, perms, sample_fmt, 
nb_samples, channel_layout);
 
     if (ret)
         ret->type = AVMEDIA_TYPE_AUDIO;
@@ -584,6 +583,9 @@ void avfilter_filter_samples(AVFilterLink *link, 
AVFilterBufferRef *samplesref)
     /* prepare to copy the samples if the buffer has insufficient permissions 
*/
     if ((dst->min_perms & samplesref->perms) != dst->min_perms ||
         dst->rej_perms & samplesref->perms) {
+        int  i, planar = av_sample_fmt_is_planar(samplesref->format);
+        int planes = !planar ? 1:
+                     
av_get_channel_layout_nb_channels(samplesref->audio->channel_layout);
 
         av_log(link->dst, AV_LOG_DEBUG,
                "Copying audio data in avfilter (have perms %x, need %x, reject 
%x)\n",
@@ -591,14 +593,14 @@ void avfilter_filter_samples(AVFilterLink *link, 
AVFilterBufferRef *samplesref)
 
         link->cur_buf = avfilter_default_get_audio_buffer(link, dst->min_perms,
                                                           samplesref->format,
-                                                          
samplesref->audio->size,
-                                                          
samplesref->audio->channel_layout,
-                                                          
samplesref->audio->planar);
+                                                          
samplesref->audio->nb_samples,
+                                                          
samplesref->audio->channel_layout);
         link->cur_buf->pts                = samplesref->pts;
         link->cur_buf->audio->sample_rate = samplesref->audio->sample_rate;
 
         /* Copy actual data into new samples buffer */
-        memcpy(link->cur_buf->data[0], samplesref->data[0], 
samplesref->audio->size);
+        for (i = 0; i < planes; i++)
+            memcpy(link->cur_buf->extended_data[i], 
samplesref->extended_data[i], samplesref->linesize[0]);
 
         avfilter_unref_buffer(samplesref);
     } else
diff --git a/libavfilter/avfilter.h b/libavfilter/avfilter.h
index 5f5284a..46c3963 100644
--- a/libavfilter/avfilter.h
+++ b/libavfilter/avfilter.h
@@ -109,7 +109,6 @@ typedef struct AVFilterBuffer {
 typedef struct AVFilterBufferRefAudioProps {
     uint64_t channel_layout;    ///< channel layout of audio buffer
     int nb_samples;             ///< number of audio samples
-    int size;                   ///< audio buffer size
     uint32_t sample_rate;       ///< audio buffer sample rate
     int planar;                 ///< audio buffer - planar or packed
 } AVFilterBufferRefAudioProps;
@@ -388,8 +387,8 @@ struct AVFilterPad {
      * Input audio pads only.
      */
     AVFilterBufferRef *(*get_audio_buffer)(AVFilterLink *link, int perms,
-                                           enum AVSampleFormat sample_fmt, int 
size,
-                                           uint64_t channel_layout, int 
planar);
+                                           enum AVSampleFormat sample_fmt, int 
nb_samples,
+                                           uint64_t channel_layout);
 
     /**
      * Callback called after the slices of a frame are completely sent. If
@@ -474,8 +473,9 @@ AVFilterBufferRef 
*avfilter_default_get_video_buffer(AVFilterLink *link,
 
 /** default handler for get_audio_buffer() for audio inputs */
 AVFilterBufferRef *avfilter_default_get_audio_buffer(AVFilterLink *link, int 
perms,
-                                                     enum AVSampleFormat 
sample_fmt, int size,
-                                                     uint64_t channel_layout, 
int planar);
+                                                     enum AVSampleFormat 
sample_fmt,
+                                                     int nb_samples,
+                                                     uint64_t channel_layout);
 
 /**
  * A helper for query_formats() which sets all links to the same list of
@@ -505,8 +505,8 @@ AVFilterBufferRef 
*avfilter_null_get_video_buffer(AVFilterLink *link,
 
 /** get_audio_buffer() handler for filters which simply pass audio along */
 AVFilterBufferRef *avfilter_null_get_audio_buffer(AVFilterLink *link, int 
perms,
-                                                  enum AVSampleFormat 
sample_fmt, int size,
-                                                  uint64_t channel_layout, int 
planar);
+                                                  enum AVSampleFormat 
sample_fmt, int nb_samples,
+                                                  uint64_t channel_layout);
 
 /**
  * Filter definition. This defines the pads a filter contains, and all the
@@ -690,15 +690,15 @@ avfilter_get_video_buffer_ref_from_arrays(uint8_t 
*data[4], int linesize[4], int
  *                       be requested
  * @param perms          the required access permissions
  * @param sample_fmt     the format of each sample in the buffer to allocate
- * @param size           the buffer size in bytes
+ * @param nb_samples     the number of samples per channel
  * @param channel_layout the number and type of channels per sample in the 
buffer to allocate
  * @param planar         audio data layout - planar or packed
  * @return               A reference to the samples. This must be unreferenced 
with
  *                       avfilter_unref_buffer when you are finished with it.
  */
 AVFilterBufferRef *avfilter_get_audio_buffer(AVFilterLink *link, int perms,
-                                             enum AVSampleFormat sample_fmt, 
int size,
-                                             uint64_t channel_layout, int 
planar);
+                                             enum AVSampleFormat sample_fmt, 
int nb_samples,
+                                             uint64_t channel_layout);
 
 /**
  * Create an audio buffer reference wrapped around an already
diff --git a/libavfilter/defaults.c b/libavfilter/defaults.c
index 086fcc0..fcb29e3 100644
--- a/libavfilter/defaults.c
+++ b/libavfilter/defaults.c
@@ -58,12 +58,13 @@ AVFilterBufferRef 
*avfilter_default_get_video_buffer(AVFilterLink *link, int per
 }
 
 AVFilterBufferRef *avfilter_default_get_audio_buffer(AVFilterLink *link, int 
perms,
-                                                     enum AVSampleFormat 
sample_fmt, int size,
-                                                     uint64_t channel_layout, 
int planar)
+                                                     enum AVSampleFormat 
sample_fmt, int nb_samples,
+                                                     uint64_t channel_layout)
 {
     AVFilterBuffer *samples = av_mallocz(sizeof(AVFilterBuffer));
     AVFilterBufferRef *ref = NULL;
     int i, sample_size, chans_nb, bufsize, per_channel_size, step_size = 0;
+    int planar = av_sample_fmt_is_planar(sample_fmt);
     char *buf;
 
     if (!samples || !(ref = av_mallocz(sizeof(AVFilterBufferRef))))
@@ -77,7 +78,7 @@ AVFilterBufferRef 
*avfilter_default_get_audio_buffer(AVFilterLink *link, int per
         goto fail;
 
     ref->audio->channel_layout = channel_layout;
-    ref->audio->size           = size;
+    ref->audio->nb_samples     = nb_samples;
     ref->audio->planar         = planar;
 
     /* make sure the buffer gets read permission or it's useless for output */
@@ -89,8 +90,7 @@ AVFilterBufferRef 
*avfilter_default_get_audio_buffer(AVFilterLink *link, int per
     sample_size = av_get_bytes_per_sample(sample_fmt);
     chans_nb = av_get_channel_layout_nb_channels(channel_layout);
 
-    per_channel_size = size/chans_nb;
-    ref->audio->nb_samples = per_channel_size/sample_size;
+    per_channel_size = nb_samples * sample_size;
 
     /* Set the number of bytes to traverse to reach next sample of a 
particular channel:
      * For planar, this is simply the sample size.
@@ -101,7 +101,7 @@ AVFilterBufferRef 
*avfilter_default_get_audio_buffer(AVFilterLink *link, int per
     memset(&samples->linesize[chans_nb], 0, (8-chans_nb) * 
sizeof(samples->linesize[0]));
 
     /* Calculate total buffer size, round to multiple of 16 to be SIMD 
friendly */
-    bufsize = (size + 15)&~15;
+    bufsize = (nb_samples * chans_nb * sample_size + 15)&~15;
     buf = av_malloc(bufsize);
     if (!buf)
         goto fail;
@@ -189,9 +189,8 @@ void avfilter_default_filter_samples(AVFilterLink *inlink, 
AVFilterBufferRef *sa
 
     if (outlink) {
         outlink->out_buf = avfilter_default_get_audio_buffer(inlink, 
AV_PERM_WRITE, samplesref->format,
-                                                             
samplesref->audio->size,
-                                                             
samplesref->audio->channel_layout,
-                                                             
samplesref->audio->planar);
+                                                             
samplesref->audio->nb_samples,
+                                                             
samplesref->audio->channel_layout);
         outlink->out_buf->pts                = samplesref->pts;
         outlink->out_buf->audio->sample_rate = samplesref->audio->sample_rate;
         avfilter_filter_samples(outlink, avfilter_ref_buffer(outlink->out_buf, 
~0));
@@ -293,9 +292,9 @@ AVFilterBufferRef 
*avfilter_null_get_video_buffer(AVFilterLink *link, int perms,
 }
 
 AVFilterBufferRef *avfilter_null_get_audio_buffer(AVFilterLink *link, int 
perms,
-                                                  enum AVSampleFormat 
sample_fmt, int size,
-                                                  uint64_t channel_layout, int 
packed)
+                                                  enum AVSampleFormat 
sample_fmt, int nb_samples,
+                                                  uint64_t channel_layout)
 {
     return avfilter_get_audio_buffer(link->dst->outputs[0], perms, sample_fmt,
-                                     size, channel_layout, packed);
+                                     nb_samples, channel_layout);
 }
-- 
1.7.9.5

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to