static void merge__frame(filter *filt, const y4m2_parameters *parms, y4m2_frame *frame) { merge__work *wrk = filt->ctx; unsigned frames = model_get_int(&filt->config, 10, "$.options.frames"); if (!wrk->avg) wrk->avg = jd_alloc(frame->i.size * sizeof(uint32_t)); merge__add(wrk->avg, frame); if (++wrk->phase == frames) { merge__scale(frame, wrk->avg, frames); y4m2_emit_frame(filt->out, parms, frame); memset(wrk->avg, 0, frame->i.size * sizeof(uint32_t)); wrk->phase = 0; } }
static void callback(y4m2_reason reason, const y4m2_parameters *parms, y4m2_frame *frame, void *ctx) { output_ctx *oc = (output_ctx *)ctx; switch (reason) { case Y4M2_START: if (!y4m2_equal_parms(oc->parms, parms)) { y4m2_free_parms(oc->parms); oc->parms = y4m2_clone_parms(parms); y4m2_emit_start(oc->out, parms); } break; case Y4M2_FRAME: y4m2_emit_frame(oc->out, parms, frame); break; case Y4M2_END: y4m2_emit_end(oc->out); break; } }
static void callback(y4m2_reason reason, const y4m2_parameters *parms, y4m2_frame *frame, void *ctx) { output_ctx *oc = (output_ctx *)ctx; y4m2_parameters *merged = NULL; switch (reason) { case Y4M2_START: merged = merge_parms(oc, parms); y4m2_emit_start(oc->out, merged); break; case Y4M2_FRAME: merged = merge_parms(oc, parms); y4m2_emit_frame(oc->out, merged, frame); break; case Y4M2_END: y4m2_emit_end(oc->out); break; } y4m2_free_parms(merged); }
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); }
static void filter__callback(y4m2_reason reason, const y4m2_parameters *parms, y4m2_frame *frame, void *ctx) { filter *filt = (filter *)ctx; switch (reason) { case Y4M2_START: if (filt->start) filt->start(filt, parms); else y4m2_emit_start(filt->out, parms); break; case Y4M2_FRAME: if (!filt->frame || model_get_int(&filt->config, 0, "$.disabled")) y4m2_emit_frame(filt->out, parms, frame); else filt->frame(filt, parms, frame); break; case Y4M2_END: if (filt->end) filt->end(filt); else y4m2_emit_end(filt->out); break; } }