static int activate(AVFilterContext *ctx) { AVFilterLink *inlink = ctx->inputs[0]; AVFilterLink *outlink = ctx->outputs[0]; AVFrame *in; int64_t pts; int ret, status; FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink); ret = ff_inlink_consume_frame(inlink, &in); if (ret < 0) return ret; if (ret > 0) return filter_frame(inlink, in); if (ff_inlink_acknowledge_status(inlink, &status, &pts)) { if (status == AVERROR_EOF) { int64_t out_pts = pts; ret = flush_frame(outlink, pts, &out_pts); ff_outlink_set_status(outlink, status, out_pts); return ret; } } FF_FILTER_FORWARD_WANTED(outlink, inlink); return FFERROR_NOT_READY; }
static int activate(AVFilterContext *ctx) { AVFilterLink *inlink = ctx->inputs[0]; AVFilterLink *outlink = ctx->outputs[0]; CueContext *s = ctx->priv; int64_t pts; AVFrame *frame = NULL; FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink); if (s->status < 3 || s->status == 5) { int ret = ff_inlink_consume_frame(inlink, &frame); if (ret < 0) return ret; if (frame) pts = av_rescale_q(frame->pts, inlink->time_base, AV_TIME_BASE_Q); } if (!s->status && frame) { s->first_pts = pts; s->status++; } if (s->status == 1 && frame) { if (pts - s->first_pts < s->preroll) return ff_filter_frame(outlink, frame); s->first_pts = pts; s->status++; } if (s->status == 2 && frame) { int ret = ff_framequeue_add(&s->queue, frame); if (ret < 0) { av_frame_free(&frame); return ret; } frame = NULL; if (!(pts - s->first_pts < s->buffer && (av_gettime() - s->cue) < 0)) s->status++; } if (s->status == 3) { int64_t diff; while ((diff = (av_gettime() - s->cue)) < 0) av_usleep(av_clip(-diff / 2, 100, 1000000)); s->status++; } if (s->status == 4) { if (ff_framequeue_queued_frames(&s->queue)) return ff_filter_frame(outlink, ff_framequeue_take(&s->queue)); s->status++; } if (s->status == 5 && frame) return ff_filter_frame(outlink, frame); FF_FILTER_FORWARD_STATUS(inlink, outlink); FF_FILTER_FORWARD_WANTED(outlink, inlink); return FFERROR_NOT_READY; }
static int activate(AVFilterContext *ctx) { FPSContext *s = ctx->priv; AVFilterLink *inlink = ctx->inputs[0]; AVFilterLink *outlink = ctx->outputs[0]; int ret; int again = 0; int64_t status_pts; FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink); /* No buffered status: normal operation */ if (!s->status) { /* Read available input frames if we have room */ while (s->frames_count < 2 && ff_inlink_check_available_frame(inlink)) { ret = read_frame(ctx, s, inlink, outlink); if (ret < 0) return ret; } /* We do not yet have enough frames to produce output */ if (s->frames_count < 2) { /* Check if we've hit EOF (or otherwise that an error status is set) */ ret = ff_inlink_acknowledge_status(inlink, &s->status, &status_pts); if (ret > 0) update_eof_pts(ctx, s, inlink, outlink, status_pts); if (!ret) { /* If someone wants us to output, we'd better ask for more input */ FF_FILTER_FORWARD_WANTED(outlink, inlink); return 0; } } } /* Buffered frames are available, so generate an output frame */ if (s->frames_count > 0) { ret = write_frame(ctx, s, outlink, &again); /* Couldn't generate a frame, so schedule us to perform another step */ if (again) ff_filter_set_ready(ctx, 100); return ret; } /* No frames left, so forward the status */ if (s->status && s->frames_count == 0) { ff_outlink_set_status(outlink, s->status, s->next_pts); return 0; } return FFERROR_NOT_READY; }
static int activate(AVFilterContext *ctx) { AVFilterLink *inlink = ctx->inputs[0]; AVFilterLink *outlink = ctx->outputs[0]; LoopContext *s = ctx->priv; AVFrame *frame = NULL; int ret, status; int64_t pts; FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink); if (!s->eof && (s->nb_frames < s->size || !s->loop)) { ret = ff_inlink_consume_frame(inlink, &frame); if (ret < 0) return ret; if (ret > 0) return filter_frame(inlink, frame); } if (!s->eof && ff_inlink_acknowledge_status(inlink, &status, &pts)) { if (status == AVERROR_EOF) s->eof = 1; } if (s->eof && (s->loop == 0 || s->nb_frames < s->size)) { ff_outlink_set_status(outlink, AVERROR_EOF, s->duration); return 0; } if (!s->eof && (!s->size || (s->nb_frames < s->size) || (s->nb_frames >= s->size && s->loop == 0))) { FF_FILTER_FORWARD_WANTED(outlink, inlink); } else if (s->loop && s->nb_frames == s->size) { return push_frame(ctx); } return FFERROR_NOT_READY; }