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