comparison motion_est.c @ 4126:8a67fda4f0b5 libavcodec

new I/P frame selection heuristic PSNR/bitrate is slightly better for my (short) test videos more tests welcome ...
author michael
date Thu, 02 Nov 2006 23:36:39 +0000
parents bfab45292f1b
children 9b74144471c5
comparison
equal deleted inserted replaced
4125:f6f67a8bdd09 4126:8a67fda4f0b5
1176 1176
1177 if(c->avctx->me_threshold){ 1177 if(c->avctx->me_threshold){
1178 vard= check_input_motion(s, mb_x, mb_y, 1); 1178 vard= check_input_motion(s, mb_x, mb_y, 1);
1179 1179
1180 if((vard+128)>>8 < c->avctx->me_threshold){ 1180 if((vard+128)>>8 < c->avctx->me_threshold){
1181 int p_score= FFMIN(vard, varc-500+(s->lambda2>>FF_LAMBDA_SHIFT)*100);
1182 int i_score= varc-500+(s->lambda2>>FF_LAMBDA_SHIFT)*20;
1181 pic->mc_mb_var[s->mb_stride * mb_y + mb_x] = (vard+128)>>8; 1183 pic->mc_mb_var[s->mb_stride * mb_y + mb_x] = (vard+128)>>8;
1182 c->mc_mb_var_sum_temp += (vard+128)>>8; 1184 c->mc_mb_var_sum_temp += (vard+128)>>8;
1183 if (vard <= 64<<8 || vard < varc) { //FIXME 1185 c->scene_change_score+= ff_sqrt(p_score) - ff_sqrt(i_score);
1184 c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc);
1185 }else{
1186 c->scene_change_score+= s->qscale * s->avctx->scenechange_factor;
1187 }
1188 return; 1186 return;
1189 } 1187 }
1190 if((vard+128)>>8 < c->avctx->mb_threshold) 1188 if((vard+128)>>8 < c->avctx->mb_threshold)
1191 mb_type= s->mb_type[mb_x + mb_y*s->mb_stride]; 1189 mb_type= s->mb_type[mb_x + mb_y*s->mb_stride];
1192 } 1190 }
1269 #if 0 1267 #if 0
1270 printf("varc=%4d avg_var=%4d (sum=%4d) vard=%4d mx=%2d my=%2d\n", 1268 printf("varc=%4d avg_var=%4d (sum=%4d) vard=%4d mx=%2d my=%2d\n",
1271 varc, s->avg_mb_var, sum, vard, mx - xx, my - yy); 1269 varc, s->avg_mb_var, sum, vard, mx - xx, my - yy);
1272 #endif 1270 #endif
1273 if(mb_type){ 1271 if(mb_type){
1274 if (vard <= 64<<8 || vard < varc) 1272 int p_score= FFMIN(vard, varc-500+(s->lambda2>>FF_LAMBDA_SHIFT)*100);
1275 c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc); 1273 int i_score= varc-500+(s->lambda2>>FF_LAMBDA_SHIFT)*20;
1276 else 1274 c->scene_change_score+= ff_sqrt(p_score) - ff_sqrt(i_score);
1277 c->scene_change_score+= s->qscale * s->avctx->scenechange_factor;
1278 1275
1279 if(mb_type == CANDIDATE_MB_TYPE_INTER){ 1276 if(mb_type == CANDIDATE_MB_TYPE_INTER){
1280 c->sub_motion_search(s, &mx, &my, dmin, 0, 0, 0, 16); 1277 c->sub_motion_search(s, &mx, &my, dmin, 0, 0, 0, 16);
1281 set_p_mv_tables(s, mx, my, 1); 1278 set_p_mv_tables(s, mx, my, 1);
1282 }else{ 1279 }else{
1290 } 1287 }
1291 if(mb_type == CANDIDATE_MB_TYPE_INTER_I){ 1288 if(mb_type == CANDIDATE_MB_TYPE_INTER_I){
1292 interlaced_search(s, 0, s->p_field_mv_table, s->p_field_select_table, mx, my, 1); 1289 interlaced_search(s, 0, s->p_field_mv_table, s->p_field_select_table, mx, my, 1);
1293 } 1290 }
1294 }else if(c->avctx->mb_decision > FF_MB_DECISION_SIMPLE){ 1291 }else if(c->avctx->mb_decision > FF_MB_DECISION_SIMPLE){
1295 if (vard <= 64<<8 || vard < varc) 1292 int p_score= FFMIN(vard, varc-500+(s->lambda2>>FF_LAMBDA_SHIFT)*100);
1296 c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc); 1293 int i_score= varc-500+(s->lambda2>>FF_LAMBDA_SHIFT)*20;
1297 else 1294 c->scene_change_score+= ff_sqrt(p_score) - ff_sqrt(i_score);
1298 c->scene_change_score+= s->qscale * s->avctx->scenechange_factor;
1299 1295
1300 if (vard*2 + 200*256 > varc) 1296 if (vard*2 + 200*256 > varc)
1301 mb_type|= CANDIDATE_MB_TYPE_INTRA; 1297 mb_type|= CANDIDATE_MB_TYPE_INTRA;
1302 if (varc*2 + 200*256 > vard || s->qscale > 24){ 1298 if (varc*2 + 200*256 > vard || s->qscale > 24){
1303 // if (varc*2 + 200*256 + 50*(s->lambda2>>FF_LAMBDA_SHIFT) > vard){ 1299 // if (varc*2 + 200*256 + 50*(s->lambda2>>FF_LAMBDA_SHIFT) > vard){
1397 mb_type= CANDIDATE_MB_TYPE_INTRA; 1393 mb_type= CANDIDATE_MB_TYPE_INTRA;
1398 s->current_picture.mb_type[mb_y*s->mb_stride + mb_x]= CANDIDATE_MB_TYPE_INTRA; //FIXME cleanup 1394 s->current_picture.mb_type[mb_y*s->mb_stride + mb_x]= CANDIDATE_MB_TYPE_INTRA; //FIXME cleanup
1399 }else 1395 }else
1400 s->current_picture.mb_type[mb_y*s->mb_stride + mb_x]= 0; 1396 s->current_picture.mb_type[mb_y*s->mb_stride + mb_x]= 0;
1401 1397
1402 if (vard <= 64<<8 || vard < varc) { //FIXME 1398 {
1403 c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc); 1399 int p_score= FFMIN(vard, varc-500+(s->lambda2>>FF_LAMBDA_SHIFT)*100);
1404 }else{ 1400 int i_score= varc-500+(s->lambda2>>FF_LAMBDA_SHIFT)*20;
1405 c->scene_change_score+= s->qscale * s->avctx->scenechange_factor; 1401 c->scene_change_score+= ff_sqrt(p_score) - ff_sqrt(i_score);
1406 } 1402 }
1407 } 1403 }
1408 1404
1409 s->mb_type[mb_y*s->mb_stride + mb_x]= mb_type; 1405 s->mb_type[mb_y*s->mb_stride + mb_x]= mb_type;
1410 } 1406 }