FFmpeg
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 "internal.h"
#include "mathops.h"
#include "motion_est.h"
#include "mpegutils.h"
#include "mpegvideo.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 More...
 
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, ptrdiff_t 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. More...
 
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]

Definition at line 45 of file motion_est.c.

Referenced by epzs_motion_search2(), h263_mv4_search(), and interlaced_search().

#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,
 
)
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)\
}
static uint8_t mv_penalty[MAX_FCODE+1][MAX_DMV *2+1]
Table of number of bits a motion vector component needs.
Definition: ituh263enc.c:47
#define NULL
Definition: coverity.c:32
ptrdiff_t size
Definition: opengl_enc.c:100
#define s(width, name)
Definition: cbs_vp9.c:257
#define COPY3_IF_LT(x, y, a, b, c, d)
Definition: mathops.h:146
#define stride

Definition at line 385 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;\
}\
}
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)
Definition: motion_est.c:1176
static av_cold int end(AVCodecContext *avctx)
Definition: avrndec.c:90
#define s(width, name)
Definition: cbs_vp9.c:257
if(ret)
const VDPAUPixFmtMap * map
int
#define HASH(fx, fy, bx, by)
#define CHECK_BIDIR2 (   a,
  b,
  c,
 
)
Value:
CHECK_BIDIR(-(a),-(b),-(c),-(d))
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Definition: undefined.txt:36
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
#define b
Definition: input.c:41
#define CHECK_BIDIR(fx, fy, bx, by)

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 392 of file motion_est.c.

Referenced by ff_init_me().

static unsigned update_map_generation ( MotionEstContext c)
inlinestatic

Definition at line 55 of file motion_est.c.

Referenced by epzs_motion_search2(), and epzs_motion_search_internal().

static int minima_cmp ( const void a,
const void b 
)
static

Definition at line 72 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 101 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 107 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 179 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 231 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 237 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 247 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 260 of file motion_est.c.

Referenced by deband_16_coupling_c(), deband_8_coupling_c(), decode_tonal_components(), epzs_motion_search_internal(), ff_mpeg12_find_best_frame_rate(), get_func(), 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 275 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 285 of file motion_est.c.

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

Definition at line 297 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 303 of file motion_est.c.

Referenced by ff_init_me().

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

Definition at line 497 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 560 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 571 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 725 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 738 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 885 of file motion_est.c.

Referenced by estimate_motion_thread(), ff_h263_round_chroma(), and svq1_encode_plane().

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

Definition at line 1061 of file motion_est.c.

Referenced by ff_h263_round_chroma(), and 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 1114 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 1176 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 1241 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 1388 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 1490 of file motion_est.c.

Referenced by estimate_motion_thread(), and ff_h263_round_chroma().

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

Definition at line 1598 of file motion_est.c.

Referenced by encode_picture(), and ff_h263_round_chroma().

void ff_fix_long_p_mvs ( MpegEncContext s)

Definition at line 1651 of file motion_est.c.

Referenced by encode_picture(), ff_h263_round_chroma(), 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 1700 of file motion_est.c.

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