comparison dsputil.c @ 1007:b2cf2a1d9a51 libavcodec

more compare functions (rd & bit)
author michaelni
date Wed, 15 Jan 2003 18:05:23 +0000
parents 4dfe15ae0078
children fb6cbb8a04a3
comparison
equal deleted inserted replaced
1006:a32feda30b01 1007:b2cf2a1d9a51
1833 1833
1834 s->dsp.diff_pixels(temp, src1, src2, stride); 1834 s->dsp.diff_pixels(temp, src1, src2, stride);
1835 1835
1836 memcpy(bak, temp, 64*sizeof(DCTELEM)); 1836 memcpy(bak, temp, 64*sizeof(DCTELEM));
1837 1837
1838 s->dct_quantize(s, temp, 0/*FIXME*/, s->qscale, &i); 1838 s->fast_dct_quantize(s, temp, 0/*FIXME*/, s->qscale, &i);
1839 s->dct_unquantize(s, temp, 0, s->qscale); 1839 s->dct_unquantize(s, temp, 0, s->qscale);
1840 simple_idct(temp); //FIXME 1840 simple_idct(temp); //FIXME
1841 1841
1842 for(i=0; i<64; i++) 1842 for(i=0; i<64; i++)
1843 sum+= (temp[i]-bak[i])*(temp[i]-bak[i]); 1843 sum+= (temp[i]-bak[i])*(temp[i]-bak[i]);
1844 1844
1845 return sum; 1845 return sum;
1846 } 1846 }
1847 1847
1848 static int rd8x8_c(/*MpegEncContext*/ void *c, uint8_t *src1, uint8_t *src2, int stride){
1849 MpegEncContext * const s= (MpegEncContext *)c;
1850 const UINT8 *scantable= s->intra_scantable.permutated;
1851 DCTELEM temp[64];
1852 uint8_t bak[stride*8];
1853 int i, last, run, bits, level, distoration, start_i;
1854 const int esc_length= s->ac_esc_length;
1855 uint8_t * length;
1856 uint8_t * last_length;
1857
1858 s->mb_intra=0;
1859
1860 if (s->mb_intra) {
1861 start_i = 1;
1862 length = s->intra_ac_vlc_length;
1863 last_length= s->intra_ac_vlc_last_length;
1864 } else {
1865 start_i = 0;
1866 length = s->inter_ac_vlc_length;
1867 last_length= s->inter_ac_vlc_last_length;
1868 }
1869
1870 for(i=0; i<8; i++){
1871 ((uint32_t*)(bak + i*stride))[0]= ((uint32_t*)(src2 + i*stride))[0];
1872 ((uint32_t*)(bak + i*stride))[1]= ((uint32_t*)(src2 + i*stride))[1];
1873 }
1874
1875 s->dsp.diff_pixels(temp, src1, src2, stride);
1876
1877 last= s->fast_dct_quantize(s, temp, 0/*FIXME*/, s->qscale, &i);
1878
1879 bits=0;
1880 if(last>=0){
1881 run=0;
1882 for(i=start_i; i<last; i++){
1883 int j= scantable[i];
1884 level= temp[j];
1885
1886 if(level){
1887 level+=64;
1888 if((level&(~127)) == 0){
1889 bits+= length[UNI_AC_ENC_INDEX(run, level)];
1890 }else
1891 bits+= esc_length;
1892 run=0;
1893 }else
1894 run++;
1895 }
1896 i= scantable[last];
1897
1898 assert(level);
1899
1900 level= temp[i] + 64;
1901 if((level&(~127)) == 0){
1902 bits+= last_length[UNI_AC_ENC_INDEX(run, level)];
1903 }else
1904 bits+= esc_length;
1905
1906 s->dct_unquantize(s, temp, 0, s->qscale);
1907 }
1908
1909 s->idct_add(bak, stride, temp);
1910
1911 distoration= s->dsp.sse[1](NULL, bak, src1, stride);
1912
1913 return distoration + ((bits*s->qscale*s->qscale*105 + 64)>>7);
1914 }
1915
1916 static int bit8x8_c(/*MpegEncContext*/ void *c, uint8_t *src1, uint8_t *src2, int stride){
1917 MpegEncContext * const s= (MpegEncContext *)c;
1918 const UINT8 *scantable= s->intra_scantable.permutated;
1919 DCTELEM temp[64];
1920 int i, last, run, bits, level, start_i;
1921 const int esc_length= s->ac_esc_length;
1922 uint8_t * length;
1923 uint8_t * last_length;
1924
1925 s->mb_intra=0;
1926
1927 if (s->mb_intra) {
1928 start_i = 1;
1929 length = s->intra_ac_vlc_length;
1930 last_length= s->intra_ac_vlc_last_length;
1931 } else {
1932 start_i = 0;
1933 length = s->inter_ac_vlc_length;
1934 last_length= s->inter_ac_vlc_last_length;
1935 }
1936
1937 s->dsp.diff_pixels(temp, src1, src2, stride);
1938
1939 last= s->fast_dct_quantize(s, temp, 0/*FIXME*/, s->qscale, &i);
1940
1941 bits=0;
1942 if(last>=0){
1943 run=0;
1944 for(i=start_i; i<last; i++){
1945 int j= scantable[i];
1946 level= temp[j];
1947
1948 if(level){
1949 level+=64;
1950 if((level&(~127)) == 0){
1951 bits+= length[UNI_AC_ENC_INDEX(run, level)];
1952 }else
1953 bits+= esc_length;
1954 run=0;
1955 }else
1956 run++;
1957 }
1958 i= scantable[last];
1959
1960 assert(level);
1961
1962 level= temp[i] + 64;
1963 if((level&(~127)) == 0){
1964 bits+= last_length[UNI_AC_ENC_INDEX(run, level)];
1965 }else
1966 bits+= esc_length;
1967 }
1968
1969 return bits;
1970 }
1971
1972
1848 WARPER88_1616(hadamard8_diff_c, hadamard8_diff16_c) 1973 WARPER88_1616(hadamard8_diff_c, hadamard8_diff16_c)
1849 WARPER88_1616(dct_sad8x8_c, dct_sad16x16_c) 1974 WARPER88_1616(dct_sad8x8_c, dct_sad16x16_c)
1850 WARPER88_1616(quant_psnr8x8_c, quant_psnr16x16_c) 1975 WARPER88_1616(quant_psnr8x8_c, quant_psnr16x16_c)
1976 WARPER88_1616(rd8x8_c, rd16x16_c)
1977 WARPER88_1616(bit8x8_c, bit16x16_c)
1851 1978
1852 void dsputil_init(DSPContext* c, unsigned mask) 1979 void dsputil_init(DSPContext* c, unsigned mask)
1853 { 1980 {
1854 static int init_done = 0; 1981 static int init_done = 0;
1855 int i; 1982 int i;
1959 c->sad[0]= sad16x16_c; 2086 c->sad[0]= sad16x16_c;
1960 c->sad[1]= sad8x8_c; 2087 c->sad[1]= sad8x8_c;
1961 2088
1962 c->quant_psnr[0]= quant_psnr16x16_c; 2089 c->quant_psnr[0]= quant_psnr16x16_c;
1963 c->quant_psnr[1]= quant_psnr8x8_c; 2090 c->quant_psnr[1]= quant_psnr8x8_c;
1964 2091
2092 c->rd[0]= rd16x16_c;
2093 c->rd[1]= rd8x8_c;
2094
2095 c->bit[0]= bit16x16_c;
2096 c->bit[1]= bit8x8_c;
2097
1965 c->add_bytes= add_bytes_c; 2098 c->add_bytes= add_bytes_c;
1966 c->diff_bytes= diff_bytes_c; 2099 c->diff_bytes= diff_bytes_c;
1967 2100
1968 #ifdef HAVE_MMX 2101 #ifdef HAVE_MMX
1969 dsputil_init_mmx(c, mask); 2102 dsputil_init_mmx(c, mask);