int ff_filter_samples(AVFilterLink *link, AVFilterBufferRef *samplesref) { int insamples = samplesref->audio->nb_samples, inpos = 0, nb_samples; AVFilterBufferRef *pbuf = link->partial_buf; int nb_channels = av_get_channel_layout_nb_channels(link->channel_layout); int ret = 0; av_assert1(samplesref->format == link->format); av_assert1(samplesref->audio->channel_layout == link->channel_layout); av_assert1(samplesref->audio->sample_rate == link->sample_rate); if (!link->min_samples || (!pbuf && insamples >= link->min_samples && insamples <= link->max_samples)) { return ff_filter_samples_framed(link, samplesref); } /* Handle framing (min_samples, max_samples) */ while (insamples) { if (!pbuf) { AVRational samples_tb = { 1, link->sample_rate }; int perms = link->dstpad->min_perms | AV_PERM_WRITE; pbuf = ff_get_audio_buffer(link, perms, link->partial_buf_size); if (!pbuf) { av_log(link->dst, AV_LOG_WARNING, "Samples dropped due to memory allocation failure.\n"); return 0; } avfilter_copy_buffer_ref_props(pbuf, samplesref); pbuf->pts = samplesref->pts + av_rescale_q(inpos, samples_tb, link->time_base); pbuf->audio->nb_samples = 0; } nb_samples = FFMIN(insamples, link->partial_buf_size - pbuf->audio->nb_samples); av_samples_copy(pbuf->extended_data, samplesref->extended_data, pbuf->audio->nb_samples, inpos, nb_samples, nb_channels, link->format); inpos += nb_samples; insamples -= nb_samples; pbuf->audio->nb_samples += nb_samples; if (pbuf->audio->nb_samples >= link->min_samples) { ret = ff_filter_samples_framed(link, pbuf); pbuf = NULL; } } avfilter_unref_buffer(samplesref); link->partial_buf = pbuf; return ret; }
int ff_request_frame(AVFilterLink *link) { int ret = -1; FF_TPRINTF_START(NULL, request_frame); ff_tlog_link(NULL, link, 1); if (link->closed) return AVERROR_EOF; if (link->srcpad->request_frame) ret = link->srcpad->request_frame(link); else if (link->src->inputs[0]) ret = ff_request_frame(link->src->inputs[0]); if (ret == AVERROR_EOF && link->partial_buf) { AVFilterBufferRef *pbuf = link->partial_buf; link->partial_buf = NULL; ff_filter_samples_framed(link, pbuf); return 0; } if (ret == AVERROR_EOF) link->closed = 1; return ret; }