32 #define ME_MODE_BIDIR 0
33 #define ME_MODE_BILAT 1
35 #define MC_MODE_OBMC 0
36 #define MC_MODE_AOBMC 1
38 #define SCD_METHOD_NONE 0
39 #define SCD_METHOD_FDIFF 1
42 #define NB_PIXEL_MVS 32
43 #define NB_CLUSTERS 128
45 #define ALPHA_MAX 1024
46 #define CLUSTER_THRESHOLD 4
47 #define PX_WEIGHT_MAX 255
48 #define COST_PRED_SCALE 64
51 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,
52 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,
53 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,
54 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,
55 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,
56 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,
57 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,
58 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,
59 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,
60 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,
61 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,
62 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,
63 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,
64 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,
65 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,
66 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,
67 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,
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, 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,
70 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,
71 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,
72 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,
73 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,
74 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,
75 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,
76 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,
77 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,
78 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,
79 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,
80 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,
81 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,
82 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,
86 0, 4, 4, 8, 8, 12, 12, 16, 16, 12, 12, 8, 8, 4, 4, 0,
87 4, 8, 16, 20, 28, 32, 40, 44, 44, 40, 32, 28, 20, 16, 8, 4,
88 4, 16, 24, 36, 44, 56, 64, 76, 76, 64, 56, 44, 36, 24, 16, 4,
89 8, 20, 36, 48, 64, 76, 92,104,104, 92, 76, 64, 48, 36, 20, 8,
90 8, 28, 44, 64, 80,100,116,136,136,116,100, 80, 64, 44, 28, 8,
91 12, 32, 56, 76,100,120,144,164,164,144,120,100, 76, 56, 32, 12,
92 12, 40, 64, 92,116,144,168,196,196,168,144,116, 92, 64, 40, 12,
93 16, 44, 76,104,136,164,196,224,224,196,164,136,104, 76, 44, 16,
94 16, 44, 76,104,136,164,196,224,224,196,164,136,104, 76, 44, 16,
95 12, 40, 64, 92,116,144,168,196,196,168,144,116, 92, 64, 40, 12,
96 12, 32, 56, 76,100,120,144,164,164,144,120,100, 76, 56, 32, 12,
97 8, 28, 44, 64, 80,100,116,136,136,116,100, 80, 64, 44, 28, 8,
98 8, 20, 36, 48, 64, 76, 92,104,104, 92, 76, 64, 48, 36, 20, 8,
99 4, 16, 24, 36, 44, 56, 64, 76, 76, 64, 56, 44, 36, 24, 16, 4,
100 4, 8, 16, 20, 28, 32, 40, 44, 44, 40, 32, 28, 20, 16, 8, 4,
101 0, 4, 4, 8, 8, 12, 12, 16, 16, 12, 12, 8, 8, 4, 4, 0,
105 4, 12, 20, 28, 28, 20, 12, 4,
106 12, 36, 60, 84, 84, 60, 36, 12,
107 20, 60,100,140,140,100, 60, 20,
108 28, 84,140,196,196,140, 84, 28,
109 28, 84,140,196,196,140, 84, 28,
110 20, 60,100,140,140,100, 60, 20,
111 12, 36, 60, 84, 84, 60, 36, 12,
112 4, 12, 20, 28, 28, 20, 12, 4,
137 typedef struct Block {
158 typedef struct Frame {
198 #define OFFSET(x) offsetof(MIContext, x)
199 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
200 #define CONST(name, help, val, unit) { name, help, 0, AV_OPT_TYPE_CONST, {.i64=val}, 0, 0, FLAGS, unit }
210 CONST(
"aobmc",
"adaptive overlapped block motion compensation",
MC_MODE_AOBMC,
"mc_mode"),
250 uint8_t *data_cur = me_ctx->
data_cur;
251 uint8_t *data_next = me_ctx->
data_ref;
253 int mv_x1 = x_mv - x;
254 int mv_y1 = y_mv - y;
255 int mv_x, mv_y,
i, j;
263 data_cur += (y + mv_y) * linesize;
264 data_next += (y - mv_y) * linesize;
266 for (j = 0; j < me_ctx->
mb_size; j++)
268 sbad +=
FFABS(data_cur[x + mv_x +
i + j * linesize] - data_next[x - mv_x +
i + j * linesize]);
275 uint8_t *data_cur = me_ctx->
data_cur;
276 uint8_t *data_next = me_ctx->
data_ref;
282 int mv_x1 = x_mv - x;
283 int mv_y1 = y_mv - y;
284 int mv_x, mv_y,
i, j;
289 mv_x =
av_clip(x_mv - x, -
FFMIN(x - x_min, x_max - x),
FFMIN(x - x_min, x_max - x));
290 mv_y =
av_clip(y_mv - y, -
FFMIN(y - y_min, y_max - y),
FFMIN(y - y_min, y_max - y));
292 for (j = -me_ctx->
mb_size / 2; j < me_ctx->mb_size * 3 / 2; j++)
293 for (
i = -me_ctx->
mb_size / 2; i < me_ctx->mb_size * 3 / 2;
i++)
294 sbad +=
FFABS(data_cur[x + mv_x +
i + (y + mv_y + j) * linesize] - data_next[x - mv_x +
i + (y - mv_y + j) * linesize]);
301 uint8_t *data_ref = me_ctx->
data_ref;
302 uint8_t *data_cur = me_ctx->
data_cur;
315 x_mv =
av_clip(x_mv, x_min, x_max);
316 y_mv =
av_clip(y_mv, y_min, y_max);
318 for (j = -me_ctx->
mb_size / 2; j < me_ctx->mb_size * 3 / 2; j++)
319 for (
i = -me_ctx->
mb_size / 2; i < me_ctx->mb_size * 3 / 2;
i++)
320 sad +=
FFABS(data_ref[x_mv +
i + (y_mv + j) * linesize] - data_cur[x +
i + (y + j) * linesize]);
380 for (
i = 0;
i < 3;
i++) {
407 #define ADD_PRED(preds, px, py)\
409 preds.mvs[preds.nb][0] = px;\
410 preds.mvs[preds.nb][1] = py;\
422 const int mb_i = mb_x + mb_y * mi_ctx->
b_width;
423 int mv[2] = {x_mb, y_mb};
463 if (mb_y > 0 && mb_x + 1 < mi_ctx->
b_width)
467 if (preds[0].nb == 4) {
468 me_ctx->
pred_x =
mid_pred(preds[0].mvs[1][0], preds[0].mvs[2][0], preds[0].mvs[3][0]);
469 me_ctx->
pred_y =
mid_pred(preds[0].mvs[1][1], preds[0].mvs[2][1], preds[0].mvs[3][1]);
470 }
else if (preds[0].nb == 3) {
471 me_ctx->
pred_x =
mid_pred(0, preds[0].mvs[1][0], preds[0].mvs[2][0]);
472 me_ctx->
pred_y =
mid_pred(0, preds[0].mvs[1][1], preds[0].mvs[2][1]);
473 }
else if (preds[0].nb == 2) {
497 if (mb_x + 1 < mi_ctx->
b_width)
506 mi_ctx->
mv_table[0][mb_i][dir][0] =
mv[0] - x_mb;
507 mi_ctx->
mv_table[0][mb_i][dir][1] =
mv[1] - y_mb;
518 ADD_PRED(preds[0], blocks[mb_i - 1].mvs[dir][0], blocks[mb_i - 1].mvs[dir][1]);
525 if (mb_x + 1 < mi_ctx->
b_width)
533 if (preds[0].nb == 4) {
534 me_ctx->
pred_x =
mid_pred(preds[0].mvs[1][0], preds[0].mvs[2][0], preds[0].mvs[3][0]);
535 me_ctx->
pred_y =
mid_pred(preds[0].mvs[1][1], preds[0].mvs[2][1], preds[0].mvs[3][1]);
536 }
else if (preds[0].nb == 3) {
537 me_ctx->
pred_x =
mid_pred(0, preds[0].mvs[1][0], preds[0].mvs[2][0]);
538 me_ctx->
pred_y =
mid_pred(0, preds[0].mvs[1][1], preds[0].mvs[2][1]);
539 }
else if (preds[0].nb == 2) {
552 block->mvs[dir][0] =
mv[0] - x_mb;
553 block->mvs[dir][1] =
mv[1] - y_mb;
561 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
562 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++) {
568 block->mvs[0][0] = 0;
569 block->mvs[0][1] = 0;
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++)
580 uint64_t cost_sb, cost_old;
588 cost_old = me_ctx->
get_cost(me_ctx, x_mb, y_mb, x_mb +
block->mvs[0][0], y_mb +
block->mvs[0][1]);
604 for (y = 0; y < 2; y++)
605 for (x = 0; x < 2; x++) {
607 int mv[2] = {x_mb +
block->mvs[0][0], y_mb +
block->mvs[0][1]};
609 me_ctx->
mb_size = 1 << (n - 1);
621 if (cost_sb < cost_old / 4) {
622 sb->
mvs[0][0] = mv_x;
623 sb->
mvs[0][1] = mv_y;
626 if (
ret =
var_size_bme(mi_ctx, sb, x_mb + (x << (n - 1)), y_mb + (y << (n - 1)), n - 1))
641 int changed,
c, c_max = 0;
642 int mb_x, mb_y, x, y;
643 int mv_x, mv_y, avg_x, avg_y, dx, dy;
646 Cluster *cluster, *cluster_new;
650 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
651 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++) {
655 mv_x =
block->mvs[0][0];
656 mv_y =
block->mvs[0][1];
661 avg_x = cluster->
sum[0] / cluster->
nb;
662 avg_y = cluster->
sum[1] / cluster->
nb;
668 for (
d = 1;
d < 5;
d++)
686 cluster_new->
sum[0] += mv_x;
687 cluster_new->
sum[1] += mv_y;
688 cluster->
sum[0] -= mv_x;
689 cluster->
sum[1] -= mv_y;
702 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
703 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++) {
710 if ((x - mb_x) && (y - mb_y) || !dx && !dy)
713 if (!mb_x || !mb_y || mb_x == mi_ctx->
b_width - 1 || mb_y == mi_ctx->
b_height - 1)
737 frame_tmp = mi_ctx->
frames[0];
752 for (dir = 0; dir < 2; dir++) {
757 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
758 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++)
778 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
779 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++) {
796 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
797 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++) {
827 mi_ctx->
sad(p1, linesize1, p2, linesize2,
input->w,
input->h, &sad);
839 #define ADD_PIXELS(b_weight, mv_x, mv_y)\
841 if (!b_weight || pixel_refs->nb + 1 >= NB_PIXEL_MVS)\
843 pixel_refs->refs[pixel_refs->nb] = 1;\
844 pixel_weights->weights[pixel_refs->nb] = b_weight * (ALPHA_MAX - alpha);\
845 pixel_mvs->mvs[pixel_refs->nb][0] = av_clip((mv_x * alpha) / ALPHA_MAX, x_min, x_max);\
846 pixel_mvs->mvs[pixel_refs->nb][1] = av_clip((mv_y * alpha) / ALPHA_MAX, y_min, y_max);\
848 pixel_refs->refs[pixel_refs->nb] = 2;\
849 pixel_weights->weights[pixel_refs->nb] = b_weight * alpha;\
850 pixel_mvs->mvs[pixel_refs->nb][0] = av_clip(-mv_x * (ALPHA_MAX - alpha) / ALPHA_MAX, x_min, x_max);\
851 pixel_mvs->mvs[pixel_refs->nb][1] = av_clip(-mv_y * (ALPHA_MAX - alpha) / ALPHA_MAX, y_min, y_max);\
862 for (y = 0; y <
height; y++)
863 for (x = 0; x <
width; x++)
866 for (dir = 0; dir < 2; dir++)
867 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
868 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++) {
872 int start_x, start_y;
873 int startc_x, startc_y, endc_x, endc_y;
888 for (y = startc_y; y < endc_y; y++) {
890 int y_max =
height - y - 1;
891 for (x = startc_x; x < endc_x; x++) {
893 int x_max =
width - x - 1;
909 for (plane = 0; plane < mi_ctx->
nb_planes; plane++) {
912 int chroma = plane == 1 || plane == 2;
914 for (y = 0; y <
height; y++)
915 for (x = 0; x <
width; x++) {
923 for (
i = 0;
i < pixel_refs->
nb;
i++)
924 weight_sum += pixel_weights->
weights[
i];
926 if (!weight_sum || !pixel_refs->
nb) {
928 pixel_refs->
refs[0] = 1;
929 pixel_mvs->
mvs[0][0] = 0;
930 pixel_mvs->
mvs[0][1] = 0;
932 pixel_refs->
refs[1] = 2;
933 pixel_mvs->
mvs[1][0] = 0;
934 pixel_mvs->
mvs[1][1] = 0;
940 for (
i = 0;
i < pixel_refs->
nb;
i++) {
946 x_mv = x + pixel_mvs->
mvs[
i][0];
947 y_mv = y + pixel_mvs->
mvs[
i][1];
969 for (sb_y = 0; sb_y < 2; sb_y++)
970 for (sb_x = 0; sb_x < 2; sb_x++) {
974 var_size_bmc(mi_ctx, sb, x_mb + (sb_x << (n - 1)), y_mb + (sb_y << (n - 1)), n - 1,
alpha);
977 int mv_x = sb->
mvs[0][0] * 2;
978 int mv_y = sb->
mvs[0][1] * 2;
980 int start_x = x_mb + (sb_x << (n - 1));
981 int start_y = y_mb + (sb_y << (n - 1));
982 int end_x = start_x + (1 << (n - 1));
983 int end_y = start_y + (1 << (n - 1));
985 for (y = start_y; y < end_y; y++) {
987 int y_max =
height - y - 1;
988 for (x = start_x; x < end_x; x++) {
990 int x_max =
width - x - 1;
1012 int mv_x =
block->mvs[0][0] * 2;
1013 int mv_y =
block->mvs[0][1] * 2;
1014 int start_x, start_y;
1015 int startc_x, startc_y, endc_x, endc_y;
1019 for (nb_x =
FFMAX(0, mb_x - 1); nb_x <
FFMIN(mb_x + 2, mi_ctx->
b_width); nb_x++) {
1023 if (nb_x - mb_x || nb_y - mb_y)
1024 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]);
1035 for (y = startc_y; y < endc_y; y++) {
1037 int y_max =
height - y - 1;
1038 for (x = startc_x; x < endc_x; x++) {
1040 int x_max =
width - x - 1;
1047 nb_x = (((x - start_x) >> (mi_ctx->
log2_mb_size - 1)) * 2 - 3) / 2;
1048 nb_y = (((y - start_y) >> (mi_ctx->
log2_mb_size - 1)) * 2 - 3) / 2;
1051 uint64_t sbad = sbads[nb_x + 1 + (nb_y + 1) * 3];
1054 if (sbad && sbad != UINT64_MAX && nb->sbad != UINT64_MAX) {
1056 obmc_weight = obmc_weight * phi /
ALPHA_MAX;
1104 for (plane = 0; plane < mi_ctx->
nb_planes; plane++) {
1108 if (plane == 1 || plane == 2) {
1113 for (y = 0; y <
height; y++) {
1114 for (x = 0; x <
width; x++) {
1115 avf_out->
data[plane][x + y * avf_out->
linesize[plane]] =
1137 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++) {
1222 for (m = 0; m < mi_ctx->
b_count; m++)
1232 for (
i = 0;
i < 3;
i++)
1254 .
name =
"minterpolate",
1257 .priv_class = &minterpolate_class,