Mercurial > libavcodec.hg
comparison h263.c @ 1666:b76ab3c968ab libavcodec
AIC/MQ encoding fix
author | michael |
---|---|
date | Mon, 08 Dec 2003 17:42:20 +0000 |
parents | 4ac3573977e6 |
children | 30746f429df6 |
comparison
equal
deleted
inserted
replaced
1665:2886ec9d113f | 1666:b76ab3c968ab |
---|---|
728 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1) && !s->data_partitioning ? 1 : 0; | 728 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1) && !s->data_partitioning ? 1 : 0; |
729 const int dquant_code[5]= {1,0,9,2,3}; | 729 const int dquant_code[5]= {1,0,9,2,3}; |
730 | 730 |
731 // printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y); | 731 // printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y); |
732 if (!s->mb_intra) { | 732 if (!s->mb_intra) { |
733 /* compute cbp */ | |
734 int i, cbp; | 733 int i, cbp; |
735 | 734 |
736 if(s->pict_type==B_TYPE){ | 735 if(s->pict_type==B_TYPE){ |
737 static const int mb_type_table[8]= {-1, 2, 3, 1,-1,-1,-1, 0}; /* convert from mv_dir to type */ | 736 static const int mb_type_table[8]= {-1, 2, 3, 1,-1,-1,-1, 0}; /* convert from mv_dir to type */ |
738 int mb_type= mb_type_table[s->mv_dir]; | 737 int mb_type= mb_type_table[s->mv_dir]; |
1143 | 1142 |
1144 if(interleaved_stats){ | 1143 if(interleaved_stats){ |
1145 s->mv_bits+= get_bits_diff(s); | 1144 s->mv_bits+= get_bits_diff(s); |
1146 } | 1145 } |
1147 } else { | 1146 } else { |
1148 int li = s->h263_aic ? 0 : 1; | |
1149 assert(s->mb_intra); | 1147 assert(s->mb_intra); |
1150 | 1148 |
1151 cbp = 0; | 1149 cbp = 0; |
1152 for(i=0; i<6; i++) { | 1150 if (s->h263_aic) { |
1153 /* Predict DC */ | 1151 /* Predict DC */ |
1154 if (s->h263_aic) { | 1152 for(i=0; i<6; i++) { |
1155 int16_t level = block[i][0]; | 1153 int16_t level = block[i][0]; |
1156 | 1154 int scale; |
1155 | |
1156 if(i<4) scale= s->y_dc_scale; | |
1157 else scale= s->c_dc_scale; | |
1158 | |
1157 pred_dc = h263_pred_dc(s, i, &dc_ptr[i]); | 1159 pred_dc = h263_pred_dc(s, i, &dc_ptr[i]); |
1158 level -= pred_dc; | 1160 level -= pred_dc; |
1159 /* Quant */ | 1161 /* Quant */ |
1160 if (level < 0) | 1162 if (level >= 0) |
1161 level = (level + (s->qscale >> 1))/(s->y_dc_scale); | 1163 level = (level + (scale>>1))/scale; |
1162 else | 1164 else |
1163 level = (level - (s->qscale >> 1))/(s->y_dc_scale); | 1165 level = (level - (scale>>1))/scale; |
1164 | 1166 |
1165 /* AIC can change CBP */ | 1167 /* AIC can change CBP */ |
1166 if (level == 0 && s->block_last_index[i] == 0) | 1168 if (level == 0 && s->block_last_index[i] == 0) |
1167 s->block_last_index[i] = -1; | 1169 s->block_last_index[i] = -1; |
1168 else if (level < -127) | 1170 |
1169 level = -127; | 1171 if(!s->modified_quant){ |
1170 else if (level > 127) | 1172 if (level < -127) |
1171 level = 127; | 1173 level = -127; |
1172 | 1174 else if (level > 127) |
1175 level = 127; | |
1176 } | |
1177 | |
1173 block[i][0] = level; | 1178 block[i][0] = level; |
1174 /* Reconstruction */ | 1179 /* Reconstruction */ |
1175 rec_intradc[i] = (s->y_dc_scale*level) + pred_dc; | 1180 rec_intradc[i] = scale*level + pred_dc; |
1176 /* Oddify */ | 1181 /* Oddify */ |
1177 rec_intradc[i] |= 1; | 1182 rec_intradc[i] |= 1; |
1178 //if ((rec_intradc[i] % 2) == 0) | 1183 //if ((rec_intradc[i] % 2) == 0) |
1179 // rec_intradc[i]++; | 1184 // rec_intradc[i]++; |
1180 /* Clipping */ | 1185 /* Clipping */ |
1183 else if (rec_intradc[i] > 2047) | 1188 else if (rec_intradc[i] > 2047) |
1184 rec_intradc[i] = 2047; | 1189 rec_intradc[i] = 2047; |
1185 | 1190 |
1186 /* Update AC/DC tables */ | 1191 /* Update AC/DC tables */ |
1187 *dc_ptr[i] = rec_intradc[i]; | 1192 *dc_ptr[i] = rec_intradc[i]; |
1188 } | 1193 if (s->block_last_index[i] >= 0) |
1189 /* compute cbp */ | 1194 cbp |= 1 << (5 - i); |
1190 if (s->block_last_index[i] >= li) | 1195 } |
1191 cbp |= 1 << (5 - i); | 1196 }else{ |
1197 for(i=0; i<6; i++) { | |
1198 /* compute cbp */ | |
1199 if (s->block_last_index[i] >= 1) | |
1200 cbp |= 1 << (5 - i); | |
1201 } | |
1192 } | 1202 } |
1193 | 1203 |
1194 cbpc = cbp & 3; | 1204 cbpc = cbp & 3; |
1195 if (s->pict_type == I_TYPE) { | 1205 if (s->pict_type == I_TYPE) { |
1196 if(s->dquant) cbpc+=4; | 1206 if(s->dquant) cbpc+=4; |
1905 s->avctx->extradata_size= (get_bit_count(&s->pb)+7)>>3; | 1915 s->avctx->extradata_size= (get_bit_count(&s->pb)+7)>>3; |
1906 } | 1916 } |
1907 | 1917 |
1908 break; | 1918 break; |
1909 case CODEC_ID_H263P: | 1919 case CODEC_ID_H263P: |
1910 s->fcode_tab= umv_fcode_tab; | 1920 if(s->umvplus) |
1911 s->min_qcoeff= -127; | 1921 s->fcode_tab= umv_fcode_tab; |
1912 s->max_qcoeff= 127; | 1922 else |
1923 s->fcode_tab= fcode_tab; | |
1924 if(s->modified_quant){ | |
1925 s->min_qcoeff= -2047; | |
1926 s->max_qcoeff= 2047; | |
1927 }else{ | |
1928 s->min_qcoeff= -127; | |
1929 s->max_qcoeff= 127; | |
1930 } | |
1913 break; | 1931 break; |
1914 //Note for mpeg4 & h263 the dc-scale table will be set per frame as needed later | 1932 //Note for mpeg4 & h263 the dc-scale table will be set per frame as needed later |
1915 case CODEC_ID_FLV1: | 1933 case CODEC_ID_FLV1: |
1916 if (s->h263_flv > 1) { | 1934 if (s->h263_flv > 1) { |
1917 s->min_qcoeff= -1023; | 1935 s->min_qcoeff= -1023; |