Mercurial > libavcodec.hg
comparison h263.c @ 1064:b32afefe7d33 libavcodec
* UINTX -> uintx_t INTX -> intx_t
| author | kabi |
|---|---|
| date | Tue, 11 Feb 2003 16:35:48 +0000 |
| parents | bb5de8a59da8 |
| children | a5be963709d1 |
comparison
equal
deleted
inserted
replaced
| 1063:fdeac9642346 | 1064:b32afefe7d33 |
|---|---|
| 59 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, | 59 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, |
| 60 int n); | 60 int n); |
| 61 static void h263_encode_motion(MpegEncContext * s, int val, int fcode); | 61 static void h263_encode_motion(MpegEncContext * s, int val, int fcode); |
| 62 static void h263p_encode_umotion(MpegEncContext * s, int val); | 62 static void h263p_encode_umotion(MpegEncContext * s, int val); |
| 63 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, | 63 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, |
| 64 int n, int dc, UINT8 *scan_table, | 64 int n, int dc, uint8_t *scan_table, |
| 65 PutBitContext *dc_pb, PutBitContext *ac_pb); | 65 PutBitContext *dc_pb, PutBitContext *ac_pb); |
| 66 #endif | 66 #endif |
| 67 | 67 |
| 68 static int h263_decode_motion(MpegEncContext * s, int pred, int fcode); | 68 static int h263_decode_motion(MpegEncContext * s, int pred, int fcode); |
| 69 static int h263p_decode_umotion(MpegEncContext * s, int pred); | 69 static int h263p_decode_umotion(MpegEncContext * s, int pred); |
| 70 static int h263_decode_block(MpegEncContext * s, DCTELEM * block, | 70 static int h263_decode_block(MpegEncContext * s, DCTELEM * block, |
| 71 int n, int coded); | 71 int n, int coded); |
| 72 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr); | 72 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr); |
| 73 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, | 73 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, |
| 74 int n, int coded, int intra); | 74 int n, int coded, int intra); |
| 75 static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr); | 75 static int h263_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr); |
| 76 static void mpeg4_inv_pred_ac(MpegEncContext * s, DCTELEM *block, int n, | 76 static void mpeg4_inv_pred_ac(MpegEncContext * s, DCTELEM *block, int n, |
| 77 int dir); | 77 int dir); |
| 78 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s); | 78 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s); |
| 79 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr); | 79 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr, int *dir_ptr); |
| 80 | 80 |
| 81 extern UINT32 inverse[256]; | 81 extern uint32_t inverse[256]; |
| 82 | 82 |
| 83 static UINT8 uni_DCtab_lum_len[512]; | 83 static uint8_t uni_DCtab_lum_len[512]; |
| 84 static UINT8 uni_DCtab_chrom_len[512]; | 84 static uint8_t uni_DCtab_chrom_len[512]; |
| 85 static UINT16 uni_DCtab_lum_bits[512]; | 85 static uint16_t uni_DCtab_lum_bits[512]; |
| 86 static UINT16 uni_DCtab_chrom_bits[512]; | 86 static uint16_t uni_DCtab_chrom_bits[512]; |
| 87 | 87 |
| 88 #ifdef CONFIG_ENCODERS | 88 #ifdef CONFIG_ENCODERS |
| 89 static UINT16 (*mv_penalty)[MAX_MV*2+1]= NULL; | 89 static uint16_t (*mv_penalty)[MAX_MV*2+1]= NULL; |
| 90 static UINT8 fcode_tab[MAX_MV*2+1]; | 90 static uint8_t fcode_tab[MAX_MV*2+1]; |
| 91 static UINT8 umv_fcode_tab[MAX_MV*2+1]; | 91 static uint8_t umv_fcode_tab[MAX_MV*2+1]; |
| 92 | 92 |
| 93 static uint32_t uni_mpeg4_intra_rl_bits[64*64*2*2]; | 93 static uint32_t uni_mpeg4_intra_rl_bits[64*64*2*2]; |
| 94 static uint8_t uni_mpeg4_intra_rl_len [64*64*2*2]; | 94 static uint8_t uni_mpeg4_intra_rl_len [64*64*2*2]; |
| 95 static uint32_t uni_mpeg4_inter_rl_bits[64*64*2*2]; | 95 static uint32_t uni_mpeg4_inter_rl_bits[64*64*2*2]; |
| 96 static uint8_t uni_mpeg4_inter_rl_len [64*64*2*2]; | 96 static uint8_t uni_mpeg4_inter_rl_len [64*64*2*2]; |
| 159 /* Update the pointer to last GOB */ | 159 /* Update the pointer to last GOB */ |
| 160 s->ptr_lastgob = pbBufPtr(&s->pb); | 160 s->ptr_lastgob = pbBufPtr(&s->pb); |
| 161 s->gob_number = 0; | 161 s->gob_number = 0; |
| 162 | 162 |
| 163 put_bits(&s->pb, 22, 0x20); /* PSC */ | 163 put_bits(&s->pb, 22, 0x20); /* PSC */ |
| 164 put_bits(&s->pb, 8, (((INT64)s->picture_number * 30 * FRAME_RATE_BASE) / | 164 put_bits(&s->pb, 8, (((int64_t)s->picture_number * 30 * FRAME_RATE_BASE) / |
| 165 s->frame_rate) & 0xff); | 165 s->frame_rate) & 0xff); |
| 166 | 166 |
| 167 put_bits(&s->pb, 1, 1); /* marker */ | 167 put_bits(&s->pb, 1, 1); /* marker */ |
| 168 put_bits(&s->pb, 1, 0); /* h263 id */ | 168 put_bits(&s->pb, 1, 0); /* h263 id */ |
| 169 put_bits(&s->pb, 1, 0); /* split screen off */ | 169 put_bits(&s->pb, 1, 0); /* split screen off */ |
| 278 int score0=0, score1=0; | 278 int score0=0, score1=0; |
| 279 int i, n; | 279 int i, n; |
| 280 int8_t * const qscale_table= s->current_picture.qscale_table; | 280 int8_t * const qscale_table= s->current_picture.qscale_table; |
| 281 | 281 |
| 282 for(n=0; n<6; n++){ | 282 for(n=0; n<6; n++){ |
| 283 INT16 *ac_val, *ac_val1; | 283 int16_t *ac_val, *ac_val1; |
| 284 | 284 |
| 285 ac_val = s->ac_val[0][0] + s->block_index[n] * 16; | 285 ac_val = s->ac_val[0][0] + s->block_index[n] * 16; |
| 286 ac_val1= ac_val; | 286 ac_val1= ac_val; |
| 287 if(dir[n]){ | 287 if(dir[n]){ |
| 288 const int xy= s->mb_x + s->mb_y*s->mb_width - s->mb_width; | 288 const int xy= s->mb_x + s->mb_y*s->mb_width - s->mb_width; |
| 726 } else { | 726 } else { |
| 727 int cbp; | 727 int cbp; |
| 728 int dc_diff[6]; //dc values with the dc prediction subtracted | 728 int dc_diff[6]; //dc values with the dc prediction subtracted |
| 729 int dir[6]; //prediction direction | 729 int dir[6]; //prediction direction |
| 730 int zigzag_last_index[6]; | 730 int zigzag_last_index[6]; |
| 731 UINT8 *scan_table[6]; | 731 uint8_t *scan_table[6]; |
| 732 int i; | 732 int i; |
| 733 | 733 |
| 734 for(i=0; i<6; i++){ | 734 for(i=0; i<6; i++){ |
| 735 const int level= block[i][0]; | 735 const int level= block[i][0]; |
| 736 UINT16 *dc_ptr; | 736 uint16_t *dc_ptr; |
| 737 | 737 |
| 738 dc_diff[i]= level - ff_mpeg4_pred_dc(s, i, &dc_ptr, &dir[i]); | 738 dc_diff[i]= level - ff_mpeg4_pred_dc(s, i, &dc_ptr, &dir[i]); |
| 739 if (i < 4) { | 739 if (i < 4) { |
| 740 *dc_ptr = level * s->y_dc_scale; | 740 *dc_ptr = level * s->y_dc_scale; |
| 741 } else { | 741 } else { |
| 745 | 745 |
| 746 s->ac_pred= decide_ac_pred(s, block, dir); | 746 s->ac_pred= decide_ac_pred(s, block, dir); |
| 747 | 747 |
| 748 if(s->ac_pred){ | 748 if(s->ac_pred){ |
| 749 for(i=0; i<6; i++){ | 749 for(i=0; i<6; i++){ |
| 750 UINT8 *st; | 750 uint8_t *st; |
| 751 int last_index; | 751 int last_index; |
| 752 | 752 |
| 753 mpeg4_inv_pred_ac(s, block[i], i, dir[i]); | 753 mpeg4_inv_pred_ac(s, block[i], i, dir[i]); |
| 754 if (dir[i]==0) st = s->intra_v_scantable.permutated; /* left */ | 754 if (dir[i]==0) st = s->intra_v_scantable.permutated; /* left */ |
| 755 else st = s->intra_h_scantable.permutated; /* top */ | 755 else st = s->intra_h_scantable.permutated; /* top */ |
| 815 | 815 |
| 816 /* restore ac coeffs & last_index stuff if we messed them up with the prediction */ | 816 /* restore ac coeffs & last_index stuff if we messed them up with the prediction */ |
| 817 if(s->ac_pred){ | 817 if(s->ac_pred){ |
| 818 for(i=0; i<6; i++){ | 818 for(i=0; i<6; i++){ |
| 819 int j; | 819 int j; |
| 820 INT16 *ac_val; | 820 int16_t *ac_val; |
| 821 | 821 |
| 822 ac_val = s->ac_val[0][0] + s->block_index[i] * 16; | 822 ac_val = s->ac_val[0][0] + s->block_index[i] * 16; |
| 823 | 823 |
| 824 if(dir[i]){ | 824 if(dir[i]){ |
| 825 for(j=1; j<8; j++) | 825 for(j=1; j<8; j++) |
| 837 void h263_encode_mb(MpegEncContext * s, | 837 void h263_encode_mb(MpegEncContext * s, |
| 838 DCTELEM block[6][64], | 838 DCTELEM block[6][64], |
| 839 int motion_x, int motion_y) | 839 int motion_x, int motion_y) |
| 840 { | 840 { |
| 841 int cbpc, cbpy, i, cbp, pred_x, pred_y; | 841 int cbpc, cbpy, i, cbp, pred_x, pred_y; |
| 842 INT16 pred_dc; | 842 int16_t pred_dc; |
| 843 INT16 rec_intradc[6]; | 843 int16_t rec_intradc[6]; |
| 844 UINT16 *dc_ptr[6]; | 844 uint16_t *dc_ptr[6]; |
| 845 const int dquant_code[5]= {1,0,9,2,3}; | 845 const int dquant_code[5]= {1,0,9,2,3}; |
| 846 | 846 |
| 847 //printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y); | 847 //printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y); |
| 848 if (!s->mb_intra) { | 848 if (!s->mb_intra) { |
| 849 /* compute cbp */ | 849 /* compute cbp */ |
| 888 | 888 |
| 889 cbp = 0; | 889 cbp = 0; |
| 890 for(i=0; i<6; i++) { | 890 for(i=0; i<6; i++) { |
| 891 /* Predict DC */ | 891 /* Predict DC */ |
| 892 if (s->h263_aic && s->mb_intra) { | 892 if (s->h263_aic && s->mb_intra) { |
| 893 INT16 level = block[i][0]; | 893 int16_t level = block[i][0]; |
| 894 | 894 |
| 895 pred_dc = h263_pred_dc(s, i, &dc_ptr[i]); | 895 pred_dc = h263_pred_dc(s, i, &dc_ptr[i]); |
| 896 level -= pred_dc; | 896 level -= pred_dc; |
| 897 /* Quant */ | 897 /* Quant */ |
| 898 if (level < 0) | 898 if (level < 0) |
| 963 } | 963 } |
| 964 } | 964 } |
| 965 } | 965 } |
| 966 #endif | 966 #endif |
| 967 | 967 |
| 968 static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr) | 968 static int h263_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr) |
| 969 { | 969 { |
| 970 int x, y, wrap, a, c, pred_dc, scale; | 970 int x, y, wrap, a, c, pred_dc, scale; |
| 971 INT16 *dc_val, *ac_val; | 971 int16_t *dc_val, *ac_val; |
| 972 | 972 |
| 973 /* find prediction */ | 973 /* find prediction */ |
| 974 if (n < 4) { | 974 if (n < 4) { |
| 975 x = 2 * s->mb_x + 1 + (n & 1); | 975 x = 2 * s->mb_x + 1 + (n & 1); |
| 976 y = 2 * s->mb_y + 1 + ((n & 2) >> 1); | 976 y = 2 * s->mb_y + 1 + ((n & 2) >> 1); |
| 1012 | 1012 |
| 1013 | 1013 |
| 1014 static void h263_pred_acdc(MpegEncContext * s, DCTELEM *block, int n) | 1014 static void h263_pred_acdc(MpegEncContext * s, DCTELEM *block, int n) |
| 1015 { | 1015 { |
| 1016 int x, y, wrap, a, c, pred_dc, scale, i; | 1016 int x, y, wrap, a, c, pred_dc, scale, i; |
| 1017 INT16 *dc_val, *ac_val, *ac_val1; | 1017 int16_t *dc_val, *ac_val, *ac_val1; |
| 1018 | 1018 |
| 1019 /* find prediction */ | 1019 /* find prediction */ |
| 1020 if (n < 4) { | 1020 if (n < 4) { |
| 1021 x = 2 * s->mb_x + 1 + (n & 1); | 1021 x = 2 * s->mb_x + 1 + (n & 1); |
| 1022 y = 2 * s->mb_y + 1 + ((n & 2) >> 1); | 1022 y = 2 * s->mb_y + 1 + ((n & 2) >> 1); |
| 1093 /* top copy */ | 1093 /* top copy */ |
| 1094 for(i=1;i<8;i++) | 1094 for(i=1;i<8;i++) |
| 1095 ac_val1[8 + i] = block[s->idct_permutation[i ]]; | 1095 ac_val1[8 + i] = block[s->idct_permutation[i ]]; |
| 1096 } | 1096 } |
| 1097 | 1097 |
| 1098 INT16 *h263_pred_motion(MpegEncContext * s, int block, | 1098 int16_t *h263_pred_motion(MpegEncContext * s, int block, |
| 1099 int *px, int *py) | 1099 int *px, int *py) |
| 1100 { | 1100 { |
| 1101 int xy, wrap; | 1101 int xy, wrap; |
| 1102 INT16 *A, *B, *C, *mot_val; | 1102 int16_t *A, *B, *C, *mot_val; |
| 1103 static const int off[4]= {2, 1, 1, -1}; | 1103 static const int off[4]= {2, 1, 1, -1}; |
| 1104 | 1104 |
| 1105 wrap = s->block_wrap[0]; | 1105 wrap = s->block_wrap[0]; |
| 1106 xy = s->block_index[block]; | 1106 xy = s->block_index[block]; |
| 1107 | 1107 |
| 1247 { | 1247 { |
| 1248 int f_code; | 1248 int f_code; |
| 1249 int mv; | 1249 int mv; |
| 1250 | 1250 |
| 1251 if(mv_penalty==NULL) | 1251 if(mv_penalty==NULL) |
| 1252 mv_penalty= av_mallocz( sizeof(UINT16)*(MAX_FCODE+1)*(2*MAX_MV+1) ); | 1252 mv_penalty= av_mallocz( sizeof(uint16_t)*(MAX_FCODE+1)*(2*MAX_MV+1) ); |
| 1253 | 1253 |
| 1254 for(f_code=1; f_code<=MAX_FCODE; f_code++){ | 1254 for(f_code=1; f_code<=MAX_FCODE; f_code++){ |
| 1255 for(mv=-MAX_MV; mv<=MAX_MV; mv++){ | 1255 for(mv=-MAX_MV; mv<=MAX_MV; mv++){ |
| 1256 int len; | 1256 int len; |
| 1257 | 1257 |
| 1341 | 1341 |
| 1342 } | 1342 } |
| 1343 } | 1343 } |
| 1344 | 1344 |
| 1345 #ifdef CONFIG_ENCODERS | 1345 #ifdef CONFIG_ENCODERS |
| 1346 static void init_uni_mpeg4_rl_tab(RLTable *rl, UINT32 *bits_tab, UINT8 *len_tab){ | 1346 static void init_uni_mpeg4_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){ |
| 1347 int slevel, run, last; | 1347 int slevel, run, last; |
| 1348 | 1348 |
| 1349 assert(MAX_LEVEL >= 64); | 1349 assert(MAX_LEVEL >= 64); |
| 1350 assert(MAX_RUN >= 63); | 1350 assert(MAX_RUN >= 63); |
| 1351 | 1351 |
| 1573 } | 1573 } |
| 1574 | 1574 |
| 1575 if(s->current_picture.pts) | 1575 if(s->current_picture.pts) |
| 1576 s->time= (s->current_picture.pts*s->time_increment_resolution + 500*1000)/(1000*1000); | 1576 s->time= (s->current_picture.pts*s->time_increment_resolution + 500*1000)/(1000*1000); |
| 1577 else | 1577 else |
| 1578 s->time= picture_number*(INT64)FRAME_RATE_BASE*s->time_increment_resolution/s->frame_rate; | 1578 s->time= picture_number*(int64_t)FRAME_RATE_BASE*s->time_increment_resolution/s->frame_rate; |
| 1579 time_div= s->time/s->time_increment_resolution; | 1579 time_div= s->time/s->time_increment_resolution; |
| 1580 time_mod= s->time%s->time_increment_resolution; | 1580 time_mod= s->time%s->time_increment_resolution; |
| 1581 | 1581 |
| 1582 if(s->pict_type==B_TYPE){ | 1582 if(s->pict_type==B_TYPE){ |
| 1583 s->pb_time= s->pp_time - (s->last_non_b_time - s->time); | 1583 s->pb_time= s->pp_time - (s->last_non_b_time - s->time); |
| 1819 * @param n block index (0-3 are luma, 4-5 are chroma) | 1819 * @param n block index (0-3 are luma, 4-5 are chroma) |
| 1820 * @param dc_val_ptr a pointer to the dc_val entry for the current MB will be stored here | 1820 * @param dc_val_ptr a pointer to the dc_val entry for the current MB will be stored here |
| 1821 * @param dir_ptr pointer to an integer where the prediction direction will be stored | 1821 * @param dir_ptr pointer to an integer where the prediction direction will be stored |
| 1822 * @return the quantized predicted dc | 1822 * @return the quantized predicted dc |
| 1823 */ | 1823 */ |
| 1824 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr) | 1824 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr, int *dir_ptr) |
| 1825 { | 1825 { |
| 1826 int a, b, c, wrap, pred, scale; | 1826 int a, b, c, wrap, pred, scale; |
| 1827 UINT16 *dc_val; | 1827 uint16_t *dc_val; |
| 1828 int dummy; | 1828 int dummy; |
| 1829 | 1829 |
| 1830 /* find prediction */ | 1830 /* find prediction */ |
| 1831 if (n < 4) { | 1831 if (n < 4) { |
| 1832 scale = s->y_dc_scale; | 1832 scale = s->y_dc_scale; |
| 1885 */ | 1885 */ |
| 1886 void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n, | 1886 void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n, |
| 1887 int dir) | 1887 int dir) |
| 1888 { | 1888 { |
| 1889 int i; | 1889 int i; |
| 1890 INT16 *ac_val, *ac_val1; | 1890 int16_t *ac_val, *ac_val1; |
| 1891 int8_t * const qscale_table= s->current_picture.qscale_table; | 1891 int8_t * const qscale_table= s->current_picture.qscale_table; |
| 1892 | 1892 |
| 1893 /* find prediction */ | 1893 /* find prediction */ |
| 1894 ac_val = s->ac_val[0][0] + s->block_index[n] * 16; | 1894 ac_val = s->ac_val[0][0] + s->block_index[n] * 16; |
| 1895 ac_val1 = ac_val; | 1895 ac_val1 = ac_val; |
| 1940 | 1940 |
| 1941 static void mpeg4_inv_pred_ac(MpegEncContext * s, DCTELEM *block, int n, | 1941 static void mpeg4_inv_pred_ac(MpegEncContext * s, DCTELEM *block, int n, |
| 1942 int dir) | 1942 int dir) |
| 1943 { | 1943 { |
| 1944 int i; | 1944 int i; |
| 1945 INT16 *ac_val; | 1945 int16_t *ac_val; |
| 1946 int8_t * const qscale_table= s->current_picture.qscale_table; | 1946 int8_t * const qscale_table= s->current_picture.qscale_table; |
| 1947 | 1947 |
| 1948 /* find prediction */ | 1948 /* find prediction */ |
| 1949 ac_val = s->ac_val[0][0] + s->block_index[n] * 16; | 1949 ac_val = s->ac_val[0][0] + s->block_index[n] * 16; |
| 1950 | 1950 |
| 2029 /** | 2029 /** |
| 2030 * encodes a 8x8 block | 2030 * encodes a 8x8 block |
| 2031 * @param n block index (0-3 are luma, 4-5 are chroma) | 2031 * @param n block index (0-3 are luma, 4-5 are chroma) |
| 2032 */ | 2032 */ |
| 2033 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc, | 2033 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc, |
| 2034 UINT8 *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb) | 2034 uint8_t *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb) |
| 2035 { | 2035 { |
| 2036 int i, last_non_zero; | 2036 int i, last_non_zero; |
| 2037 #if 0 //variables for the outcommented version | 2037 #if 0 //variables for the outcommented version |
| 2038 int code, sign, last; | 2038 int code, sign, last; |
| 2039 #endif | 2039 #endif |
| 2040 const RLTable *rl; | 2040 const RLTable *rl; |
| 2041 UINT32 *bits_tab; | 2041 uint32_t *bits_tab; |
| 2042 UINT8 *len_tab; | 2042 uint8_t *len_tab; |
| 2043 const int last_index = s->block_last_index[n]; | 2043 const int last_index = s->block_last_index[n]; |
| 2044 | 2044 |
| 2045 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away | 2045 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away |
| 2046 /* mpeg4 based DC predictor */ | 2046 /* mpeg4 based DC predictor */ |
| 2047 mpeg4_encode_dc(dc_pb, intra_dc, n); | 2047 mpeg4_encode_dc(dc_pb, intra_dc, n); |
| 2145 } | 2145 } |
| 2146 #endif | 2146 #endif |
| 2147 } | 2147 } |
| 2148 | 2148 |
| 2149 static inline int mpeg4_get_block_length(MpegEncContext * s, DCTELEM * block, int n, int intra_dc, | 2149 static inline int mpeg4_get_block_length(MpegEncContext * s, DCTELEM * block, int n, int intra_dc, |
| 2150 UINT8 *scan_table) | 2150 uint8_t *scan_table) |
| 2151 { | 2151 { |
| 2152 int i, last_non_zero; | 2152 int i, last_non_zero; |
| 2153 const RLTable *rl; | 2153 const RLTable *rl; |
| 2154 UINT8 *len_tab; | 2154 uint8_t *len_tab; |
| 2155 const int last_index = s->block_last_index[n]; | 2155 const int last_index = s->block_last_index[n]; |
| 2156 int len=0; | 2156 int len=0; |
| 2157 | 2157 |
| 2158 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away | 2158 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away |
| 2159 /* mpeg4 based DC predictor */ | 2159 /* mpeg4 based DC predictor */ |
| 2562 memsetw(s->dc_val[1] + c_xy, 1024, c_wrap+1); | 2562 memsetw(s->dc_val[1] + c_xy, 1024, c_wrap+1); |
| 2563 memsetw(s->dc_val[2] + c_xy, 1024, c_wrap+1); | 2563 memsetw(s->dc_val[2] + c_xy, 1024, c_wrap+1); |
| 2564 #endif | 2564 #endif |
| 2565 | 2565 |
| 2566 /* clean AC */ | 2566 /* clean AC */ |
| 2567 memset(s->ac_val[0] + l_xy, 0, (l_wrap*2+1)*16*sizeof(INT16)); | 2567 memset(s->ac_val[0] + l_xy, 0, (l_wrap*2+1)*16*sizeof(int16_t)); |
| 2568 memset(s->ac_val[1] + c_xy, 0, (c_wrap +1)*16*sizeof(INT16)); | 2568 memset(s->ac_val[1] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t)); |
| 2569 memset(s->ac_val[2] + c_xy, 0, (c_wrap +1)*16*sizeof(INT16)); | 2569 memset(s->ac_val[2] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t)); |
| 2570 | 2570 |
| 2571 /* clean MV */ | 2571 /* clean MV */ |
| 2572 // we cant clear the MVs as they might be needed by a b frame | 2572 // we cant clear the MVs as they might be needed by a b frame |
| 2573 // memset(s->motion_val + l_xy, 0, (l_wrap*2+1)*2*sizeof(INT16)); | 2573 // memset(s->motion_val + l_xy, 0, (l_wrap*2+1)*2*sizeof(int16_t)); |
| 2574 // memset(s->motion_val, 0, 2*sizeof(INT16)*(2 + s->mb_width*2)*(2 + s->mb_height*2)); | 2574 // memset(s->motion_val, 0, 2*sizeof(int16_t)*(2 + s->mb_width*2)*(2 + s->mb_height*2)); |
| 2575 s->last_mv[0][0][0]= | 2575 s->last_mv[0][0][0]= |
| 2576 s->last_mv[0][0][1]= | 2576 s->last_mv[0][0][1]= |
| 2577 s->last_mv[1][0][0]= | 2577 s->last_mv[1][0][0]= |
| 2578 s->last_mv[1][0][1]= 0; | 2578 s->last_mv[1][0][1]= 0; |
| 2579 } | 2579 } |
| 2669 * decodes first partition. | 2669 * decodes first partition. |
| 2670 * @return number of MBs decoded or <0 if an error occured | 2670 * @return number of MBs decoded or <0 if an error occured |
| 2671 */ | 2671 */ |
| 2672 static int mpeg4_decode_partition_a(MpegEncContext *s){ | 2672 static int mpeg4_decode_partition_a(MpegEncContext *s){ |
| 2673 int mb_num; | 2673 int mb_num; |
| 2674 static const INT8 quant_tab[4] = { -1, -2, 1, 2 }; | 2674 static const int8_t quant_tab[4] = { -1, -2, 1, 2 }; |
| 2675 | 2675 |
| 2676 /* decode first partition */ | 2676 /* decode first partition */ |
| 2677 mb_num=0; | 2677 mb_num=0; |
| 2678 s->first_slice_line=1; | 2678 s->first_slice_line=1; |
| 2679 for(; s->mb_y<s->mb_height; s->mb_y++){ | 2679 for(; s->mb_y<s->mb_height; s->mb_y++){ |
| 2727 s->pred_dir_table[xy]= dir; | 2727 s->pred_dir_table[xy]= dir; |
| 2728 | 2728 |
| 2729 s->error_status_table[xy]= AC_ERROR; | 2729 s->error_status_table[xy]= AC_ERROR; |
| 2730 }else{ /* P/S_TYPE */ | 2730 }else{ /* P/S_TYPE */ |
| 2731 int mx, my, pred_x, pred_y, bits; | 2731 int mx, my, pred_x, pred_y, bits; |
| 2732 INT16 * const mot_val= s->motion_val[s->block_index[0]]; | 2732 int16_t * const mot_val= s->motion_val[s->block_index[0]]; |
| 2733 const int stride= s->block_wrap[0]*2; | 2733 const int stride= s->block_wrap[0]*2; |
| 2734 | 2734 |
| 2735 bits= show_bits(&s->gb, 17); | 2735 bits= show_bits(&s->gb, 17); |
| 2736 if(bits==MOTION_MARKER){ | 2736 if(bits==MOTION_MARKER){ |
| 2737 return mb_num-1; | 2737 return mb_num-1; |
| 2815 } else { | 2815 } else { |
| 2816 int i; | 2816 int i; |
| 2817 PRINT_MB_TYPE("4"); | 2817 PRINT_MB_TYPE("4"); |
| 2818 s->mb_type[xy]= MB_TYPE_INTER4V; | 2818 s->mb_type[xy]= MB_TYPE_INTER4V; |
| 2819 for(i=0;i<4;i++) { | 2819 for(i=0;i<4;i++) { |
| 2820 INT16 *mot_val= h263_pred_motion(s, i, &pred_x, &pred_y); | 2820 int16_t *mot_val= h263_pred_motion(s, i, &pred_x, &pred_y); |
| 2821 mx = h263_decode_motion(s, pred_x, s->f_code); | 2821 mx = h263_decode_motion(s, pred_x, s->f_code); |
| 2822 if (mx >= 0xffff) | 2822 if (mx >= 0xffff) |
| 2823 return -1; | 2823 return -1; |
| 2824 | 2824 |
| 2825 my = h263_decode_motion(s, pred_y, s->f_code); | 2825 my = h263_decode_motion(s, pred_y, s->f_code); |
| 2843 * decode second partition. | 2843 * decode second partition. |
| 2844 * @return <0 if an error occured | 2844 * @return <0 if an error occured |
| 2845 */ | 2845 */ |
| 2846 static int mpeg4_decode_partition_b(MpegEncContext *s, int mb_count){ | 2846 static int mpeg4_decode_partition_b(MpegEncContext *s, int mb_count){ |
| 2847 int mb_num=0; | 2847 int mb_num=0; |
| 2848 static const INT8 quant_tab[4] = { -1, -2, 1, 2 }; | 2848 static const int8_t quant_tab[4] = { -1, -2, 1, 2 }; |
| 2849 | 2849 |
| 2850 s->mb_x= s->resync_mb_x; | 2850 s->mb_x= s->resync_mb_x; |
| 2851 s->first_slice_line=1; | 2851 s->first_slice_line=1; |
| 2852 for(s->mb_y= s->resync_mb_y; mb_num < mb_count; s->mb_y++){ | 2852 for(s->mb_y= s->resync_mb_y; mb_num < mb_count; s->mb_y++){ |
| 2853 ff_init_block_index(s); | 2853 ff_init_block_index(s); |
| 3071 | 3071 |
| 3072 int ff_h263_decode_mb(MpegEncContext *s, | 3072 int ff_h263_decode_mb(MpegEncContext *s, |
| 3073 DCTELEM block[6][64]) | 3073 DCTELEM block[6][64]) |
| 3074 { | 3074 { |
| 3075 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant; | 3075 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant; |
| 3076 INT16 *mot_val; | 3076 int16_t *mot_val; |
| 3077 static INT8 quant_tab[4] = { -1, -2, 1, 2 }; | 3077 static int8_t quant_tab[4] = { -1, -2, 1, 2 }; |
| 3078 | 3078 |
| 3079 s->error_status_table[s->mb_x + s->mb_y*s->mb_width]= 0; | 3079 s->error_status_table[s->mb_x + s->mb_y*s->mb_width]= 0; |
| 3080 | 3080 |
| 3081 if(s->mb_x==0) PRINT_MB_TYPE("\n"); | 3081 if(s->mb_x==0) PRINT_MB_TYPE("\n"); |
| 3082 | 3082 |
| 3214 } | 3214 } |
| 3215 } else if(s->pict_type==B_TYPE) { | 3215 } else if(s->pict_type==B_TYPE) { |
| 3216 int modb1; // first bit of modb | 3216 int modb1; // first bit of modb |
| 3217 int modb2; // second bit of modb | 3217 int modb2; // second bit of modb |
| 3218 int mb_type; | 3218 int mb_type; |
| 3219 int xy; | |
| 3220 | 3219 |
| 3221 s->mb_intra = 0; //B-frames never contain intra blocks | 3220 s->mb_intra = 0; //B-frames never contain intra blocks |
| 3222 s->mcsel=0; // ... true gmc blocks | 3221 s->mcsel=0; // ... true gmc blocks |
| 3223 | 3222 |
| 3224 if(s->mb_x==0){ | 3223 if(s->mb_x==0){ |
| 3499 static int h263_decode_block(MpegEncContext * s, DCTELEM * block, | 3498 static int h263_decode_block(MpegEncContext * s, DCTELEM * block, |
| 3500 int n, int coded) | 3499 int n, int coded) |
| 3501 { | 3500 { |
| 3502 int code, level, i, j, last, run; | 3501 int code, level, i, j, last, run; |
| 3503 RLTable *rl = &rl_inter; | 3502 RLTable *rl = &rl_inter; |
| 3504 const UINT8 *scan_table; | 3503 const uint8_t *scan_table; |
| 3505 | 3504 |
| 3506 scan_table = s->intra_scantable.permutated; | 3505 scan_table = s->intra_scantable.permutated; |
| 3507 if (s->h263_aic && s->mb_intra) { | 3506 if (s->h263_aic && s->mb_intra) { |
| 3508 rl = &rl_intra_aic; | 3507 rl = &rl_intra_aic; |
| 3509 i = 0; | 3508 i = 0; |
| 3554 } | 3553 } |
| 3555 if (code == rl->n) { | 3554 if (code == rl->n) { |
| 3556 /* escape */ | 3555 /* escape */ |
| 3557 last = get_bits1(&s->gb); | 3556 last = get_bits1(&s->gb); |
| 3558 run = get_bits(&s->gb, 6); | 3557 run = get_bits(&s->gb, 6); |
| 3559 level = (INT8)get_bits(&s->gb, 8); | 3558 level = (int8_t)get_bits(&s->gb, 8); |
| 3560 if (s->h263_rv10 && level == -128) { | 3559 if (s->h263_rv10 && level == -128) { |
| 3561 /* XXX: should patch encoder too */ | 3560 /* XXX: should patch encoder too */ |
| 3562 level = get_bits(&s->gb, 12); | 3561 level = get_bits(&s->gb, 12); |
| 3563 level= (level + ((-1)<<11)) ^ ((-1)<<11); //sign extension | 3562 level= (level + ((-1)<<11)) ^ ((-1)<<11); //sign extension |
| 3564 } | 3563 } |
| 3596 * @return the quantized dc | 3595 * @return the quantized dc |
| 3597 */ | 3596 */ |
| 3598 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr) | 3597 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr) |
| 3599 { | 3598 { |
| 3600 int level, pred, code; | 3599 int level, pred, code; |
| 3601 UINT16 *dc_val; | 3600 uint16_t *dc_val; |
| 3602 | 3601 |
| 3603 if (n < 4) | 3602 if (n < 4) |
| 3604 code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1); | 3603 code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1); |
| 3605 else | 3604 else |
| 3606 code = get_vlc2(&s->gb, dc_chrom.table, DC_VLC_BITS, 1); | 3605 code = get_vlc2(&s->gb, dc_chrom.table, DC_VLC_BITS, 1); |
| 3655 { | 3654 { |
| 3656 int level, i, last, run; | 3655 int level, i, last, run; |
| 3657 int dc_pred_dir; | 3656 int dc_pred_dir; |
| 3658 RLTable * rl; | 3657 RLTable * rl; |
| 3659 RL_VLC_ELEM * rl_vlc; | 3658 RL_VLC_ELEM * rl_vlc; |
| 3660 const UINT8 * scan_table; | 3659 const uint8_t * scan_table; |
| 3661 int qmul, qadd; | 3660 int qmul, qadd; |
| 3662 | 3661 |
| 3663 if(intra) { | 3662 if(intra) { |
| 3664 /* DC coef */ | 3663 /* DC coef */ |
| 3665 if(s->partitioned_frame){ | 3664 if(s->partitioned_frame){ |
