46#define OFFSET(x) offsetof(MEContext, x)
47#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
48#define CONST(name, help, val, u) { name, help, 0, AV_OPT_TYPE_CONST, {.i64=val}, 0, 0, FLAGS, .unit = u }
86 s->mb_size = 1 <<
s->log2_mb_size;
88 s->b_width = inlink->
w >>
s->log2_mb_size;
89 s->b_height = inlink->
h >>
s->log2_mb_size;
90 s->b_count =
s->b_width *
s->b_height;
95 for (
i = 0;
i < 3;
i++) {
96 s->mv_table[
i] =
av_calloc(
s->b_count,
sizeof(*
s->mv_table[0]));
101 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);
107 int x,
int y,
int x_mv,
int y_mv,
int dir)
111 mv->dst_x = x + (mb_size >> 1);
112 mv->dst_y = y + (mb_size >> 1);
113 mv->src_x = x_mv + (mb_size >> 1);
114 mv->src_y = y_mv + (mb_size >> 1);
115 mv->source = dir ? 1 : -1;
119#define SEARCH_MV(method)\
121 for (mb_y = 0; mb_y < s->b_height; mb_y++)\
122 for (mb_x = 0; mb_x < s->b_width; mb_x++) {\
123 const int x_mb = mb_x << s->log2_mb_size;\
124 const int y_mb = mb_y << s->log2_mb_size;\
125 int mv[2] = {x_mb, y_mb};\
126 ff_me_search_##method(me_ctx, x_mb, y_mb, mv);\
127 add_mv_data(((AVMotionVector *) sd->data) + mv_count++, me_ctx->mb_size, x_mb, y_mb, mv[0], mv[1], dir);\
131#define ADD_PRED(preds, px, py)\
133 preds.mvs[preds.nb][0] = px;\
134 preds.mvs[preds.nb][1] = py;\
159 s->mv_table[2] = memcpy(
s->mv_table[2],
s->mv_table[1],
sizeof(*
s->mv_table[1]) *
s->b_count);
160 s->mv_table[1] = memcpy(
s->mv_table[1],
s->mv_table[0],
sizeof(*
s->mv_table[0]) *
s->b_count);
184 for (dir = 0; dir < 2; dir++) {
202 for (mb_y = 0; mb_y <
s->b_height; mb_y++)
203 for (mb_x = 0; mb_x <
s->b_width; mb_x++) {
204 const int mb_i = mb_x + mb_y *
s->b_width;
205 const int x_mb = mb_x <<
s->log2_mb_size;
206 const int y_mb = mb_y <<
s->log2_mb_size;
207 int mv[2] = {x_mb, y_mb};
216 ADD_PRED(preds[0],
s->mv_table[0][mb_i - 1][dir][0],
s->mv_table[0][mb_i - 1][dir][1]);
220 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]);
223 if (mb_x + 1 <
s->b_width)
224 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]);
227 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]);
231 if (preds[0].nb == 4) {
232 me_ctx->
pred_x =
mid_pred(preds[0].mvs[1][0], preds[0].mvs[2][0], preds[0].mvs[3][0]);
233 me_ctx->
pred_y =
mid_pred(preds[0].mvs[1][1], preds[0].mvs[2][1], preds[0].mvs[3][1]);
234 }
else if (preds[0].nb == 3) {
235 me_ctx->
pred_x =
mid_pred(0, preds[0].mvs[1][0], preds[0].mvs[2][0]);
236 me_ctx->
pred_y =
mid_pred(0, preds[0].mvs[1][1], preds[0].mvs[2][1]);
237 }
else if (preds[0].nb == 2) {
247 s->mv_table[0][mb_i][dir][0] =
mv[0] - x_mb;
248 s->mv_table[0][mb_i][dir][1] =
mv[1] - y_mb;
254 for (mb_y = 0; mb_y <
s->b_height; mb_y++)
255 for (mb_x = 0; mb_x <
s->b_width; mb_x++) {
256 const int mb_i = mb_x + mb_y *
s->b_width;
257 const int x_mb = mb_x <<
s->log2_mb_size;
258 const int y_mb = mb_y <<
s->log2_mb_size;
259 int mv[2] = {x_mb, y_mb};
269 ADD_PRED(preds[0],
s->mv_table[0][mb_i - 1][dir][0],
s->mv_table[0][mb_i - 1][dir][1]);
273 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]);
276 if (mb_y > 0 && mb_x + 1 <
s->b_width)
277 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]);
280 if (preds[0].nb == 4) {
281 me_ctx->
pred_x =
mid_pred(preds[0].mvs[1][0], preds[0].mvs[2][0], preds[0].mvs[3][0]);
282 me_ctx->
pred_y =
mid_pred(preds[0].mvs[1][1], preds[0].mvs[2][1], preds[0].mvs[3][1]);
283 }
else if (preds[0].nb == 3) {
284 me_ctx->
pred_x =
mid_pred(0, preds[0].mvs[1][0], preds[0].mvs[2][0]);
285 me_ctx->
pred_y =
mid_pred(0, preds[0].mvs[1][1], preds[0].mvs[2][1]);
286 }
else if (preds[0].nb == 2) {
295 ADD_PRED(preds[0],
s->mv_table[1][mb_i][dir][0],
s->mv_table[1][mb_i][dir][1]);
298 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]),
299 s->mv_table[1][mb_i][dir][1] + (
s->mv_table[1][mb_i][dir][1] -
s->mv_table[2][mb_i][dir][1]));
303 ADD_PRED(preds[1],
s->mv_table[1][mb_i - 1][dir][0],
s->mv_table[1][mb_i - 1][dir][1]);
307 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]);
310 if (mb_x + 1 <
s->b_width)
311 ADD_PRED(preds[1],
s->mv_table[1][mb_i + 1][dir][0],
s->mv_table[1][mb_i + 1][dir][1]);
314 if (mb_y + 1 <
s->b_height)
315 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]);
319 s->mv_table[0][mb_i][dir][0] =
mv[0] - x_mb;
320 s->mv_table[0][mb_i][dir][1] =
mv[1] - y_mb;
338 for (
i = 0;
i < 3;
i++)
352 .p.name =
"mestimate",
354 .p.priv_class = &mestimate_class,
static int config_input(AVFilterLink *inlink)
const FFFilter ff_vf_mestimate
static AVFormatContext * ctx
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Main libavfilter public API header.
#define i(width, name, range_min, range_max)
common internal and external API header
static av_always_inline av_const int av_ceil_log2_c(int x)
Compute ceil(log2(x)).
static int filter_frame(DBEDecodeContext *s, AVFrame *frame)
@ AV_OPT_TYPE_INT
Underlying C type is int.
#define AVFILTER_FLAG_METADATA_ONLY
The filter is a "metadata" filter - it does not modify the frame data in any way.
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, size_t size)
Add a new side data to a frame.
AVFrame * av_frame_clone(const AVFrame *src)
Create a new frame that references the same data as src.
@ AV_FRAME_DATA_MOTION_VECTORS
Motion vectors exported by some codecs (on demand through the export_mvs flag set in the libavcodec A...
#define AV_NOPTS_VALUE
Undefined timestamp value.
static av_cold void uninit(AVBitStreamFilterContext *ctx)
static const int8_t mv[256][2]
#define FILTER_INPUTS(array)
#define FILTER_OUTPUTS(array)
#define FILTER_PIXFMTS_ARRAY(array)
#define AVFILTER_DEFINE_CLASS(fname)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
static enum AVPixelFormat pix_fmts[]
void * av_calloc(size_t nmemb, size_t size)
Memory handling functions.
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.
Structure to hold side data for an AVFrame.
This structure describes decoded (raw) audio or video data.
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[]
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)
#define CONST(name, help, val, u)
static av_cold void uninit(AVFilterContext *ctx)
const AVFilterPad ff_video_default_filterpad[1]
An AVFilterPad array whose only entry has name "default" and is of type AVMEDIA_TYPE_VIDEO.