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