示例#1
0
文件: merge.c 项目: AndyA/timewarp
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;
  }
}
示例#2
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;
  }
}
示例#3
0
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);
}
示例#4
0
文件: peak.c 项目: AndyA/timewarp
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);
}
示例#5
0
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;
  }
}