示例#1
0
文件: audio.c 项目: SmartJog/ffmpeg
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;
}
示例#2
0
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;
}