FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
Data Structures | Macros | Functions
motion_est.c File Reference

Motion estimation. More...

#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
#include "avcodec.h"
#include "mathops.h"
#include "mpegutils.h"
#include "mpegvideo.h"
#include <assert.h>
#include "motion_est_template.c"

Go to the source code of this file.

Data Structures

struct  Minima
 

Macros

#define P_LEFT   P[1]
 
#define P_TOP   P[2]
 
#define P_TOPRIGHT   P[3]
 
#define P_MEDIAN   P[4]
 
#define P_MV1   P[9]
 
#define ME_MAP_SHIFT   3
 
#define ME_MAP_MV_BITS   11
 
#define FLAG_QPEL   1
 
#define FLAG_CHROMA   2
 
#define FLAG_DIRECT   4
 
#define CHECK_SAD_HALF_MV(suffix, x, y)
 
#define HASH(fx, fy, bx, by)   ((fx)+17*(fy)+63*(bx)+117*(by))
 
#define HASH8(fx, fy, bx, by)   ((uint8_t)HASH(fx,fy,bx,by))
 
#define CHECK_BIDIR(fx, fy, bx, by)
 
#define CHECK_BIDIR2(a, b, c, d)
 

Functions

static int sad_hpel_motion_search (MpegEncContext *s, int *mx_ptr, int *my_ptr, int dmin, int src_index, int ref_index, int size, int h)
 
static unsigned update_map_generation (MotionEstContext *c)
 
static int minima_cmp (const void *a, const void *b)
 
static void init_ref (MotionEstContext *c, uint8_t *src[3], uint8_t *ref[3], uint8_t *ref2[3], int x, int y, int ref_index)
 
static int get_flags (MotionEstContext *c, int direct, int chroma)
 
static av_always_inline int cmp_direct_inline (MpegEncContext *s, const int x, const int y, const int subx, const int suby, const int size, const int h, int ref_index, int src_index, me_cmp_func cmp_func, me_cmp_func chroma_cmp_func, int qpel)
 
static av_always_inline int cmp_inline (MpegEncContext *s, const int x, const int y, const int subx, const int suby, const int size, const int h, int ref_index, int src_index, me_cmp_func cmp_func, me_cmp_func chroma_cmp_func, int qpel, int chroma)
 
static int cmp_simple (MpegEncContext *s, const int x, const int y, int ref_index, int src_index, me_cmp_func cmp_func, me_cmp_func chroma_cmp_func)
 
static int cmp_fpel_internal (MpegEncContext *s, const int x, const int y, const int size, const int h, int ref_index, int src_index, me_cmp_func cmp_func, me_cmp_func chroma_cmp_func, const int flags)
 
static int cmp_internal (MpegEncContext *s, const int x, const int y, const int subx, const int suby, const int size, const int h, int ref_index, int src_index, me_cmp_func cmp_func, me_cmp_func chroma_cmp_func, const int flags)
 
static av_always_inline int cmp (MpegEncContext *s, const int x, const int y, const int subx, const int suby, const int size, const int h, int ref_index, int src_index, me_cmp_func cmp_func, me_cmp_func chroma_cmp_func, const int flags)
 compares a block (either a full macroblock or a partition thereof) against a proposed motion-compensated prediction of that block
 
static int cmp_hpel (MpegEncContext *s, const int x, const int y, const int subx, const int suby, const int size, const int h, int ref_index, int src_index, me_cmp_func cmp_func, me_cmp_func chroma_cmp_func, const int flags)
 
static int cmp_qpel (MpegEncContext *s, const int x, const int y, const int subx, const int suby, const int size, const int h, int ref_index, int src_index, me_cmp_func cmp_func, me_cmp_func chroma_cmp_func, const int flags)
 
static int zero_cmp (MpegEncContext *s, uint8_t *a, uint8_t *b, int stride, int h)
 
static void zero_hpel (uint8_t *a, const uint8_t *b, ptrdiff_t stride, int h)
 
int ff_init_me (MpegEncContext *s)
 
static void set_p_mv_tables (MpegEncContext *s, int mx, int my, int mv4)
 
static void get_limits (MpegEncContext *s, int x, int y)
 get fullpel ME search limits.
 
static void init_mv4_ref (MotionEstContext *c)
 
static int h263_mv4_search (MpegEncContext *s, int mx, int my, int shift)
 
