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 {
201 #define OFFSET(x) offsetof(MIContext, x)
202 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
203 #define CONST(name, help, val, unit) { name, help, 0, AV_OPT_TYPE_CONST, {.i64=val}, 0, 0, FLAGS, unit }
213 CONST(
"aobmc",
"adaptive overlapped block motion compensation",
MC_MODE_AOBMC,
"mc_mode"),
264 int mv_x1 = x_mv -
x;
265 int mv_y1 = y_mv - y;
266 int mv_x, mv_y,
i, j;
274 data_cur += (y + mv_y) * linesize;
275 data_next += (y - mv_y) * linesize;
277 for (j = 0; j < me_ctx->
mb_size; j++)
279 sbad +=
FFABS(data_cur[
x + mv_x +
i + j * linesize] - data_next[
x - mv_x +
i + j * linesize]);
293 int mv_x1 = x_mv -
x;
294 int mv_y1 = y_mv - y;
295 int mv_x, mv_y,
i, j;
298 x = av_clip(
x, x_min, x_max);
299 y = av_clip(y, y_min, y_max);
300 mv_x = av_clip(x_mv -
x, -
FFMIN(
x - x_min, x_max -
x),
FFMIN(
x - x_min, x_max -
x));
301 mv_y = av_clip(y_mv - y, -
FFMIN(y - y_min, y_max - y),
FFMIN(y - y_min, y_max - y));
303 for (j = -me_ctx->
mb_size / 2; j < me_ctx->mb_size * 3 / 2; j++)
304 for (
i = -me_ctx->
mb_size / 2; i < me_ctx->mb_size * 3 / 2;
i++)
305 sbad +=
FFABS(data_cur[
x + mv_x +
i + (y + mv_y + j) * linesize] - data_next[
x - mv_x +
i + (y - mv_y + j) * linesize]);
324 x = av_clip(
x, x_min, x_max);
325 y = av_clip(y, y_min, y_max);
326 x_mv = av_clip(x_mv, x_min, x_max);
327 y_mv = av_clip(y_mv, y_min, y_max);
329 for (j = -me_ctx->
mb_size / 2; j < me_ctx->mb_size * 3 / 2; j++)
330 for (
i = -me_ctx->
mb_size / 2; i < me_ctx->mb_size * 3 / 2;
i++)
331 sad +=
FFABS(data_ref[x_mv +
i + (y_mv + j) * linesize] - data_cur[
x +
i + (y + j) * linesize]);
379 for (
i = 0;
i < 3;
i++) {
420 #define ADD_PRED(preds, px, py)\
422 preds.mvs[preds.nb][0] = px;\
423 preds.mvs[preds.nb][1] = py;\
435 const int mb_i = mb_x + mb_y * mi_ctx->
b_width;
436 int mv[2] = {x_mb, y_mb};
476 if (mb_y > 0 && mb_x + 1 < mi_ctx->
b_width)
480 if (preds[0].nb == 4) {
481 me_ctx->
pred_x =
mid_pred(preds[0].mvs[1][0], preds[0].mvs[2][0], preds[0].mvs[3][0]);
482 me_ctx->
pred_y =
mid_pred(preds[0].mvs[1][1], preds[0].mvs[2][1], preds[0].mvs[3][1]);
483 }
else if (preds[0].nb == 3) {
484 me_ctx->
pred_x =
mid_pred(0, preds[0].mvs[1][0], preds[0].mvs[2][0]);
485 me_ctx->
pred_y =
mid_pred(0, preds[0].mvs[1][1], preds[0].mvs[2][1]);
486 }
else if (preds[0].nb == 2) {
510 if (mb_x + 1 < mi_ctx->
b_width)
519 mi_ctx->
mv_table[0][mb_i][dir][0] =
mv[0] - x_mb;
520 mi_ctx->
mv_table[0][mb_i][dir][1] =
mv[1] - y_mb;
531 ADD_PRED(preds[0], blocks[mb_i - 1].mvs[dir][0], blocks[mb_i - 1].mvs[dir][1]);
538 if (mb_x + 1 < mi_ctx->
b_width)
546 if (preds[0].nb == 4) {
547 me_ctx->
pred_x =
mid_pred(preds[0].mvs[1][0], preds[0].mvs[2][0], preds[0].mvs[3][0]);
548 me_ctx->
pred_y =
mid_pred(preds[0].mvs[1][1], preds[0].mvs[2][1], preds[0].mvs[3][1]);
549 }
else if (preds[0].nb == 3) {
550 me_ctx->
pred_x =
mid_pred(0, preds[0].mvs[1][0], preds[0].mvs[2][0]);
551 me_ctx->
pred_y =
mid_pred(0, preds[0].mvs[1][1], preds[0].mvs[2][1]);
552 }
else if (preds[0].nb == 2) {
565 block->mvs[dir][0] =
mv[0] - x_mb;
566 block->mvs[dir][1] =
mv[1] - y_mb;
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++) {
581 block->mvs[0][0] = 0;
582 block->mvs[0][1] = 0;
585 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
586 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++)
593 uint64_t cost_sb, cost_old;
601 cost_old = me_ctx->
get_cost(me_ctx, x_mb, y_mb, x_mb +
block->mvs[0][0], y_mb +
block->mvs[0][1]);
617 for (y = 0; y < 2; y++)
618 for (
x = 0;
x < 2;
x++) {
620 int mv[2] = {x_mb +
block->mvs[0][0], y_mb +
block->mvs[0][1]};
622 me_ctx->
mb_size = 1 << (n - 1);
634 if (cost_sb < cost_old / 4) {
635 sb->
mvs[0][0] = mv_x;
636 sb->
mvs[0][1] = mv_y;
639 if (
ret =
var_size_bme(mi_ctx, sb, x_mb + (
x << (n - 1)), y_mb + (y << (n - 1)), n - 1))
654 int changed,
c, c_max = 0;
655 int mb_x, mb_y,
x, y;
656 int mv_x, mv_y, avg_x, avg_y, dx, dy;
659 Cluster *cluster, *cluster_new;
663 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
664 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++) {
668 mv_x =
block->mvs[0][0];
669 mv_y =
block->mvs[0][1];
674 avg_x = cluster->
sum[0] / cluster->
nb;
675 avg_y = cluster->
sum[1] / cluster->
nb;
681 for (d = 1; d < 5; d++)
699 cluster_new->
sum[0] += mv_x;
700 cluster_new->
sum[1] += mv_y;
701 cluster->
sum[0] -= mv_x;
702 cluster->
sum[1] -= mv_y;
715 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
716 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++) {
723 if ((
x - mb_x) && (y - mb_y) || !dx && !dy)
726 if (!mb_x || !mb_y || mb_x == mi_ctx->
b_width - 1 || mb_y == mi_ctx->
b_height - 1)
750 frame_tmp = mi_ctx->
frames[0];
765 for (dir = 0; dir < 2; dir++) {
770 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
771 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++)
791 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
792 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++) {
809 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
810 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++) {
839 mi_ctx->
sad(p1, linesize1, p2, linesize2, me_ctx->
width, me_ctx->
height, &sad);
852 #define ADD_PIXELS(b_weight, mv_x, mv_y)\
854 if (!b_weight || pixel_refs->nb + 1 >= NB_PIXEL_MVS)\
856 pixel_refs->refs[pixel_refs->nb] = 1;\
857 pixel_weights->weights[pixel_refs->nb] = b_weight * (ALPHA_MAX - alpha);\
858 pixel_mvs->mvs[pixel_refs->nb][0] = av_clip((mv_x * alpha) / ALPHA_MAX, x_min, x_max);\
859 pixel_mvs->mvs[pixel_refs->nb][1] = av_clip((mv_y * alpha) / ALPHA_MAX, y_min, y_max);\
861 pixel_refs->refs[pixel_refs->nb] = 2;\
862 pixel_weights->weights[pixel_refs->nb] = b_weight * alpha;\
863 pixel_mvs->mvs[pixel_refs->nb][0] = av_clip(-mv_x * (ALPHA_MAX - alpha) / ALPHA_MAX, x_min, x_max);\
864 pixel_mvs->mvs[pixel_refs->nb][1] = av_clip(-mv_y * (ALPHA_MAX - alpha) / ALPHA_MAX, y_min, y_max);\
875 for (y = 0; y <
height; y++)
879 for (dir = 0; dir < 2; dir++)
880 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
881 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++) {
885 int start_x, start_y;
886 int startc_x, startc_y, endc_x, endc_y;
891 startc_x = av_clip(start_x, 0,
width - 1);
892 startc_y = av_clip(start_y, 0,
height - 1);
901 for (y = startc_y; y < endc_y; y++) {
903 int y_max =
height - y - 1;
904 for (
x = startc_x;
x < endc_x;
x++) {
906 int x_max =
width -
x - 1;
922 for (plane = 0; plane < mi_ctx->
nb_planes; plane++) {
925 int chroma = plane == 1 || plane == 2;
927 for (y = 0; y <
height; y++)
936 for (
i = 0;
i < pixel_refs->
nb;
i++)
937 weight_sum += pixel_weights->
weights[
i];
939 if (!weight_sum || !pixel_refs->
nb) {
941 pixel_refs->
refs[0] = 1;
942 pixel_mvs->
mvs[0][0] = 0;
943 pixel_mvs->
mvs[0][1] = 0;
945 pixel_refs->
refs[1] = 2;
946 pixel_mvs->
mvs[1][0] = 0;
947 pixel_mvs->
mvs[1][1] = 0;
953 for (
i = 0;
i < pixel_refs->
nb;
i++) {
959 x_mv =
x + pixel_mvs->
mvs[
i][0];
960 y_mv = y + pixel_mvs->
mvs[
i][1];
963 val += pixel_weights->
weights[
i] *
frame->avf->data[plane][x_mv + y_mv *
frame->avf->linesize[plane]];
982 for (sb_y = 0; sb_y < 2; sb_y++)
983 for (sb_x = 0; sb_x < 2; sb_x++) {
987 var_size_bmc(mi_ctx, sb, x_mb + (sb_x << (n - 1)), y_mb + (sb_y << (n - 1)), n - 1,
alpha);
990 int mv_x = sb->
mvs[0][0] * 2;
991 int mv_y = sb->
mvs[0][1] * 2;
993 int start_x = x_mb + (sb_x << (n - 1));
994 int start_y = y_mb + (sb_y << (n - 1));
995 int end_x = start_x + (1 << (n - 1));
996 int end_y = start_y + (1 << (n - 1));
998 for (y = start_y; y < end_y; y++) {
1000 int y_max =
height - y - 1;
1001 for (
x = start_x;
x < end_x;
x++) {
1003 int x_max =
width -
x - 1;
1025 int mv_x =
block->mvs[0][0] * 2;
1026 int mv_y =
block->mvs[0][1] * 2;
1027 int start_x, start_y;
1028 int startc_x, startc_y, endc_x, endc_y;
1032 for (nb_x =
FFMAX(0, mb_x - 1); nb_x <
FFMIN(mb_x + 2, mi_ctx->
b_width); nb_x++) {
1036 if (nb_x - mb_x || nb_y - mb_y)
1037 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]);
1043 startc_x = av_clip(start_x, 0,
width - 1);
1044 startc_y = av_clip(start_y, 0,
height - 1);
1048 for (y = startc_y; y < endc_y; y++) {
1050 int y_max =
height - y - 1;
1051 for (
x = startc_x;
x < endc_x;
x++) {
1053 int x_max =
width -
x - 1;
1060 nb_x = (((
x - start_x) >> (mi_ctx->
log2_mb_size - 1)) * 2 - 3) / 2;
1061 nb_y = (((y - start_y) >> (mi_ctx->
log2_mb_size - 1)) * 2 - 3) / 2;
1064 uint64_t sbad = sbads[nb_x + 1 + (nb_y + 1) * 3];
1067 if (sbad && sbad != UINT64_MAX && nb->sbad != UINT64_MAX) {
1069 obmc_weight = obmc_weight * phi /
ALPHA_MAX;
1112 for (plane = 0; plane < mi_ctx->
nb_planes; plane++) {
1116 if (plane == 1 || plane == 2) {
1121 for (y = 0; y <
height; y++) {
1145 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++) {
1229 for (m = 0; m < mi_ctx->
b_count; m++)
1239 for (
i = 0;
i < 3;
i++)
1263 .
name =
"minterpolate",
1266 .priv_class = &minterpolate_class,