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