@ -1475,12 +1475,10 @@ static inline void vc1_pred_mv(VC1Context *v, int n, int dmv_x, int dmv_y,
int px , py ;
int sum ;
int mixedmv_pic , num_samefield = 0 , num_oppfield = 0 ;
int opposit , f ;
int16_t samefield_pred [ 2 ] , oppfield_pred [ 2 ] ;
int16_t samefield_predA [ 2 ] , oppfield_predA [ 2 ] ;
int16_t samefield_predB [ 2 ] , oppfield_predB [ 2 ] ;
int16_t samefield_predC [ 2 ] , oppfield_predC [ 2 ] ;
int16_t * predA , * predC ;
int opposit , a_f , b_f , c_f ;
int16_t field_predA [ 2 ] ;
int16_t field_predB [ 2 ] ;
int16_t field_predC [ 2 ] ;
int a_valid , b_valid , c_valid ;
int hybridmv_thresh , y_bias = 0 ;
@ -1554,96 +1552,34 @@ static inline void vc1_pred_mv(VC1Context *v, int n, int dmv_x, int dmv_y,
}
if ( a_valid ) {
f = v - > mv_f [ dir ] [ xy - wrap + v - > blocks_off ] ;
num_oppfield + = f ;
num_samefield + = 1 - f ;
if ( f ) {
oppfield_predA [ 0 ] = A [ 0 ] ;
oppfield_predA [ 1 ] = A [ 1 ] ;
samefield_predA [ 0 ] = scaleforsame ( v , 0 , A [ 0 ] , 0 , dir ) ;
samefield_predA [ 1 ] = scaleforsame ( v , n , A [ 1 ] , 1 , dir ) ;
} else {
samefield_predA [ 0 ] = A [ 0 ] ;
samefield_predA [ 1 ] = A [ 1 ] ;
if ( v - > numref )
oppfield_predA [ 0 ] = scaleforopp ( v , A [ 0 ] , 0 , dir ) ;
if ( v - > numref )
oppfield_predA [ 1 ] = scaleforopp ( v , A [ 1 ] , 1 , dir ) ;
}
a_f = v - > mv_f [ dir ] [ xy - wrap + v - > blocks_off ] ;
num_oppfield + = a_f ;
num_samefield + = 1 - a_f ;
field_predA [ 0 ] = A [ 0 ] ;
field_predA [ 1 ] = A [ 1 ] ;
} else {
same field_predA[ 0 ] = same field_predA[ 1 ] = 0 ;
oppfield_predA [ 0 ] = oppfield_predA [ 1 ] = 0 ;
field_predA [ 0 ] = field_predA [ 1 ] = 0 ;
a_f = 0 ;
}
if ( c_valid ) {
f = v - > mv_f [ dir ] [ xy - 1 + v - > blocks_off ] ;
num_oppfield + = f ;
num_samefield + = 1 - f ;
if ( f ) {
oppfield_predC [ 0 ] = C [ 0 ] ;
oppfield_predC [ 1 ] = C [ 1 ] ;
samefield_predC [ 0 ] = scaleforsame ( v , 0 , C [ 0 ] , 0 , dir ) ;
samefield_predC [ 1 ] = scaleforsame ( v , n , C [ 1 ] , 1 , dir ) ;
} else {
samefield_predC [ 0 ] = C [ 0 ] ;
samefield_predC [ 1 ] = C [ 1 ] ;
if ( v - > numref )
oppfield_predC [ 0 ] = scaleforopp ( v , C [ 0 ] , 0 , dir ) ;
if ( v - > numref )
oppfield_predC [ 1 ] = scaleforopp ( v , C [ 1 ] , 1 , dir ) ;
}
c_f = v - > mv_f [ dir ] [ xy - 1 + v - > blocks_off ] ;
num_oppfield + = c_f ;
num_samefield + = 1 - c_f ;
field_predC [ 0 ] = C [ 0 ] ;
field_predC [ 1 ] = C [ 1 ] ;
} else {
same field_predC[ 0 ] = same field_predC[ 1 ] = 0 ;
oppfield_predC [ 0 ] = oppfield_predC [ 1 ] = 0 ;
field_predC [ 0 ] = field_predC [ 1 ] = 0 ;
c_f = 0 ;
}
if ( b_valid ) {
f = v - > mv_f [ dir ] [ xy - wrap + off + v - > blocks_off ] ;
num_oppfield + = f ;
num_samefield + = 1 - f ;
if ( f ) {
oppfield_predB [ 0 ] = B [ 0 ] ;
oppfield_predB [ 1 ] = B [ 1 ] ;
samefield_predB [ 0 ] = scaleforsame ( v , 0 , B [ 0 ] , 0 , dir ) ;
samefield_predB [ 1 ] = scaleforsame ( v , n , B [ 1 ] , 1 , dir ) ;
} else {
samefield_predB [ 0 ] = B [ 0 ] ;
samefield_predB [ 1 ] = B [ 1 ] ;
if ( v - > numref )
oppfield_predB [ 0 ] = scaleforopp ( v , B [ 0 ] , 0 , dir ) ;
if ( v - > numref )
oppfield_predB [ 1 ] = scaleforopp ( v , B [ 1 ] , 1 , dir ) ;
}
} else {
samefield_predB [ 0 ] = samefield_predB [ 1 ] = 0 ;
oppfield_predB [ 0 ] = oppfield_predB [ 1 ] = 0 ;
}
if ( a_valid ) {
samefield_pred [ 0 ] = samefield_predA [ 0 ] ;
samefield_pred [ 1 ] = samefield_predA [ 1 ] ;
oppfield_pred [ 0 ] = oppfield_predA [ 0 ] ;
oppfield_pred [ 1 ] = oppfield_predA [ 1 ] ;
} else if ( c_valid ) {
samefield_pred [ 0 ] = samefield_predC [ 0 ] ;
samefield_pred [ 1 ] = samefield_predC [ 1 ] ;
oppfield_pred [ 0 ] = oppfield_predC [ 0 ] ;
oppfield_pred [ 1 ] = oppfield_predC [ 1 ] ;
} else if ( b_valid ) {
samefield_pred [ 0 ] = samefield_predB [ 0 ] ;
samefield_pred [ 1 ] = samefield_predB [ 1 ] ;
oppfield_pred [ 0 ] = oppfield_predB [ 0 ] ;
oppfield_pred [ 1 ] = oppfield_predB [ 1 ] ;
b_f = v - > mv_f [ dir ] [ xy - wrap + off + v - > blocks_off ] ;
num_oppfield + = b_f ;
num_samefield + = 1 - b_f ;
field_predB [ 0 ] = B [ 0 ] ;
field_predB [ 1 ] = B [ 1 ] ;
} else {
samefield_pred [ 0 ] = samefield_pred [ 1 ] = 0 ;
oppfield_pred [ 0 ] = oppfield_pred [ 1 ] = 0 ;
}
if ( num_samefield + num_oppfield > 1 ) {
samefield_pred [ 0 ] = mid_pred ( samefield_predA [ 0 ] , samefield_predB [ 0 ] , samefield_predC [ 0 ] ) ;
samefield_pred [ 1 ] = mid_pred ( samefield_predA [ 1 ] , samefield_predB [ 1 ] , samefield_predC [ 1 ] ) ;
if ( v - > numref )
oppfield_pred [ 0 ] = mid_pred ( oppfield_predA [ 0 ] , oppfield_predB [ 0 ] , oppfield_predC [ 0 ] ) ;
if ( v - > numref )
oppfield_pred [ 1 ] = mid_pred ( oppfield_predA [ 1 ] , oppfield_predB [ 1 ] , oppfield_predC [ 1 ] ) ;
field_predB [ 0 ] = field_predB [ 1 ] = 0 ;
b_f = 0 ;
}
if ( v - > field_mode ) {
@ -1654,21 +1590,56 @@ static inline void vc1_pred_mv(VC1Context *v, int n, int dmv_x, int dmv_y,
} else
opposit = 0 ;
if ( opposit ) {
px = oppfield_pred [ 0 ] ;
py = oppfield_pred [ 1 ] ;
predA = oppfield_predA ;
predC = oppfield_predC ;
v - > mv_f [ dir ] [ xy + v - > blocks_off ] = f = 1 ;
if ( a_valid & & ! a_f ) {
field_predA [ 0 ] = scaleforopp ( v , field_predA [ 0 ] , 0 , dir ) ;
field_predA [ 1 ] = scaleforopp ( v , field_predA [ 1 ] , 1 , dir ) ;
}
if ( b_valid & & ! b_f ) {
field_predB [ 0 ] = scaleforopp ( v , field_predB [ 0 ] , 0 , dir ) ;
field_predB [ 1 ] = scaleforopp ( v , field_predB [ 1 ] , 1 , dir ) ;
}
if ( c_valid & & ! c_f ) {
field_predC [ 0 ] = scaleforopp ( v , field_predC [ 0 ] , 0 , dir ) ;
field_predC [ 1 ] = scaleforopp ( v , field_predC [ 1 ] , 1 , dir ) ;
}
v - > mv_f [ dir ] [ xy + v - > blocks_off ] = 1 ;
v - > ref_field_type [ dir ] = ! v - > cur_field_type ;
} else {
px = samefield_pred [ 0 ] ;
py = samefield_pred [ 1 ] ;
predA = samefield_predA ;
predC = samefield_predC ;
v - > mv_f [ dir ] [ xy + v - > blocks_off ] = f = 0 ;
if ( a_valid & & a_f ) {
field_predA [ 0 ] = scaleforsame ( v , n , field_predA [ 0 ] , 0 , dir ) ;
field_predA [ 1 ] = scaleforsame ( v , n , field_predA [ 1 ] , 1 , dir ) ;
}
if ( b_valid & & b_f ) {
field_predB [ 0 ] = scaleforsame ( v , n , field_predB [ 0 ] , 0 , dir ) ;
field_predB [ 1 ] = scaleforsame ( v , n , field_predB [ 1 ] , 1 , dir ) ;
}
if ( c_valid & & c_f ) {
field_predC [ 0 ] = scaleforsame ( v , n , field_predC [ 0 ] , 0 , dir ) ;
field_predC [ 1 ] = scaleforsame ( v , n , field_predC [ 1 ] , 1 , dir ) ;
}
v - > mv_f [ dir ] [ xy + v - > blocks_off ] = 0 ;
v - > ref_field_type [ dir ] = v - > cur_field_type ;
}
if ( a_valid ) {
px = field_predA [ 0 ] ;
py = field_predA [ 1 ] ;
} else if ( c_valid ) {
px = field_predC [ 0 ] ;
py = field_predC [ 1 ] ;
} else if ( b_valid ) {
px = field_predB [ 0 ] ;
py = field_predB [ 1 ] ;
} else {
px = 0 ;
py = 0 ;
}
if ( num_samefield + num_oppfield > 1 ) {
px = mid_pred ( field_predA [ 0 ] , field_predB [ 0 ] , field_predC [ 0 ] ) ;
py = mid_pred ( field_predA [ 1 ] , field_predB [ 1 ] , field_predC [ 1 ] ) ;
}
/* Pullback MV as specified in 8.3.5.3.4 */
if ( ! v - > field_mode ) {
int qx , qy , X , Y ;
@ -1697,27 +1668,27 @@ static inline void vc1_pred_mv(VC1Context *v, int n, int dmv_x, int dmv_y,
if ( is_intra [ xy - wrap ] )
sum = FFABS ( px ) + FFABS ( py ) ;
else
sum = FFABS ( px - predA [ 0 ] ) + FFABS ( py - predA [ 1 ] ) ;
sum = FFABS ( px - field_ predA[ 0 ] ) + FFABS ( py - field_ predA[ 1 ] ) ;
if ( sum > hybridmv_thresh ) {
if ( get_bits1 ( & s - > gb ) ) { // read HYBRIDPRED bit
px = predA [ 0 ] ;
py = predA [ 1 ] ;
px = field_ predA[ 0 ] ;
py = field_ predA[ 1 ] ;
} else {
px = predC [ 0 ] ;
py = predC [ 1 ] ;
px = field_ predC[ 0 ] ;
py = field_ predC[ 1 ] ;
}
} else {
if ( is_intra [ xy - 1 ] )
sum = FFABS ( px ) + FFABS ( py ) ;
else
sum = FFABS ( px - predC [ 0 ] ) + FFABS ( py - predC [ 1 ] ) ;
sum = FFABS ( px - field_ predC[ 0 ] ) + FFABS ( py - field_ predC[ 1 ] ) ;
if ( sum > hybridmv_thresh ) {
if ( get_bits1 ( & s - > gb ) ) {
px = predA [ 0 ] ;
py = predA [ 1 ] ;
px = field_ predA[ 0 ] ;
py = field_ predA[ 1 ] ;
} else {
px = predC [ 0 ] ;
py = predC [ 1 ] ;
px = field_ predC[ 0 ] ;
py = field_ predC[ 1 ] ;
}
}
}