Commit a34a609f authored by Mans Rullgard's avatar Mans Rullgard

motion_est: fix use of inline on extern functions

Inline functions declared without extern do not provide an external
definition in standard C99.  This code only works because most
compilers do not implement the inline semantics correctly.  With a
stricter compiler, linking fails with unresolved references to these
functions.

Declaring the functions extern inline works correctly with some
compilers while some others still fail to create external definitions.

For maximum portability, create a static inline version with an
externally visible wrapper for ff_get_mb_score.  ff_epzs_motion_search
is so large that no sane compiler inlines it anyway, so there the
inline keyword can simply be dropped with no effect.
Signed-off-by: 's avatarMans Rullgard <mans@mansr.com>
parent 50d1f443
...@@ -1140,7 +1140,7 @@ void ff_estimate_p_frame_motion(MpegEncContext * s, ...@@ -1140,7 +1140,7 @@ void ff_estimate_p_frame_motion(MpegEncContext * s,
dmin= c->sub_motion_search(s, &mx, &my, dmin, 0, 0, 0, 16); dmin= c->sub_motion_search(s, &mx, &my, dmin, 0, 0, 0, 16);
if(c->avctx->me_sub_cmp != c->avctx->mb_cmp && !c->skip) if(c->avctx->me_sub_cmp != c->avctx->mb_cmp && !c->skip)
dmin= ff_get_mb_score(s, mx, my, 0, 0, 0, 16, 1); dmin= get_mb_score(s, mx, my, 0, 0, 0, 16, 1);
if((s->flags&CODEC_FLAG_4MV) if((s->flags&CODEC_FLAG_4MV)
&& !c->skip && varc>50<<8 && vard>10<<8){ && !c->skip && varc>50<<8 && vard>10<<8){
...@@ -1312,7 +1312,7 @@ static int ff_estimate_motion_b(MpegEncContext * s, ...@@ -1312,7 +1312,7 @@ static int ff_estimate_motion_b(MpegEncContext * s,
dmin= c->sub_motion_search(s, &mx, &my, dmin, 0, ref_index, 0, 16); dmin= c->sub_motion_search(s, &mx, &my, dmin, 0, ref_index, 0, 16);
if(c->avctx->me_sub_cmp != c->avctx->mb_cmp && !c->skip) if(c->avctx->me_sub_cmp != c->avctx->mb_cmp && !c->skip)
dmin= ff_get_mb_score(s, mx, my, 0, ref_index, 0, 16, 1); dmin= get_mb_score(s, mx, my, 0, ref_index, 0, 16, 1);
//printf("%d %d %d %d//", s->mb_x, s->mb_y, mx, my); //printf("%d %d %d %d//", s->mb_x, s->mb_y, mx, my);
// s->mb_type[mb_y*s->mb_width + mb_x]= mb_type; // s->mb_type[mb_y*s->mb_width + mb_x]= mb_type;
...@@ -1624,7 +1624,7 @@ static inline int direct_search(MpegEncContext * s, int mb_x, int mb_y) ...@@ -1624,7 +1624,7 @@ static inline int direct_search(MpegEncContext * s, int mb_x, int mb_y)
dmin = hpel_motion_search(s, &mx, &my, dmin, 0, 0, 0, 16); dmin = hpel_motion_search(s, &mx, &my, dmin, 0, 0, 0, 16);
if(c->avctx->me_sub_cmp != c->avctx->mb_cmp && !c->skip) if(c->avctx->me_sub_cmp != c->avctx->mb_cmp && !c->skip)
dmin= ff_get_mb_score(s, mx, my, 0, 0, 0, 16, 1); dmin= get_mb_score(s, mx, my, 0, 0, 0, 16, 1);
get_limits(s, 16*mb_x, 16*mb_y); //restore c->?min/max, maybe not needed get_limits(s, 16*mb_x, 16*mb_y); //restore c->?min/max, maybe not needed
......
...@@ -160,8 +160,9 @@ static int no_sub_motion_search(MpegEncContext * s, ...@@ -160,8 +160,9 @@ static int no_sub_motion_search(MpegEncContext * s,
return dmin; return dmin;
} }
inline int ff_get_mb_score(MpegEncContext * s, int mx, int my, int src_index, static inline int get_mb_score(MpegEncContext *s, int mx, int my,
int ref_index, int size, int h, int add_rate) int src_index, int ref_index, int size,
int h, int add_rate)
{ {
// const int check_luma= s->dsp.me_sub_cmp != s->dsp.mb_cmp; // const int check_luma= s->dsp.me_sub_cmp != s->dsp.mb_cmp;
MotionEstContext * const c= &s->me; MotionEstContext * const c= &s->me;
...@@ -190,6 +191,12 @@ inline int ff_get_mb_score(MpegEncContext * s, int mx, int my, int src_index, ...@@ -190,6 +191,12 @@ inline int ff_get_mb_score(MpegEncContext * s, int mx, int my, int src_index,
return d; return d;
} }
int ff_get_mb_score(MpegEncContext *s, int mx, int my, int src_index,
int ref_index, int size, int h, int add_rate)
{
return get_mb_score(s, mx, my, src_index, ref_index, size, h, add_rate);
}
#define CHECK_QUARTER_MV(dx, dy, x, y)\ #define CHECK_QUARTER_MV(dx, dy, x, y)\
{\ {\
const int hx= 4*(x)+(dx);\ const int hx= 4*(x)+(dx);\
...@@ -972,9 +979,10 @@ static av_always_inline int epzs_motion_search_internal(MpegEncContext * s, int ...@@ -972,9 +979,10 @@ static av_always_inline int epzs_motion_search_internal(MpegEncContext * s, int
} }
//this function is dedicated to the braindamaged gcc //this function is dedicated to the braindamaged gcc
inline int ff_epzs_motion_search(MpegEncContext * s, int *mx_ptr, int *my_ptr, int ff_epzs_motion_search(MpegEncContext *s, int *mx_ptr, int *my_ptr,
int P[10][2], int src_index, int ref_index, int16_t (*last_mv)[2], int P[10][2], int src_index, int ref_index,
int ref_mv_scale, int size, int h) int16_t (*last_mv)[2], int ref_mv_scale,
int size, int h)
{ {
MotionEstContext * const c= &s->me; MotionEstContext * const c= &s->me;
//FIXME convert other functions in the same way if faster //FIXME convert other functions in the same way if faster
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment