@ -217,8 +217,27 @@ static void fill_caches(H264Context *h, int mb_type, int for_deblock){
h - > top_samples_available = 0x33FF ;
h - > top_samples_available = 0x33FF ;
h - > topright_samples_available = 0x26EA ;
h - > topright_samples_available = 0x26EA ;
}
}
for ( i = 0 ; i < 2 ; i + + ) {
if ( IS_INTERLACED ( mb_type ) ! = IS_INTERLACED ( left_type [ 0 ] ) ) {
if ( ! IS_INTRA ( left_type [ i ] ) & & ( left_type [ i ] = = 0 | | h - > pps . constrained_intra_pred ) ) {
if ( IS_INTERLACED ( mb_type ) ) {
if ( ! IS_INTRA ( left_type [ 0 ] ) & & ( left_type [ 0 ] = = 0 | | h - > pps . constrained_intra_pred ) ) {
h - > topleft_samples_available & = 0xDFFF ;
h - > left_samples_available & = 0x5FFF ;
}
if ( ! IS_INTRA ( left_type [ 1 ] ) & & ( left_type [ 1 ] = = 0 | | h - > pps . constrained_intra_pred ) ) {
h - > topleft_samples_available & = 0xFF5F ;
h - > left_samples_available & = 0xFF5F ;
}
} else {
int left_typei = h - > slice_table [ left_xy [ 0 ] + s - > mb_stride ] = = h - > slice_num
? s - > current_picture . mb_type [ left_xy [ 0 ] + s - > mb_stride ] : 0 ;
assert ( left_xy [ 0 ] = = left_xy [ 1 ] ) ;
if ( ! ( IS_INTRA ( left_typei ) & & IS_INTRA ( left_type [ 0 ] ) ) & & ( left_typei = = 0 | | h - > pps . constrained_intra_pred ) ) {
h - > topleft_samples_available & = 0xDF5F ;
h - > left_samples_available & = 0x5F5F ;
}
}
} else {
if ( ! IS_INTRA ( left_type [ 0 ] ) & & ( left_type [ 0 ] = = 0 | | h - > pps . constrained_intra_pred ) ) {
h - > topleft_samples_available & = 0xDF5F ;
h - > topleft_samples_available & = 0xDF5F ;
h - > left_samples_available & = 0x5F5F ;
h - > left_samples_available & = 0x5F5F ;
}
}
@ -565,8 +584,10 @@ static inline int check_intra4x4_pred_mode(H264Context *h){
}
}
}
}
if ( ! ( h - > left_samples_available & 0x8000 ) ) {
if ( ( h - > left_samples_available & 0x8888 ) ! = 0x8888 ) {
static const int mask [ 4 ] = { 0x8000 , 0x2000 , 0x80 , 0x20 } ;
for ( i = 0 ; i < 4 ; i + + ) {
for ( i = 0 ; i < 4 ; i + + ) {
if ( ! ( h - > left_samples_available & mask [ i ] ) ) {
int status = left [ h - > intra4x4_pred_mode_cache [ scan8 [ 0 ] + 8 * i ] ] ;
int status = left [ h - > intra4x4_pred_mode_cache [ scan8 [ 0 ] + 8 * i ] ] ;
if ( status < 0 ) {
if ( status < 0 ) {
av_log ( h - > s . avctx , AV_LOG_ERROR , " left block unavailable for requested intra4x4 mode %d at %d %d \n " , status , s - > mb_x , s - > mb_y ) ;
av_log ( h - > s . avctx , AV_LOG_ERROR , " left block unavailable for requested intra4x4 mode %d at %d %d \n " , status , s - > mb_x , s - > mb_y ) ;
@ -574,6 +595,7 @@ static inline int check_intra4x4_pred_mode(H264Context *h){
} else if ( status ) {
} else if ( status ) {
h - > intra4x4_pred_mode_cache [ scan8 [ 0 ] + 8 * i ] = status ;
h - > intra4x4_pred_mode_cache [ scan8 [ 0 ] + 8 * i ] = status ;
}
}
}
}
}
}
}
@ -601,8 +623,11 @@ static inline int check_intra_pred_mode(H264Context *h, int mode){
}
}
}
}
if ( ! ( h - > left_samples_available & 0x8000 ) ) {
if ( ( h - > left_samples_available & 0x8080 ) ! = 0x8080 ) {
mode = left [ mode ] ;
mode = left [ mode ] ;
if ( h - > left_samples_available & 0x8080 ) { //mad cow disease mode, aka MBAFF + constrained_intra_pred
mode = ALZHEIMER_DC_L0T_PRED8x8 + ( ! ( h - > left_samples_available & 0x8000 ) ) + 2 * ( mode = = DC_128_PRED8x8 ) ;
}
if ( mode < 0 ) {
if ( mode < 0 ) {
av_log ( h - > s . avctx , AV_LOG_ERROR , " left block unavailable for requested intra mode at %d %d \n " , s - > mb_x , s - > mb_y ) ;
av_log ( h - > s . avctx , AV_LOG_ERROR , " left block unavailable for requested intra mode at %d %d \n " , s - > mb_x , s - > mb_y ) ;
return - 1 ;
return - 1 ;