static int filter_frame()

in Transform360/vf_transform360.c [307:371]


static int filter_frame(AVFilterLink *inlink, AVFrame *in) {
    AVFilterContext *ctx = inlink->dst;
    TransformContext *s = ctx->priv;
    AVFilterLink *outlink = ctx->outputs[0];
    AVFrame *out;
    av_log(ctx, AV_LOG_VERBOSE, "Frame\n");

    // map not yet set
    if (s->out_map_planes != 2) {
      int result = generate_map(s, inlink, outlink, in);
      if (result != 0) {
          av_frame_free(&in);
          return result;
      }
    }

    out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
    av_log(ctx, AV_LOG_VERBOSE, "Got Frame %dx%d\n", outlink->w, outlink->h);

    if (!out) {
      av_frame_free(&in);
      return AVERROR(ENOMEM);
    }
    av_frame_copy_props(out, in);
    av_log(ctx, AV_LOG_VERBOSE, "Copied props \n");

    uint8_t *in_data, *out_data;
    int out_map_plane;
    int in_w, in_h, out_w, out_h;
    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(outlink->format);
    for (int plane = 0; plane < s->planes; ++plane) {
      in_data = in->data[plane];
      av_assert1(in_data);
      out_data = out->data[plane];
      out_map_plane = (plane == 1 || plane == 2) ? 1 : 0;

      out_w = outlink->w;
      out_h = outlink->h;
      in_w = inlink->w;
      in_h = inlink->h;

      if (plane >= 1) {
        update_plane_sizes(desc, &in_w, &in_h, &out_w, &out_h);
      }

      if (!VideoFrameTransform_transformFramePlane(
        s->transform,
        in_data,
        out_data,
        in_w,
        in_h,
        in->linesize[plane],
        out_w,
        out_h,
        out->linesize[plane],
        out_map_plane,
        plane)) {
        return AVERROR(EINVAL);
      }
    }

    av_frame_free(&in);
    av_log(ctx, AV_LOG_VERBOSE, "Done freeing in \n");
    return ff_filter_frame(outlink, out);
}