static void init_interlaced_ref (MpegEncContext *s, int ref_index)
 
static int interlaced_search (MpegEncContext *s, int ref_index, int16_t(*mv_tables[2][2])[2], uint8_t *field_select_tables[2], int mx, int my, int user_field_select)
 
static int get_penalty_factor (int lambda, int lambda2, int type)
 
void ff_estimate_p_frame_motion (MpegEncContext *s, int mb_x, int mb_y)
 
int ff_pre_estimate_p_frame_motion (MpegEncContext *s, int mb_x, int mb_y)
 
static int estimate_motion_b (MpegEncContext *s, int mb_x, int mb_y, int16_t(*mv_table)[2], int ref_index, int f_code)
 
static int check_bidir_mv (MpegEncContext *s, int motion_fx, int motion_fy, int motion_bx, int motion_by, int pred_fx, int pred_fy, int pred_bx, int pred_by, int size, int h)
 
static int bidir_refine (MpegEncContext *s, int mb_x, int mb_y)
 
static int direct_search (MpegEncContext *s, int mb_x, int mb_y)
 
void ff_estimate_b_frame_motion (MpegEncContext *s, int mb_x, int mb_y)
 
int ff_get_best_fcode (MpegEncContext *s, int16_t(*mv_table)[2], int type)
 
void ff_fix_long_p_mvs (MpegEncContext *s)
 
void ff_fix_long_mvs (MpegEncContext *s, uint8_t *field_select_table, int field_select, int16_t(*mv_table)[2], int f_code, int type, int truncate)
 

Detailed Description

Motion estimation.

Definition in file motion_est.c.

Macro Definition Documentation

#define P_LEFT   P[1]
#define P_TOP   P[2]
#define P_TOPRIGHT   P[3]
#define P_MEDIAN   P[4]
#define P_MV1   P[9]
#define ME_MAP_SHIFT   3
#define ME_MAP_MV_BITS   11
#define FLAG_QPEL   1
#define FLAG_CHROMA   2
#define FLAG_DIRECT   4
#define CHECK_SAD_HALF_MV (   suffix,
  x,
  y 
)
Value:
{\
d = s->mecc.pix_abs[size][(x ? 1 : 0) + (y ? 2 : 0)](NULL, pix, ptr + ((x) >> 1), stride, h); \
d += (mv_penalty[pen_x + x] + mv_penalty[pen_y + y])*penalty_factor;\
COPY3_IF_LT(dminh, d, dx, x, dy, y)\
}

Definition at line 382 of file motion_est.c.

Referenced by sad_hpel_motion_search().

#define HASH (   fx,
  fy,
  bx,
  by 
)    ((fx)+17*(fy)+63*(bx)+117*(by))

Referenced by bidir_refine().

#define HASH8 (   fx,
  fy,
  bx,
  by 
)    ((uint8_t)HASH(fx,fy,bx,by))

Referenced by bidir_refine().

#define CHECK_BIDIR (   fx,
  fy,
  bx,
  by 
)
Value:
if( !map[(hashidx+HASH(fx,fy,bx,by))&255]\
&&(fx<=0 || motion_fx+fx<=xmax) && (fy<=0 || motion_fy+fy<=ymax) && (bx<=0 || motion_bx+bx<=xmax) && (by<=0 || motion_by+by<=ymax)\
&&(fx>=0 || motion_fx+fx>=xmin) && (fy>=0 || motion_fy+fy>=ymin) && (bx>=0 || motion_bx+bx>=xmin) && (by>=0 || motion_by+by>=ymin)){\
int score;\
map[(hashidx+HASH(fx,fy,bx,by))&255] = 1;\
score= check_bidir_mv(s, motion_fx+fx, motion_fy+fy, motion_bx+bx, motion_by+by, pred_fx, pred_fy, pred_bx, pred_by, 0, 16);\
if(score < fbmin){\
hashidx += HASH(fx,fy,bx,by);\
fbmin= score;\
motion_fx+=fx;\
motion_fy+=fy;\
motion_bx+=bx;\
motion_by+=by;\
end=0;\
}\
}
#define CHECK_BIDIR2 (   a,
  b,
  c,
 
)
Value:
CHECK_BIDIR(-(a),-(b),-(c),-(d))

Referenced by bidir_refine().

Function Documentation

