Signed-off-by: Michael Niedermayer <michaelni@gmx.at>tags/n0.9
@@ -97,12 +97,9 @@ int ff_h264_check_intra4x4_pred_mode(H264Context *h){ | |||||
} | } | ||||
return 0; | return 0; | ||||
} //FIXME cleanup like ff_h264_check_intra_pred_mode | |||||
} //FIXME cleanup like check_intra_pred_mode | |||||
/** | |||||
* checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks. | |||||
*/ | |||||
int ff_h264_check_intra_pred_mode(H264Context *h, int mode){ | |||||
static int check_intra_pred_mode(H264Context *h, int mode, int is_chroma){ | |||||
MpegEncContext * const s = &h->s; | MpegEncContext * const s = &h->s; | ||||
static const int8_t top [7]= {LEFT_DC_PRED8x8, 1,-1,-1}; | static const int8_t top [7]= {LEFT_DC_PRED8x8, 1,-1,-1}; | ||||
static const int8_t left[7]= { TOP_DC_PRED8x8,-1, 2,-1,DC_128_PRED8x8}; | static const int8_t left[7]= { TOP_DC_PRED8x8,-1, 2,-1,DC_128_PRED8x8}; | ||||
@@ -122,7 +119,7 @@ int ff_h264_check_intra_pred_mode(H264Context *h, int mode){ | |||||
if((h->left_samples_available&0x8080) != 0x8080){ | 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 | |||||
if(is_chroma && (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); | mode= ALZHEIMER_DC_L0T_PRED8x8 + (!(h->left_samples_available&0x8000)) + 2*(mode == DC_128_PRED8x8); | ||||
} | } | ||||
if(mode<0){ | if(mode<0){ | ||||
@@ -134,6 +131,23 @@ int ff_h264_check_intra_pred_mode(H264Context *h, int mode){ | |||||
return mode; | return mode; | ||||
} | } | ||||
/** | |||||
* checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks. | |||||
*/ | |||||
int ff_h264_check_intra16x16_pred_mode(H264Context *h, int mode) | |||||
{ | |||||
return check_intra_pred_mode(h, mode, 0); | |||||
} | |||||
/** | |||||
* checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks. | |||||
*/ | |||||
int ff_h264_check_intra_chroma_pred_mode(H264Context *h, int mode) | |||||
{ | |||||
return check_intra_pred_mode(h, mode, 1); | |||||
} | |||||
const uint8_t *ff_h264_decode_nal(H264Context *h, const uint8_t *src, int *dst_length, int *consumed, int length){ | const uint8_t *ff_h264_decode_nal(H264Context *h, const uint8_t *src, int *dst_length, int *consumed, int length){ | ||||
int i, si, di; | int i, si, di; | ||||
uint8_t *dst; | uint8_t *dst; | ||||
@@ -668,7 +668,12 @@ int ff_h264_check_intra4x4_pred_mode(H264Context *h); | |||||
/** | /** | ||||
* Check if the top & left blocks are available if needed & change the dc mode so it only uses the available blocks. | * Check if the top & left blocks are available if needed & change the dc mode so it only uses the available blocks. | ||||
*/ | */ | ||||
int ff_h264_check_intra_pred_mode(H264Context *h, int mode); | |||||
int ff_h264_check_intra16x16_pred_mode(H264Context *h, int mode); | |||||
/** | |||||
* Check if the top & left blocks are available if needed & change the dc mode so it only uses the available blocks. | |||||
*/ | |||||
int ff_h264_check_intra_chroma_pred_mode(H264Context *h, int mode); | |||||
void ff_h264_hl_decode_mb(H264Context *h); | void ff_h264_hl_decode_mb(H264Context *h); | ||||
int ff_h264_frame_start(H264Context *h); | int ff_h264_frame_start(H264Context *h); | ||||
@@ -2013,14 +2013,14 @@ decode_intra_mb: | |||||
write_back_intra_pred_mode(h); | write_back_intra_pred_mode(h); | ||||
if( ff_h264_check_intra4x4_pred_mode(h) < 0 ) return -1; | if( ff_h264_check_intra4x4_pred_mode(h) < 0 ) return -1; | ||||
} else { | } else { | ||||
h->intra16x16_pred_mode= ff_h264_check_intra_pred_mode( h, h->intra16x16_pred_mode ); | |||||
h->intra16x16_pred_mode= ff_h264_check_intra16x16_pred_mode( h, h->intra16x16_pred_mode ); | |||||
if( h->intra16x16_pred_mode < 0 ) return -1; | if( h->intra16x16_pred_mode < 0 ) return -1; | ||||
} | } | ||||
if(decode_chroma){ | if(decode_chroma){ | ||||
h->chroma_pred_mode_table[mb_xy] = | h->chroma_pred_mode_table[mb_xy] = | ||||
pred_mode = decode_cabac_mb_chroma_pre_mode( h ); | pred_mode = decode_cabac_mb_chroma_pre_mode( h ); | ||||
pred_mode= ff_h264_check_intra_pred_mode( h, pred_mode ); | |||||
pred_mode= ff_h264_check_intra_chroma_pred_mode( h, pred_mode ); | |||||
if( pred_mode < 0 ) return -1; | if( pred_mode < 0 ) return -1; | ||||
h->chroma_pred_mode= pred_mode; | h->chroma_pred_mode= pred_mode; | ||||
} else { | } else { | ||||
@@ -821,12 +821,12 @@ decode_intra_mb: | |||||
if( ff_h264_check_intra4x4_pred_mode(h) < 0) | if( ff_h264_check_intra4x4_pred_mode(h) < 0) | ||||
return -1; | return -1; | ||||
}else{ | }else{ | ||||
h->intra16x16_pred_mode= ff_h264_check_intra_pred_mode(h, h->intra16x16_pred_mode); | |||||
h->intra16x16_pred_mode= ff_h264_check_intra16x16_pred_mode(h, h->intra16x16_pred_mode); | |||||
if(h->intra16x16_pred_mode < 0) | if(h->intra16x16_pred_mode < 0) | ||||
return -1; | return -1; | ||||
} | } | ||||
if(decode_chroma){ | if(decode_chroma){ | ||||
pred_mode= ff_h264_check_intra_pred_mode(h, get_ue_golomb_31(&s->gb)); | |||||
pred_mode= ff_h264_check_intra_chroma_pred_mode(h, get_ue_golomb_31(&s->gb)); | |||||
if(pred_mode < 0) | if(pred_mode < 0) | ||||
return -1; | return -1; | ||||
h->chroma_pred_mode= pred_mode; | h->chroma_pred_mode= pred_mode; | ||||
@@ -614,7 +614,7 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type) | |||||
dir = i_mb_type_info[mb_type - 8].pred_mode; | dir = i_mb_type_info[mb_type - 8].pred_mode; | ||||
dir = (dir >> 1) ^ 3*(dir & 1) ^ 1; | dir = (dir >> 1) ^ 3*(dir & 1) ^ 1; | ||||
if ((h->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(h, dir)) == -1){ | |||||
if ((h->intra16x16_pred_mode = ff_h264_check_intra16x16_pred_mode(h, dir)) == -1){ | |||||
av_log(h->s.avctx, AV_LOG_ERROR, "check_intra_pred_mode = -1\n"); | av_log(h->s.avctx, AV_LOG_ERROR, "check_intra_pred_mode = -1\n"); | ||||
return -1; | return -1; | ||||
} | } | ||||
@@ -713,7 +713,7 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type) | |||||
s->current_picture.f.mb_type[mb_xy] = mb_type; | s->current_picture.f.mb_type[mb_xy] = mb_type; | ||||
if (IS_INTRA(mb_type)) { | if (IS_INTRA(mb_type)) { | ||||
h->chroma_pred_mode = ff_h264_check_intra_pred_mode(h, DC_PRED8x8); | |||||
h->chroma_pred_mode = ff_h264_check_intra_chroma_pred_mode(h, DC_PRED8x8); | |||||
} | } | ||||
return 0; | return 0; | ||||