@ -840,152 +840,6 @@ static int interlaced_search(MpegEncContext *s, int ref_index,
}
}
static void clip_input_mv ( MpegEncContext * s , int16_t * mv , int interlaced ) {
int ymax = s - > me . ymax > > interlaced ;
int ymin = s - > me . ymin > > interlaced ;
if ( mv [ 0 ] < s - > me . xmin ) mv [ 0 ] = s - > me . xmin ;
if ( mv [ 0 ] > s - > me . xmax ) mv [ 0 ] = s - > me . xmax ;
if ( mv [ 1 ] < ymin ) mv [ 1 ] = ymin ;
if ( mv [ 1 ] > ymax ) mv [ 1 ] = ymax ;
}
static inline int check_input_motion ( MpegEncContext * s , int mb_x , int mb_y , int p_type ) {
MotionEstContext * const c = & s - > me ;
Picture * p = s - > current_picture_ptr ;
int mb_xy = mb_x + mb_y * s - > mb_stride ;
int xy = 2 * mb_x + 2 * mb_y * s - > b8_stride ;
int mb_type = s - > current_picture . f . mb_type [ mb_xy ] ;
int flags = c - > flags ;
int shift = ( flags & FLAG_QPEL ) + 1 ;
int mask = ( 1 < < shift ) - 1 ;
int x , y , i ;
int d = 0 ;
me_cmp_func cmpf = s - > dsp . sse [ 0 ] ;
me_cmp_func chroma_cmpf = s - > dsp . sse [ 1 ] ;
if ( p_type & & USES_LIST ( mb_type , 1 ) ) {
av_log ( c - > avctx , AV_LOG_ERROR , " backward motion vector in P frame \n " ) ;
return INT_MAX / 2 ;
}
av_assert0 ( IS_INTRA ( mb_type ) | | USES_LIST ( mb_type , 0 ) | | USES_LIST ( mb_type , 1 ) ) ;
for ( i = 0 ; i < 4 ; i + + ) {
int xy = s - > block_index [ i ] ;
clip_input_mv ( s , p - > f . motion_val [ 0 ] [ xy ] , ! ! IS_INTERLACED ( mb_type ) ) ;
clip_input_mv ( s , p - > f . motion_val [ 1 ] [ xy ] , ! ! IS_INTERLACED ( mb_type ) ) ;
}
if ( IS_INTERLACED ( mb_type ) ) {
int xy2 = xy + s - > b8_stride ;
s - > mb_type [ mb_xy ] = CANDIDATE_MB_TYPE_INTRA ;
c - > stride < < = 1 ;
c - > uvstride < < = 1 ;
if ( ! ( s - > flags & CODEC_FLAG_INTERLACED_ME ) ) {
av_log ( c - > avctx , AV_LOG_ERROR , " Interlaced macroblock selected but interlaced motion estimation disabled \n " ) ;
return INT_MAX / 2 ;
}
if ( USES_LIST ( mb_type , 0 ) ) {
int field_select0 = p - > f . ref_index [ 0 ] [ 4 * mb_xy ] ;
int field_select1 = p - > f . ref_index [ 0 ] [ 4 * mb_xy + 2 ] ;
av_assert0 ( field_select0 = = 0 | | field_select0 = = 1 ) ;
av_assert0 ( field_select1 = = 0 | | field_select1 = = 1 ) ;
init_interlaced_ref ( s , 0 ) ;
if ( p_type ) {
s - > p_field_select_table [ 0 ] [ mb_xy ] = field_select0 ;
s - > p_field_select_table [ 1 ] [ mb_xy ] = field_select1 ;
* ( uint32_t * ) s - > p_field_mv_table [ 0 ] [ field_select0 ] [ mb_xy ] = * ( uint32_t * ) p - > f . motion_val [ 0 ] [ xy ] ;
* ( uint32_t * ) s - > p_field_mv_table [ 1 ] [ field_select1 ] [ mb_xy ] = * ( uint32_t * ) p - > f . motion_val [ 0 ] [ xy2 ] ;
s - > mb_type [ mb_xy ] = CANDIDATE_MB_TYPE_INTER_I ;
} else {
s - > b_field_select_table [ 0 ] [ 0 ] [ mb_xy ] = field_select0 ;
s - > b_field_select_table [ 0 ] [ 1 ] [ mb_xy ] = field_select1 ;
* ( uint32_t * ) s - > b_field_mv_table [ 0 ] [ 0 ] [ field_select0 ] [ mb_xy ] = * ( uint32_t * ) p - > f . motion_val [ 0 ] [ xy ] ;
* ( uint32_t * ) s - > b_field_mv_table [ 0 ] [ 1 ] [ field_select1 ] [ mb_xy ] = * ( uint32_t * ) p - > f . motion_val [ 0 ] [ xy2 ] ;
s - > mb_type [ mb_xy ] = CANDIDATE_MB_TYPE_FORWARD_I ;
}
x = p - > f . motion_val [ 0 ] [ xy ] [ 0 ] ;
y = p - > f . motion_val [ 0 ] [ xy ] [ 1 ] ;
d = cmp ( s , x > > shift , y > > shift , x & mask , y & mask , 0 , 8 , field_select0 , 0 , cmpf , chroma_cmpf , flags ) ;
x = p - > f . motion_val [ 0 ] [ xy2 ] [ 0 ] ;
y = p - > f . motion_val [ 0 ] [ xy2 ] [ 1 ] ;
d + = cmp ( s , x > > shift , y > > shift , x & mask , y & mask , 0 , 8 , field_select1 , 1 , cmpf , chroma_cmpf , flags ) ;
}
if ( USES_LIST ( mb_type , 1 ) ) {
int field_select0 = p - > f . ref_index [ 1 ] [ 4 * mb_xy ] ;
int field_select1 = p - > f . ref_index [ 1 ] [ 4 * mb_xy + 2 ] ;
av_assert0 ( field_select0 = = 0 | | field_select0 = = 1 ) ;
av_assert0 ( field_select1 = = 0 | | field_select1 = = 1 ) ;
init_interlaced_ref ( s , 2 ) ;
s - > b_field_select_table [ 1 ] [ 0 ] [ mb_xy ] = field_select0 ;
s - > b_field_select_table [ 1 ] [ 1 ] [ mb_xy ] = field_select1 ;
* ( uint32_t * ) s - > b_field_mv_table [ 1 ] [ 0 ] [ field_select0 ] [ mb_xy ] = * ( uint32_t * ) p - > f . motion_val [ 1 ] [ xy ] ;
* ( uint32_t * ) s - > b_field_mv_table [ 1 ] [ 1 ] [ field_select1 ] [ mb_xy ] = * ( uint32_t * ) p - > f . motion_val [ 1 ] [ xy2 ] ;
if ( USES_LIST ( mb_type , 0 ) ) {
s - > mb_type [ mb_xy ] = CANDIDATE_MB_TYPE_BIDIR_I ;
} else {
s - > mb_type [ mb_xy ] = CANDIDATE_MB_TYPE_BACKWARD_I ;
}
x = p - > f . motion_val [ 1 ] [ xy ] [ 0 ] ;
y = p - > f . motion_val [ 1 ] [ xy ] [ 1 ] ;
d = cmp ( s , x > > shift , y > > shift , x & mask , y & mask , 0 , 8 , field_select0 + 2 , 0 , cmpf , chroma_cmpf , flags ) ;
x = p - > f . motion_val [ 1 ] [ xy2 ] [ 0 ] ;
y = p - > f . motion_val [ 1 ] [ xy2 ] [ 1 ] ;
d + = cmp ( s , x > > shift , y > > shift , x & mask , y & mask , 0 , 8 , field_select1 + 2 , 1 , cmpf , chroma_cmpf , flags ) ;
//FIXME bidir scores
}
c - > stride > > = 1 ;
c - > uvstride > > = 1 ;
} else if ( IS_8X8 ( mb_type ) ) {
if ( ! ( s - > flags & CODEC_FLAG_4MV ) ) {
av_log ( c - > avctx , AV_LOG_ERROR , " 4MV macroblock selected but 4MV encoding disabled \n " ) ;
return INT_MAX / 2 ;
}
cmpf = s - > dsp . sse [ 1 ] ;
chroma_cmpf = s - > dsp . sse [ 1 ] ;
init_mv4_ref ( c ) ;
for ( i = 0 ; i < 4 ; i + + ) {
xy = s - > block_index [ i ] ;
x = p - > f . motion_val [ 0 ] [ xy ] [ 0 ] ;
y = p - > f . motion_val [ 0 ] [ xy ] [ 1 ] ;
d + = cmp ( s , x > > shift , y > > shift , x & mask , y & mask , 1 , 8 , i , i , cmpf , chroma_cmpf , flags ) ;
}
s - > mb_type [ mb_xy ] = CANDIDATE_MB_TYPE_INTER4V ;
} else {
if ( USES_LIST ( mb_type , 0 ) ) {
if ( p_type ) {
* ( uint32_t * ) s - > p_mv_table [ mb_xy ] = * ( uint32_t * ) p - > f . motion_val [ 0 ] [ xy ] ;
s - > mb_type [ mb_xy ] = CANDIDATE_MB_TYPE_INTER ;
} else if ( USES_LIST ( mb_type , 1 ) ) {
* ( uint32_t * ) s - > b_bidir_forw_mv_table [ mb_xy ] = * ( uint32_t * ) p - > f . motion_val [ 0 ] [ xy ] ;
* ( uint32_t * ) s - > b_bidir_back_mv_table [ mb_xy ] = * ( uint32_t * ) p - > f . motion_val [ 1 ] [ xy ] ;
s - > mb_type [ mb_xy ] = CANDIDATE_MB_TYPE_BIDIR ;
} else {
* ( uint32_t * ) s - > b_forw_mv_table [ mb_xy ] = * ( uint32_t * ) p - > f . motion_val [ 0 ] [ xy ] ;
s - > mb_type [ mb_xy ] = CANDIDATE_MB_TYPE_FORWARD ;
}
x = p - > f . motion_val [ 0 ] [ xy ] [ 0 ] ;
y = p - > f . motion_val [ 0 ] [ xy ] [ 1 ] ;
d = cmp ( s , x > > shift , y > > shift , x & mask , y & mask , 0 , 16 , 0 , 0 , cmpf , chroma_cmpf , flags ) ;
} else if ( USES_LIST ( mb_type , 1 ) ) {
* ( uint32_t * ) s - > b_back_mv_table [ mb_xy ] = * ( uint32_t * ) p - > f . motion_val [ 1 ] [ xy ] ;
s - > mb_type [ mb_xy ] = CANDIDATE_MB_TYPE_BACKWARD ;
x = p - > f . motion_val [ 1 ] [ xy ] [ 0 ] ;
y = p - > f . motion_val [ 1 ] [ xy ] [ 1 ] ;
d = cmp ( s , x > > shift , y > > shift , x & mask , y & mask , 0 , 16 , 2 , 0 , cmpf , chroma_cmpf , flags ) ;
} else
s - > mb_type [ mb_xy ] = CANDIDATE_MB_TYPE_INTRA ;
}
return d ;
}
static inline int get_penalty_factor ( int lambda , int lambda2 , int type ) {
switch ( type & 0xFF ) {
default :
@ -1046,21 +900,6 @@ void ff_estimate_p_frame_motion(MpegEncContext * s,
pic - > mb_var [ s - > mb_stride * mb_y + mb_x ] = ( varc + 128 ) > > 8 ;
c - > mb_var_sum_temp + = ( varc + 128 ) > > 8 ;
if ( c - > avctx - > me_threshold ) {
vard = check_input_motion ( s , mb_x , mb_y , 1 ) ;
if ( ( vard + 128 ) > > 8 < c - > avctx - > me_threshold ) {
int p_score = FFMIN ( vard , varc - 500 + ( s - > lambda2 > > FF_LAMBDA_SHIFT ) * 100 ) ;
int i_score = varc - 500 + ( s - > lambda2 > > FF_LAMBDA_SHIFT ) * 20 ;
pic - > mc_mb_var [ s - > mb_stride * mb_y + mb_x ] = ( vard + 128 ) > > 8 ;
c - > mc_mb_var_sum_temp + = ( vard + 128 ) > > 8 ;
c - > scene_change_score + = ff_sqrt ( p_score ) - ff_sqrt ( i_score ) ;
return ;
}
if ( ( vard + 128 ) > > 8 < c - > avctx - > mb_threshold )
mb_type = s - > mb_type [ mb_x + mb_y * s - > mb_stride ] ;
}
switch ( s - > me_method ) {
case ME_ZERO :
default :
@ -1694,57 +1533,6 @@ void ff_estimate_b_frame_motion(MpegEncContext * s,
return ;
}
if ( c - > avctx - > me_threshold ) {
int vard = check_input_motion ( s , mb_x , mb_y , 0 ) ;
if ( ( vard + 128 ) > > 8 < c - > avctx - > me_threshold ) {
// pix = c->src[0][0];
// sum = s->dsp.pix_sum(pix, s->linesize);
// varc = s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500;
// pic->mb_var [s->mb_stride * mb_y + mb_x] = (varc+128)>>8;
s - > current_picture . mc_mb_var [ s - > mb_stride * mb_y + mb_x ] = ( vard + 128 ) > > 8 ;
/* pic->mb_mean [s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
c - > mb_var_sum_temp + = ( varc + 128 ) > > 8 ; */
c - > mc_mb_var_sum_temp + = ( vard + 128 ) > > 8 ;
/* if (vard <= 64<<8 || vard < varc) {
c - > scene_change_score + = ff_sqrt ( vard ) - ff_sqrt ( varc ) ;
} else {
c - > scene_change_score + = s - > qscale * s - > avctx - > scenechange_factor ;
} */
return ;
}
if ( ( vard + 128 ) > > 8 < c - > avctx - > mb_threshold ) {
type = s - > mb_type [ mb_y * s - > mb_stride + mb_x ] ;
if ( type = = CANDIDATE_MB_TYPE_DIRECT ) {
direct_search ( s , mb_x , mb_y ) ;
}
if ( type = = CANDIDATE_MB_TYPE_FORWARD | | type = = CANDIDATE_MB_TYPE_BIDIR ) {
c - > skip = 0 ;
ff_estimate_motion_b ( s , mb_x , mb_y , s - > b_forw_mv_table , 0 , s - > f_code ) ;
}
if ( type = = CANDIDATE_MB_TYPE_BACKWARD | | type = = CANDIDATE_MB_TYPE_BIDIR ) {
c - > skip = 0 ;
ff_estimate_motion_b ( s , mb_x , mb_y , s - > b_back_mv_table , 2 , s - > b_code ) ;
}
if ( type = = CANDIDATE_MB_TYPE_FORWARD_I | | type = = CANDIDATE_MB_TYPE_BIDIR_I ) {
c - > skip = 0 ;
c - > current_mv_penalty = c - > mv_penalty [ s - > f_code ] + MAX_MV ;
interlaced_search ( s , 0 ,
s - > b_field_mv_table [ 0 ] , s - > b_field_select_table [ 0 ] ,
s - > b_forw_mv_table [ xy ] [ 0 ] , s - > b_forw_mv_table [ xy ] [ 1 ] , 1 ) ;
}
if ( type = = CANDIDATE_MB_TYPE_BACKWARD_I | | type = = CANDIDATE_MB_TYPE_BIDIR_I ) {
c - > skip = 0 ;
c - > current_mv_penalty = c - > mv_penalty [ s - > b_code ] + MAX_MV ;
interlaced_search ( s , 2 ,
s - > b_field_mv_table [ 1 ] , s - > b_field_select_table [ 1 ] ,
s - > b_back_mv_table [ xy ] [ 0 ] , s - > b_back_mv_table [ xy ] [ 1 ] , 1 ) ;
}
return ;
}
}
if ( s - > codec_id = = AV_CODEC_ID_MPEG4 )
dmin = direct_search ( s , mb_x , mb_y ) ;
else