static int sad_hpel_motion_search ( MpegEncContext s,
int *  mx_ptr,
int *  my_ptr,
int  dmin,
int  src_index,
int  ref_index,
int  size,
int  h 
)
static

Definition at line 389 of file motion_est.c.

Referenced by ff_init_me().

static unsigned update_map_generation ( MotionEstContext c)
inlinestatic
static int minima_cmp ( const void a,
const void b 
)
static

Definition at line 73 of file motion_est.c.

Referenced by sab_diamond_search().

static void init_ref ( MotionEstContext c,
uint8_t src[3],
uint8_t ref[3],
uint8_t ref2[3],
int  x,
int  y,
int  ref_index 
)
inlinestatic
static int get_flags ( MotionEstContext c,
int  direct,
int  chroma 
)
static

Definition at line 102 of file motion_est.c.

Referenced by ff_init_me().

static av_always_inline int cmp_direct_inline ( MpegEncContext s,
const int  x,
const int  y,
const int  subx,
const int  suby,
const int  size,
const int  h,
int  ref_index,
int  src_index,
me_cmp_func  cmp_func,
me_cmp_func  chroma_cmp_func,
int  qpel 
)
static

Definition at line 108 of file motion_est.c.

Referenced by cmp_fpel_internal(), cmp_hpel(), cmp_internal(), and cmp_qpel().

static av_always_inline int cmp_inline ( MpegEncContext s,
const int  x,
const int  y,
const int  subx,
const int  suby,
const int  size,
const int  h,
int  ref_index,
int  src_index,
me_cmp_func  cmp_func,
me_cmp_func  chroma_cmp_func,
int  qpel,
int  chroma 
)
static

Definition at line 180 of file motion_est.c.

Referenced by cmp_fpel_internal(), cmp_hpel(), cmp_internal(), cmp_qpel(), and cmp_simple().

static int cmp_simple ( MpegEncContext s,
const int  x,
const int  y,
int  ref_index,
int  src_index,
me_cmp_func  cmp_func,
me_cmp_func  chroma_cmp_func 
)
static

Definition at line 226 of file motion_est.c.

Referenced by cmp().

static int cmp_fpel_internal ( MpegEncContext s,
const int  x,
const int  y,
const int  size,
const int  h,
int  ref_index,
int  src_index,
me_cmp_func  cmp_func,
me_cmp_func  chroma_cmp_func,
const int  flags 
)
static

Definition at line 232 of file motion_est.c.

Referenced by cmp().

static int cmp_internal ( MpegEncContext s,
const int  x,
const int  y,
const int  subx,
const int  suby,
const int  size,
const int  h,
int  ref_index,
int  src_index,
me_cmp_func  cmp_func,
me_cmp_func  chroma_cmp_func,
const int  flags 
)
static

Definition at line 242 of file motion_est.c.

Referenced by cmp().

static av_always_inline int cmp ( MpegEncContext s,
const int  x,
const int  y,
const int  subx,
const int  suby,
const int  size,
const int  h,
int  ref_index,
int  src_index,
me_cmp_func  cmp_func,
me_cmp_func  chroma_cmp_func,
const int  flags 
)
static

compares a block (either a full macroblock or a partition thereof) against a proposed motion-compensated prediction of that block

Definition at line 255 of file motion_est.c.

Referenced by av_tree_enumerate(), av_tree_find(), av_tree_insert(), decode_tonal_components(), epzs_motion_search_internal(), get_mb_score(), hpel_motion_search(), qpel_motion_search(), and small_diamond_search().

static int cmp_hpel ( MpegEncContext s,
const int  x,
const int  y,
const int  subx,
const int  suby,
const int  size,
const int  h,
int  ref_index,
int  src_index,
me_cmp_func  cmp_func,
me_cmp_func  chroma_cmp_func,
const int  flags 
)
static

Definition at line 270 of file motion_est.c.

static int cmp_qpel ( MpegEncContext s,
const int  x,
const int  y,
const int  subx,
const int  suby,
const int  size,
const int  h,
int  ref_index,
int  src_index,
me_cmp_func  cmp_func,
me_cmp_func  chroma_cmp_func,
const int  flags 
)
static

Definition at line 280 of file motion_est.c.

static int zero_cmp ( MpegEncContext s,
uint8_t a,
uint8_t b,
int  stride,
int  h 
)
static

Definition at line 292 of file motion_est.c.

Referenced by ff_init_me().

static void zero_hpel ( uint8_t a,
const uint8_t b,
ptrdiff_t  stride,
int  h 
)
static

Definition at line 298 of file motion_est.c.

Referenced by ff_init_me().

int ff_init_me ( MpegEncContext s)

Definition at line 301 of file motion_est.c.

Referenced by encode_frame(), encode_picture(), and svq1_encode_plane().

static void set_p_mv_tables ( MpegEncContext s,
int  mx,
int  my,
int  mv4 
)
inlinestatic

Definition at line 494 of file motion_est.c.

Referenced by ff_estimate_p_frame_motion().

static void get_limits ( MpegEncContext s,
int  x,
int  y 
)
inlinestatic
static void init_mv4_ref ( MotionEstContext c)
inlinestatic

Definition at line 557 of file motion_est.c.

Referenced by h263_mv4_search().

static int h263_mv4_search ( MpegEncContext s,
int  mx,
int  my,
int  shift 
)
inlinestatic

Definition at line 568 of file motion_est.c.

Referenced by ff_estimate_p_frame_motion().

static void init_interlaced_ref ( MpegEncContext s,
int  ref_index 
)
inlinestatic

Definition at line 722 of file motion_est.c.

Referenced by interlaced_search().

static int interlaced_search ( MpegEncContext s,
int  ref_index,
int16_t(*[2][2])  mv_tables[2],
uint8_t field_select_tables[2],
int  mx,
int  my,
int  user_field_select 
)
static

Definition at line 735 of file motion_est.c.

Referenced by ff_estimate_b_frame_motion(), and ff_estimate_p_frame_motion().

static int get_penalty_factor ( int  lambda,
int  lambda2,
int  type 
)
inlinestatic
void ff_estimate_p_frame_motion ( MpegEncContext s,
int  mb_x,
int  mb_y 
)

< the variance of the block (sum of squared (p[y][x]-average))

< sum of squared differences with the estimated motion vector

Definition at line 881 of file motion_est.c.

Referenced by estimate_motion_thread(), and svq1_encode_plane().

int ff_pre_estimate_p_frame_motion ( MpegEncContext s,
int  mb_x,
int  mb_y 
)

Definition at line 1086 of file motion_est.c.

Referenced by pre_estimate_motion_thread().

static int estimate_motion_b ( MpegEncContext s,
int  mb_x,
int  mb_y,
int16_t(*)  mv_table[2],
int  ref_index,
int  f_code 
)
static

Definition at line 1139 of file motion_est.c.

Referenced by ff_estimate_b_frame_motion().

static int check_bidir_mv ( MpegEncContext s,
int  motion_fx,
int  motion_fy,
int  motion_bx,
int  motion_by,
int  pred_fx,
int  pred_fy,
int  pred_bx,
int  pred_by,
int  size,
int  h 
)
inlinestatic

Definition at line 1211 of file motion_est.c.

Referenced by bidir_refine().

static int bidir_refine ( MpegEncContext s,
int  mb_x,
int  mb_y 
)
inlinestatic

Definition at line 1276 of file motion_est.c.

Referenced by ff_estimate_b_frame_motion().

static int direct_search ( MpegEncContext s,
int  mb_x,
int  mb_y 
)
inlinestatic

Definition at line 1423 of file motion_est.c.

Referenced by ff_estimate_b_frame_motion().

void ff_estimate_b_frame_motion ( MpegEncContext s,
int  mb_x,
int  mb_y 
)

Definition at line 1525 of file motion_est.c.

Referenced by estimate_motion_thread().

int ff_get_best_fcode ( MpegEncContext s,
int16_t(*)  mv_table[2],
int  type 
)

Definition at line 1633 of file motion_est.c.

Referenced by encode_picture().

void ff_fix_long_p_mvs ( MpegEncContext s)

Definition at line 1686 of file motion_est.c.

Referenced by encode_picture(), and svq1_encode_plane().

void ff_fix_long_mvs ( MpegEncContext s,
uint8_t field_select_table,
int  field_select,
int16_t(*)  mv_table[2],
int  f_code,
int  type,
int  truncate 
)
Parameters
truncate1 for truncation, 0 for using intra

Definition at line 1736 of file motion_est.c.

Referenced by encode_picture(), and svq1_encode_plane().