@ -151,73 +151,16 @@ static void pred_spatial_direct_motion(H264Context * const h, int *mb_type){
const int is_b8x8 = IS_8X8 ( * mb_type ) ;
unsigned int sub_mb_type ;
int i8 , i4 ;
int ref [ 2 ] ;
int mv [ 2 ] ;
int list ;
assert ( h - > ref_list [ 1 ] [ 0 ] . reference & 3 ) ;
# define MB_TYPE_16x16_OR_INTRA (MB_TYPE_16x16|MB_TYPE_INTRA4x4|MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM)
if ( IS_INTERLACED ( h - > ref_list [ 1 ] [ 0 ] . mb_type [ mb_xy ] ) ) { // AFL/AFR/FR/FL -> AFL/FL
if ( ! IS_INTERLACED ( * mb_type ) ) { // AFR/FR -> AFL/FL
mb_xy = s - > mb_x + ( ( s - > mb_y & ~ 1 ) + h - > col_parity ) * s - > mb_stride ;
b8_stride = 0 ;
} else {
mb_xy + = h - > col_fieldoff ; // non zero for FL -> FL & differ parity
}
goto single_col ;
} else { // AFL/AFR/FR/FL -> AFR/FR
if ( IS_INTERLACED ( * mb_type ) ) { // AFL /FL -> AFR/FR
mb_xy = s - > mb_x + ( s - > mb_y & ~ 1 ) * s - > mb_stride ;
mb_type_col [ 0 ] = h - > ref_list [ 1 ] [ 0 ] . mb_type [ mb_xy ] ;
mb_type_col [ 1 ] = h - > ref_list [ 1 ] [ 0 ] . mb_type [ mb_xy + s - > mb_stride ] ;
b8_stride * = 3 ;
b4_stride * = 6 ;
sub_mb_type = MB_TYPE_16x16 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_DIRECT2 ; /* B_SUB_8x8 */
if ( ( mb_type_col [ 0 ] & MB_TYPE_16x16_OR_INTRA )
& & ( mb_type_col [ 1 ] & MB_TYPE_16x16_OR_INTRA )
& & ! is_b8x8 ) {
* mb_type | = MB_TYPE_16x8 | MB_TYPE_L0L1 | MB_TYPE_DIRECT2 ; /* B_16x8 */
} else {
* mb_type | = MB_TYPE_8x8 | MB_TYPE_L0L1 ;
}
} else { // AFR/FR -> AFR/FR
single_col :
mb_type_col [ 0 ] =
mb_type_col [ 1 ] = h - > ref_list [ 1 ] [ 0 ] . mb_type [ mb_xy ] ;
sub_mb_type = MB_TYPE_16x16 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_DIRECT2 ; /* B_SUB_8x8 */
if ( ! is_b8x8 & & ( mb_type_col [ 0 ] & MB_TYPE_16x16_OR_INTRA ) ) {
* mb_type | = MB_TYPE_16x16 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_DIRECT2 ; /* B_16x16 */
} else if ( ! is_b8x8 & & ( mb_type_col [ 0 ] & ( MB_TYPE_16x8 | MB_TYPE_8x16 ) ) ) {
* mb_type | = MB_TYPE_L0L1 | MB_TYPE_DIRECT2 | ( mb_type_col [ 0 ] & ( MB_TYPE_16x8 | MB_TYPE_8x16 ) ) ;
} else {
if ( ! h - > sps . direct_8x8_inference_flag ) {
/* FIXME save sub mb types from previous frames (or derive from MVs)
* so we know exactly what block size to use */
sub_mb_type = MB_TYPE_8x8 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_DIRECT2 ; /* B_SUB_4x4 */
}
* mb_type | = MB_TYPE_8x8 | MB_TYPE_L0L1 ;
}
}
}
l1mv0 = & h - > ref_list [ 1 ] [ 0 ] . motion_val [ 0 ] [ h - > mb2b_xy [ mb_xy ] ] ;
l1mv1 = & h - > ref_list [ 1 ] [ 0 ] . motion_val [ 1 ] [ h - > mb2b_xy [ mb_xy ] ] ;
l1ref0 = & h - > ref_list [ 1 ] [ 0 ] . ref_index [ 0 ] [ h - > mb2b8_xy [ mb_xy ] ] ;
l1ref1 = & h - > ref_list [ 1 ] [ 0 ] . ref_index [ 1 ] [ h - > mb2b8_xy [ mb_xy ] ] ;
if ( ! b8_stride ) {
if ( s - > mb_y & 1 ) {
l1ref0 + = h - > b8_stride ;
l1ref1 + = h - > b8_stride ;
l1mv0 + = 2 * b4_stride ;
l1mv1 + = 2 * b4_stride ;
}
}
{
int ref [ 2 ] ;
int mv [ 2 ] ;
int list ;
* mb_type | = MB_TYPE_L0L1 ;
sub_mb_type | = MB_TYPE_L0L1 ;
/* ref = min(neighbors) */
for ( list = 0 ; list < 2 ; list + + ) {
@ -271,7 +214,69 @@ single_col:
fill_rectangle ( & h - > mv_cache [ 0 ] [ scan8 [ 0 ] ] , 4 , 4 , 8 , 0 , 4 ) ;
fill_rectangle ( & h - > mv_cache [ 1 ] [ scan8 [ 0 ] ] , 4 , 4 , 8 , 0 , 4 ) ;
* mb_type = ( * mb_type & ~ ( MB_TYPE_8x8 | MB_TYPE_16x8 | MB_TYPE_8x16 | MB_TYPE_P1L0 | MB_TYPE_P1L1 ) ) | MB_TYPE_16x16 | MB_TYPE_DIRECT2 ;
} else if ( IS_INTERLACED ( * mb_type ) ! = IS_INTERLACED ( mb_type_col [ 0 ] ) ) {
return ;
}
if ( IS_INTERLACED ( h - > ref_list [ 1 ] [ 0 ] . mb_type [ mb_xy ] ) ) { // AFL/AFR/FR/FL -> AFL/FL
if ( ! IS_INTERLACED ( * mb_type ) ) { // AFR/FR -> AFL/FL
mb_xy = s - > mb_x + ( ( s - > mb_y & ~ 1 ) + h - > col_parity ) * s - > mb_stride ;
b8_stride = 0 ;
} else {
mb_xy + = h - > col_fieldoff ; // non zero for FL -> FL & differ parity
}
goto single_col ;
} else { // AFL/AFR/FR/FL -> AFR/FR
if ( IS_INTERLACED ( * mb_type ) ) { // AFL /FL -> AFR/FR
mb_xy = s - > mb_x + ( s - > mb_y & ~ 1 ) * s - > mb_stride ;
mb_type_col [ 0 ] = h - > ref_list [ 1 ] [ 0 ] . mb_type [ mb_xy ] ;
mb_type_col [ 1 ] = h - > ref_list [ 1 ] [ 0 ] . mb_type [ mb_xy + s - > mb_stride ] ;
b8_stride * = 3 ;
b4_stride * = 6 ;
sub_mb_type | = MB_TYPE_16x16 | MB_TYPE_DIRECT2 ; /* B_SUB_8x8 */
if ( ( mb_type_col [ 0 ] & MB_TYPE_16x16_OR_INTRA )
& & ( mb_type_col [ 1 ] & MB_TYPE_16x16_OR_INTRA )
& & ! is_b8x8 ) {
* mb_type | = MB_TYPE_16x8 | MB_TYPE_DIRECT2 ; /* B_16x8 */
} else {
* mb_type | = MB_TYPE_8x8 ;
}
} else { // AFR/FR -> AFR/FR
single_col :
mb_type_col [ 0 ] =
mb_type_col [ 1 ] = h - > ref_list [ 1 ] [ 0 ] . mb_type [ mb_xy ] ;
sub_mb_type | = MB_TYPE_16x16 | MB_TYPE_DIRECT2 ; /* B_SUB_8x8 */
if ( ! is_b8x8 & & ( mb_type_col [ 0 ] & MB_TYPE_16x16_OR_INTRA ) ) {
* mb_type | = MB_TYPE_16x16 | MB_TYPE_DIRECT2 ; /* B_16x16 */
} else if ( ! is_b8x8 & & ( mb_type_col [ 0 ] & ( MB_TYPE_16x8 | MB_TYPE_8x16 ) ) ) {
* mb_type | = MB_TYPE_DIRECT2 | ( mb_type_col [ 0 ] & ( MB_TYPE_16x8 | MB_TYPE_8x16 ) ) ;
} else {
if ( ! h - > sps . direct_8x8_inference_flag ) {
/* FIXME save sub mb types from previous frames (or derive from MVs)
* so we know exactly what block size to use */
sub_mb_type + = ( MB_TYPE_8x8 - MB_TYPE_16x16 ) ; /* B_SUB_4x4 */
}
* mb_type | = MB_TYPE_8x8 ;
}
}
}
l1mv0 = & h - > ref_list [ 1 ] [ 0 ] . motion_val [ 0 ] [ h - > mb2b_xy [ mb_xy ] ] ;
l1mv1 = & h - > ref_list [ 1 ] [ 0 ] . motion_val [ 1 ] [ h - > mb2b_xy [ mb_xy ] ] ;
l1ref0 = & h - > ref_list [ 1 ] [ 0 ] . ref_index [ 0 ] [ h - > mb2b8_xy [ mb_xy ] ] ;
l1ref1 = & h - > ref_list [ 1 ] [ 0 ] . ref_index [ 1 ] [ h - > mb2b8_xy [ mb_xy ] ] ;
if ( ! b8_stride ) {
if ( s - > mb_y & 1 ) {
l1ref0 + = h - > b8_stride ;
l1ref1 + = h - > b8_stride ;
l1mv0 + = 2 * b4_stride ;
l1mv1 + = 2 * b4_stride ;
}
}
if ( IS_INTERLACED ( * mb_type ) ! = IS_INTERLACED ( mb_type_col [ 0 ] ) ) {
int n = 0 ;
for ( i8 = 0 ; i8 < 4 ; i8 + + ) {
int x8 = i8 & 1 ;