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