23 static const int8_t
sqr1[8][2] = {{ 0,-1}, { 0, 1}, {-1, 0}, { 1, 0}, {-1,-1}, {-1, 1}, { 1,-1}, { 1, 1}};
24 static const int8_t
dia1[4][2] = {{-1, 0}, { 0,-1}, { 1, 0}, { 0, 1}};
25 static const int8_t
dia2[8][2] = {{-2, 0}, {-1,-1}, { 0,-2}, { 1,-1}, { 2, 0}, { 1, 1}, { 0, 2}, {-1, 1}};
26 static const int8_t
hex2[6][2] = {{-2, 0}, {-1,-2}, {-1, 2}, { 1,-2}, { 1, 2}, { 2, 0}};
27 static const int8_t
hex4[16][2] = {{-4,-2}, {-4,-1}, {-4, 0}, {-4, 1}, {-4, 2},
28 { 4,-2}, { 4,-1}, { 4, 0}, { 4, 1}, { 4, 2},
29 {-2, 3}, { 0, 4}, { 2, 3}, {-2,-3}, { 0,-4}, { 2,-3}};
31 #define COST_MV(x, y)\
33 cost = me_ctx->get_cost(me_ctx, x_mb, y_mb, x, y);\
34 if (cost < cost_min) {\
41 #define COST_P_MV(x, y)\
42 if (x >= x_min && x <= x_max && y >= y_min && y <= y_max)\
46 int width,
int height,
int x_min,
int x_max,
int y_min,
int y_max)
53 me_ctx->
x_min = x_min;
54 me_ctx->
x_max = x_max;
55 me_ctx->
y_min = y_min;
56 me_ctx->
y_max = y_max;
61 const int linesize = me_ctx->
linesize;
62 uint8_t *data_ref = me_ctx->
data_ref;
63 uint8_t *data_cur = me_ctx->
data_cur;
67 data_ref += y_mv * linesize;
68 data_cur += y_mb * linesize;
70 for (j = 0; j < me_ctx->
mb_size; j++)
72 sad +=
FFABS(data_ref[x_mv +
i + j * linesize] - data_cur[x_mb +
i + j * linesize]);
84 uint64_t cost, cost_min;
86 if (!(cost_min = me_ctx->
get_cost(me_ctx, x_mb, y_mb, x_mb, y_mb)))
89 for (y = y_min; y <= y_max; y++)
90 for (x = x_min; x <= x_max; x++)
103 uint64_t cost, cost_min;
110 if (!(cost_min = me_ctx->
get_cost(me_ctx, x_mb, y_mb, x_mb, y_mb)))
117 for (
i = 0;
i < 8;
i++)
134 uint64_t cost, cost_min;
141 if (!(cost_min = me_ctx->
get_cost(me_ctx, x_mb, y_mb, x_mb, y_mb)))
148 for (
i = 0;
i < 4;
i++)
151 if (x ==
mv[0] && y ==
mv[1])
166 uint64_t cost, cost_min;
174 if (!(cost_min = me_ctx->
get_cost(me_ctx, x_mb, y_mb, x_mb, y_mb)))
181 for (
i = 0;
i < 8;
i++)
187 for (
i = 0;
i < 8;
i++)
190 if (x ==
mv[0] && y ==
mv[1])
197 for (
i = 0;
i < 8;
i++)
219 uint64_t cost, cost_min;
226 if (!(cost_min = me_ctx->
get_cost(me_ctx, x_mb, y_mb, x_mb, y_mb)))
233 for (
i = 0;
i < 8;
i++)
236 if (x ==
mv[0] && y ==
mv[1])
251 uint64_t cost, cost_min;
255 if (!(cost_min = me_ctx->
get_cost(me_ctx, x_mb, y_mb, x_mb, y_mb)))
266 for (
i = 0;
i < 8;
i++)
272 if (dir_x <= 0 && dir_y <= 0)
276 if (dir_x >= 0 && dir_y <= 0)
280 if (dir_x >= 0 && dir_y >= 0)
284 if (dir_x <= 0 && dir_y >= 0)
291 }
while (x !=
mv[0] || y !=
mv[1]);
293 for (
i = 0;
i < 4;
i++)
306 uint64_t cost, cost_min;
309 if (!(cost_min = me_ctx->
get_cost(me_ctx, x_mb, y_mb, x_mb, y_mb)))
316 for (
i = 0;
i < 6;
i++)
319 }
while (x !=
mv[0] || y !=
mv[1]);
321 for (
i = 0;
i < 4;
i++)
339 uint64_t cost, cost_min;
344 cost_min = UINT64_MAX;
348 for (
i = 0;
i < preds[0].
nb;
i++)
349 COST_P_MV(x_mb + preds[0].mvs[
i][0], y_mb + preds[0].mvs[
i][1]);
351 for (
i = 0;
i < preds[1].
nb;
i++)
352 COST_P_MV(x_mb + preds[1].mvs[
i][0], y_mb + preds[1].mvs[
i][1]);
358 for (
i = 0;
i < 4;
i++)
361 }
while (x !=
mv[0] || y !=
mv[1]);
380 uint64_t cost, cost_min;
386 cost_min = UINT64_MAX;
399 if (d <= me_ctx->search_param / 2) {
406 end_x =
FFMIN(
mv[0] + 2, x_max);
407 end_y =
FFMIN(
mv[1] + 2, y_max);
408 for (y =
FFMAX(y_min,
mv[1] - 2); y <= end_y; y++)
409 for (x =
FFMAX(x_min,
mv[0] - 2); x <= end_x; x++)
415 for (
i = 1;
i < 16;
i++)
423 for (
i = 0;
i < 6;
i++)
426 }
while (x !=
mv[0] || y !=
mv[1]);
428 for (
i = 0;
i < 4;
i++)