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.
Unified · Split
| @@ -13,6 +13,11 @@ libavutil: 2011-04-18 · 12 unmodified lines | |||
| 13 | 13 | ||
| 14 | API changes, most recent first: | 14 | API changes, most recent first: |
| 15 | 15 | ||
| 16 | 2011-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 | |||
| 16 | 2011-06-06 - xxxxxx - lavu 51.6.0 - av_samples_alloc() | 21 | 2011-06-06 - xxxxxx - lavu 51.6.0 - av_samples_alloc() |
| 17 | Switch nb_channels and nb_samples parameters order in | 22 | Switch nb_channels and nb_samples parameters order in |
| 18 | av_samples_alloc(). | 23 | av_samples_alloc(). |
| @@ -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 | ||
| 407 | AVFilterBufferRef *avfilter_get_audio_buffer(AVFilterLink *link, int perms, | 406 | AVFilterBufferRef *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 | } else | 575 | } else |
| @@ -26,7 +26,7 @@ · 25 unmodified lines | |||
| 26 | #include "libavutil/samplefmt.h" | 26 | #include "libavutil/samplefmt.h" |
| 27 | 27 | ||
| 28 | #define LIBAVFILTER_VERSION_MAJOR 2 | 28 | #define LIBAVFILTER_VERSION_MAJOR 2 |
| 29 | #define LIBAVFILTER_VERSION_MINOR 13 | 29 | #define LIBAVFILTER_VERSION_MINOR 14 |
| 30 | #define LIBAVFILTER_VERSION_MICRO 0 | 30 | #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 | */ |
| 99 | typedef struct AVFilterBufferRefAudioProps { | 99 | typedef struct AVFilterBufferRefAudioProps { |
| 100 | int64_t channel_layout; ///< channel layout of audio buffer | 100 | int64_t channel_layout; ///< channel layout of audio buffer |
| 101 | int nb_samples; ///< number of audio samples | 101 | int nb_samples; ///< number of audio samples per channel |
| 102 | int size; ///< audio buffer size | ||
| 103 | uint32_t sample_rate; ///< audio buffer sample rate | 102 | uint32_t sample_rate; ///< audio buffer sample rate |
| 104 | int planar; ///< audio buffer - planar or packed | 103 | 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 */ |
| 463 | AVFilterBufferRef *avfilter_default_get_audio_buffer(AVFilterLink *link, int perms, | 462 | AVFilterBufferRef *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 requested | 683 | * be requested |
| 685 | * @param perms the required access permissions | 684 | * @param perms the required access permissions |
| 686 | * @param sample_fmt the format of each sample in the buffer to allocate | 685 | * @param sample_fmt the format of each sample in the buffer to allocate |
| 687 | * @param size the buffer size in bytes | 686 | * @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 allocate | 687 | * @param channel_layout the number and type of channels per sample in the buffer to allocate |
| 689 | * @param planar audio data layout - planar or packed | 688 | * @param planar audio data layout - planar or packed |
| 690 | * @return A reference to the samples. This must be unreferenced with | 689 | * @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 | */ |
| 693 | AVFilterBufferRef *avfilter_get_audio_buffer(AVFilterLink *link, int perms, | 692 | AVFilterBufferRef *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 | /** |
| @@ -81,7 +81,7 @@ AVFilterBufferRef *avfilter_default_get_video_buffer(AVFilterLink *link, int per · 80 unmodified lines | |||
| 81 | } | 81 | } |
| 82 | 82 | ||
| 83 | AVFilterBufferRef *avfilter_default_get_audio_buffer(AVFilterLink *link, int perms, | 83 | AVFilterBufferRef *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; |