summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libavfilter/avfilter.c22
-rw-r--r--libavfilter/avfilter.h20
-rw-r--r--libavfilter/defaults.c23
3 files changed, 33 insertions, 32 deletions
diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c
index e535bdab64..9f81be7a8d 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;
@@ -585,6 +584,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",
@@ -592,14 +594,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 6555744f12..19ac057ed4 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 086fcc0b4c..fcb29e3b8d 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);
}