- AVFilterLink *outlink = ctx->outputs[0];
- double interpolate_scene_score = 0;
-
- if ((s->flags & FRAMERATE_FLAG_SCD) && copy_src2) {
- interpolate_scene_score = get_scene_score16(ctx, copy_src1, copy_src2);
- ff_dlog(ctx, "blend_frames16() interpolate scene score:%f\n", interpolate_scene_score);
+ ThreadData *td = arg;
+ uint16_t src1_factor = td->src1_factor;
+ uint16_t src2_factor = td->src2_factor;
+ int plane, line, pixel;
+
+ 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;
+
+ if (plane <1 || plane >2) {
+ // luma or alpha
+ for (line = start; line < end; line++) {
+ for (pixel = 0; pixel < cpy_line_width; pixel++) {
+ // integer version of (src1 * src1_factor) + (src2 + src2_factor) + 0.5
+ // 0.5 is for rounding
+ // 128 is the integer representation of 0.5 << 8
+ cpy_dst_data[pixel] = ((cpy_src1_data[pixel] * src1_factor) + (cpy_src2_data[pixel] * src2_factor) + 128) >> 8;
+ }
+ cpy_src1_data += cpy_src1_line_size;
+ cpy_src2_data += cpy_src2_line_size;
+ cpy_dst_data += cpy_dst_line_size;
+ }
+ } else {
+ // chroma
+ for (line = start; line < end; line++) {
+ for (pixel = 0; pixel < cpy_line_width; pixel++) {
+ // as above
+ // because U and V are based around 128 we have to subtract 128 from the components.
+ // 32896 is the integer representation of 128.5 << 8
+ cpy_dst_data[pixel] = (((cpy_src1_data[pixel] - 128) * src1_factor) + ((cpy_src2_data[pixel] - 128) * src2_factor) + 32896) >> 8;
+ }
+ cpy_src1_data += cpy_src1_line_size;
+ cpy_src2_data += cpy_src2_line_size;
+ cpy_dst_data += cpy_dst_line_size;
+ }
+ }