changeset 608:98e39397636b libavcodec

better scene change detection
author michaelni
date Thu, 22 Aug 2002 19:41:06 +0000
parents 5762b2d659d2
children 153a7ffd289b
files motion_est.c mpegvideo.c mpegvideo.h
diffstat 3 files changed, 12 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- 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;
--- 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){
--- 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