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.
Showing the changes to libavfilter/avfilter.c (1 of 4 files). Show all
Unified · Split
| @@ -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 |