# HG changeset patch # User michaelni # Date 1030045266 0 # Node ID 98e39397636b6a2ff0450c88e128db7853923075 # Parent 5762b2d659d2201529d2a588fb8d5b83522d2550 better scene change detection diff -r 5762b2d659d2 -r 98e39397636b motion_est.c --- a/motion_est.c Wed Aug 21 19:18:02 2002 +0000 +++ b/motion_est.c Thu Aug 22 19:41:06 2002 +0000 @@ -1183,6 +1183,7 @@ sum= (sum+8)>>4; varc = (pix_norm1(pix, s->linesize) - sum*sum + 500 + 128)>>8; vard = (pix_norm(pix, ppix, s->linesize)+128)>>8; + //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); s->mb_var [s->mb_width * mb_y + mb_x] = varc; s->mc_mb_var[s->mb_width * mb_y + mb_x] = vard; @@ -1195,6 +1196,11 @@ varc, s->avg_mb_var, sum, vard, mx - xx, my - yy); #endif if(s->flags&CODEC_FLAG_HQ){ + if (vard <= 64 || vard < varc) + s->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc); + else + s->scene_change_score+= 20; + if (vard*2 + 200 > varc) mb_type|= MB_TYPE_INTRA; if (varc*2 + 200 > vard){ @@ -1221,6 +1227,7 @@ set_p_mv_tables(s, mx, my, 1); }else{ if (vard <= 64 || vard < varc) { + s->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc); mb_type|= MB_TYPE_INTER; if (s->me_method != ME_ZERO) { if(s->me_method >= ME_EPZS) @@ -1251,6 +1258,7 @@ } #endif }else{ + s->scene_change_score+= 20; mb_type|= MB_TYPE_INTRA; mx = 0; my = 0; diff -r 5762b2d659d2 -r 98e39397636b mpegvideo.c --- a/mpegvideo.c Wed Aug 21 19:18:02 2002 +0000 +++ b/mpegvideo.c Thu Aug 22 19:41:06 2002 +0000 @@ -1978,6 +1978,8 @@ if (s->h263_pred && !s->h263_msmpeg4) ff_set_mpeg4_time(s, s->picture_number); + s->scene_change_score=0; + /* Estimate motion for every MB */ if(s->pict_type != I_TYPE){ for(mb_y=0; mb_y < s->mb_height; mb_y++) { @@ -2009,8 +2011,7 @@ memset(s->p_mv_table , 0, sizeof(INT16)*(s->mb_width+2)*(s->mb_height+2)*2); memset(s->mb_type , MB_TYPE_INTRA, sizeof(UINT8)*s->mb_width*s->mb_height); } - - if(s->mb_var_sum < s->mc_mb_var_sum && s->pict_type == P_TYPE){ //FIXME subtract MV bits + if(s->scene_change_score > 0 && s->pict_type == P_TYPE){ s->pict_type= I_TYPE; memset(s->mb_type , MB_TYPE_INTRA, sizeof(UINT8)*s->mb_width*s->mb_height); if(s->max_b_frames==0){ diff -r 5762b2d659d2 -r 98e39397636b mpegvideo.h --- a/mpegvideo.h Wed Aug 21 19:18:02 2002 +0000 +++ b/mpegvideo.h Thu Aug 22 19:41:06 2002 +0000 @@ -195,6 +195,7 @@ uint16_t *me_score_map; /* map to store the SADs */ int me_map_generation; int skip_me; /* set if ME is skiped for the current MB */ + int scene_change_score; int mv_dir; #define MV_DIR_BACKWARD 1 #define MV_DIR_FORWARD 2