comparison h263.c @ 1261:362947395f5c libavcodec

fastdiv patch by (BERO <bero at geocities dot co dot jp>) with fixes & cleanup by me
author michaelni
date Wed, 14 May 2003 15:12:13 +0000
parents 6defe392d5d2
children 42ea05e4a391
comparison
equal deleted inserted replaced
1260:bc68a29d0dd1 1261:362947395f5c
70 static void mpeg4_inv_pred_ac(MpegEncContext * s, DCTELEM *block, int n, 70 static void mpeg4_inv_pred_ac(MpegEncContext * s, DCTELEM *block, int n,
71 int dir); 71 int dir);
72 #endif //CONFIG_ENCODERS 72 #endif //CONFIG_ENCODERS
73 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s); 73 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s);
74 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr, int *dir_ptr); 74 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr, int *dir_ptr);
75
76 extern uint32_t inverse[256];
77 75
78 #ifdef CONFIG_ENCODERS 76 #ifdef CONFIG_ENCODERS
79 static uint8_t uni_DCtab_lum_len[512]; 77 static uint8_t uni_DCtab_lum_len[512];
80 static uint8_t uni_DCtab_chrom_len[512]; 78 static uint8_t uni_DCtab_chrom_len[512];
81 static uint16_t uni_DCtab_lum_bits[512]; 79 static uint16_t uni_DCtab_lum_bits[512];
1821 */ 1819 */
1822 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr, int *dir_ptr) 1820 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr, int *dir_ptr)
1823 { 1821 {
1824 int a, b, c, wrap, pred, scale; 1822 int a, b, c, wrap, pred, scale;
1825 uint16_t *dc_val; 1823 uint16_t *dc_val;
1826 int dummy;
1827 1824
1828 /* find prediction */ 1825 /* find prediction */
1829 if (n < 4) { 1826 if (n < 4) {
1830 scale = s->y_dc_scale; 1827 scale = s->y_dc_scale;
1831 } else { 1828 } else {
1857 } else { 1854 } else {
1858 pred = a; 1855 pred = a;
1859 *dir_ptr = 0; /* left */ 1856 *dir_ptr = 0; /* left */
1860 } 1857 }
1861 /* we assume pred is positive */ 1858 /* we assume pred is positive */
1862 #ifdef ARCH_X86 1859 pred = FASTDIV((pred + (scale >> 1)), scale);
1863 asm volatile (
1864 "xorl %%edx, %%edx \n\t"
1865 "mul %%ecx \n\t"
1866 : "=d" (pred), "=a"(dummy)
1867 : "a" (pred + (scale >> 1)), "c" (inverse[scale])
1868 );
1869 #else
1870 pred = (pred + (scale >> 1)) / scale;
1871 #endif
1872 1860
1873 /* prepare address for prediction update */ 1861 /* prepare address for prediction update */
1874 *dc_val_ptr = &dc_val[0]; 1862 *dc_val_ptr = &dc_val[0];
1875 1863
1876 return pred; 1864 return pred;
3666 3654
3667 if(intra) { 3655 if(intra) {
3668 /* DC coef */ 3656 /* DC coef */
3669 if(s->partitioned_frame){ 3657 if(s->partitioned_frame){
3670 level = s->dc_val[0][ s->block_index[n] ]; 3658 level = s->dc_val[0][ s->block_index[n] ];
3671 if(n<4) level= (level + (s->y_dc_scale>>1))/s->y_dc_scale; //FIXME optimizs 3659 if(n<4) level= FASTDIV((level + (s->y_dc_scale>>1)), s->y_dc_scale);
3672 else level= (level + (s->c_dc_scale>>1))/s->c_dc_scale; 3660 else level= FASTDIV((level + (s->c_dc_scale>>1)), s->c_dc_scale);
3673 dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_stride]<<n)&32; 3661 dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_stride]<<n)&32;
3674 }else{ 3662 }else{
3675 level = mpeg4_decode_dc(s, n, &dc_pred_dir); 3663 level = mpeg4_decode_dc(s, n, &dc_pred_dir);
3676 if (level < 0) 3664 if (level < 0)
3677 return -1; 3665 return -1;