diff snow.c @ 3053:2991dc513726 libavcodec

detect when iterative_me fails to converge, and stop searching
author lorenm
date Thu, 19 Jan 2006 09:21:39 +0000
parents c0fde3eb7784
children 17494903551b
line wrap: on
line diff
--- a/snow.c	Thu Jan 19 00:19:15 2006 +0000
+++ b/snow.c	Thu Jan 19 09:21:39 2006 +0000
@@ -25,6 +25,8 @@
 
 #include "mpegvideo.h"
 
+#include <zlib.h>
+
 #undef NDEBUG
 #include <assert.h>
 
@@ -3301,6 +3303,8 @@
     const int b_height= s->b_height << s->block_max_depth;
     const int b_stride= b_width;
     int color[3];
+    const int first_crc_pass= 12;
+    uint32_t crcs[50];
 
     for(pass=0; pass<50; pass++){
         int change= 0;
@@ -3435,6 +3439,18 @@
             }
         }
         av_log(NULL, AV_LOG_ERROR, "pass:%d changed:%d\n", pass, change);
+
+        if(pass >= first_crc_pass){
+            int i;
+            //FIXME can we hash just the blocks that were analysed?
+            crcs[pass]= crc32(crc32(0,NULL,0), (void*)s->block, b_stride*b_height*sizeof(BlockNode));
+            for(i=pass-1; i>=first_crc_pass; i--){
+                if(crcs[i] == crcs[pass]){
+                    change= 0;
+                    break;
+                }
+            }
+        }
         if(!change)
             break;
     }