static void peak__frame(filter *filt, const y4m2_parameters *parms, y4m2_frame *frame) { peak__work *wrk = filt->ctx; if (!wrk->acc) { wrk->acc = jd_alloc(frame->i.size * sizeof(double)); for (unsigned p = 0; p < Y4M2_N_PLANE; p++) wrk->scale[p] = 1; } uint8_t *fp = frame->buf; double *ap = wrk->acc; double *sp = wrk->scale; for (unsigned p = 0; p < Y4M2_N_PLANE; p++) { if (model_get_int(&filt->config, 0, "$.options.%s.disabled", plane_key[p])) { ap += frame->i.plane[p].size; fp += frame->i.plane[p].size; sp++; } else { double decay = model_get_real(&filt->config, 0, "$.options.%s.decay", plane_key[p]); double scale = *sp; for (unsigned i = 0; i < frame->i.plane[p].size; i++) { double sample = *fp; double next = (*ap = *ap * decay + sample) / scale; ap++; *fp++ = (uint8_t)(sample > next ? sample : next); } *sp++ = scale * decay + 1; } } y4m2_emit_frame(filt->out, parms, frame); }
void average_config(average *avg, jd_var *v, const char *ns) { average_init(avg, model_get_real(v, 0, "$.%s_decay", ns), model_get_real(v, 1, "$.%s_ow", ns), model_get_real(v, 1, "$.%s_nw", ns)); }