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