comparison dsputil.c @ 1013:5d4c95f323d0 libavcodec

finetuneing thresholds/factors nicer mb decission a few minor improvements & fixes
author michaelni
date Sun, 19 Jan 2003 17:55:13 +0000
parents 7a5038ec769b
children 5840ee827cc9
comparison
equal deleted inserted replaced
1012:7a5038ec769b 1013:5d4c95f323d0
1805 1805
1806 s->dsp.diff_pixels(temp, src1, src2, stride); 1806 s->dsp.diff_pixels(temp, src1, src2, stride);
1807 1807
1808 memcpy(bak, temp, 64*sizeof(DCTELEM)); 1808 memcpy(bak, temp, 64*sizeof(DCTELEM));
1809 1809
1810 s->fast_dct_quantize(s, temp, 0/*FIXME*/, s->qscale, &i); 1810 s->block_last_index[0/*FIXME*/]= s->fast_dct_quantize(s, temp, 0/*FIXME*/, s->qscale, &i);
1811 s->dct_unquantize(s, temp, 0, s->qscale); 1811 s->dct_unquantize(s, temp, 0, s->qscale);
1812 simple_idct(temp); //FIXME 1812 simple_idct(temp); //FIXME
1813 1813
1814 for(i=0; i<64; i++) 1814 for(i=0; i<64; i++)
1815 sum+= (temp[i]-bak[i])*(temp[i]-bak[i]); 1815 sum+= (temp[i]-bak[i])*(temp[i]-bak[i]);
1824 uint8_t bak[stride*8]; 1824 uint8_t bak[stride*8];
1825 int i, last, run, bits, level, distoration, start_i; 1825 int i, last, run, bits, level, distoration, start_i;
1826 const int esc_length= s->ac_esc_length; 1826 const int esc_length= s->ac_esc_length;
1827 uint8_t * length; 1827 uint8_t * length;
1828 uint8_t * last_length; 1828 uint8_t * last_length;
1829 1829
1830 s->mb_intra=0; 1830 for(i=0; i<8; i++){
1831 ((uint32_t*)(bak + i*stride))[0]= ((uint32_t*)(src2 + i*stride))[0];
1832 ((uint32_t*)(bak + i*stride))[1]= ((uint32_t*)(src2 + i*stride))[1];
1833 }
1834
1835 s->dsp.diff_pixels(temp, src1, src2, stride);
1836
1837 s->block_last_index[0/*FIXME*/]= last= s->fast_dct_quantize(s, temp, 0/*FIXME*/, s->qscale, &i);
1838
1839 bits=0;
1831 1840
1832 if (s->mb_intra) { 1841 if (s->mb_intra) {
1833 start_i = 1; 1842 start_i = 1;
1834 length = s->intra_ac_vlc_length; 1843 length = s->intra_ac_vlc_length;
1835 last_length= s->intra_ac_vlc_last_length; 1844 last_length= s->intra_ac_vlc_last_length;
1845 bits+= s->luma_dc_vlc_length[temp[0] + 256]; //FIXME chroma
1836 } else { 1846 } else {
1837 start_i = 0; 1847 start_i = 0;
1838 length = s->inter_ac_vlc_length; 1848 length = s->inter_ac_vlc_length;
1839 last_length= s->inter_ac_vlc_last_length; 1849 last_length= s->inter_ac_vlc_last_length;
1840 } 1850 }
1841 1851
1842 for(i=0; i<8; i++){ 1852 if(last>=start_i){
1843 ((uint32_t*)(bak + i*stride))[0]= ((uint32_t*)(src2 + i*stride))[0];
1844 ((uint32_t*)(bak + i*stride))[1]= ((uint32_t*)(src2 + i*stride))[1];
1845 }
1846
1847 s->dsp.diff_pixels(temp, src1, src2, stride);
1848
1849 last= s->fast_dct_quantize(s, temp, 0/*FIXME*/, s->qscale, &i);
1850
1851 bits=0;
1852 if(last>=0){
1853 run=0; 1853 run=0;
1854 for(i=start_i; i<last; i++){ 1854 for(i=start_i; i<last; i++){
1855 int j= scantable[i]; 1855 int j= scantable[i];
1856 level= temp[j]; 1856 level= temp[j];
1857 1857
1874 if((level&(~127)) == 0){ 1874 if((level&(~127)) == 0){
1875 bits+= last_length[UNI_AC_ENC_INDEX(run, level)]; 1875 bits+= last_length[UNI_AC_ENC_INDEX(run, level)];
1876 }else 1876 }else
1877 bits+= esc_length; 1877 bits+= esc_length;
1878 1878
1879 }
1880
1881 if(last>=0){
1879 s->dct_unquantize(s, temp, 0, s->qscale); 1882 s->dct_unquantize(s, temp, 0, s->qscale);
1880 } 1883 }
1881 1884
1882 s->idct_add(bak, stride, temp); 1885 s->idct_add(bak, stride, temp);
1883 1886
1884 distoration= s->dsp.sse[1](NULL, bak, src1, stride); 1887 distoration= s->dsp.sse[1](NULL, bak, src1, stride);
1885 1888
1886 return distoration + ((bits*s->qscale*s->qscale*105 + 64)>>7); 1889 return distoration + ((bits*s->qscale*s->qscale*109 + 64)>>7);
1887 } 1890 }
1888 1891
1889 static int bit8x8_c(/*MpegEncContext*/ void *c, uint8_t *src1, uint8_t *src2, int stride){ 1892 static int bit8x8_c(/*MpegEncContext*/ void *c, uint8_t *src1, uint8_t *src2, int stride){
1890 MpegEncContext * const s= (MpegEncContext *)c; 1893 MpegEncContext * const s= (MpegEncContext *)c;
1891 const UINT8 *scantable= s->intra_scantable.permutated; 1894 const UINT8 *scantable= s->intra_scantable.permutated;
1892 DCTELEM temp[64]; 1895 DCTELEM temp[64];
1893 int i, last, run, bits, level, start_i; 1896 int i, last, run, bits, level, start_i;
1894 const int esc_length= s->ac_esc_length; 1897 const int esc_length= s->ac_esc_length;
1895 uint8_t * length; 1898 uint8_t * length;
1896 uint8_t * last_length; 1899 uint8_t * last_length;
1897 1900
1898 s->mb_intra=0; 1901 s->dsp.diff_pixels(temp, src1, src2, stride);
1902
1903 s->block_last_index[0/*FIXME*/]= last= s->fast_dct_quantize(s, temp, 0/*FIXME*/, s->qscale, &i);
1904
1905 bits=0;
1899 1906
1900 if (s->mb_intra) { 1907 if (s->mb_intra) {
1901 start_i = 1; 1908 start_i = 1;
1902 length = s->intra_ac_vlc_length; 1909 length = s->intra_ac_vlc_length;
1903 last_length= s->intra_ac_vlc_last_length; 1910 last_length= s->intra_ac_vlc_last_length;
1911 bits+= s->luma_dc_vlc_length[temp[0] + 256]; //FIXME chroma
1904 } else { 1912 } else {
1905 start_i = 0; 1913 start_i = 0;
1906 length = s->inter_ac_vlc_length; 1914 length = s->inter_ac_vlc_length;
1907 last_length= s->inter_ac_vlc_last_length; 1915 last_length= s->inter_ac_vlc_last_length;
1908 } 1916 }
1909 1917
1910 s->dsp.diff_pixels(temp, src1, src2, stride); 1918 if(last>=start_i){
1911
1912 last= s->fast_dct_quantize(s, temp, 0/*FIXME*/, s->qscale, &i);
1913
1914 bits=0;
1915 if(last>=0){
1916 run=0; 1919 run=0;
1917 for(i=start_i; i<last; i++){ 1920 for(i=start_i; i<last; i++){
1918 int j= scantable[i]; 1921 int j= scantable[i];
1919 level= temp[j]; 1922 level= temp[j];
1920 1923
1927 run=0; 1930 run=0;
1928 }else 1931 }else
1929 run++; 1932 run++;
1930 } 1933 }
1931 i= scantable[last]; 1934 i= scantable[last];
1935
1936 level= temp[i] + 64;
1932 1937
1933 assert(level); 1938 assert(level - 64);
1934 1939
1935 level= temp[i] + 64;
1936 if((level&(~127)) == 0){ 1940 if((level&(~127)) == 0){
1937 bits+= last_length[UNI_AC_ENC_INDEX(run, level)]; 1941 bits+= last_length[UNI_AC_ENC_INDEX(run, level)];
1938 }else 1942 }else
1939 bits+= esc_length; 1943 bits+= esc_length;
1940 } 1944 }