FFmpeg
Data Structures | Macros | Functions
motion_est.c File Reference
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
#include "avcodec.h"
#include "mathops.h"
#include "motion_est.h"
#include "mpegutils.h"
#include "mpegvideoenc.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 *const src[3], uint8_t *const ref[3], uint8_t *const 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, const uint8_t *a, const 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, const int16_t(*mv_table)[2], int type)
 
void ff_fix_long_p_mvs (MpegEncContext *s, int type)
 
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

◆ P_LEFT

#define P_LEFT   P[1]

Definition at line 40 of file motion_est.c.

◆ P_TOP

#define P_TOP   P[2]

Definition at line 41 of file motion_est.c.

◆ P_TOPRIGHT

#define P_TOPRIGHT   P[3]

Definition at line 42 of file motion_est.c.

◆ P_MEDIAN

#define P_MEDIAN   P[4]

Definition at line 43 of file motion_est.c.

◆ P_MV1

#define P_MV1   P[9]

Definition at line 44 of file motion_est.c.

◆ ME_MAP_SHIFT

#define ME_MAP_SHIFT   3

Definition at line 46 of file motion_est.c.

◆ ME_MAP_MV_BITS

#define ME_MAP_MV_BITS   11

Definition at line 47 of file motion_est.c.

◆ FLAG_QPEL

#define FLAG_QPEL   1

Definition at line 78 of file motion_est.c.

◆ FLAG_CHROMA

#define FLAG_CHROMA   2

Definition at line 79 of file motion_est.c.

◆ FLAG_DIRECT

#define FLAG_DIRECT   4

Definition at line 80 of file motion_est.c.

◆ CHECK_SAD_HALF_MV

#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)\
}

Definition at line 390 of file motion_est.c.

◆ HASH

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

◆ HASH8

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

◆ CHECK_BIDIR

#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;\
}\
}

◆ CHECK_BIDIR2

#define CHECK_BIDIR2 (   a,
  b,
  c,
  d 
)
Value:
CHECK_BIDIR(-(a),-(b),-(c),-(d))

Function Documentation

◆ sad_hpel_motion_search()

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

Referenced by ff_init_me().

◆ update_map_generation()

static unsigned update_map_generation ( MotionEstContext c)
inlinestatic

Definition at line 54 of file motion_est.c.

Referenced by epzs_motion_search2(), and epzs_motion_search_internal().

◆ minima_cmp()

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

Definition at line 71 of file motion_est.c.

Referenced by sab_diamond_search().

◆ init_ref()

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

◆ get_flags()

static int get_flags ( MotionEstContext c,
int  direct,
int  chroma 
)
static

Definition at line 103 of file motion_est.c.

Referenced by ff_init_me().

◆ cmp_direct_inline()

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

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

◆ cmp_inline()

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

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

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

Referenced by cmp().

◆ cmp_fpel_internal()

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

Referenced by cmp().

◆ cmp_internal()

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

Referenced by cmp().

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

Referenced by deband_16_coupling_c(), deband_8_coupling_c(), decode_tonal_components(), epzs_motion_search_internal(), ff_huff_build_tree(), ff_mpeg12_find_best_frame_rate(), ff_set_cmp(), get_func(), get_mb_score(), hpel_motion_search(), qpel_motion_search(), receive_for_stream(), and small_diamond_search().

◆ cmp_hpel()

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

◆ cmp_qpel()

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

◆ zero_cmp()

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

Definition at line 299 of file motion_est.c.

Referenced by ff_init_me().

◆ zero_hpel()

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

Definition at line 305 of file motion_est.c.

Referenced by ff_init_me().

◆ ff_init_me()

int ff_init_me ( MpegEncContext s)

Definition at line 308 of file motion_est.c.

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

◆ set_p_mv_tables()

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

Definition at line 502 of file motion_est.c.

Referenced by ff_estimate_p_frame_motion().

◆ get_limits()

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

◆ init_mv4_ref()

static void init_mv4_ref ( MotionEstContext c)
inlinestatic

Definition at line 565 of file motion_est.c.

Referenced by h263_mv4_search().

◆ h263_mv4_search()

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

Definition at line 576 of file motion_est.c.

Referenced by ff_estimate_p_frame_motion().

◆ init_interlaced_ref()

static void init_interlaced_ref ( MpegEncContext s,
int  ref_index 
)
inlinestatic

Definition at line 730 of file motion_est.c.

Referenced by interlaced_search().

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

Referenced by ff_estimate_b_frame_motion(), and ff_estimate_p_frame_motion().

◆ get_penalty_factor()

static int get_penalty_factor ( int  lambda,
int  lambda2,
int  type 
)
inlinestatic

◆ ff_estimate_p_frame_motion()

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

Referenced by estimate_motion_thread(), and svq1_encode_plane().

◆ ff_pre_estimate_p_frame_motion()

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

Definition at line 1065 of file motion_est.c.

Referenced by pre_estimate_motion_thread().

◆ estimate_motion_b()

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

Referenced by ff_estimate_b_frame_motion().

◆ check_bidir_mv()

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

Referenced by bidir_refine().

◆ bidir_refine()

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

Definition at line 1245 of file motion_est.c.

Referenced by ff_estimate_b_frame_motion().

◆ direct_search()

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

Definition at line 1392 of file motion_est.c.

Referenced by ff_estimate_b_frame_motion().

◆ ff_estimate_b_frame_motion()

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

Definition at line 1494 of file motion_est.c.

Referenced by estimate_motion_thread().

◆ ff_get_best_fcode()

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

Definition at line 1602 of file motion_est.c.

Referenced by encode_picture().

◆ ff_fix_long_p_mvs()

void ff_fix_long_p_mvs ( MpegEncContext s,
int  type 
)

Definition at line 1655 of file motion_est.c.

Referenced by encode_picture(), and svq1_encode_plane().

◆ ff_fix_long_mvs()

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

Referenced by encode_picture(), and svq1_encode_plane().

check_bidir_mv
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:1180
CHECK_BIDIR
#define CHECK_BIDIR(fx, fy, bx, by)
b
#define b
Definition: input.c:41
mv_penalty
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:52
s
#define s(width, name)
Definition: cbs_vp9.c:198
NULL
#define NULL
Definition: coverity.c:32
c
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
size
int size
Definition: twinvq_data.h:10344
a
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:41
stride
#define stride
Definition: h264pred_template.c:537
map
const VDPAUPixFmtMap * map
Definition: hwcontext_vdpau.c:71
d
d
Definition: ffmpeg_filter.c:425
h
h
Definition: vp9dsp_template.c:2038
HASH
#define HASH(fx, fy, bx, by)