@ -667,6 +667,22 @@ static void rv34_mc_2mv(RV34DecContext *r, const int block_type)
r - > s . dsp . avg_h264_chroma_pixels_tab ) ;
}
static void rv34_mc_2mv_skip ( RV34DecContext * r )
{
int i , j , k ;
for ( j = 0 ; j < 2 ; j + + )
for ( i = 0 ; i < 2 ; i + + ) {
rv34_mc ( r , RV34_MB_P_8x8 , i * 8 , j * 8 , i + j * r - > s . b8_stride , 1 , 1 , 0 , r - > rv30 ,
r - > rv30 ? r - > s . dsp . put_rv30_tpel_pixels_tab
: r - > s . dsp . put_h264_qpel_pixels_tab ,
r - > s . dsp . put_h264_chroma_pixels_tab ) ;
rv34_mc ( r , RV34_MB_P_8x8 , i * 8 , j * 8 , i + j * r - > s . b8_stride , 1 , 1 , 1 , r - > rv30 ,
r - > rv30 ? r - > s . dsp . avg_rv30_tpel_pixels_tab
: r - > s . dsp . avg_h264_qpel_pixels_tab ,
r - > s . dsp . avg_h264_chroma_pixels_tab ) ;
}
}
/** number of motion vectors in each macroblock type */
static const int num_mvs [ RV34_MB_TYPES ] = { 0 , 0 , 1 , 4 , 1 , 1 , 0 , 0 , 2 , 2 , 2 , 1 } ;
@ -678,7 +694,9 @@ static int rv34_decode_mv(RV34DecContext *r, int block_type)
{
MpegEncContext * s = & r - > s ;
GetBitContext * gb = & s - > gb ;
int i ;
int i , j , k ;
int mv_pos = s - > mb_x * 2 + s - > mb_y * 2 * s - > b8_stride ;
int next_bt ;
memset ( r - > dmv , 0 , sizeof ( r - > dmv ) ) ;
for ( i = 0 ; i < num_mvs [ block_type ] ; i + + ) {
@ -697,9 +715,19 @@ static int rv34_decode_mv(RV34DecContext *r, int block_type)
break ;
}
case RV34_MB_B_DIRECT :
rv34_pred_mv_b ( r , RV34_MB_B_DIRECT , 0 ) ;
rv34_pred_mv_b ( r , RV34_MB_B_DIRECT , 1 ) ;
rv34_mc_2mv ( r , RV34_MB_B_DIRECT ) ;
//surprisingly, it uses motion scheme from next reference frame
next_bt = s - > next_picture_ptr - > mb_type [ s - > mb_x + s - > mb_y * s - > mb_stride ] ;
for ( j = 0 ; j < 2 ; j + + )
for ( i = 0 ; i < 2 ; i + + )
for ( k = 0 ; k < 2 ; k + + ) {
s - > current_picture_ptr - > motion_val [ 0 ] [ mv_pos + i + j * s - > b8_stride ] [ k ] = ( s - > next_picture_ptr - > motion_val [ 0 ] [ mv_pos + i + j * s - > b8_stride ] [ k ] + 1 ) > > 1 ;
s - > current_picture_ptr - > motion_val [ 1 ] [ mv_pos + i + j * s - > b8_stride ] [ k ] = - ( s - > next_picture_ptr - > motion_val [ 0 ] [ mv_pos + i + j * s - > b8_stride ] [ k ] > > 1 ) ;
}
if ( IS_16X16 ( next_bt ) ) //we can use whole macroblock MC
rv34_mc_2mv ( r , block_type ) ;
else
rv34_mc_2mv_skip ( r ) ;
fill_rectangle ( s - > current_picture_ptr - > motion_val [ 0 ] [ s - > mb_x * 2 + s - > mb_y * 2 * s - > b8_stride ] , 2 , 2 , s - > b8_stride , 0 , 4 ) ;
break ;
case RV34_MB_P_16x16 :
case RV34_MB_P_MIX16x16 :