History

lavfi: cleanup avfilter_get_audio_buffer() and pals.

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.

Stefano Sabatini committed 15 years ago

Commit e727bca1 parent c8b4a393 files · +33 −32Browse files

Unified · Split

3 files
  1. libavfilter/avfilter.c +12 −10
  2. libavfilter/avfilter.h +10 −10
  3. libavfilter/defaults.c +11 −12
libavfilter/avfilter.c+12−10
@@ -265,10 +265,9 @@ static void ff_dlog_ref(void *ctx, AVFilterBufferRef *ref, int end) · 264 unmodified lines
265265 av_get_picture_type_char(ref->video->pict_type));
266266 }
267267 if (ref->audio) {
268− av_dlog(ctx, " cl:%"PRId64"d sn:%d s:%d sr:%d p:%d",
268+ av_dlog(ctx, " cl:%"PRId64"d n:%d r:%d p:%d",
269269 ref->audio->channel_layout,
270270 ref->audio->nb_samples,
271− ref->audio->size,
272271 ref->audio->sample_rate,
273272 ref->audio->planar);
274273 }
@@ -368,16 +367,16 @@ fail: · 93 unmodified lines
368367 }
369368
370369 AVFilterBufferRef *avfilter_get_audio_buffer(AVFilterLink *link, int perms,
371− enum AVSampleFormat sample_fmt, int size,
372− uint64_t channel_layout, int planar)
370+ enum AVSampleFormat sample_fmt, int nb_samples,
371+ uint64_t channel_layout)
373372 {
374373 AVFilterBufferRef *ret = NULL;
375374
376375 if (link->dstpad->get_audio_buffer)
377− ret = link->dstpad->get_audio_buffer(link, perms, sample_fmt, size, channel_layout, planar);
376+ ret = link->dstpad->get_audio_buffer(link, perms, sample_fmt, nb_samples, channel_layout);
378377
379378 if (!ret)
380− ret = avfilter_default_get_audio_buffer(link, perms, sample_fmt, size, channel_layout, planar);
379+ ret = avfilter_default_get_audio_buffer(link, perms, sample_fmt, nb_samples, channel_layout);
381380
382381 if (ret)
383382 ret->type = AVMEDIA_TYPE_AUDIO;
@@ -585,6 +584,9 @@ void avfilter_filter_samples(AVFilterLink *link, AVFilterBufferRef *samplesref) · 201 unmodified lines
585584 /* prepare to copy the samples if the buffer has insufficient permissions */
586585 if ((dst->min_perms & samplesref->perms) != dst->min_perms ||
587586 dst->rej_perms & samplesref->perms) {
587+ int i, planar = av_sample_fmt_is_planar(samplesref->format);
588+ int planes = !planar ? 1:
589+ av_get_channel_layout_nb_channels(samplesref->audio->channel_layout);
588590
589591 av_log(link->dst, AV_LOG_DEBUG,
590592 "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) · 1 unmodified line
592594
593595 link->cur_buf = avfilter_default_get_audio_buffer(link, dst->min_perms,
594596 samplesref->format,
595− samplesref->audio->size,
596− samplesref->audio->channel_layout,
597− samplesref->audio->planar);
597+ samplesref->audio->nb_samples,
598+ samplesref->audio->channel_layout);
598599 link->cur_buf->pts = samplesref->pts;
599600 link->cur_buf->audio->sample_rate = samplesref->audio->sample_rate;
600601
601602 /* Copy actual data into new samples buffer */
602− memcpy(link->cur_buf->data[0], samplesref->data[0], samplesref->audio->size);
603+ for (i = 0; i < planes; i++)
604+ memcpy(link->cur_buf->extended_data[i], samplesref->extended_data[i], samplesref->linesize[0]);
603605
604606 avfilter_unref_buffer(samplesref);
605607 } else
libavfilter/avfilter.h+10−10
@@ -109,7 +109,6 @@ typedef struct AVFilterBuffer { · 108 unmodified lines
109109 typedef struct AVFilterBufferRefAudioProps {
110110 uint64_t channel_layout; ///< channel layout of audio buffer
111111 int nb_samples; ///< number of audio samples
112− int size; ///< audio buffer size
113112 uint32_t sample_rate; ///< audio buffer sample rate
114113 int planar; ///< audio buffer - planar or packed
115114 } AVFilterBufferRefAudioProps;
@@ -388,8 +387,8 @@ struct AVFilterPad { · 272 unmodified lines
388387 * Input audio pads only.
389388 */
390389 AVFilterBufferRef *(*get_audio_buffer)(AVFilterLink *link, int perms,
391− enum AVSampleFormat sample_fmt, int size,
392− uint64_t channel_layout, int planar);
390+ enum AVSampleFormat sample_fmt, int nb_samples,
391+ uint64_t channel_layout);
393392
394393 /**
395394 * Callback called after the slices of a frame are completely sent. If
@@ -474,8 +473,9 @@ AVFilterBufferRef *avfilter_default_get_video_buffer(AVFilterLink *link, · 78 unmodified lines
474473
475474 /** default handler for get_audio_buffer() for audio inputs */
476475 AVFilterBufferRef *avfilter_default_get_audio_buffer(AVFilterLink *link, int perms,
477− enum AVSampleFormat sample_fmt, int size,
478− uint64_t channel_layout, int planar);
476+ enum AVSampleFormat sample_fmt,
477+ int nb_samples,
478+ uint64_t channel_layout);
479479
480480 /**
481481 * 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, · 23 unmodified lines
505505
506506 /** get_audio_buffer() handler for filters which simply pass audio along */
507507 AVFilterBufferRef *avfilter_null_get_audio_buffer(AVFilterLink *link, int perms,
508− enum AVSampleFormat sample_fmt, int size,
509− uint64_t channel_layout, int planar);
508+ enum AVSampleFormat sample_fmt, int nb_samples,
509+ uint64_t channel_layout);
510510
511511 /**
512512 * 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 · 177 unmodified lines
690690 * be requested
691691 * @param perms the required access permissions
692692 * @param sample_fmt the format of each sample in the buffer to allocate
693− * @param size the buffer size in bytes
693+ * @param nb_samples the number of samples per channel
694694 * @param channel_layout the number and type of channels per sample in the buffer to allocate
695695 * @param planar audio data layout - planar or packed
696696 * @return A reference to the samples. This must be unreferenced with
697697 * avfilter_unref_buffer when you are finished with it.
698698 */
699699 AVFilterBufferRef *avfilter_get_audio_buffer(AVFilterLink *link, int perms,
700− enum AVSampleFormat sample_fmt, int size,
701− uint64_t channel_layout, int planar);
700+ enum AVSampleFormat sample_fmt, int nb_samples,
701+ uint64_t channel_layout);
702702
703703 /**
704704 * Create an audio buffer reference wrapped around an already
libavfilter/defaults.c+11−12
@@ -58,12 +58,13 @@ AVFilterBufferRef *avfilter_default_get_video_buffer(AVFilterLink *link, int per · 57 unmodified lines
5858 }
5959
6060 AVFilterBufferRef *avfilter_default_get_audio_buffer(AVFilterLink *link, int perms,
61− enum AVSampleFormat sample_fmt, int size,
62− uint64_t channel_layout, int planar)
61+ enum AVSampleFormat sample_fmt, int nb_samples,
62+ uint64_t channel_layout)
6363 {
6464 AVFilterBuffer *samples = av_mallocz(sizeof(AVFilterBuffer));
6565 AVFilterBufferRef *ref = NULL;
6666 int i, sample_size, chans_nb, bufsize, per_channel_size, step_size = 0;
67+ int planar = av_sample_fmt_is_planar(sample_fmt);
6768 char *buf;
6869
6970 if (!samples || !(ref = av_mallocz(sizeof(AVFilterBufferRef))))
@@ -77,7 +78,7 @@ AVFilterBufferRef *avfilter_default_get_audio_buffer(AVFilterLink *link, int per · 7 unmodified lines
7778 goto fail;
7879
7980 ref->audio->channel_layout = channel_layout;
80− ref->audio->size = size;
81+ ref->audio->nb_samples = nb_samples;
8182 ref->audio->planar = planar;
8283
8384 /* 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 · 5 unmodified lines
8990 sample_size = av_get_bytes_per_sample(sample_fmt);
9091 chans_nb = av_get_channel_layout_nb_channels(channel_layout);
9192
92− per_channel_size = size/chans_nb;
93− ref->audio->nb_samples = per_channel_size/sample_size;
93+ per_channel_size = nb_samples * sample_size;
9494
9595 /* Set the number of bytes to traverse to reach next sample of a particular channel:
9696 * For planar, this is simply the sample size.
@@ -101,7 +101,7 @@ AVFilterBufferRef *avfilter_default_get_audio_buffer(AVFilterLink *link, int per · 4 unmodified lines
101101 memset(&samples->linesize[chans_nb], 0, (8-chans_nb) * sizeof(samples->linesize[0]));
102102
103103 /* Calculate total buffer size, round to multiple of 16 to be SIMD friendly */
104− bufsize = (size + 15)&~15;
104+ bufsize = (nb_samples * chans_nb * sample_size + 15)&~15;
105105 buf = av_malloc(bufsize);
106106 if (!buf)
107107 goto fail;
@@ -189,9 +189,8 @@ void avfilter_default_filter_samples(AVFilterLink *inlink, AVFilterBufferRef *sa · 81 unmodified lines
189189
190190 if (outlink) {
191191 outlink->out_buf = avfilter_default_get_audio_buffer(inlink, AV_PERM_WRITE, samplesref->format,
192− samplesref->audio->size,
193− samplesref->audio->channel_layout,
194− samplesref->audio->planar);
192+ samplesref->audio->nb_samples,
193+ samplesref->audio->channel_layout);
195194 outlink->out_buf->pts = samplesref->pts;
196195 outlink->out_buf->audio->sample_rate = samplesref->audio->sample_rate;
197196 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, · 95 unmodified lines
293292 }
294293
295294 AVFilterBufferRef *avfilter_null_get_audio_buffer(AVFilterLink *link, int perms,
296− enum AVSampleFormat sample_fmt, int size,
297− uint64_t channel_layout, int packed)
295+ enum AVSampleFormat sample_fmt, int nb_samples,
296+ uint64_t channel_layout)
298297 {
299298 return avfilter_get_audio_buffer(link->dst->outputs[0], perms, sample_fmt,
300− size, channel_layout, packed);
299+ nb_samples, channel_layout);
301300 }

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t