comparison h264.c @ 8443:cf81cdbf8ca9 libavcodec

unified CAVLC level decoding LUT. Quite a bit faster (HPCVMOLQ_BRCM_B.264 was 3% faster here)
author michael
date Tue, 23 Dec 2008 17:49:38 +0000
parents f97c423dcb7f
children 4fdaffd1ae1c
comparison
equal deleted inserted replaced
8442:60be1c7d8345 8443:cf81cdbf8ca9
98 {0,1,2,3,7,10,8,11}, 98 {0,1,2,3,7,10,8,11},
99 {2,2,3,3,8,11,8,11}, 99 {2,2,3,3,8,11,8,11},
100 {0,0,1,1,7,10,7,10}, 100 {0,0,1,1,7,10,7,10},
101 {0,2,0,2,7,10,7,10} 101 {0,2,0,2,7,10,7,10}
102 }; 102 };
103
104 #define LEVEL_TAB_BITS 8
105 static int8_t cavlc_level_tab[7][1<<LEVEL_TAB_BITS][2];
103 106
104 static void fill_caches(H264Context *h, int mb_type, int for_deblock){ 107 static void fill_caches(H264Context *h, int mb_type, int for_deblock){
105 MpegEncContext * const s = &h->s; 108 MpegEncContext * const s = &h->s;
106 const int mb_xy= h->mb_xy; 109 const int mb_xy= h->mb_xy;
107 int topleft_xy, top_xy, topright_xy, left_xy[2]; 110 int topleft_xy, top_xy, topright_xy, left_xy[2];
1873 } 1876 }
1874 1877
1875 prefetch_motion(h, 1); 1878 prefetch_motion(h, 1);
1876 } 1879 }
1877 1880
1881 static av_cold void init_cavlc_level_tab(void){
1882 int suffix_length, mask;
1883 unsigned int i;
1884
1885 for(suffix_length=0; suffix_length<7; suffix_length++){
1886 for(i=0; i<(1<<LEVEL_TAB_BITS); i++){
1887 int prefix= LEVEL_TAB_BITS - av_log2(2*i);
1888 int level_code= (prefix<<suffix_length) + (i>>(LEVEL_TAB_BITS-prefix-1-suffix_length)) - (1<<suffix_length);
1889
1890 mask= -(level_code&1);
1891 level_code= (((2+level_code)>>1) ^ mask) - mask;
1892 if(prefix + 1 + suffix_length <= LEVEL_TAB_BITS){
1893 cavlc_level_tab[suffix_length][i][0]= level_code;
1894 cavlc_level_tab[suffix_length][i][1]= prefix + 1 + suffix_length;
1895 }else if(prefix + 1 <= LEVEL_TAB_BITS){
1896 cavlc_level_tab[suffix_length][i][0]= prefix+100;
1897 cavlc_level_tab[suffix_length][i][1]= prefix + 1;
1898 }else{
1899 cavlc_level_tab[suffix_length][i][0]= LEVEL_TAB_BITS+100;
1900 cavlc_level_tab[suffix_length][i][1]= LEVEL_TAB_BITS;
1901 }
1902 }
1903 }
1904 }
1905
1878 static av_cold void decode_init_vlc(void){ 1906 static av_cold void decode_init_vlc(void){
1879 static int done = 0; 1907 static int done = 0;
1880 1908
1881 if (!done) { 1909 if (!done) {
1882 int i; 1910 int i;
1939 run7_vlc.table_allocated = run7_vlc_table_size; 1967 run7_vlc.table_allocated = run7_vlc_table_size;
1940 init_vlc(&run7_vlc, RUN7_VLC_BITS, 16, 1968 init_vlc(&run7_vlc, RUN7_VLC_BITS, 16,
1941 &run_len [6][0], 1, 1, 1969 &run_len [6][0], 1, 1,
1942 &run_bits[6][0], 1, 1, 1970 &run_bits[6][0], 1, 1,
1943 INIT_VLC_USE_NEW_STATIC); 1971 INIT_VLC_USE_NEW_STATIC);
1972
1973 init_cavlc_level_tab();
1944 } 1974 }
1945 } 1975 }
1946 1976
1947 static void free_tables(H264Context *h){ 1977 static void free_tables(H264Context *h){
1948 int i; 1978 int i;
4135 mask= -(level_code&1); 4165 mask= -(level_code&1);
4136 level[trailing_ones]= (((2+level_code)>>1) ^ mask) - mask; 4166 level[trailing_ones]= (((2+level_code)>>1) ^ mask) - mask;
4137 4167
4138 //remaining coefficients have suffix_length > 0 4168 //remaining coefficients have suffix_length > 0
4139 for(i=trailing_ones+1;i<total_coeff;i++) { 4169 for(i=trailing_ones+1;i<total_coeff;i++) {
4140 static const int suffix_limit[7] = {0,5,11,23,47,95,INT_MAX }; 4170 static const unsigned int suffix_limit[7] = {0,3,6,12,24,48,INT_MAX };
4141 prefix = get_level_prefix(gb); 4171 int bitsi= show_bits(gb, LEVEL_TAB_BITS);
4172 level_code= cavlc_level_tab[suffix_length][bitsi][0];
4173
4174 skip_bits(gb, cavlc_level_tab[suffix_length][bitsi][1]);
4175 if(level_code >= 100){
4176 prefix= level_code - 100;
4177 if(prefix == LEVEL_TAB_BITS){
4178 prefix += get_level_prefix(gb);
4179 }
4142 if(prefix<15){ 4180 if(prefix<15){
4143 level_code = (prefix<<suffix_length) + get_bits(gb, suffix_length); 4181 level_code = (prefix<<suffix_length) + get_bits(gb, suffix_length);
4144 }else{ 4182 }else{
4145 level_code = (15<<suffix_length) + get_bits(gb, prefix-3); 4183 level_code = (15<<suffix_length) + get_bits(gb, prefix-3);
4146 if(prefix>=16) 4184 if(prefix>=16)
4147 level_code += (1<<(prefix-3))-4096; 4185 level_code += (1<<(prefix-3))-4096;
4148 } 4186 }
4149 mask= -(level_code&1); 4187 mask= -(level_code&1);
4150 level[i]= (((2+level_code)>>1) ^ mask) - mask; 4188 level_code= (((2+level_code)>>1) ^ mask) - mask;
4151 if(level_code > suffix_limit[suffix_length]) 4189 }
4190 level[i]= level_code;
4191
4192 if(suffix_limit[suffix_length] + level_code > 2U*suffix_limit[suffix_length])
4152 suffix_length++; 4193 suffix_length++;
4153 } 4194 }
4154 } 4195 }
4155 4196
4156 if(total_coeff == max_coeff) 4197 if(total_coeff == max_coeff)