static int mode08(int c, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8) { REMOVE_GRAIN_SORT_AXIS const int d1 = ma1 - mi1; const int d2 = ma2 - mi2; const int d3 = ma3 - mi3; const int d4 = ma4 - mi4; const int cli1 = av_clip(c, mi1, ma1); const int cli2 = av_clip(c, mi2, ma2); const int cli3 = av_clip(c, mi3, ma3); const int cli4 = av_clip(c, mi4, ma4); const int c1 = av_clip_uint16(FFABS(c - cli1) + (d1 << 1)); const int c2 = av_clip_uint16(FFABS(c - cli2) + (d2 << 1)); const int c3 = av_clip_uint16(FFABS(c - cli3) + (d3 << 1)); const int c4 = av_clip_uint16(FFABS(c - cli4) + (d4 << 1)); const int mindiff = FFMIN(FFMIN(c1, c2), FFMIN(c3, c4)); if (mindiff == c4) { return cli4; } else if (mindiff == c2) { return cli2; } else if (mindiff == c3) { return cli3; } return cli1; }
static int filter_frame(AVFilterLink *inlink, AVFrame *frame) { AVFilterContext *ctx = inlink->dst; FadeContext *s = ctx->priv; double frame_timestamp = frame->pts == AV_NOPTS_VALUE ? -1 : frame->pts * av_q2d(inlink->time_base); // Calculate Fade assuming this is a Fade In if (s->fade_state == VF_FADE_WAITING) { s->factor=0; if (frame_timestamp >= s->start_time/(double)AV_TIME_BASE && inlink->frame_count_out >= s->start_frame) { // Time to start fading s->fade_state = VF_FADE_FADING; // Save start time in case we are starting based on frames and fading based on time if (s->start_time == 0 && s->start_frame != 0) { s->start_time = frame_timestamp*(double)AV_TIME_BASE; } // Save start frame in case we are starting based on time and fading based on frames if (s->start_time != 0 && s->start_frame == 0) { s->start_frame = inlink->frame_count_out; } } } if (s->fade_state == VF_FADE_FADING) { if (s->duration == 0) { // Fading based on frame count s->factor = (inlink->frame_count_out - s->start_frame) * s->fade_per_frame; if (inlink->frame_count_out > s->start_frame + s->nb_frames) { s->fade_state = VF_FADE_DONE; } } else { // Fading based on duration s->factor = (frame_timestamp - s->start_time/(double)AV_TIME_BASE) * (float) UINT16_MAX / (s->duration/(double)AV_TIME_BASE); if (frame_timestamp > s->start_time/(double)AV_TIME_BASE + s->duration/(double)AV_TIME_BASE) { s->fade_state = VF_FADE_DONE; } } } if (s->fade_state == VF_FADE_DONE) { s->factor=UINT16_MAX; } s->factor = av_clip_uint16(s->factor); // Invert fade_factor if Fading Out if (s->type == FADE_OUT) { s->factor=UINT16_MAX-s->factor; } if (s->factor < UINT16_MAX) { if (s->alpha) { ctx->internal->execute(ctx, filter_slice_alpha, frame, NULL, FFMIN(frame->height, ff_filter_get_nb_threads(ctx))); } else if (s->is_packed_rgb && !s->black_fade) { ctx->internal->execute(ctx, filter_slice_rgb, frame, NULL, FFMIN(frame->height, ff_filter_get_nb_threads(ctx))); } else { /* luma, or rgb plane in case of black */ ctx->internal->execute(ctx, filter_slice_luma, frame, NULL, FFMIN(frame->height, ff_filter_get_nb_threads(ctx))); if (frame->data[1] && frame->data[2]) { /* chroma planes */ ctx->internal->execute(ctx, filter_slice_chroma, frame, NULL, FFMIN(frame->height, ff_filter_get_nb_threads(ctx))); } } } return ff_filter_frame(inlink->dst->outputs[0], frame); }