static int filter_frame(AVFilterLink *link, AVFrame *picref) { AVFilterContext *ctx = link->dst; IDETContext *idet = ctx->priv; AVDictionary **metadata = avpriv_frame_get_metadatap(picref); if (idet->prev) av_frame_free(&idet->prev); idet->prev = idet->cur; idet->cur = idet->next; idet->next = picref; if (!idet->cur) return 0; if (!idet->prev) idet->prev = av_frame_clone(idet->cur); if (!idet->csp) idet->csp = av_pix_fmt_desc_get(link->format); if (idet->csp->comp[0].depth_minus1 / 8 == 1){ idet->filter_line = (ff_idet_filter_func)ff_idet_filter_line_c_16bit; if (ARCH_X86) ff_idet_init_x86(idet, 1); } filter(ctx); av_dict_set_int(metadata, "lavfi.idet.tff", idet->prestat[TFF], 0); av_dict_set_int(metadata, "lavfi.idet.bff", idet->prestat[BFF], 0); av_dict_set_int(metadata, "lavfi.idet.progressive", idet->prestat[PROGRESSIVE], 0); av_dict_set_int(metadata, "lavfi.idet.undetermined", idet->prestat[UNDETERMINED], 0); return ff_filter_frame(ctx->outputs[0], av_frame_clone(idet->cur)); }
static int filter_frame(AVFilterLink *link, AVFrame *picref) { AVFilterContext *ctx = link->dst; IDETContext *idet = ctx->priv; if (idet->prev) av_frame_free(&idet->prev); idet->prev = idet->cur; idet->cur = idet->next; idet->next = picref; if (!idet->cur) return 0; if (!idet->prev) idet->prev = av_frame_clone(idet->cur); if (!idet->csp) idet->csp = av_pix_fmt_desc_get(link->format); if (idet->csp->comp[0].depth_minus1 / 8 == 1){ idet->filter_line = (ff_idet_filter_func)ff_idet_filter_line_c_16bit; if (ARCH_X86) ff_idet_init_x86(idet, 1); } filter(ctx); return ff_filter_frame(ctx->outputs[0], av_frame_clone(idet->cur)); }
static av_cold int init(AVFilterContext *ctx) { IDETContext *idet = ctx->priv; idet->last_type = UNDETERMINED; memset(idet->history, UNDETERMINED, HIST_SIZE); idet->filter_line = ff_idet_filter_line_c; if (ARCH_X86) ff_idet_init_x86(idet, 0); return 0; }
static av_cold int init(AVFilterContext *ctx) { IDETContext *idet = ctx->priv; idet->eof = 0; idet->last_type = UNDETERMINED; memset(idet->history, UNDETERMINED, HIST_SIZE); if( idet->half_life > 0 ) idet->decay_coefficient = (uint64_t) round( PRECISION * exp2(-1.0 / idet->half_life) ); else idet->decay_coefficient = PRECISION; idet->filter_line = ff_idet_filter_line_c; if (ARCH_X86) ff_idet_init_x86(idet, 0); return 0; }
static int filter_frame(AVFilterLink *link, AVFrame *picref) { AVFilterContext *ctx = link->dst; IDETContext *idet = ctx->priv; // initial frame(s) and not interlaced, just pass through for // the analyze_interlaced_flag mode if (idet->analyze_interlaced_flag && !picref->interlaced_frame && !idet->next) { return ff_filter_frame(ctx->outputs[0], picref); } if (idet->analyze_interlaced_flag_done) { if (picref->interlaced_frame && idet->interlaced_flag_accuracy < 0) picref->interlaced_frame = 0; return ff_filter_frame(ctx->outputs[0], picref); } av_frame_free(&idet->prev); if( picref->width != link->w || picref->height != link->h || picref->format != link->format) { link->dst->inputs[0]->format = picref->format; link->dst->inputs[0]->w = picref->width; link->dst->inputs[0]->h = picref->height; av_frame_free(&idet->cur ); av_frame_free(&idet->next); } idet->prev = idet->cur; idet->cur = idet->next; idet->next = picref; if (!idet->cur && !(idet->cur = av_frame_clone(idet->next))) return AVERROR(ENOMEM); if (!idet->prev) return 0; if (!idet->csp) idet->csp = av_pix_fmt_desc_get(link->format); if (idet->csp->comp[0].depth > 8){ idet->filter_line = (ff_idet_filter_func)ff_idet_filter_line_c_16bit; if (ARCH_X86) ff_idet_init_x86(idet, 1); } if (idet->analyze_interlaced_flag) { if (idet->cur->interlaced_frame) { idet->cur->interlaced_frame = 0; filter(ctx); if (idet->last_type == PROGRESSIVE) { idet->interlaced_flag_accuracy --; idet->analyze_interlaced_flag --; } else if (idet->last_type != UNDETERMINED) { idet->interlaced_flag_accuracy ++; idet->analyze_interlaced_flag --; } if (idet->analyze_interlaced_flag == 1) { ff_filter_frame(ctx->outputs[0], av_frame_clone(idet->cur)); if (idet->next->interlaced_frame && idet->interlaced_flag_accuracy < 0) idet->next->interlaced_frame = 0; idet->analyze_interlaced_flag_done = 1; av_log(ctx, AV_LOG_INFO, "Final flag accuracy %d\n", idet->interlaced_flag_accuracy); return ff_filter_frame(ctx->outputs[0], av_frame_clone(idet->next)); } } } else { filter(ctx); } return ff_filter_frame(ctx->outputs[0], av_frame_clone(idet->cur)); }