comparison motion_est.c @ 3061:259fed5adf5d libavcodec

sc_factor support for encoding. Here's the description I'll add to the mplayer man page: --- Causes frames with higher quantizers to be more likely to trigger a scene change detection and make libavcodec use an I-frame (default: 1). 1-16 is a sane range. Values between 2 and 6 may yield increasing PSNR (up to approximately 0.04 dB) and better placement of I-frames in high-motion scenes. Higher values than 6 may give very slightly better PSNR (approximately 0.01 dB more than sc_factor=6), but noticably worse visual quality. --- Original idea from Michael; patch by me.
author corey
date Sun, 22 Jan 2006 20:54:52 +0000
parents 0b546eab515d
children 8d1b2cc2a75b
comparison
equal deleted inserted replaced
3060:a2f611d6c34d 3061:259fed5adf5d
1177 pic->mc_mb_var[s->mb_stride * mb_y + mb_x] = (vard+128)>>8; 1177 pic->mc_mb_var[s->mb_stride * mb_y + mb_x] = (vard+128)>>8;
1178 c->mc_mb_var_sum_temp += (vard+128)>>8; 1178 c->mc_mb_var_sum_temp += (vard+128)>>8;
1179 if (vard <= 64<<8 || vard < varc) { //FIXME 1179 if (vard <= 64<<8 || vard < varc) { //FIXME
1180 c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc); 1180 c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc);
1181 }else{ 1181 }else{
1182 c->scene_change_score+= s->qscale; 1182 c->scene_change_score+= s->qscale * s->avctx->scenechange_factor;
1183 } 1183 }
1184 return; 1184 return;
1185 } 1185 }
1186 if((vard+128)>>8 < c->avctx->mb_threshold) 1186 if((vard+128)>>8 < c->avctx->mb_threshold)
1187 mb_type= s->mb_type[mb_x + mb_y*s->mb_stride]; 1187 mb_type= s->mb_type[mb_x + mb_y*s->mb_stride];
1268 #endif 1268 #endif
1269 if(mb_type){ 1269 if(mb_type){
1270 if (vard <= 64<<8 || vard < varc) 1270 if (vard <= 64<<8 || vard < varc)
1271 c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc); 1271 c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc);
1272 else 1272 else
1273 c->scene_change_score+= s->qscale; 1273 c->scene_change_score+= s->qscale * s->avctx->scenechange_factor;
1274 1274
1275 if(mb_type == CANDIDATE_MB_TYPE_INTER){ 1275 if(mb_type == CANDIDATE_MB_TYPE_INTER){
1276 c->sub_motion_search(s, &mx, &my, dmin, 0, 0, 0, 16); 1276 c->sub_motion_search(s, &mx, &my, dmin, 0, 0, 0, 16);
1277 set_p_mv_tables(s, mx, my, 1); 1277 set_p_mv_tables(s, mx, my, 1);
1278 }else{ 1278 }else{
1289 } 1289 }
1290 }else if(c->avctx->mb_decision > FF_MB_DECISION_SIMPLE){ 1290 }else if(c->avctx->mb_decision > FF_MB_DECISION_SIMPLE){
1291 if (vard <= 64<<8 || vard < varc) 1291 if (vard <= 64<<8 || vard < varc)
1292 c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc); 1292 c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc);
1293 else 1293 else
1294 c->scene_change_score+= s->qscale; 1294 c->scene_change_score+= s->qscale * s->avctx->scenechange_factor;
1295 1295
1296 if (vard*2 + 200*256 > varc) 1296 if (vard*2 + 200*256 > varc)
1297 mb_type|= CANDIDATE_MB_TYPE_INTRA; 1297 mb_type|= CANDIDATE_MB_TYPE_INTRA;
1298 if (varc*2 + 200*256 > vard){ 1298 if (varc*2 + 200*256 > vard){
1299 mb_type|= CANDIDATE_MB_TYPE_INTER; 1299 mb_type|= CANDIDATE_MB_TYPE_INTER;
1395 s->current_picture.mb_type[mb_y*s->mb_stride + mb_x]= 0; 1395 s->current_picture.mb_type[mb_y*s->mb_stride + mb_x]= 0;
1396 1396
1397 if (vard <= 64<<8 || vard < varc) { //FIXME 1397 if (vard <= 64<<8 || vard < varc) { //FIXME
1398 c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc); 1398 c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc);
1399 }else{ 1399 }else{
1400 c->scene_change_score+= s->qscale; 1400 c->scene_change_score+= s->qscale * s->avctx->scenechange_factor;
1401 } 1401 }
1402 } 1402 }
1403 1403
1404 s->mb_type[mb_y*s->mb_stride + mb_x]= mb_type; 1404 s->mb_type[mb_y*s->mb_stride + mb_x]= mb_type;
1405 } 1405 }
1841 c->mb_var_sum_temp += (varc+128)>>8;*/ 1841 c->mb_var_sum_temp += (varc+128)>>8;*/
1842 c->mc_mb_var_sum_temp += (vard+128)>>8; 1842 c->mc_mb_var_sum_temp += (vard+128)>>8;
1843 /* if (vard <= 64<<8 || vard < varc) { 1843 /* if (vard <= 64<<8 || vard < varc) {
1844 c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc); 1844 c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc);
1845 }else{ 1845 }else{
1846 c->scene_change_score+= s->qscale; 1846 c->scene_change_score+= s->qscale * s->avctx->scenechange_factor;
1847 }*/ 1847 }*/
1848 return; 1848 return;
1849 } 1849 }
1850 if((vard+128)>>8 < c->avctx->mb_threshold){ 1850 if((vard+128)>>8 < c->avctx->mb_threshold){
1851 type= s->mb_type[mb_y*s->mb_stride + mb_x]; 1851 type= s->mb_type[mb_y*s->mb_stride + mb_x];