History

lavfi: prefer nb_samples over size in AVFilterBufferRefAudioProps

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

Stefano Sabatini committed 15 years ago

Commit 95a02421 parent 0bc2cca4 files · +24 −20Browse files

Unified · Split

4 files
  1. doc/APIchanges +5 −0
  2. libavfilter/avfilter.c +8 −7
  3. libavfilter/avfilter.h +6 −7
  4. libavfilter/defaults.c +5 −6
doc/APIchanges+5−0
@@ -13,6 +13,11 @@ libavutil: 2011-04-18 · 12 unmodified lines
13 13
14API changes, most recent first:14API changes, most recent first:
15 15
162011-06-06 - xxxxxx - lavfi 2.14.0 - AVFilterBufferRefAudioProps
17 Remove AVFilterBufferRefAudioProps.size, and use nb_samples in
18 avfilter_get_audio_buffer() and avfilter_default_get_audio_buffer() in
19 place of size.
20
162011-06-06 - xxxxxx - lavu 51.6.0 - av_samples_alloc()212011-06-06 - xxxxxx - lavu 51.6.0 - av_samples_alloc()
17 Switch nb_channels and nb_samples parameters order in22 Switch nb_channels and nb_samples parameters order in
18 av_samples_alloc().23 av_samples_alloc().
libavfilter/avfilter.c+8−7
@@ -305,10 +305,9 @@ static void ff_dlog_ref(void *ctx, AVFilterBufferRef *ref, int end) · 304 unmodified lines
305 av_get_picture_type_char(ref->video->pict_type));305 av_get_picture_type_char(ref->video->pict_type));
306 }306 }
307 if (ref->audio) {307 if (ref->audio) {
308 av_dlog(ctx, " cl:%"PRId64"d sn:%d s:%d sr:%d p:%d",308 av_dlog(ctx, " cl:%"PRId64"d n:%d r:%d p:%d",
309 ref->audio->channel_layout,309 ref->audio->channel_layout,
310 ref->audio->nb_samples,310 ref->audio->nb_samples,
311 ref->audio->size,
312 ref->audio->sample_rate,311 ref->audio->sample_rate,
313 ref->audio->planar);312 ref->audio->planar);
314 }313 }
@@ -405,16 +404,16 @@ fail: · 90 unmodified lines
405}404}
406 405
407AVFilterBufferRef *avfilter_get_audio_buffer(AVFilterLink *link, int perms,406AVFilterBufferRef *avfilter_get_audio_buffer(AVFilterLink *link, int perms,
408 enum AVSampleFormat sample_fmt, int size,407 enum AVSampleFormat sample_fmt, int nb_samples,
409 int64_t channel_layout, int planar)408 int64_t channel_layout, int planar)
410{409{
411 AVFilterBufferRef *ret = NULL;410 AVFilterBufferRef *ret = NULL;
412 411
413 if (link->dstpad->get_audio_buffer)412 if (link->dstpad->get_audio_buffer)
414 ret = link->dstpad->get_audio_buffer(link, perms, sample_fmt, size, channel_layout, planar);413 ret = link->dstpad->get_audio_buffer(link, perms, sample_fmt, nb_samples, channel_layout, planar);
415 414
416 if (!ret)415 if (!ret)
417 ret = avfilter_default_get_audio_buffer(link, perms, sample_fmt, size, channel_layout, planar);416 ret = avfilter_default_get_audio_buffer(link, perms, sample_fmt, nb_samples, channel_layout, planar);
418 417
419 if (ret)418 if (ret)
420 ret->type = AVMEDIA_TYPE_AUDIO;419 ret->type = AVMEDIA_TYPE_AUDIO;
@@ -545,6 +544,7 @@ void avfilter_filter_samples(AVFilterLink *link, AVFilterBufferRef *samplesref) · 124 unmodified lines
545{544{
546 void (*filter_samples)(AVFilterLink *, AVFilterBufferRef *);545 void (*filter_samples)(AVFilterLink *, AVFilterBufferRef *);
547 AVFilterPad *dst = link->dstpad;546 AVFilterPad *dst = link->dstpad;
547 int i;
548 548
549 FF_DPRINTF_START(NULL, filter_samples); ff_dlog_link(NULL, link, 1);549 FF_DPRINTF_START(NULL, filter_samples); ff_dlog_link(NULL, link, 1);
550 550
@@ -561,14 +561,15 @@ void avfilter_filter_samples(AVFilterLink *link, AVFilterBufferRef *samplesref) · 10 unmodified lines
561 561
562 link->cur_buf = avfilter_default_get_audio_buffer(link, dst->min_perms,562 link->cur_buf = avfilter_default_get_audio_buffer(link, dst->min_perms,
563 samplesref->format,563 samplesref->format,
564 samplesref->audio->size,564 samplesref->audio->nb_samples,
565 samplesref->audio->channel_layout,565 samplesref->audio->channel_layout,
566 samplesref->audio->planar);566 samplesref->audio->planar);
567 link->cur_buf->pts = samplesref->pts;567 link->cur_buf->pts = samplesref->pts;
568 link->cur_buf->audio->sample_rate = samplesref->audio->sample_rate;568 link->cur_buf->audio->sample_rate = samplesref->audio->sample_rate;
569 569
570 /* Copy actual data into new samples buffer */570 /* Copy actual data into new samples buffer */
571 memcpy(link->cur_buf->data[0], samplesref->data[0], samplesref->audio->size);571 for (i = 0; samplesref->data[i]; i++)
572 memcpy(link->cur_buf->data[i], samplesref->data[i], samplesref->linesize[0]);
572 573
573 avfilter_unref_buffer(samplesref);574 avfilter_unref_buffer(samplesref);
574 } else575 } else
libavfilter/avfilter.h+6−7
@@ -26,7 +26,7 @@ · 25 unmodified lines
26#include "libavutil/samplefmt.h"26#include "libavutil/samplefmt.h"
27 27
28#define LIBAVFILTER_VERSION_MAJOR 228#define LIBAVFILTER_VERSION_MAJOR 2
29#define LIBAVFILTER_VERSION_MINOR 1329#define LIBAVFILTER_VERSION_MINOR 14
30#define LIBAVFILTER_VERSION_MICRO 030#define LIBAVFILTER_VERSION_MICRO 0
31 31
32#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \32#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
@@ -98,8 +98,7 @@ typedef struct AVFilterBuffer { · 65 unmodified lines
98 */98 */
99typedef struct AVFilterBufferRefAudioProps {99typedef struct AVFilterBufferRefAudioProps {
100 int64_t channel_layout; ///< channel layout of audio buffer100 int64_t channel_layout; ///< channel layout of audio buffer
101 int nb_samples; ///< number of audio samples101 int nb_samples; ///< number of audio samples per channel
102 int size; ///< audio buffer size
103 uint32_t sample_rate; ///< audio buffer sample rate102 uint32_t sample_rate; ///< audio buffer sample rate
104 int planar; ///< audio buffer - planar or packed103 int planar; ///< audio buffer - planar or packed
105} AVFilterBufferRefAudioProps;104} AVFilterBufferRefAudioProps;
@@ -372,7 +371,7 @@ struct AVFilterPad { · 266 unmodified lines
372 * Input audio pads only.371 * Input audio pads only.
373 */372 */
374 AVFilterBufferRef *(*get_audio_buffer)(AVFilterLink *link, int perms,373 AVFilterBufferRef *(*get_audio_buffer)(AVFilterLink *link, int perms,
375 enum AVSampleFormat sample_fmt, int size,374 enum AVSampleFormat sample_fmt, int nb_samples,
376 int64_t channel_layout, int planar);375 int64_t channel_layout, int planar);
377 376
378 /**377 /**
@@ -461,7 +460,7 @@ AVFilterBufferRef *avfilter_default_get_video_buffer(AVFilterLink *link, · 82 unmodified lines
461 460
462/** default handler for get_audio_buffer() for audio inputs */461/** default handler for get_audio_buffer() for audio inputs */
463AVFilterBufferRef *avfilter_default_get_audio_buffer(AVFilterLink *link, int perms,462AVFilterBufferRef *avfilter_default_get_audio_buffer(AVFilterLink *link, int perms,
464 enum AVSampleFormat sample_fmt, int size,463 enum AVSampleFormat sample_fmt, int nb_samples,
465 int64_t channel_layout, int planar);464 int64_t channel_layout, int planar);
466 465
467/**466/**
@@ -684,14 +683,14 @@ avfilter_get_video_buffer_ref_from_arrays(uint8_t * const data[4], const int lin · 216 unmodified lines
684 * be requested683 * be requested
685 * @param perms the required access permissions684 * @param perms the required access permissions
686 * @param sample_fmt the format of each sample in the buffer to allocate685 * @param sample_fmt the format of each sample in the buffer to allocate
687 * @param size the buffer size in bytes686 * @param nb_samples the number of samples per channel
688 * @param channel_layout the number and type of channels per sample in the buffer to allocate687 * @param channel_layout the number and type of channels per sample in the buffer to allocate
689 * @param planar audio data layout - planar or packed688 * @param planar audio data layout - planar or packed
690 * @return A reference to the samples. This must be unreferenced with689 * @return A reference to the samples. This must be unreferenced with
691 * avfilter_unref_buffer when you are finished with it.690 * avfilter_unref_buffer when you are finished with it.
692 */691 */
693AVFilterBufferRef *avfilter_get_audio_buffer(AVFilterLink *link, int perms,692AVFilterBufferRef *avfilter_get_audio_buffer(AVFilterLink *link, int perms,
694 enum AVSampleFormat sample_fmt, int size,693 enum AVSampleFormat sample_fmt, int nb_samples,
695 int64_t channel_layout, int planar);694 int64_t channel_layout, int planar);
696 695
697/**696/**
libavfilter/defaults.c+5−6
@@ -81,7 +81,7 @@ AVFilterBufferRef *avfilter_default_get_video_buffer(AVFilterLink *link, int per · 80 unmodified lines
81}81}
82 82
83AVFilterBufferRef *avfilter_default_get_audio_buffer(AVFilterLink *link, int perms,83AVFilterBufferRef *avfilter_default_get_audio_buffer(AVFilterLink *link, int perms,
84 enum AVSampleFormat sample_fmt, int size,84 enum AVSampleFormat sample_fmt, int nb_samples,
85 int64_t channel_layout, int planar)85 int64_t channel_layout, int planar)
86{86{
87 AVFilterBuffer *samples = av_mallocz(sizeof(AVFilterBuffer));87 AVFilterBuffer *samples = av_mallocz(sizeof(AVFilterBuffer));
@@ -100,7 +100,7 @@ AVFilterBufferRef *avfilter_default_get_audio_buffer(AVFilterLink *link, int per · 12 unmodified lines
100 goto fail;100 goto fail;
101 101
102 ref->audio->channel_layout = channel_layout;102 ref->audio->channel_layout = channel_layout;
103 ref->audio->size = size;103 ref->audio->nb_samples = nb_samples;
104 ref->audio->planar = planar;104 ref->audio->planar = planar;
105 105
106 /* make sure the buffer gets read permission or it's useless for output */106 /* make sure the buffer gets read permission or it's useless for output */
@@ -112,8 +112,7 @@ AVFilterBufferRef *avfilter_default_get_audio_buffer(AVFilterLink *link, int per · 5 unmodified lines
112 sample_size = av_get_bits_per_sample_fmt(sample_fmt) >>3;112 sample_size = av_get_bits_per_sample_fmt(sample_fmt) >>3;
113 chans_nb = av_get_channel_layout_nb_channels(channel_layout);113 chans_nb = av_get_channel_layout_nb_channels(channel_layout);
114 114
115 per_channel_size = size/chans_nb;115 per_channel_size = nb_samples * sample_size;
116 ref->audio->nb_samples = per_channel_size/sample_size;
117 116
118 /* Set the number of bytes to traverse to reach next sample of a particular channel:117 /* Set the number of bytes to traverse to reach next sample of a particular channel:
119 * For planar, this is simply the sample size.118 * For planar, this is simply the sample size.
@@ -124,7 +123,7 @@ AVFilterBufferRef *avfilter_default_get_audio_buffer(AVFilterLink *link, int per · 4 unmodified lines
124 memset(&samples->linesize[chans_nb], 0, (8-chans_nb) * sizeof(samples->linesize[0]));123 memset(&samples->linesize[chans_nb], 0, (8-chans_nb) * sizeof(samples->linesize[0]));
125 124
126 /* Calculate total buffer size, round to multiple of 16 to be SIMD friendly */125 /* Calculate total buffer size, round to multiple of 16 to be SIMD friendly */
127 bufsize = (size + 15)&~15;126 bufsize = (nb_samples * chans_nb * sample_size + 15)&~15;
128 buf = av_malloc(bufsize);127 buf = av_malloc(bufsize);
129 if (!buf)128 if (!buf)
130 goto fail;129 goto fail;
@@ -212,7 +211,7 @@ void avfilter_default_filter_samples(AVFilterLink *inlink, AVFilterBufferRef *sa · 81 unmodified lines
212 211
213 if (outlink) {212 if (outlink) {
214 outlink->out_buf = avfilter_default_get_audio_buffer(inlink, AV_PERM_WRITE, samplesref->format,213 outlink->out_buf = avfilter_default_get_audio_buffer(inlink, AV_PERM_WRITE, samplesref->format,
215 samplesref->audio->size,214 samplesref->audio->nb_samples,
216 samplesref->audio->channel_layout,215 samplesref->audio->channel_layout,
217 samplesref->audio->planar);216 samplesref->audio->planar);
218 outlink->out_buf->pts = samplesref->pts;217 outlink->out_buf->pts = samplesref->pts;

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