1 /**
2 * Copyright (c) 2014-2015 Michael Niedermayer <michaelni@gmx.at>
3 * Copyright (c) 2016 Davinder Singh (DSM_) <ds.mudhar<@gmail.com>
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
33
34 #define ME_MODE_BIDIR 0
35 #define ME_MODE_BILAT 1
36
37 #define MC_MODE_OBMC 0
38 #define MC_MODE_AOBMC 1
39
40 #define SCD_METHOD_NONE 0
41 #define SCD_METHOD_FDIFF 1
42
44 #define NB_PIXEL_MVS 32
45 #define NB_CLUSTERS 128
46
47 #define ALPHA_MAX 1024
48 #define CLUSTER_THRESHOLD 4
49 #define PX_WEIGHT_MAX 255
50 #define COST_PRED_SCALE 64
51
53 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0,
54 0, 4, 4, 4, 8, 8, 8, 12, 12, 16, 16, 16, 20, 20, 20, 24, 24, 20, 20, 20, 16, 16, 16, 12, 12, 8, 8, 8, 4, 4, 4, 0,
55 0, 4, 8, 8, 12, 12, 16, 20, 20, 24, 28, 28, 32, 32, 36, 40, 40, 36, 32, 32, 28, 28, 24, 20, 20, 16, 12, 12, 8, 8, 4, 0,
56 0, 4, 8, 12, 16, 20, 24, 28, 28, 32, 36, 40, 44, 48, 52, 56, 56, 52, 48, 44, 40, 36, 32, 28, 28, 24, 20, 16, 12, 8, 4, 0,
57 4, 8, 12, 16, 20, 24, 28, 32, 40, 44, 48, 52, 56, 60, 64, 68, 68, 64, 60, 56, 52, 48, 44, 40, 32, 28, 24, 20, 16, 12, 8, 4,
58 4, 8, 12, 20, 24, 32, 36, 40, 48, 52, 56, 64, 68, 76, 80, 84, 84, 80, 76, 68, 64, 56, 52, 48, 40, 36, 32, 24, 20, 12, 8, 4,
59 4, 8, 16, 24, 28, 36, 44, 48, 56, 60, 68, 76, 80, 88, 96,100,100, 96, 88, 80, 76, 68, 60, 56, 48, 44, 36, 28, 24, 16, 8, 4,
60 4, 12, 20, 28, 32, 40, 48, 56, 64, 72, 80, 88, 92,100,108,116,116,108,100, 92, 88, 80, 72, 64, 56, 48, 40, 32, 28, 20, 12, 4,
61 4, 12, 20, 28, 40, 48, 56, 64, 72, 80, 88, 96,108,116,124,132,132,124,116,108, 96, 88, 80, 72, 64, 56, 48, 40, 28, 20, 12, 4,
62 4, 16, 24, 32, 44, 52, 60, 72, 80, 92,100,108,120,128,136,148,148,136,128,120,108,100, 92, 80, 72, 60, 52, 44, 32, 24, 16, 4,
63 4, 16, 28, 36, 48, 56, 68, 80, 88,100,112,120,132,140,152,164,164,152,140,132,120,112,100, 88, 80, 68, 56, 48, 36, 28, 16, 4,
64 4, 16, 28, 40, 52, 64, 76, 88, 96,108,120,132,144,156,168,180,180,168,156,144,132,120,108, 96, 88, 76, 64, 52, 40, 28, 16, 4,
65 8, 20, 32, 44, 56, 68, 80, 92,108,120,132,144,156,168,180,192,192,180,168,156,144,132,120,108, 92, 80, 68, 56, 44, 32, 20, 8,
66 8, 20, 32, 48, 60, 76, 88,100,116,128,140,156,168,184,196,208,208,196,184,168,156,140,128,116,100, 88, 76, 60, 48, 32, 20, 8,
67 8, 20, 36, 52, 64, 80, 96,108,124,136,152,168,180,196,212,224,224,212,196,180,168,152,136,124,108, 96, 80, 64, 52, 36, 20, 8,
68 8, 24, 40, 56, 68, 84,100,116,132,148,164,180,192,208,224,240,240,224,208,192,180,164,148,132,116,100, 84, 68, 56, 40, 24, 8,
69 8, 24, 40, 56, 68, 84,100,116,132,148,164,180,192,208,224,240,240,224,208,192,180,164,148,132,116,100, 84, 68, 56, 40, 24, 8,
70 8, 20, 36, 52, 64, 80, 96,108,124,136,152,168,180,196,212,224,224,212,196,180,168,152,136,124,108, 96, 80, 64, 52, 36, 20, 8,
71 8, 20, 32, 48, 60, 76, 88,100,116,128,140,156,168,184,196,208,208,196,184,168,156,140,128,116,100, 88, 76, 60, 48, 32, 20, 8,
72 8, 20, 32, 44, 56, 68, 80, 92,108,120,132,144,156,168,180,192,192,180,168,156,144,132,120,108, 92, 80, 68, 56, 44, 32, 20, 8,
73 4, 16, 28, 40, 52, 64, 76, 88, 96,108,120,132,144,156,168,180,180,168,156,144,132,120,108, 96, 88, 76, 64, 52, 40, 28, 16, 4,
74 4, 16, 28, 36, 48, 56, 68, 80, 88,100,112,120,132,140,152,164,164,152,140,132,120,112,100, 88, 80, 68, 56, 48, 36, 28, 16, 4,
75 4, 16, 24, 32, 44, 52, 60, 72, 80, 92,100,108,120,128,136,148,148,136,128,120,108,100, 92, 80, 72, 60, 52, 44, 32, 24, 16, 4,
76 4, 12, 20, 28, 40, 48, 56, 64, 72, 80, 88, 96,108,116,124,132,132,124,116,108, 96, 88, 80, 72, 64, 56, 48, 40, 28, 20, 12, 4,
77 4, 12, 20, 28, 32, 40, 48, 56, 64, 72, 80, 88, 92,100,108,116,116,108,100, 92, 88, 80, 72, 64, 56, 48, 40, 32, 28, 20, 12, 4,
78 4, 8, 16, 24, 28, 36, 44, 48, 56, 60, 68, 76, 80, 88, 96,100,100, 96, 88, 80, 76, 68, 60, 56, 48, 44, 36, 28, 24, 16, 8, 4,
79 4, 8, 12, 20, 24, 32, 36, 40, 48, 52, 56, 64, 68, 76, 80, 84, 84, 80, 76, 68, 64, 56, 52, 48, 40, 36, 32, 24, 20, 12, 8, 4,
80 4, 8, 12, 16, 20, 24, 28, 32, 40, 44, 48, 52, 56, 60, 64, 68, 68, 64, 60, 56, 52, 48, 44, 40, 32, 28, 24, 20, 16, 12, 8, 4,
81 0, 4, 8, 12, 16, 20, 24, 28, 28, 32, 36, 40, 44, 48, 52, 56, 56, 52, 48, 44, 40, 36, 32, 28, 28, 24, 20, 16, 12, 8, 4, 0,
82 0, 4, 8, 8, 12, 12, 16, 20, 20, 24, 28, 28, 32, 32, 36, 40, 40, 36, 32, 32, 28, 28, 24, 20, 20, 16, 12, 12, 8, 8, 4, 0,
83 0, 4, 4, 4, 8, 8, 8, 12, 12, 16, 16, 16, 20, 20, 20, 24, 24, 20, 20, 20, 16, 16, 16, 12, 12, 8, 8, 8, 4, 4, 4, 0,
84 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0,
85 };
86
88 0, 4, 4, 8, 8, 12, 12, 16, 16, 12, 12, 8, 8, 4, 4, 0,
89 4, 8, 16, 20, 28, 32, 40, 44, 44, 40, 32, 28, 20, 16, 8, 4,
90 4, 16, 24, 36, 44, 56, 64, 76, 76, 64, 56, 44, 36, 24, 16, 4,
91 8, 20, 36, 48, 64, 76, 92,104,104, 92, 76, 64, 48, 36, 20, 8,
92 8, 28, 44, 64, 80,100,116,136,136,116,100, 80, 64, 44, 28, 8,
93 12, 32, 56, 76,100,120,144,164,164,144,120,100, 76, 56, 32, 12,
94 12, 40, 64, 92,116,144,168,196,196,168,144,116, 92, 64, 40, 12,
95 16, 44, 76,104,136,164,196,224,224,196,164,136,104, 76, 44, 16,
96 16, 44, 76,104,136,164,196,224,224,196,164,136,104, 76, 44, 16,
97 12, 40, 64, 92,116,144,168,196,196,168,144,116, 92, 64, 40, 12,
98 12, 32, 56, 76,100,120,144,164,164,144,120,100, 76, 56, 32, 12,
99 8, 28, 44, 64, 80,100,116,136,136,116,100, 80, 64, 44, 28, 8,
100 8, 20, 36, 48, 64, 76, 92,104,104, 92, 76, 64, 48, 36, 20, 8,
101 4, 16, 24, 36, 44, 56, 64, 76, 76, 64, 56, 44, 36, 24, 16, 4,
102 4, 8, 16, 20, 28, 32, 40, 44, 44, 40, 32, 28, 20, 16, 8, 4,
103 0, 4, 4, 8, 8, 12, 12, 16, 16, 12, 12, 8, 8, 4, 4, 0,
104 };
105
107 4, 12, 20, 28, 28, 20, 12, 4,
108 12, 36, 60, 84, 84, 60, 36, 12,
109 20, 60,100,140,140,100, 60, 20,
110 28, 84,140,196,196,140, 84, 28,
111 28, 84,140,196,196,140, 84, 28,
112 20, 60,100,140,140,100, 60, 20,
113 12, 36, 60, 84, 84, 60, 36, 12,
114 4, 12, 20, 28, 28, 20, 12, 4,
115 };
116
118 16, 48, 48, 16,
119 48,144,144, 48,
120 48,144,144, 48,
121 16, 48, 48, 16,
122 };
123
126 };
127
132 };
133
138
139 typedef struct Block {
146
150
154
159
160 typedef struct Frame {
164
176
188
194
199
200 #define OFFSET(x) offsetof(MIContext, x)
201 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
202 #define CONST(name, help, val, unit) { name, help, 0, AV_OPT_TYPE_CONST, {.i64=val}, 0, 0, FLAGS, unit }
203
212 CONST(
"aobmc",
"adaptive overlapped block motion compensation",
MC_MODE_AOBMC,
"mc_mode"),
234 };
235
237
248 };
249
251 {
252 uint8_t *data_cur = me_ctx->
data_cur;
253 uint8_t *data_next = me_ctx->
data_ref;
255 int mv_x1 = x_mv - x;
256 int mv_y1 = y_mv - y;
257 int mv_x, mv_y,
i, j;
258 uint64_t sbad = 0;
259
264
265 data_cur += (y + mv_y) * linesize;
266 data_next += (y - mv_y) * linesize;
267
268 for (j = 0; j < me_ctx->
mb_size; j++)
270 sbad +=
FFABS(data_cur[x + mv_x +
i + j * linesize] - data_next[x - mv_x +
i + j * linesize]);
271
273 }
274
276 {
277 uint8_t *data_cur = me_ctx->
data_cur;
278 uint8_t *data_next = me_ctx->
data_ref;
284 int mv_x1 = x_mv - x;
285 int mv_y1 = y_mv - y;
286 int mv_x, mv_y,
i, j;
287 uint64_t sbad = 0;
288
291 mv_x =
av_clip(x_mv - x, -
FFMIN(x - x_min, x_max - x),
FFMIN(x - x_min, x_max - x));
292 mv_y =
av_clip(y_mv - y, -
FFMIN(y - y_min, y_max - y),
FFMIN(y - y_min, y_max - y));
293
294 for (j = -me_ctx->
mb_size / 2; j < me_ctx->mb_size * 3 / 2; j++)
295 for (
i = -me_ctx->
mb_size / 2; i < me_ctx->mb_size * 3 / 2;
i++)
296 sbad +=
FFABS(data_cur[x + mv_x +
i + (y + mv_y + j) * linesize] - data_next[x - mv_x +
i + (y - mv_y + j) * linesize]);
297
299 }
300
302 {
303 uint8_t *data_ref = me_ctx->
data_ref;
304 uint8_t *data_cur = me_ctx->
data_cur;
310 int mv_x = x_mv - x;
311 int mv_y = y_mv - y;
313 uint64_t sad = 0;
314
317 x_mv =
av_clip(x_mv, x_min, x_max);
318 y_mv =
av_clip(y_mv, y_min, y_max);
319
320 for (j = -me_ctx->
mb_size / 2; j < me_ctx->mb_size * 3 / 2; j++)
321 for (
i = -me_ctx->
mb_size / 2; i < me_ctx->mb_size * 3 / 2;
i++)
322 sad +=
FFABS(data_ref[x_mv +
i + (y_mv + j) * linesize] - data_cur[x +
i + (y + j) * linesize]);
323
325 }
326
328 {
335
339
341
344
348
354 }
355
361 }
365
370
376
380
382 for (
i = 0;
i < 3;
i++) {
386 }
387 }
388 }
389
394 }
395
396 return 0;
397 }
398
400 {
402
405
406 return 0;
407 }
408
409 #define ADD_PRED(preds, px, py)\
410 do {\
411 preds.mvs[preds.nb][0] = px;\
412 preds.mvs[preds.nb][1] = py;\
413 preds.nb++;\
414 } while(0)
415
417 {
421
424 const int mb_i = mb_x + mb_y * mi_ctx->
b_width;
425 int mv[2] = {x_mb, y_mb};
426
430 break;
433 break;
436 break;
439 break;
442 break;
445 break;
448 break;
450
453
455
456 //left mb in current frame
457 if (mb_x > 0)
459
460 //top mb in current frame
461 if (mb_y > 0)
463
464 //top-right mb in current frame
465 if (mb_y > 0 && mb_x + 1 < mi_ctx->
b_width)
467
468 //median predictor
469 if (preds[0].nb == 4) {
470 me_ctx->
pred_x =
mid_pred(preds[0].mvs[1][0], preds[0].mvs[2][0], preds[0].mvs[3][0]);
471 me_ctx->
pred_y =
mid_pred(preds[0].mvs[1][1], preds[0].mvs[2][1], preds[0].mvs[3][1]);
472 } else if (preds[0].nb == 3) {
473 me_ctx->
pred_x =
mid_pred(0, preds[0].mvs[1][0], preds[0].mvs[2][0]);
474 me_ctx->
pred_y =
mid_pred(0, preds[0].mvs[1][1], preds[0].mvs[2][1]);
475 } else if (preds[0].nb == 2) {
478 } else {
481 }
482
483 //collocated mb in prev frame
485
486 //accelerator motion vector of collocated block in prev frame
489
490 //left mb in prev frame
491 if (mb_x > 0)
493
494 //top mb in prev frame
495 if (mb_y > 0)
497
498 //right mb in prev frame
499 if (mb_x + 1 < mi_ctx->
b_width)
501
502 //bottom mb in prev frame
505
507
508 mi_ctx->
mv_table[0][mb_i][dir][0] =
mv[0] - x_mb;
509 mi_ctx->
mv_table[0][mb_i][dir][1] =
mv[1] - y_mb;
510
511 break;
513
515
517
518 //left mb in current frame
519 if (mb_x > 0)
520 ADD_PRED(preds[0], blocks[mb_i - 1].mvs[dir][0], blocks[mb_i - 1].mvs[dir][1]);
521
522 if (mb_y > 0) {
523 //top mb in current frame
525
526 //top-right mb in current frame
527 if (mb_x + 1 < mi_ctx->
b_width)
529 //top-left mb in current frame
530 else if (mb_x > 0)
532 }
533
534 //median predictor
535 if (preds[0].nb == 4) {
536 me_ctx->
pred_x =
mid_pred(preds[0].mvs[1][0], preds[0].mvs[2][0], preds[0].mvs[3][0]);
537 me_ctx->
pred_y =
mid_pred(preds[0].mvs[1][1], preds[0].mvs[2][1], preds[0].mvs[3][1]);
538 } else if (preds[0].nb == 3) {
539 me_ctx->
pred_x =
mid_pred(0, preds[0].mvs[1][0], preds[0].mvs[2][0]);
540 me_ctx->
pred_y =
mid_pred(0, preds[0].mvs[1][1], preds[0].mvs[2][1]);
541 } else if (preds[0].nb == 2) {
544 } else {
547 }
548
550
551 break;
552 }
553
554 block->mvs[dir][0] =
mv[0] - x_mb;
555 block->mvs[dir][1] =
mv[1] - y_mb;
556 }
557
559 {
561 int mb_x, mb_y;
562
563 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
564 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++) {
566
569
570 block->mvs[0][0] = 0;
571 block->mvs[0][1] = 0;
572 }
573
574 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
575 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++)
577 }
578
580 {
582 uint64_t cost_sb, cost_old;
585 int mv_x, mv_y;
586 int x, y;
588
590 cost_old = me_ctx->
get_cost(me_ctx, x_mb, y_mb, x_mb +
block->mvs[0][0], y_mb +
block->mvs[0][1]);
592
593 if (!cost_old) {
595 return 0;
596 }
597
602 }
603
605
606 for (y = 0; y < 2; y++)
607 for (x = 0; x < 2; x++) {
609 int mv[2] = {x_mb +
block->mvs[0][0], y_mb +
block->mvs[0][1]};
610
611 me_ctx->
mb_size = 1 << (n - 1);
615
619
622
623 if (cost_sb < cost_old / 4) {
624 sb->
mvs[0][0] = mv_x;
625 sb->
mvs[0][1] = mv_y;
626
627 if (n > 1) {
628 if (
ret =
var_size_bme(mi_ctx, sb, x_mb + (x << (n - 1)), y_mb + (y << (n - 1)), n - 1))
630 } else
632 } else {
634 return 0;
635 }
636 }
637
638 return 0;
639 }
640
642 {
643 int changed,
c, c_max = 0;
644 int mb_x, mb_y, x, y;
645 int mv_x, mv_y, avg_x, avg_y, dx, dy;
648 Cluster *cluster, *cluster_new;
649
650 do {
651 changed = 0;
652 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
653 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++) {
657 mv_x =
block->mvs[0][0];
658 mv_y =
block->mvs[0][1];
659
661 continue;
662
663 avg_x = cluster->
sum[0] / cluster->
nb;
664 avg_y = cluster->
sum[1] / cluster->
nb;
665 dx = avg_x - mv_x;
666 dy = avg_y - mv_y;
667
669
670 for (
d = 1;
d < 5;
d++)
677 }
678 }
679
682
684 continue;
685 }
686
688 cluster_new->
sum[0] += mv_x;
689 cluster_new->
sum[1] += mv_y;
690 cluster->
sum[0] -= mv_x;
691 cluster->
sum[1] -= mv_y;
694
697
698 changed = 1;
699 }
700 }
701 } while (changed);
702
703 /* find boundaries */
704 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
705 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++) {
709 dx = x - mb_x;
710 dy = y - mb_y;
711
712 if ((x - mb_x) && (y - mb_y) || !dx && !dy)
713 continue;
714
715 if (!mb_x || !mb_y || mb_x == mi_ctx->
b_width - 1 || mb_y == mi_ctx->
b_height - 1)
716 continue;
717
723 }
724 }
725 }
726 }
727
728 return 0;
729 }
730
732 {
736 int mb_x, mb_y, dir;
737
739 frame_tmp = mi_ctx->
frames[0];
743
745
749 }
750
752
754 for (dir = 0; dir < 2; dir++) {
758
759 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
760 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++)
762 }
763 }
764
768
770 return 0;
771
775
777
779
780 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
781 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++) {
785
787 }
788 }
789
791
796 }
797
798 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
799 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++) {
801
804 }
805
807
810 }
811 }
812 }
813
814 return 0;
815 }
816
818 {
825
828 uint64_t sad;
829 mi_ctx->
sad(p1, linesize1, p2, linesize2,
input->w,
input->h, &sad);
830 emms_c();
835
837 }
838
839 return 0;
840 }
841
842 #define ADD_PIXELS(b_weight, mv_x, mv_y)\
843 do {\
844 if (!b_weight || pixel_refs->nb + 1 >= NB_PIXEL_MVS)\
845 continue;\
846 pixel_refs->refs[pixel_refs->nb] = 1;\
847 pixel_weights->weights[pixel_refs->nb] = b_weight * (ALPHA_MAX - alpha);\
848 pixel_mvs->mvs[pixel_refs->nb][0] = av_clip((mv_x * alpha) / ALPHA_MAX, x_min, x_max);\
849 pixel_mvs->mvs[pixel_refs->nb][1] = av_clip((mv_y * alpha) / ALPHA_MAX, y_min, y_max);\
850 pixel_refs->nb++;\
851 pixel_refs->refs[pixel_refs->nb] = 2;\
852 pixel_weights->weights[pixel_refs->nb] = b_weight * alpha;\
853 pixel_mvs->mvs[pixel_refs->nb][0] = av_clip(-mv_x * (ALPHA_MAX - alpha) / ALPHA_MAX, x_min, x_max);\
854 pixel_mvs->mvs[pixel_refs->nb][1] = av_clip(-mv_y * (ALPHA_MAX - alpha) / ALPHA_MAX, y_min, y_max);\
855 pixel_refs->nb++;\
856 } while(0)
857
859 {
860 int x, y;
863 int mb_y, mb_x, dir;
864
865 for (y = 0; y <
height; y++)
866 for (x = 0; x <
width; x++)
868
869 for (dir = 0; dir < 2; dir++)
870 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
871 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++) {
875 int start_x, start_y;
876 int startc_x, startc_y, endc_x, endc_y;
877
880
885
886 if (dir) {
887 mv_x = -mv_x;
888 mv_y = -mv_y;
889 }
890
891 for (y = startc_y; y < endc_y; y++) {
892 int y_min = -y;
893 int y_max =
height - y - 1;
894 for (x = startc_x; x < endc_x; x++) {
895 int x_min = -x;
896 int x_max =
width - x - 1;
901
903 }
904 }
905 }
906 }
907
909 {
910 int x, y, plane;
911
912 for (plane = 0; plane < mi_ctx->
nb_planes; plane++) {
915 int chroma = plane == 1 || plane == 2;
916
917 for (y = 0; y <
height; y++)
918 for (x = 0; x <
width; x++) {
919 int x_mv, y_mv;
920 int weight_sum = 0;
925
926 for (
i = 0;
i < pixel_refs->
nb;
i++)
927 weight_sum += pixel_weights->
weights[
i];
928
929 if (!weight_sum || !pixel_refs->
nb) {
931 pixel_refs->
refs[0] = 1;
932 pixel_mvs->
mvs[0][0] = 0;
933 pixel_mvs->
mvs[0][1] = 0;
935 pixel_refs->
refs[1] = 2;
936 pixel_mvs->
mvs[1][0] = 0;
937 pixel_mvs->
mvs[1][1] = 0;
939
941 }
942
943 for (
i = 0;
i < pixel_refs->
nb;
i++) {
948 } else {
949 x_mv = x + pixel_mvs->
mvs[
i][0];
950 y_mv = y + pixel_mvs->
mvs[
i][1];
951 }
952
953 val += pixel_weights->
weights[
i] *
frame->avf->data[plane][x_mv + y_mv *
frame->avf->linesize[plane]];
954 }
955
957
960 else
962 }
963 }
964 }
965
967 {
968 int sb_x, sb_y;
971
972 for (sb_y = 0; sb_y < 2; sb_y++)
973 for (sb_x = 0; sb_x < 2; sb_x++) {
975
977 var_size_bmc(mi_ctx, sb, x_mb + (sb_x << (n - 1)), y_mb + (sb_y << (n - 1)), n - 1,
alpha);
978 else {
979 int x, y;
980 int mv_x = sb->
mvs[0][0] * 2;
981 int mv_y = sb->
mvs[0][1] * 2;
982
983 int start_x = x_mb + (sb_x << (n - 1));
984 int start_y = y_mb + (sb_y << (n - 1));
985 int end_x = start_x + (1 << (n - 1));
986 int end_y = start_y + (1 << (n - 1));
987
988 for (y = start_y; y < end_y; y++) {
989 int y_min = -y;
990 int y_max =
height - y - 1;
991 for (x = start_x; x < end_x; x++) {
992 int x_min = -x;
993 int x_max =
width - x - 1;
997
999 }
1000 }
1001 }
1002 }
1003 }
1004
1006 {
1007 int x, y;
1010
1012 int nb_x, nb_y;
1013 uint64_t sbads[9];
1014
1015 int mv_x =
block->mvs[0][0] * 2;
1016 int mv_y =
block->mvs[0][1] * 2;
1017 int start_x, start_y;
1018 int startc_x, startc_y, endc_x, endc_y;
1019
1022 for (nb_x =
FFMAX(0, mb_x - 1); nb_x <
FFMIN(mb_x + 2, mi_ctx->
b_width); nb_x++) {
1025
1026 if (nb_x - mb_x || nb_y - mb_y)
1027 sbads[nb_x - mb_x + 1 + (nb_y - mb_y + 1) * 3] =
get_sbad(&mi_ctx->
me_ctx, x_nb, y_nb, x_nb +
block->mvs[0][0], y_nb +
block->mvs[0][1]);
1028 }
1029
1032
1037
1038 for (y = startc_y; y < endc_y; y++) {
1039 int y_min = -y;
1040 int y_max =
height - y - 1;
1041 for (x = startc_x; x < endc_x; x++) {
1042 int x_min = -x;
1043 int x_max =
width - x - 1;
1048
1050 nb_x = (((x - start_x) >> (mi_ctx->
log2_mb_size - 1)) * 2 - 3) / 2;
1051 nb_y = (((y - start_y) >> (mi_ctx->
log2_mb_size - 1)) * 2 - 3) / 2;
1052
1053 if (nb_x || nb_y) {
1054 uint64_t sbad = sbads[nb_x + 1 + (nb_y + 1) * 3];
1056
1057 if (sbad && sbad != UINT64_MAX && nb->sbad != UINT64_MAX) {
1059 obmc_weight = obmc_weight * phi /
ALPHA_MAX;
1060 }
1061 }
1062 }
1063
1065 }
1066 }
1067 }
1068
1070 {
1074 int x, y;
1077
1080
1083
1086 return;
1087 }
1088
1091 /* duplicate frame */
1093 return;
1094 }
1095
1099
1100 break;
1102 for (plane = 0; plane < mi_ctx->
nb_planes; plane++) {
1105
1106 if (plane == 1 || plane == 2) {
1109 }
1110
1111 for (y = 0; y <
height; y++) {
1112 for (x = 0; x <
width; x++) {
1113 avf_out->
data[plane][x + y * avf_out->
linesize[plane]] =
1116 }
1117 }
1118 }
1119
1120 break;
1125
1127 int mb_x, mb_y;
1129
1133
1135 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++) {
1137
1140
1142
1143 }
1144
1146 }
1147
1148 break;
1149 }
1150 }
1151
1153 {
1158
1162 }
1163
1167 }
1168
1172
1175
1177 return 0;
1178
1180
1181 for (;;) {
1183
1185 break;
1186
1189
1193
1195
1198 }
1199
1200 return 0;
1201 }
1202
1204 {
1207 if (sb)
1209 }
1210
1212 {
1215
1220 for (m = 0; m < mi_ctx->
b_count; m++)
1223
1228 }
1229
1230 for (
i = 0;
i < 3;
i++)
1232 }
1233
1235 {
1240 },
1241 };
1242
1244 {
1248 },
1249 };
1250
1252 .
name =
"minterpolate",
1255 .priv_class = &minterpolate_class,
1260 };