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 {
155 typedef struct Frame {
192 #define OFFSET(x) offsetof(MIContext, x)
193 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
194 #define CONST(name, help, val, unit) { name, help, 0, AV_OPT_TYPE_CONST, {.i64=val}, 0, 0, FLAGS, unit }
204 CONST(
"aobmc",
"adaptive overlapped block motion compensation",
MC_MODE_AOBMC,
"mc_mode"),
255 int mv_x1 = x_mv - x;
256 int mv_y1 = y_mv - y;
257 int mv_x, mv_y, i, j;
265 data_cur += (y + mv_y) * linesize;
266 data_next += (y - mv_y) * linesize;
268 for (j = 0; j < me_ctx->
mb_size; j++)
269 for (i = 0; i < me_ctx->
mb_size; i++)
270 sbad +=
FFABS(data_cur[x + mv_x + i + j * linesize] - data_next[x - mv_x + i + j * linesize]);
284 int mv_x1 = x_mv - x;
285 int mv_y1 = y_mv - y;
286 int mv_x, mv_y, i, j;
289 x = av_clip(x, x_min, x_max);
290 y = av_clip(y, y_min, y_max);
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));
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]);
315 x = av_clip(x, x_min, x_max);
316 y = av_clip(y, y_min, y_max);
317 x_mv = av_clip(x_mv, x_min, x_max);
318 y_mv = av_clip(y_mv, y_min, y_max);
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]);
333 const int width = inlink->
w;
364 for (i = 0; i < 3; i++) {
398 #define ADD_PRED(preds, px, py)\
400 preds.mvs[preds.nb][0] = px;\
401 preds.mvs[preds.nb][1] = py;\
413 const int mb_i = mb_x + mb_y * mi_ctx->
b_width;
414 int mv[2] = {x_mb, y_mb};
454 if (mb_y > 0 && mb_x + 1 < mi_ctx->
b_width)
458 if (preds[0].nb == 4) {
459 me_ctx->
pred_x =
mid_pred(preds[0].mvs[1][0], preds[0].mvs[2][0], preds[0].mvs[3][0]);
460 me_ctx->
pred_y =
mid_pred(preds[0].mvs[1][1], preds[0].mvs[2][1], preds[0].mvs[3][1]);
461 }
else if (preds[0].nb == 3) {
462 me_ctx->
pred_x =
mid_pred(0, preds[0].mvs[1][0], preds[0].mvs[2][0]);
463 me_ctx->
pred_y =
mid_pred(0, preds[0].mvs[1][1], preds[0].mvs[2][1]);
464 }
else if (preds[0].nb == 2) {
488 if (mb_x + 1 < mi_ctx->
b_width)
497 mi_ctx->
mv_table[0][mb_i][dir][0] = mv[0] - x_mb;
498 mi_ctx->
mv_table[0][mb_i][dir][1] = mv[1] - y_mb;
509 ADD_PRED(preds[0], blocks[mb_i - 1].mvs[dir][0], blocks[mb_i - 1].mvs[dir][1]);
516 if (mb_x + 1 < mi_ctx->
b_width)
524 if (preds[0].nb == 4) {
525 me_ctx->
pred_x =
mid_pred(preds[0].mvs[1][0], preds[0].mvs[2][0], preds[0].mvs[3][0]);
526 me_ctx->
pred_y =
mid_pred(preds[0].mvs[1][1], preds[0].mvs[2][1], preds[0].mvs[3][1]);
527 }
else if (preds[0].nb == 3) {
528 me_ctx->
pred_x =
mid_pred(0, preds[0].mvs[1][0], preds[0].mvs[2][0]);
529 me_ctx->
pred_y =
mid_pred(0, preds[0].mvs[1][1], preds[0].mvs[2][1]);
530 }
else if (preds[0].nb == 2) {
543 block->
mvs[dir][0] = mv[0] - x_mb;
544 block->
mvs[dir][1] = mv[1] - y_mb;
552 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
553 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++) {
559 block->
mvs[0][0] = 0;
560 block->
mvs[0][1] = 0;
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++)
571 uint64_t cost_sb, cost_old;
579 cost_old = me_ctx->
get_cost(me_ctx, x_mb, y_mb, x_mb + block->
mvs[0][0], y_mb + block->
mvs[0][1]);
595 for (y = 0; y < 2; y++)
596 for (x = 0; x < 2; x++) {
598 int mv[2] = {x_mb + block->
mvs[0][0], y_mb + block->
mvs[0][1]};
600 me_ctx->
mb_size = 1 << (n - 1);
612 if (cost_sb < cost_old / 4) {
613 sb->
mvs[0][0] = mv_x;
614 sb->
mvs[0][1] = mv_y;
617 if (ret =
var_size_bme(mi_ctx, sb, x_mb + (x << (n - 1)), y_mb + (y << (n - 1)), n - 1))
632 int changed,
c, c_max = 0;
633 int mb_x, mb_y, x, y;
634 int mv_x, mv_y, avg_x, avg_y, dx, dy;
637 Cluster *cluster, *cluster_new;
641 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
642 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++) {
646 mv_x = block->
mvs[0][0];
647 mv_y = block->
mvs[0][1];
652 avg_x = cluster->
sum[0] / cluster->
nb;
653 avg_y = cluster->
sum[1] / cluster->
nb;
659 for (d = 1; d < 5; d++)
663 if (nb->
cid > block->
cid) {
664 if (nb->
cid < c || c == block->
cid)
677 cluster_new->
sum[0] += mv_x;
678 cluster_new->
sum[1] += mv_y;
679 cluster->
sum[0] -= mv_x;
680 cluster->
sum[1] -= mv_y;
684 c_max =
FFMAX(c_max, c);
693 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
694 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++) {
701 if ((x - mb_x) && (y - mb_y) || !dx && !dy)
704 if (!mb_x || !mb_y || mb_x == mi_ctx->
b_width - 1 || mb_y == mi_ctx->
b_height - 1)
728 frame_tmp = mi_ctx->
frames[0];
744 for (dir = 0; dir < 2; dir++) {
749 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
750 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++)
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++) {
788 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
789 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++) {
816 double ret = 0, mafd,
diff;
819 for (sad = y = 0; y < me_ctx->
height; y += 8)
820 for (x = 0; x < linesize; x += 8)
821 sad += mi_ctx->
sad(p1 + x + y * linesize, linesize, p2 + x + y * linesize, linesize);
824 mafd = (double) sad / (me_ctx->
height * me_ctx->
width * 3);
826 ret = av_clipf(
FFMIN(mafd, diff), 0, 100.0);
835 #define ADD_PIXELS(b_weight, mv_x, mv_y)\
837 if (!b_weight || pixel->nb + 1 >= NB_PIXEL_MVS)\
839 pixel->refs[pixel->nb] = 1;\
840 pixel->weights[pixel->nb] = b_weight * (ALPHA_MAX - alpha);\
841 pixel->mvs[pixel->nb][0] = av_clip((mv_x * alpha) / ALPHA_MAX, x_min, x_max);\
842 pixel->mvs[pixel->nb][1] = av_clip((mv_y * alpha) / ALPHA_MAX, y_min, y_max);\
844 pixel->refs[pixel->nb] = 2;\
845 pixel->weights[pixel->nb] = b_weight * alpha;\
846 pixel->mvs[pixel->nb][0] = av_clip(-mv_x * (ALPHA_MAX - alpha) / ALPHA_MAX, x_min, x_max);\
847 pixel->mvs[pixel->nb][1] = av_clip(-mv_y * (ALPHA_MAX - alpha) / ALPHA_MAX, y_min, y_max);\
858 for (y = 0; y <
height; y++)
859 for (x = 0; x <
width; x++)
860 mi_ctx->
pixels[x + y * width].
nb = 0;
862 for (dir = 0; dir < 2; dir++)
863 for (mb_y = 0; mb_y < mi_ctx->
b_height; mb_y++)
864 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++) {
868 int start_x, start_y;
869 int startc_x, startc_y, endc_x, endc_y;
874 startc_x = av_clip(start_x, 0, width - 1);
875 startc_y = av_clip(start_y, 0, height - 1);
876 endc_x = av_clip(start_x + (2 << mi_ctx->
log2_mb_size), 0, width - 1);
877 endc_y = av_clip(start_y + (2 << mi_ctx->
log2_mb_size), 0, height - 1);
884 for (y = startc_y; y < endc_y; y++) {
886 int y_max = height - y - 1;
887 for (x = startc_x; x < endc_x; x++) {
889 int x_max = width - x - 1;
903 for (plane = 0; plane < mi_ctx->
nb_planes; plane++) {
906 int chroma = plane == 1 || plane == 2;
908 for (y = 0; y <
height; y++)
909 for (x = 0; x <
width; x++) {
915 for (i = 0; i < pixel->
nb; i++)
916 weight_sum += pixel->
weights[i];
918 if (!weight_sum || !pixel->
nb) {
921 pixel->
mvs[0][0] = 0;
922 pixel->
mvs[0][1] = 0;
925 pixel->
mvs[1][0] = 0;
926 pixel->
mvs[1][1] = 0;
932 for (i = 0; i < pixel->
nb; i++) {
938 x_mv = x + pixel->
mvs[i][0];
939 y_mv = y + pixel->
mvs[i][1];
961 for (sb_y = 0; sb_y < 2; sb_y++)
962 for (sb_x = 0; sb_x < 2; sb_x++) {
963 Block *sb = &block->
subs[sb_x + sb_y * 2];
966 var_size_bmc(mi_ctx, sb, x_mb + (sb_x << (n - 1)), y_mb + (sb_y << (n - 1)), n - 1, alpha);
969 int mv_x = sb->
mvs[0][0] * 2;
970 int mv_y = sb->
mvs[0][1] * 2;
972 int start_x = x_mb + (sb_x << (n - 1));
973 int start_y = y_mb + (sb_y << (n - 1));
974 int end_x = start_x + (1 << (n - 1));
975 int end_y = start_y + (1 << (n - 1));
977 for (y = start_y; y < end_y; y++) {
979 int y_max = height - y - 1;
980 for (x = start_x; x < end_x; x++) {
982 int x_max = width - x - 1;
1002 int mv_x = block->
mvs[0][0] * 2;
1003 int mv_y = block->
mvs[0][1] * 2;
1004 int start_x, start_y;
1005 int startc_x, startc_y, endc_x, endc_y;
1009 for (nb_x =
FFMAX(0, mb_x - 1); nb_x <
FFMIN(mb_x + 2, mi_ctx->
b_width); nb_x++) {
1013 if (nb_x - mb_x || nb_y - mb_y)
1014 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]);
1020 startc_x = av_clip(start_x, 0, width - 1);
1021 startc_y = av_clip(start_y, 0, height - 1);
1022 endc_x = av_clip(start_x + (2 << mi_ctx->
log2_mb_size), 0, width - 1);
1023 endc_y = av_clip(start_y + (2 << mi_ctx->
log2_mb_size), 0, height - 1);
1025 for (y = startc_y; y < endc_y; y++) {
1027 int y_max = height - y - 1;
1028 for (x = startc_x; x < endc_x; x++) {
1030 int x_max = width - x - 1;
1035 nb_x = (((x - start_x) >> (mi_ctx->
log2_mb_size - 1)) * 2 - 3) / 2;
1036 nb_y = (((y - start_y) >> (mi_ctx->
log2_mb_size - 1)) * 2 - 3) / 2;
1039 uint64_t sbad = sbads[nb_x + 1 + (nb_y + 1) * 3];
1042 if (sbad && sbad != UINT64_MAX && nb->sbad != UINT64_MAX) {
1044 obmc_weight = obmc_weight * phi /
ALPHA_MAX;
1067 alpha = av_clip(alpha, 0, ALPHA_MAX);
1069 if (alpha == 0 || alpha == ALPHA_MAX) {
1086 for (plane = 0; plane < mi_ctx->
nb_planes; plane++) {
1090 if (plane == 1 || plane == 2) {
1095 for (y = 0; y <
height; y++) {
1096 for (x = 0; x <
width; x++) {
1119 for (mb_x = 0; mb_x < mi_ctx->
b_width; mb_x++) {
1201 for (m = 0; m < mi_ctx->
b_count; m++)
1211 for (i = 0; i < 3; i++)
1235 .
name =
"minterpolate",
1238 .priv_class = &minterpolate_class,
1241 .
inputs = minterpolate_inputs,
1242 .
outputs = minterpolate_outputs,
uint64_t ff_me_search_hexbs(AVMotionEstContext *me_ctx, int x_mb, int y_mb, int *mv)
static const uint8_t obmc_linear32[1024]
const char const char void * val
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
This structure describes decoded (raw) audio or video data.
static const AVFilterPad minterpolate_outputs[]
static const uint8_t obmc_linear4[16]
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
Main libavfilter public API header.
int h
agreed upon image height
int pred_y
median predictor y
#define AV_ME_METHOD_TDLS
static av_cold void free_blocks(Block *block, int sb)
static const AVOption minterpolate_options[]
static void bilateral_obmc(MIContext *mi_ctx, Block *block, int mb_x, int mb_y, int alpha)
AVFrame * ff_get_video_buffer(AVFilterLink *link, int w, int h)
Request a picture buffer with a specific set of permissions.
uint8_t log2_chroma_w
Amount to shift the luma width right to find the chroma width.
AVMotionEstPredictor preds[2]
const char * name
Pad name.
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
uint64_t ff_me_search_fss(AVMotionEstContext *me_ctx, int x_mb, int y_mb, int *mv)
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
#define AV_ME_METHOD_NTSS
static void interpolate(AVFilterLink *inlink, AVFrame *avf_out)
int pred_x
median predictor x
uint64_t ff_me_search_ds(AVMotionEstContext *me_ctx, int x_mb, int y_mb, int *mv)
Cluster clusters[NB_CLUSTERS]
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
#define AV_ME_METHOD_EPZS
static uint64_t get_sbad(AVMotionEstContext *me_ctx, int x, int y, int x_mv, int y_mv)
uint64_t ff_me_search_umh(AVMotionEstContext *me_ctx, int x_mb, int y_mb, int *mv)
planar YUV 4:4:0 full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV440P and setting color_range...
planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting col...
#define AV_LOG_VERBOSE
Detailed information.
#define CONST(name, help, val, unit)
static void set_frame_data(MIContext *mi_ctx, int alpha, AVFrame *avf_out)
static void bilateral_me(MIContext *mi_ctx)
#define ROUNDED_DIV(a, b)
static const uint8_t obmc_linear16[256]
#define AV_ME_METHOD_HEXBS
A filter pad used for either input or output.
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
A link between two filters.
static uint64_t get_sad_ob(AVMotionEstContext *me_ctx, int x, int y, int x_mv, int y_mv)
planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)
static double alpha(void *priv, double x, double y)
int width
width and height of the video frame
uint8_t log2_chroma_h
Amount to shift the luma height right to find the chroma height.
AVRational frame_rate
Frame rate of the stream on the link, or 1/0 if unknown or variable; if left to 0/0, will be automatically copied from the first input of the source filter if it exists.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
void * priv
private data for use by the filter
uint64_t ff_me_search_epzs(AVMotionEstContext *me_ctx, int x_mb, int y_mb, int *mv)
int(* av_pixelutils_sad_fn)(const uint8_t *src1, ptrdiff_t stride1, const uint8_t *src2, ptrdiff_t stride2)
Sum of abs(src1[x] - src2[x])
static int var_size_bme(MIContext *mi_ctx, Block *block, int x_mb, int y_mb, int n)
AVRational time_base
Define the time base used by the PTS of the frames/samples which will pass through this link...
static int filter_frame(AVFilterLink *inlink, AVFrame *avf_in)
simple assert() macros that are a bit more flexible than ISO C assert().
static const uint8_t *const obmc_tab_linear[4]
static void * av_mallocz_array(size_t nmemb, size_t size)
int av_frame_copy(AVFrame *dst, const AVFrame *src)
Copy the frame data from src to dst.
int av_compare_ts(int64_t ts_a, AVRational tb_a, int64_t ts_b, AVRational tb_b)
Compare two timestamps each in its own time base.
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
int w
agreed upon image width
static int cluster_mvs(MIContext *mi_ctx)
AVFilter ff_vf_minterpolate
uint64_t ff_me_search_tdls(AVMotionEstContext *me_ctx, int x_mb, int y_mb, int *mv)
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting col...
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
AVFilterContext * src
source filter
static const AVFilterPad outputs[]
uint64_t ff_me_search_ntss(AVMotionEstContext *me_ctx, int x_mb, int y_mb, int *mv)
AVFrame * av_frame_clone(const AVFrame *src)
Create a new frame that references the same data as src.
int format
agreed upon media format
static const int8_t mv[256][2]
void ff_me_init_context(AVMotionEstContext *me_ctx, int mb_size, int search_param, int width, int height, int x_min, int x_max, int y_min, int y_max)
static const AVFilterPad inputs[]
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
static int config_input(AVFilterLink *inlink)
static int detect_scene_change(MIContext *mi_ctx)
#define ME_MODE_BIDIR
Copyright (c) 2014-2015 Michael Niedermayer michaelni@gmx.at Copyright (c) 2016 Davinder Singh (DSM_)...
static void var_size_bmc(MIContext *mi_ctx, Block *block, int x_mb, int y_mb, int n, int alpha)
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
#define ADD_PIXELS(b_weight, mv_x, mv_y)
av_pixelutils_sad_fn av_pixelutils_get_sad_fn(int w_bits, int h_bits, int aligned, void *log_ctx)
Get a potentially optimized pointer to a Sum-of-absolute-differences function (see the av_pixelutils_...
Describe the class of an AVClass context structure.
static const AVFilterPad minterpolate_inputs[]
Rational number (pair of numerator and denominator).
int8_t refs[NB_PIXEL_MVS]
offset must point to AVRational
const char * name
Filter name.
uint64_t ff_me_search_esa(AVMotionEstContext *me_ctx, int x_mb, int y_mb, int *mv)
AVFilterLink ** outputs
array of pointers to output links
static enum AVPixelFormat pix_fmts[]
uint64_t(* get_cost)(struct AVMotionEstContext *me_ctx, int x_mb, int y_mb, int mv_x, int mv_y)
static int64_t pts
Global timestamp for the audio frames.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
static int config_output(AVFilterLink *outlink)
static av_always_inline AVRational av_inv_q(AVRational q)
Invert a rational.
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
common internal and external API header
AVFILTER_DEFINE_CLASS(minterpolate)
int16_t mvs[NB_PIXEL_MVS][2]
AVMotionEstContext me_ctx
planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting col...
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
#define AV_ME_METHOD_ESA
Copyright (c) 2016 Davinder Singh (DSM_) <ds.mudhar<.com>
uint64_t ff_me_search_tss(AVMotionEstContext *me_ctx, int x_mb, int y_mb, int *mv)
static int query_formats(AVFilterContext *ctx)
uint32_t weights[NB_PIXEL_MVS]
static void search_mv(MIContext *mi_ctx, Block *blocks, int mb_x, int mb_y, int dir)
#define ADD_PRED(preds, px, py)
static av_always_inline int diff(const uint32_t a, const uint32_t b)
AVFilterContext * dst
dest filter
#define CLUSTER_THRESHOLD
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) full scale (JPEG), deprecated in favor ...
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
static int inject_frame(AVFilterLink *inlink, AVFrame *avf_in)
static void bidirectional_obmc(MIContext *mi_ctx, int alpha)
static av_always_inline av_const int av_ceil_log2_c(int x)
Compute ceil(log2(x)).
static const uint8_t obmc_linear8[64]
static uint64_t get_sbad_ob(AVMotionEstContext *me_ctx, int x, int y, int x_mv, int y_mv)
AVPixelFormat
Pixel format.
static av_cold void uninit(AVFilterContext *ctx)
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
#define AV_NOPTS_VALUE
Undefined timestamp value.
#define AV_CEIL_RSHIFT(a, b)