Move check_intra4x4_pred_mode() back from h264.h to h264.c, the function is just
called once per MB in worst case and doesnt seem to benefit from static inline. Actually the code might be a hair faster now (0.1% according to my benchmark but this could be random noise) Originally committed as revision 21173 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
ea6f00c448
commit
2bedc0e854
@ -541,6 +541,45 @@ void ff_h264_write_back_intra_pred_mode(H264Context *h){
|
|||||||
h->intra4x4_pred_mode[mb_xy][6]= h->intra4x4_pred_mode_cache[6+8*4];
|
h->intra4x4_pred_mode[mb_xy][6]= h->intra4x4_pred_mode_cache[6+8*4];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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_intra4x4_pred_mode(H264Context *h){
|
||||||
|
MpegEncContext * const s = &h->s;
|
||||||
|
static const int8_t top [12]= {-1, 0,LEFT_DC_PRED,-1,-1,-1,-1,-1, 0};
|
||||||
|
static const int8_t left[12]= { 0,-1, TOP_DC_PRED, 0,-1,-1,-1, 0,-1,DC_128_PRED};
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if(!(h->top_samples_available&0x8000)){
|
||||||
|
for(i=0; i<4; i++){
|
||||||
|
int status= top[ h->intra4x4_pred_mode_cache[scan8[0] + i] ];
|
||||||
|
if(status<0){
|
||||||
|
av_log(h->s.avctx, AV_LOG_ERROR, "top block unavailable for requested intra4x4 mode %d at %d %d\n", status, s->mb_x, s->mb_y);
|
||||||
|
return -1;
|
||||||
|
} else if(status){
|
||||||
|
h->intra4x4_pred_mode_cache[scan8[0] + i]= status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if((h->left_samples_available&0x8888)!=0x8888){
|
||||||
|
static const int mask[4]={0x8000,0x2000,0x80,0x20};
|
||||||
|
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] ];
|
||||||
|
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);
|
||||||
|
return -1;
|
||||||
|
} else if(status){
|
||||||
|
h->intra4x4_pred_mode_cache[scan8[0] + 8*i]= status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
} //FIXME cleanup like ff_h264_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.
|
* checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks.
|
||||||
*/
|
*/
|
||||||
@ -3277,7 +3316,7 @@ decode_intra_mb:
|
|||||||
h->intra4x4_pred_mode_cache[ scan8[i] ] = mode;
|
h->intra4x4_pred_mode_cache[ scan8[i] ] = mode;
|
||||||
}
|
}
|
||||||
ff_h264_write_back_intra_pred_mode(h);
|
ff_h264_write_back_intra_pred_mode(h);
|
||||||
if( 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_intra_pred_mode(h, h->intra16x16_pred_mode);
|
||||||
@ -4378,7 +4417,7 @@ decode_intra_mb:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
ff_h264_write_back_intra_pred_mode(h);
|
ff_h264_write_back_intra_pred_mode(h);
|
||||||
if( 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_intra_pred_mode( h, h->intra16x16_pred_mode );
|
||||||
if( h->intra16x16_pred_mode < 0 ) return -1;
|
if( h->intra16x16_pred_mode < 0 ) return -1;
|
||||||
|
@ -627,6 +627,11 @@ int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count);
|
|||||||
int ff_h264_decode_ref_pic_marking(H264Context *h, GetBitContext *gb);
|
int ff_h264_decode_ref_pic_marking(H264Context *h, GetBitContext *gb);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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_intra4x4_pred_mode(H264Context *h);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks.
|
* checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks.
|
||||||
*/
|
*/
|
||||||
@ -682,45 +687,6 @@ static av_always_inline uint32_t pack16to32(int a, int b){
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks.
|
|
||||||
*/
|
|
||||||
static inline int check_intra4x4_pred_mode(H264Context *h){
|
|
||||||
MpegEncContext * const s = &h->s;
|
|
||||||
static const int8_t top [12]= {-1, 0,LEFT_DC_PRED,-1,-1,-1,-1,-1, 0};
|
|
||||||
static const int8_t left[12]= { 0,-1, TOP_DC_PRED, 0,-1,-1,-1, 0,-1,DC_128_PRED};
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if(!(h->top_samples_available&0x8000)){
|
|
||||||
for(i=0; i<4; i++){
|
|
||||||
int status= top[ h->intra4x4_pred_mode_cache[scan8[0] + i] ];
|
|
||||||
if(status<0){
|
|
||||||
av_log(h->s.avctx, AV_LOG_ERROR, "top block unavailable for requested intra4x4 mode %d at %d %d\n", status, s->mb_x, s->mb_y);
|
|
||||||
return -1;
|
|
||||||
} else if(status){
|
|
||||||
h->intra4x4_pred_mode_cache[scan8[0] + i]= status;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if((h->left_samples_available&0x8888)!=0x8888){
|
|
||||||
static const int mask[4]={0x8000,0x2000,0x80,0x20};
|
|
||||||
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] ];
|
|
||||||
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);
|
|
||||||
return -1;
|
|
||||||
} else if(status){
|
|
||||||
h->intra4x4_pred_mode_cache[scan8[0] + 8*i]= status;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
} //FIXME cleanup like ff_h264_check_intra_pred_mode
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gets the chroma qp.
|
* gets the chroma qp.
|
||||||
*/
|
*/
|
||||||
|
@ -589,7 +589,7 @@ static int svq3_decode_mb(H264Context *h, unsigned int mb_type)
|
|||||||
ff_h264_write_back_intra_pred_mode(h);
|
ff_h264_write_back_intra_pred_mode(h);
|
||||||
|
|
||||||
if (mb_type == 8) {
|
if (mb_type == 8) {
|
||||||
check_intra4x4_pred_mode(h);
|
ff_h264_check_intra4x4_pred_mode(h);
|
||||||
|
|
||||||
h->top_samples_available = (s->mb_y == 0) ? 0x33FF : 0xFFFF;
|
h->top_samples_available = (s->mb_y == 0) ? 0x33FF : 0xFFFF;
|
||||||
h->left_samples_available = (s->mb_x == 0) ? 0x5F5F : 0xFFFF;
|
h->left_samples_available = (s->mb_x == 0) ? 0x5F5F : 0xFFFF;
|
||||||
|
Loading…
Reference in New Issue
Block a user