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