static int config_output(AVFilterLink *outlink) { AVFilterContext *ctx = outlink->src; StreamSelectContext *s = ctx->priv; const int outlink_idx = FF_OUTLINK_IDX(outlink); const int inlink_idx = s->map[outlink_idx]; AVFilterLink *inlink = ctx->inputs[inlink_idx]; FFFrameSyncIn *in; int i, ret; av_log(ctx, AV_LOG_VERBOSE, "config output link %d " "with settings from input link %d\n", outlink_idx, inlink_idx); switch (outlink->type) { case AVMEDIA_TYPE_VIDEO: outlink->w = inlink->w; outlink->h = inlink->h; outlink->sample_aspect_ratio = inlink->sample_aspect_ratio; outlink->frame_rate = inlink->frame_rate; break; case AVMEDIA_TYPE_AUDIO: outlink->sample_rate = inlink->sample_rate; outlink->channels = inlink->channels; outlink->channel_layout = inlink->channel_layout; break; } outlink->time_base = inlink->time_base; outlink->format = inlink->format; if (s->fs.opaque == s) return 0; if ((ret = ff_framesync_init(&s->fs, ctx, ctx->nb_inputs)) < 0) return ret; in = s->fs.in; s->fs.opaque = s; s->fs.on_event = process_frame; for (i = 0; i < ctx->nb_inputs; i++) { in[i].time_base = ctx->inputs[i]->time_base; in[i].sync = 1; in[i].before = EXT_STOP; in[i].after = EXT_STOP; } s->frames = av_calloc(ctx->nb_inputs, sizeof(*s->frames)); if (!s->frames) return AVERROR(ENOMEM); return ff_framesync_configure(&s->fs); }
static int request_frame(AVFilterLink *outlink) { AVFilterContext *ctx = outlink->src; SelectContext *select = ctx->priv; AVFilterLink *inlink = outlink->src->inputs[0]; int out_no = FF_OUTLINK_IDX(outlink); do { int ret = ff_request_frame(inlink); if (ret < 0) return ret; } while (select->select_out != out_no); return 0; }