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);
}