comparison h263.c @ 2253:1085c5284bf1 libavcodec

trellis quantization for h263(p)
author michael
date Fri, 24 Sep 2004 20:35:59 +0000
parents b8bad8bbbc64
children 859535b5eb57
comparison
equal deleted inserted replaced
2252:bfdec93a5a42 2253:1085c5284bf1
89 89
90 static uint32_t uni_mpeg4_intra_rl_bits[64*64*2*2]; 90 static uint32_t uni_mpeg4_intra_rl_bits[64*64*2*2];
91 static uint8_t uni_mpeg4_intra_rl_len [64*64*2*2]; 91 static uint8_t uni_mpeg4_intra_rl_len [64*64*2*2];
92 static uint32_t uni_mpeg4_inter_rl_bits[64*64*2*2]; 92 static uint32_t uni_mpeg4_inter_rl_bits[64*64*2*2];
93 static uint8_t uni_mpeg4_inter_rl_len [64*64*2*2]; 93 static uint8_t uni_mpeg4_inter_rl_len [64*64*2*2];
94 static uint8_t uni_h263_intra_aic_rl_len [64*64*2*2];
95 static uint8_t uni_h263_inter_rl_len [64*64*2*2];
94 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128 + (run)*256 + (level)) 96 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128 + (run)*256 + (level))
95 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run) + (level)*64) 97 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run) + (level)*64)
96 #define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run)*128 + (level)) 98 #define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run)*128 + (level))
97 99
98 /* mpeg4 100 /* mpeg4
1874 } 1876 }
1875 } 1877 }
1876 } 1878 }
1877 } 1879 }
1878 1880
1881 static void init_uni_h263_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){
1882 int slevel, run, last;
1883
1884 assert(MAX_LEVEL >= 64);
1885 assert(MAX_RUN >= 63);
1886
1887 for(slevel=-64; slevel<64; slevel++){
1888 if(slevel==0) continue;
1889 for(run=0; run<64; run++){
1890 for(last=0; last<=1; last++){
1891 const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);
1892 int level= slevel < 0 ? -slevel : slevel;
1893 int sign= slevel < 0 ? 1 : 0;
1894 int bits, len, code;
1895 int level1, run1;
1896
1897 len_tab[index]= 100;
1898
1899 /* ESC0 */
1900 code= get_rl_index(rl, last, run, level);
1901 bits= rl->table_vlc[code][0];
1902 len= rl->table_vlc[code][1];
1903 bits=bits*2+sign; len++;
1904
1905 if(code!=rl->n && len < len_tab[index]){
1906 if(bits_tab) bits_tab[index]= bits;
1907 len_tab [index]= len;
1908 }
1909 /* ESC */
1910 bits= rl->table_vlc[rl->n][0];
1911 len = rl->table_vlc[rl->n][1];
1912 bits=bits*2+last; len++;
1913 bits=bits*64+run; len+=6;
1914 bits=bits*256+(level&0xff); len+=8;
1915
1916 if(len < len_tab[index]){
1917 if(bits_tab) bits_tab[index]= bits;
1918 len_tab [index]= len;
1919 }
1920 }
1921 }
1922 }
1923 }
1924
1879 void h263_encode_init(MpegEncContext *s) 1925 void h263_encode_init(MpegEncContext *s)
1880 { 1926 {
1881 static int done = 0; 1927 static int done = 0;
1882 1928
1883 if (!done) { 1929 if (!done) {
1890 init_rl(&rl_intra_aic); 1936 init_rl(&rl_intra_aic);
1891 1937
1892 init_uni_mpeg4_rl_tab(&rl_intra, uni_mpeg4_intra_rl_bits, uni_mpeg4_intra_rl_len); 1938 init_uni_mpeg4_rl_tab(&rl_intra, uni_mpeg4_intra_rl_bits, uni_mpeg4_intra_rl_len);
1893 init_uni_mpeg4_rl_tab(&rl_inter, uni_mpeg4_inter_rl_bits, uni_mpeg4_inter_rl_len); 1939 init_uni_mpeg4_rl_tab(&rl_inter, uni_mpeg4_inter_rl_bits, uni_mpeg4_inter_rl_len);
1894 1940
1941 init_uni_h263_rl_tab(&rl_intra_aic, NULL, uni_h263_intra_aic_rl_len);
1942 init_uni_h263_rl_tab(&rl_inter , NULL, uni_h263_inter_rl_len);
1943
1895 init_mv_penalty_and_fcode(s); 1944 init_mv_penalty_and_fcode(s);
1896 } 1945 }
1897 s->me.mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p 1946 s->me.mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p
1898 1947
1948 s->intra_ac_vlc_length =s->inter_ac_vlc_length = uni_h263_inter_rl_len;
1949 s->intra_ac_vlc_last_length=s->inter_ac_vlc_last_length= uni_h263_inter_rl_len + 128*64;
1950 if(s->h263_aic){
1951 s->intra_ac_vlc_length = uni_h263_intra_aic_rl_len;
1952 s->intra_ac_vlc_last_length= uni_h263_intra_aic_rl_len + 128*64;
1953 }
1954 s->ac_esc_length= 7+1+6+8;
1955
1899 // use fcodes >1 only for mpeg4 & h263 & h263p FIXME 1956 // use fcodes >1 only for mpeg4 & h263 & h263p FIXME
1900 switch(s->codec_id){ 1957 switch(s->codec_id){
1901 case CODEC_ID_MPEG4: 1958 case CODEC_ID_MPEG4:
1902 s->fcode_tab= fcode_tab; 1959 s->fcode_tab= fcode_tab;
1903 s->min_qcoeff= -2048; 1960 s->min_qcoeff= -2048;