Mercurial > libavcodec.hg
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) |