comparison motion_est.c @ 608:98e39397636b libavcodec

better scene change detection
author michaelni
date Thu, 22 Aug 2002 19:41:06 +0000
parents 4d41fe7eb780
children c0005de2be59
comparison
equal deleted inserted replaced
607:5762b2d659d2 608:98e39397636b
1181 sum = pix_sum(pix, s->linesize); 1181 sum = pix_sum(pix, s->linesize);
1182 1182
1183 sum= (sum+8)>>4; 1183 sum= (sum+8)>>4;
1184 varc = (pix_norm1(pix, s->linesize) - sum*sum + 500 + 128)>>8; 1184 varc = (pix_norm1(pix, s->linesize) - sum*sum + 500 + 128)>>8;
1185 vard = (pix_norm(pix, ppix, s->linesize)+128)>>8; 1185 vard = (pix_norm(pix, ppix, s->linesize)+128)>>8;
1186
1186 //printf("%d %d %d %X %X %X\n", s->mb_width, mb_x, mb_y,(int)s, (int)s->mb_var, (int)s->mc_mb_var); fflush(stdout); 1187 //printf("%d %d %d %X %X %X\n", s->mb_width, mb_x, mb_y,(int)s, (int)s->mb_var, (int)s->mc_mb_var); fflush(stdout);
1187 s->mb_var [s->mb_width * mb_y + mb_x] = varc; 1188 s->mb_var [s->mb_width * mb_y + mb_x] = varc;
1188 s->mc_mb_var[s->mb_width * mb_y + mb_x] = vard; 1189 s->mc_mb_var[s->mb_width * mb_y + mb_x] = vard;
1189 s->mb_var_sum += varc; 1190 s->mb_var_sum += varc;
1190 s->mc_mb_var_sum += vard; 1191 s->mc_mb_var_sum += vard;
1193 #if 0 1194 #if 0
1194 printf("varc=%4d avg_var=%4d (sum=%4d) vard=%4d mx=%2d my=%2d\n", 1195 printf("varc=%4d avg_var=%4d (sum=%4d) vard=%4d mx=%2d my=%2d\n",
1195 varc, s->avg_mb_var, sum, vard, mx - xx, my - yy); 1196 varc, s->avg_mb_var, sum, vard, mx - xx, my - yy);
1196 #endif 1197 #endif
1197 if(s->flags&CODEC_FLAG_HQ){ 1198 if(s->flags&CODEC_FLAG_HQ){
1199 if (vard <= 64 || vard < varc)
1200 s->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc);
1201 else
1202 s->scene_change_score+= 20;
1203
1198 if (vard*2 + 200 > varc) 1204 if (vard*2 + 200 > varc)
1199 mb_type|= MB_TYPE_INTRA; 1205 mb_type|= MB_TYPE_INTRA;
1200 if (varc*2 + 200 > vard){ 1206 if (varc*2 + 200 > vard){
1201 mb_type|= MB_TYPE_INTER; 1207 mb_type|= MB_TYPE_INTER;
1202 if(s->me_method >= ME_EPZS) 1208 if(s->me_method >= ME_EPZS)
1219 set_p_mv_tables(s, mx, my, 0); 1225 set_p_mv_tables(s, mx, my, 0);
1220 }else 1226 }else
1221 set_p_mv_tables(s, mx, my, 1); 1227 set_p_mv_tables(s, mx, my, 1);
1222 }else{ 1228 }else{
1223 if (vard <= 64 || vard < varc) { 1229 if (vard <= 64 || vard < varc) {
1230 s->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc);
1224 mb_type|= MB_TYPE_INTER; 1231 mb_type|= MB_TYPE_INTER;
1225 if (s->me_method != ME_ZERO) { 1232 if (s->me_method != ME_ZERO) {
1226 if(s->me_method >= ME_EPZS) 1233 if(s->me_method >= ME_EPZS)
1227 dmin= fast_halfpel_motion_search(s, &mx, &my, dmin, rel_xmin, rel_ymin, rel_xmax, rel_ymax, 1234 dmin= fast_halfpel_motion_search(s, &mx, &my, dmin, rel_xmin, rel_ymin, rel_xmax, rel_ymax,
1228 pred_x, pred_y, ref_picture, pix_abs16x16_x2, pix_abs16x16_y2, 1235 pred_x, pred_y, ref_picture, pix_abs16x16_x2, pix_abs16x16_y2,
1249 fprintf(stderr,"\nEarly skip: %d vard: %2d varc: %5d dmin: %d", 1256 fprintf(stderr,"\nEarly skip: %d vard: %2d varc: %5d dmin: %d",
1250 skip, vard, varc, dmin); 1257 skip, vard, varc, dmin);
1251 } 1258 }
1252 #endif 1259 #endif
1253 }else{ 1260 }else{
1261 s->scene_change_score+= 20;
1254 mb_type|= MB_TYPE_INTRA; 1262 mb_type|= MB_TYPE_INTRA;
1255 mx = 0; 1263 mx = 0;
1256 my = 0; 1264 my = 0;
1257 } 1265 }
1258 } 1266 }