35 #define ME_MODE_BIDIR 0
36 #define ME_MODE_BILAT 1
38 #define MC_MODE_OBMC 0
39 #define MC_MODE_AOBMC 1
41 #define SCD_METHOD_NONE 0
42 #define SCD_METHOD_FDIFF 1
45 #define NB_PIXEL_MVS 32
46 #define NB_CLUSTERS 128
48 #define ALPHA_MAX 1024
49 #define CLUSTER_THRESHOLD 4
50 #define PX_WEIGHT_MAX 255
51 #define COST_PRED_SCALE 64
54 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,
55 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,
56 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,
57 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,
58 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,
59 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,
60 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,
61 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,
62 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,
63 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,
64 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,
65 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,
66 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,
67 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,
68 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,
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, 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,
71 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,
72 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,
73 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,
74 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,
75 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,
76 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,
77 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,
78 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,
79 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,
80 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,
81 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,
82 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,
83 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,
84 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,
85 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,
89 0, 4, 4, 8, 8, 12, 12, 16, 16, 12, 12, 8, 8, 4, 4, 0,
90 4, 8, 16, 20, 28, 32, 40, 44, 44, 40, 32, 28, 20, 16, 8, 4,
91 4, 16, 24, 36, 44, 56, 64, 76, 76, 64, 56, 44, 36, 24, 16, 4,
92 8, 20, 36, 48, 64, 76, 92,104,104, 92, 76, 64, 48, 36, 20, 8,
93 8, 28, 44, 64, 80,100,116,136,136,116,100, 80, 64, 44, 28, 8,
94 12, 32, 56, 76,100,120,144,164,164,144,120,100, 76, 56, 32, 12,
95 12, 40, 64, 92,116,144,168,196,196,168,144,116, 92, 64, 40, 12,
96 16, 44, 76,104,136,164,196,224,224,196,164,136,104, 76, 44, 16,
97 16, 44, 76,104,136,164,196,224,224,196,164,136,104, 76, 44, 16,
98 12, 40, 64, 92,116,144,168,196,196,168,144,116, 92, 64, 40, 12,
99 12, 32, 56, 76,100,120,144,164,164,144,120,100, 76, 56, 32, 12,
100 8, 28, 44, 64, 80,100,116,136,136,116,100, 80, 64, 44, 28, 8,
101 8, 20, 36, 48, 64, 76, 92,104,104, 92, 76, 64, 48, 36, 20, 8,
102 4, 16, 24, 36, 44, 56, 64, 76, 76, 64, 56, 44, 36, 24, 16, 4,
103 4, 8, 16, 20, 28, 32, 40, 44, 44, 40, 32, 28, 20, 16, 8, 4,
104 0, 4, 4, 8, 8, 12, 12, 16, 16, 12, 12, 8, 8, 4, 4, 0,
108 4, 12, 20, 28, 28, 20, 12, 4,
109 12, 36, 60, 84, 84, 60, 36, 12,
110 20, 60,100,140,140,100, 60, 20,
111 28, 84,140,196,196,140, 84, 28,
112 28, 84,140,196,196,140, 84, 28,
113 20, 60,100,140,140,100, 60, 20,
114 12, 36, 60, 84, 84, 60, 36, 12,
115 4, 12, 20, 28, 28, 20, 12, 4,
140 typedef struct Block {
161 typedef struct Frame {
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 }
212 CONST(
"aobmc",
"adaptive overlapped block motion compensation",
MC_MODE_AOBMC,
"mc_mode"),
263 int mv_x1 = x_mv - x;
264 int mv_y1 = y_mv - y;
265 int mv_x, mv_y,
i, j;
273 data_cur += (y + mv_y) * linesize;
274 data_next += (y - mv_y) * linesize;
276 for (j = 0; j < me_ctx->
mb_size; j++)
278 sbad +=
FFABS(data_cur[x + mv_x +
i + j * linesize] - data_next[x - mv_x +
i + j * linesize]);
292 int mv_x1 = x_mv - x;
293 int mv_y1 = y_mv - y;
294 int mv_x, mv_y,
i, j;
297 x = av_clip(x, x_min, x_max);
298 y = av_clip(y, y_min, y_max);
299 mv_x = av_clip(x_mv - x, -
FFMIN(x - x_min, x_max - x),
FFMIN(x - x_min, x_max - x));
300 mv_y = av_clip(y_mv - y, -
FFMIN(y - y_min, y_max - y),
FFMIN(y - y_min, y_max - y));
302 for (j = -me_ctx->
mb_size / 2; j < me_ctx->mb_size * 3 / 2; j++)
303 for (
i = -me_ctx->
mb_size / 2; i < me_ctx->mb_size * 3 / 2;
i++)
304 sbad +=
FFABS(data_cur[x + mv_x +
i + (y + mv_y + j) * linesize] - data_next[x - mv_x +
i + (y - mv_y + j) * linesize]);
323 x = av_clip(x, x_min, x_max);
324 y = av_clip(y, y_min, y_max);
325 x_mv = av_clip(x_mv, x_min, x_max);
326 y_mv = av_clip(y_mv, y_min, y_max);
328 for (j = -me_ctx->
mb_size / 2; j < me_ctx->mb_size * 3 / 2; j++)
329 for (
i = -me_ctx->
mb_size / 2; i < me_ctx->mb_size * 3 / 2;
i++)
330 sad +=
FFABS(data_ref[x_mv +
i + (y_mv + j) * linesize] - data_cur[x +
i + (y + j) * linesize]);
377 for (
i = 0;
i < 3;
i++) {
418 #define ADD_PRED(preds, px, py)\
420 preds.mvs[preds.nb][0] = px;\
421 preds.mvs[preds.nb][1] = py;\
433 const int mb_i = mb_x + mb_y * mi_ctx->
b_width;
434 int mv[2] = {x_mb, y_mb};
474 if (mb_y > 0 && mb_x + 1 < mi_ctx->
b_width)
478 if (preds[0].nb == 4) {
479 me_ctx->
pred_x =
mid_pred(preds[0].mvs[1][0], preds[0].mvs[2][0], preds[0].mvs[3][0]);
480 me_ctx->
pred_y =
mid_pred(preds[0].mvs[1][1], preds[0].mvs[2][1], preds[0].mvs[3][1]);
481 }
else if (preds[0].nb == 3) {
482 me_ctx->
pred_x =
mid_pred(0, preds[0].mvs[1][0], preds[0].mvs[2][0]);
483 me_ctx->
pred_y =
mid_pred(0, preds[0].mvs[1][1], preds[0].mvs[2][1]);
484 }
else if (preds[0].nb == 2) {
508 if (mb_x + 1 < mi_ctx->
b_width)
517 mi_ctx->
mv_table[0][mb_i][dir][0] =
mv[0] - x_mb;
518 mi_ctx->
mv_table[0][mb_i][dir][1] =
mv[1] - y_mb;
529 ADD_PRED(preds[0], blocks[mb_i - 1].mvs[dir][0], blocks[mb_i - 1].mvs[dir][1]);
536 if (mb_x + 1 < mi_ctx->
b_width)
544 if (preds[0].nb == 4) {
545 me_ctx->
pred_x =
mid_pred(preds[0].mvs[1][0], preds[0].mvs[2][0], preds[0].mvs[3][0]);
546 me_ctx->
pred_y =
mid_pred(preds[0].mvs[1][1], preds[0].mvs[2][1], preds[0].mvs[3][1]);
547 }
else if (preds[0].nb == 3) {
548 me_ctx->
pred_x =
mid_pred(0, preds[0].mvs[1][0], preds[0].mvs[2][0]);
549 me_ctx->
pred_y =
mid_pred(0, preds[0].mvs[1][1], preds[0].mvs[2][1]);
550 }
else if (preds[0].nb == 2) {
563 block->mvs[dir][0] =
mv[0] - x_mb;
564 block->mvs[dir][1] =
mv[1] - y_mb;
572 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
573 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++) {
579 block->mvs[0][0] = 0;
580 block->mvs[0][1] = 0;
583 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
584 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++)
591 uint64_t cost_sb, cost_old;
599 cost_old = me_ctx->
get_cost(me_ctx, x_mb, y_mb, x_mb +
block->mvs[0][0], y_mb +
block->mvs[0][1]);
615 for (y = 0; y < 2; y++)
616 for (x = 0; x < 2; x++) {
618 int mv[2] = {x_mb +
block->mvs[0][0], y_mb +
block->mvs[0][1]};
632 if (cost_sb < cost_old / 4) {
633 sb->
mvs[0][0] = mv_x;
634 sb->
mvs[0][1] = mv_y;
637 if (
ret =
var_size_bme(mi_ctx, sb, x_mb + (x << (
n - 1)), y_mb + (y << (
n - 1)),
n - 1))
652 int changed,
c, c_max = 0;
653 int mb_x, mb_y, x, y;
654 int mv_x, mv_y, avg_x, avg_y, dx, dy;
657 Cluster *cluster, *cluster_new;
661 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
662 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++) {
666 mv_x =
block->mvs[0][0];
667 mv_y =
block->mvs[0][1];
672 avg_x = cluster->
sum[0] / cluster->
nb;
673 avg_y = cluster->
sum[1] / cluster->
nb;
679 for (d = 1; d < 5; d++)
697 cluster_new->
sum[0] += mv_x;
698 cluster_new->
sum[1] += mv_y;
699 cluster->
sum[0] -= mv_x;
700 cluster->
sum[1] -= mv_y;
713 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
714 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++) {
721 if ((x - mb_x) && (y - mb_y) || !dx && !dy)
724 if (!mb_x || !mb_y || mb_x == mi_ctx->
b_width - 1 || mb_y == mi_ctx->
b_height - 1)
748 frame_tmp = mi_ctx->
frames[0];
763 for (dir = 0; dir < 2; dir++) {
768 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
769 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++)
789 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
790 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++) {
807 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
808 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++) {
837 mi_ctx->
sad(p1, linesize1, p2, linesize2, me_ctx->
width, me_ctx->
height, &sad);
839 mafd = (double) sad / (me_ctx->
height * me_ctx->
width * 3);
850 #define ADD_PIXELS(b_weight, mv_x, mv_y)\
852 if (!b_weight || pixel_refs->nb + 1 >= NB_PIXEL_MVS)\
854 pixel_refs->refs[pixel_refs->nb] = 1;\
855 pixel_weights->weights[pixel_refs->nb] = b_weight * (ALPHA_MAX - alpha);\
856 pixel_mvs->mvs[pixel_refs->nb][0] = av_clip((mv_x * alpha) / ALPHA_MAX, x_min, x_max);\
857 pixel_mvs->mvs[pixel_refs->nb][1] = av_clip((mv_y * alpha) / ALPHA_MAX, y_min, y_max);\
859 pixel_refs->refs[pixel_refs->nb] = 2;\
860 pixel_weights->weights[pixel_refs->nb] = b_weight * alpha;\
861 pixel_mvs->mvs[pixel_refs->nb][0] = av_clip(-mv_x * (ALPHA_MAX - alpha) / ALPHA_MAX, x_min, x_max);\
862 pixel_mvs->mvs[pixel_refs->nb][1] = av_clip(-mv_y * (ALPHA_MAX - alpha) / ALPHA_MAX, y_min, y_max);\
873 for (y = 0; y <
height; y++)
874 for (x = 0; x <
width; x++)
877 for (dir = 0; dir < 2; dir++)
878 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
879 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++) {
883 int start_x, start_y;
884 int startc_x, startc_y, endc_x, endc_y;
889 startc_x = av_clip(start_x, 0,
width - 1);
890 startc_y = av_clip(start_y, 0,
height - 1);
899 for (y = startc_y; y < endc_y; y++) {
901 int y_max =
height - y - 1;
902 for (x = startc_x; x < endc_x; x++) {
904 int x_max =
width - x - 1;
925 for (y = 0; y <
height; y++)
926 for (x = 0; x <
width; x++) {
934 for (
i = 0;
i < pixel_refs->
nb;
i++)
935 weight_sum += pixel_weights->
weights[
i];
937 if (!weight_sum || !pixel_refs->
nb) {
939 pixel_refs->
refs[0] = 1;
940 pixel_mvs->
mvs[0][0] = 0;
941 pixel_mvs->
mvs[0][1] = 0;
943 pixel_refs->
refs[1] = 2;
944 pixel_mvs->
mvs[1][0] = 0;
945 pixel_mvs->
mvs[1][1] = 0;
951 for (
i = 0;
i < pixel_refs->
nb;
i++) {
957 x_mv = x + pixel_mvs->
mvs[
i][0];
958 y_mv = y + pixel_mvs->
mvs[
i][1];
980 for (sb_y = 0; sb_y < 2; sb_y++)
981 for (sb_x = 0; sb_x < 2; sb_x++) {
988 int mv_x = sb->
mvs[0][0] * 2;
989 int mv_y = sb->
mvs[0][1] * 2;
991 int start_x = x_mb + (sb_x << (
n - 1));
992 int start_y = y_mb + (sb_y << (
n - 1));
993 int end_x = start_x + (1 << (
n - 1));
994 int end_y = start_y + (1 << (
n - 1));
996 for (y = start_y; y < end_y; y++) {
998 int y_max =
height - y - 1;
999 for (x = start_x; x < end_x; x++) {
1001 int x_max =
width - x - 1;
1023 int mv_x =
block->mvs[0][0] * 2;
1024 int mv_y =
block->mvs[0][1] * 2;
1025 int start_x, start_y;
1026 int startc_x, startc_y, endc_x, endc_y;
1030 for (nb_x =
FFMAX(0, mb_x - 1); nb_x <
FFMIN(mb_x + 2, mi_ctx->
b_width); nb_x++) {
1034 if (nb_x - mb_x || nb_y - mb_y)
1035 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]);
1041 startc_x = av_clip(start_x, 0,
width - 1);
1042 startc_y = av_clip(start_y, 0,
height - 1);
1046 for (y = startc_y; y < endc_y; y++) {
1048 int y_max =
height - y - 1;
1049 for (x = startc_x; x < endc_x; x++) {
1051 int x_max =
width - x - 1;
1058 nb_x = (((x - start_x) >> (mi_ctx->
log2_mb_size - 1)) * 2 - 3) / 2;
1059 nb_y = (((y - start_y) >> (mi_ctx->
log2_mb_size - 1)) * 2 - 3) / 2;
1062 uint64_t sbad = sbads[nb_x + 1 + (nb_y + 1) * 3];
1065 if (sbad && sbad != UINT64_MAX && nb->sbad != UINT64_MAX) {
1067 obmc_weight = obmc_weight * phi /
ALPHA_MAX;
1118 for (y = 0; y <
height; y++) {
1119 for (x = 0; x <
width; x++) {
1142 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++) {
1226 for (m = 0; m < mi_ctx->
b_count; m++)
1236 for (
i = 0;
i < 3;
i++)
1260 .
name =
"minterpolate",
1263 .priv_class = &minterpolate_class,