Mercurial > libavcodec.hg
diff mpeg12.c @ 237:75123d30f862 libavcodec
optimized encode_dc() (+2% speed on P3 for mpeg1 intra only encodings)
author | michaelni |
---|---|
date | Wed, 13 Feb 2002 15:26:28 +0000 |
parents | 4a090f1da60a |
children | e3e0094cb5c9 |
line wrap: on
line diff
--- a/mpeg12.c Wed Feb 13 04:19:10 2002 +0000 +++ b/mpeg12.c Wed Feb 13 15:26:28 2002 +0000 @@ -33,6 +33,8 @@ #define EXT_START_CODE 0x000001b5 #define USER_START_CODE 0x000001b2 +#define ABS(a) ((a)<0 ? -(a) : (a)) + static void mpeg1_encode_block(MpegEncContext *s, DCTELEM *block, int component); @@ -196,6 +198,26 @@ mpeg1_max_level[0][i]= rl_mpeg1.max_level[0][i]; mpeg1_index_run[0][i]= rl_mpeg1.index_run[0][i]; } + + /* build unified dc encoding tables */ + for(i=-255; i<256; i++) + { + int adiff, index; + int bits, code; + int diff=i; + + adiff = ABS(diff); + if(diff<0) diff--; + index = vlc_dc_table[adiff]; + + bits= vlc_dc_lum_bits[index] + index; + code= (vlc_dc_lum_code[index]<<index) + (diff & ((1 << index) - 1)); + mpeg1_lum_dc_uni[i+255]= bits + (code<<8); + + bits= vlc_dc_chroma_bits[index] + index; + code= (vlc_dc_chroma_code[index]<<index) + (diff & ((1 << index) - 1)); + mpeg1_chr_dc_uni[i+255]= bits + (code<<8); + } } mpeg1_encode_sequence_header(s); @@ -333,19 +355,16 @@ static inline void encode_dc(MpegEncContext *s, int diff, int component) { - int adiff, index; - - adiff = abs(diff); - index = vlc_dc_table[adiff]; if (component == 0) { - put_bits(&s->pb, vlc_dc_lum_bits[index], vlc_dc_lum_code[index]); + put_bits( + &s->pb, + mpeg1_lum_dc_uni[diff+255]&0xFF, + mpeg1_lum_dc_uni[diff+255]>>8); } else { - put_bits(&s->pb, vlc_dc_chroma_bits[index], vlc_dc_chroma_code[index]); - } - if (diff > 0) { - put_bits(&s->pb, index, (diff & ((1 << index) - 1))); - } else if (diff < 0) { - put_bits(&s->pb, index, ((diff - 1) & ((1 << index) - 1))); + put_bits( + &s->pb, + mpeg1_chr_dc_uni[diff+255]&0xFF, + mpeg1_chr_dc_uni[diff+255]>>8); } }