static int filter_slice(AVFilterContext *ctx, void *arg, int job, int nb_jobs) { FrameRateContext *s = ctx->priv; ThreadData *td = arg; uint16_t src1_factor = td->src1_factor; uint16_t src2_factor = td->src2_factor; int plane; for (plane = 0; plane < 4 && td->copy_src1->data[plane] && td->copy_src2->data[plane]; plane++) { int cpy_line_width = s->line_size[plane]; uint8_t *cpy_src1_data = td->copy_src1->data[plane]; int cpy_src1_line_size = td->copy_src1->linesize[plane]; uint8_t *cpy_src2_data = td->copy_src2->data[plane]; int cpy_src2_line_size = td->copy_src2->linesize[plane]; int cpy_src_h = (plane > 0 && plane < 3) ? (td->copy_src1->height >> s->vsub) : (td->copy_src1->height); uint8_t *cpy_dst_data = s->work->data[plane]; int cpy_dst_line_size = s->work->linesize[plane]; const int start = (cpy_src_h * job ) / nb_jobs; const int end = (cpy_src_h * (job+1)) / nb_jobs; cpy_src1_data += start * cpy_src1_line_size; cpy_src2_data += start * cpy_src2_line_size; cpy_dst_data += start * cpy_dst_line_size; s->blend(cpy_src1_data, cpy_src1_line_size, cpy_src2_data, cpy_src2_line_size, cpy_dst_data, cpy_dst_line_size, cpy_line_width, end - start, src1_factor, src2_factor, s->max / 2, s->bitdepth); } return 0; }