comparison mpegvideo.c @ 4215:7583920b3217 libavcodec

testing all dquant for qp_rd fixes the qp runaway to 31 bug
author michael
date Sun, 19 Nov 2006 23:19:52 +0000
parents be94e97ecb6e
children 8e1cafaeb6a1
comparison
equal deleted inserted replaced
4214:6a546bbe5b31 4215:7583920b3217
5224 } 5224 }
5225 5225
5226 if(s->flags & CODEC_FLAG_QP_RD){ 5226 if(s->flags & CODEC_FLAG_QP_RD){
5227 if(best_s.mv_type==MV_TYPE_16X16 && !(best_s.mv_dir&MV_DIRECT)){ 5227 if(best_s.mv_type==MV_TYPE_16X16 && !(best_s.mv_dir&MV_DIRECT)){
5228 const int last_qp= backup_s.qscale; 5228 const int last_qp= backup_s.qscale;
5229 int dquant, dir, qp, dc[6]; 5229 int dquant, qpi, qp, dc[6];
5230 DCTELEM ac[6][16]; 5230 DCTELEM ac[6][16];
5231 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0; 5231 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
5232 static const int dquant_tab[4]={-1,1,-2,2};
5232 5233
5233 assert(backup_s.dquant == 0); 5234 assert(backup_s.dquant == 0);
5234 5235
5235 //FIXME intra 5236 //FIXME intra
5236 s->mv_dir= best_s.mv_dir; 5237 s->mv_dir= best_s.mv_dir;
5239 s->mv[0][0][0] = best_s.mv[0][0][0]; 5240 s->mv[0][0][0] = best_s.mv[0][0][0];
5240 s->mv[0][0][1] = best_s.mv[0][0][1]; 5241 s->mv[0][0][1] = best_s.mv[0][0][1];
5241 s->mv[1][0][0] = best_s.mv[1][0][0]; 5242 s->mv[1][0][0] = best_s.mv[1][0][0];
5242 s->mv[1][0][1] = best_s.mv[1][0][1]; 5243 s->mv[1][0][1] = best_s.mv[1][0][1];
5243 5244
5244 dir= s->pict_type == B_TYPE ? 2 : 1; 5245 qpi = s->pict_type == B_TYPE ? 2 : 0;
5245 if(last_qp + dir > s->avctx->qmax) dir= -dir; 5246 for(dquant= dquant_tab[qpi]; qpi<4; qpi++){
5246 for(dquant= dir; dquant<=2 && dquant>=-2; dquant += dir){
5247 qp= last_qp + dquant; 5247 qp= last_qp + dquant;
5248 if(qp < s->avctx->qmin || qp > s->avctx->qmax) 5248 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
5249 break; 5249 continue;
5250 backup_s.dquant= dquant; 5250 backup_s.dquant= dquant;
5251 if(s->mb_intra && s->dc_val[0]){ 5251 if(s->mb_intra && s->dc_val[0]){
5252 for(i=0; i<6; i++){ 5252 for(i=0; i<6; i++){
5253 dc[i]= s->dc_val[0][ s->block_index[i] ]; 5253 dc[i]= s->dc_val[0][ s->block_index[i] ];
5254 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(DCTELEM)*16); 5254 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(DCTELEM)*16);
5262 for(i=0; i<6; i++){ 5262 for(i=0; i<6; i++){
5263 s->dc_val[0][ s->block_index[i] ]= dc[i]; 5263 s->dc_val[0][ s->block_index[i] ]= dc[i];
5264 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(DCTELEM)*16); 5264 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(DCTELEM)*16);
5265 } 5265 }
5266 } 5266 }
5267 if(dir > 0 && dquant==dir){
5268 dquant= 0;
5269 dir= -dir;
5270 }else
5271 break;
5272 } 5267 }
5273 } 5268 }
5274 qp= best_s.qscale; 5269 qp= best_s.qscale;
5275 s->current_picture.qscale_table[xy]= qp; 5270 s->current_picture.qscale_table[xy]= qp;
5276 } 5271 }