in Transform_V1/vf_transform_v1.c [924:984]
static int filter_frame(AVFilterLink *inlink, AVFrame *in)
{
AVFilterContext *ctx = inlink->dst;
TransformContext *s = ctx->priv;
AVFilterLink *outlink = ctx->outputs[0];
AVFrame *out;
int subs;
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");
subs = s->w_subdivisions * s->h_subdivisions;
for (int plane = 0; plane < s->planes; ++plane) {
uint8_t *in_data, *out_data;
int out_map_plane;
TransformPlaneMap *p;
in_data = in->data[plane];
av_assert1(in_data);
out_map_plane = (plane == 1 || plane == 2) ? 1 : 0;
p = &s->out_map[out_map_plane];
out_data = out->data[plane];
int num_tiles_row = 1 + ((p->h - 1) / 16); // ceiling operation
int num_tiles_col = 1 + ((p->w - 1) / 16); // ceiling operation
int num_tiles = num_tiles_row * num_tiles_col;
ThreadData td;
td.p = p;
td.subs = subs;
td.linesize = out->linesize[plane];
td.num_tiles = num_tiles;
td.num_tiles_col = num_tiles_col;
td.in_data = in_data;
td.out_data = out_data;
ctx->internal->execute(ctx, filter_slice, &td, NULL, FFMIN(num_tiles, ctx->graph->nb_threads));
}
av_log(ctx, AV_LOG_VERBOSE, "Done with byte copy \n");
av_frame_free(&in);
av_log(ctx, AV_LOG_VERBOSE, "Done freeing in \n");
return ff_filter_frame(outlink, out);
}