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;