49 #define OFFSET(x) offsetof(MEContext, x)
50 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
51 #define CONST(name, help, val, unit) { name, help, 0, AV_OPT_TYPE_CONST, {.i64=val}, 0, 0, FLAGS, unit }
97 s->mb_size = 1 <<
s->log2_mb_size;
99 s->b_width = inlink->
w >>
s->log2_mb_size;
100 s->b_height = inlink->
h >>
s->log2_mb_size;
101 s->b_count =
s->b_width *
s->b_height;
106 for (
i = 0;
i < 3;
i++) {
112 ff_me_init_context(&
s->me_ctx,
s->mb_size,
s->search_param, inlink->
w, inlink->
h, 0, (
s->b_width - 1) <<
s->log2_mb_size, 0, (
s->b_height - 1) <<
s->log2_mb_size);
118 int x,
int y,
int x_mv,
int y_mv,
int dir)
122 mv->dst_x = x + (mb_size >> 1);
123 mv->dst_y = y + (mb_size >> 1);
124 mv->src_x = x_mv + (mb_size >> 1);
125 mv->src_y = y_mv + (mb_size >> 1);
126 mv->source = dir ? 1 : -1;
130 #define SEARCH_MV(method)\
132 for (mb_y = 0; mb_y < s->b_height; mb_y++)\
133 for (mb_x = 0; mb_x < s->b_width; mb_x++) {\
134 const int x_mb = mb_x << s->log2_mb_size;\
135 const int y_mb = mb_y << s->log2_mb_size;\
136 int mv[2] = {x_mb, y_mb};\
137 ff_me_search_##method(me_ctx, x_mb, y_mb, mv);\
138 add_mv_data(((AVMotionVector *) sd->data) + mv_count++, me_ctx->mb_size, x_mb, y_mb, mv[0], mv[1], dir);\
142 #define ADD_PRED(preds, px, py)\
144 preds.mvs[preds.nb][0] = px;\
145 preds.mvs[preds.nb][1] = py;\
170 s->mv_table[2] = memcpy(
s->mv_table[2],
s->mv_table[1],
sizeof(*
s->mv_table[1]) *
s->b_count);
171 s->mv_table[1] = memcpy(
s->mv_table[1],
s->mv_table[0],
sizeof(*
s->mv_table[0]) *
s->b_count);
195 for (dir = 0; dir < 2; dir++) {
213 for (mb_y = 0; mb_y <
s->b_height; mb_y++)
214 for (mb_x = 0; mb_x <
s->b_width; mb_x++) {
215 const int mb_i = mb_x + mb_y *
s->b_width;
216 const int x_mb = mb_x <<
s->log2_mb_size;
217 const int y_mb = mb_y <<
s->log2_mb_size;
218 int mv[2] = {x_mb, y_mb};
227 ADD_PRED(preds[0],
s->mv_table[0][mb_i - 1][dir][0],
s->mv_table[0][mb_i - 1][dir][1]);
231 ADD_PRED(preds[0],
s->mv_table[0][mb_i -
s->b_width][dir][0],
s->mv_table[0][mb_i -
s->b_width][dir][1]);
234 if (mb_x + 1 <
s->b_width)
235 ADD_PRED(preds[0],
s->mv_table[0][mb_i -
s->b_width + 1][dir][0],
s->mv_table[0][mb_i -
s->b_width + 1][dir][1]);
238 ADD_PRED(preds[0],
s->mv_table[0][mb_i -
s->b_width - 1][dir][0],
s->mv_table[0][mb_i -
s->b_width - 1][dir][1]);
242 if (preds[0].nb == 4) {
243 me_ctx->
pred_x =
mid_pred(preds[0].mvs[1][0], preds[0].mvs[2][0], preds[0].mvs[3][0]);
244 me_ctx->
pred_y =
mid_pred(preds[0].mvs[1][1], preds[0].mvs[2][1], preds[0].mvs[3][1]);
245 }
else if (preds[0].nb == 3) {
246 me_ctx->
pred_x =
mid_pred(0, preds[0].mvs[1][0], preds[0].mvs[2][0]);
247 me_ctx->
pred_y =
mid_pred(0, preds[0].mvs[1][1], preds[0].mvs[2][1]);
248 }
else if (preds[0].nb == 2) {
258 s->mv_table[0][mb_i][dir][0] =
mv[0] - x_mb;
259 s->mv_table[0][mb_i][dir][1] =
mv[1] - y_mb;
265 for (mb_y = 0; mb_y <
s->b_height; mb_y++)
266 for (mb_x = 0; mb_x <
s->b_width; mb_x++) {
267 const int mb_i = mb_x + mb_y *
s->b_width;
268 const int x_mb = mb_x <<
s->log2_mb_size;
269 const int y_mb = mb_y <<
s->log2_mb_size;
270 int mv[2] = {x_mb, y_mb};
280 ADD_PRED(preds[0],
s->mv_table[0][mb_i - 1][dir][0],
s->mv_table[0][mb_i - 1][dir][1]);
284 ADD_PRED(preds[0],
s->mv_table[0][mb_i -
s->b_width][dir][0],
s->mv_table[0][mb_i -
s->b_width][dir][1]);
287 if (mb_y > 0 && mb_x + 1 <
s->b_width)
288 ADD_PRED(preds[0],
s->mv_table[0][mb_i -
s->b_width + 1][dir][0],
s->mv_table[0][mb_i -
s->b_width + 1][dir][1]);
291 if (preds[0].nb == 4) {
292 me_ctx->
pred_x =
mid_pred(preds[0].mvs[1][0], preds[0].mvs[2][0], preds[0].mvs[3][0]);
293 me_ctx->
pred_y =
mid_pred(preds[0].mvs[1][1], preds[0].mvs[2][1], preds[0].mvs[3][1]);
294 }
else if (preds[0].nb == 3) {
295 me_ctx->
pred_x =
mid_pred(0, preds[0].mvs[1][0], preds[0].mvs[2][0]);
296 me_ctx->
pred_y =
mid_pred(0, preds[0].mvs[1][1], preds[0].mvs[2][1]);
297 }
else if (preds[0].nb == 2) {
306 ADD_PRED(preds[0],
s->mv_table[1][mb_i][dir][0],
s->mv_table[1][mb_i][dir][1]);
309 ADD_PRED(preds[1],
s->mv_table[1][mb_i][dir][0] + (
s->mv_table[1][mb_i][dir][0] -
s->mv_table[2][mb_i][dir][0]),
310 s->mv_table[1][mb_i][dir][1] + (
s->mv_table[1][mb_i][dir][1] -
s->mv_table[2][mb_i][dir][1]));
314 ADD_PRED(preds[1],
s->mv_table[1][mb_i - 1][dir][0],
s->mv_table[1][mb_i - 1][dir][1]);
318 ADD_PRED(preds[1],
s->mv_table[1][mb_i -
s->b_width][dir][0],
s->mv_table[1][mb_i -
s->b_width][dir][1]);
321 if (mb_x + 1 <
s->b_width)
322 ADD_PRED(preds[1],
s->mv_table[1][mb_i + 1][dir][0],
s->mv_table[1][mb_i + 1][dir][1]);
325 if (mb_y + 1 <
s->b_height)
326 ADD_PRED(preds[1],
s->mv_table[1][mb_i +
s->b_width][dir][0],
s->mv_table[1][mb_i +
s->b_width][dir][1]);
330 s->mv_table[0][mb_i][dir][0] =
mv[0] - x_mb;
331 s->mv_table[0][mb_i][dir][1] =
mv[1] - y_mb;
349 for (
i = 0;
i < 3;
i++)
375 .priv_class = &mestimate_class,
static const AVFilterPad inputs[]
static const AVFilterPad outputs[]
simple assert() macros that are a bit more flexible than ISO C assert().
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Main libavfilter public API header.
common internal and external API header
static av_always_inline av_const int av_ceil_log2_c(int x)
Compute ceil(log2(x)).
AVFrame * av_frame_clone(const AVFrame *src)
Create a new frame that references the same data as src.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
AVFrameSideData * av_frame_new_side_data(AVFrame *frame, enum AVFrameSideDataType type, buffer_size_t size)
Add a new side data to a frame.
@ AV_FRAME_DATA_MOTION_VECTORS
Motion vectors exported by some codecs (on demand through the export_mvs flag set in the libavcodec A...
void * av_mallocz_array(size_t nmemb, size_t size)
Allocate a memory block for an array with av_mallocz().
#define AV_NOPTS_VALUE
Undefined timestamp value.
static const int8_t mv[256][2]
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
static enum AVPixelFormat pix_fmts[]
uint64_t ff_me_search_epzs(AVMotionEstContext *me_ctx, int x_mb, int y_mb, int *mv)
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)
uint64_t ff_me_search_umh(AVMotionEstContext *me_ctx, int x_mb, int y_mb, int *mv)
#define AV_ME_METHOD_NTSS
#define AV_ME_METHOD_HEXBS
#define AV_ME_METHOD_EPZS
#define AV_ME_METHOD_ESA
Copyright (c) 2016 Davinder Singh (DSM_) <ds.mudhar<@gmail.com>
#define AV_ME_METHOD_TDLS
AVPixelFormat
Pixel format.
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
@ AV_PIX_FMT_YUV440P
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
@ AV_PIX_FMT_YUVA420P
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
@ AV_PIX_FMT_YUVJ440P
planar YUV 4:4:0 full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV440P and setting color_range
@ AV_PIX_FMT_YUV410P
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
@ AV_PIX_FMT_YUV411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
@ AV_PIX_FMT_YUVA444P
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
@ AV_PIX_FMT_YUVJ411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) full scale (JPEG), deprecated in favor ...
@ AV_PIX_FMT_YUVJ422P
planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting col...
@ AV_PIX_FMT_YUVA422P
planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)
@ AV_PIX_FMT_YUVJ444P
planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting col...
@ AV_PIX_FMT_YUVJ420P
planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting col...
Describe the class of an AVClass context structure.
void * priv
private data for use by the filter
A link between two filters.
int w
agreed upon image width
int h
agreed upon image height
AVFilterContext * dst
dest filter
A filter pad used for either input or output.
const char * name
Pad name.
const char * name
Filter name.
Structure to hold side data for an AVFrame.
This structure describes decoded (raw) audio or video data.
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
AVMotionEstPredictor preds[2]
int pred_y
median predictor y
int pred_x
median predictor x
Copyright (c) 2016 Davinder Singh (DSM_) <ds.mudhar<@gmail.com>
int search_param
search parameter
int(*[3] mv_table)[2][2]
motion vectors of current & prev 2 frames
AVMotionEstContext me_ctx
int mb_size
macroblock size
int method
motion estimation method
#define SEARCH_MV(method)
static const AVOption mestimate_options[]
#define ADD_PRED(preds, px, py)
static const AVFilterPad mestimate_inputs[]
#define CONST(name, help, val, unit)
static int query_formats(AVFilterContext *ctx)
static int config_input(AVFilterLink *inlink)
static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
static void add_mv_data(AVMotionVector *mv, int mb_size, int x, int y, int x_mv, int y_mv, int dir)
AVFILTER_DEFINE_CLASS(mestimate)
static const AVFilterPad mestimate_outputs[]
static av_cold void uninit(AVFilterContext *ctx)