# HG changeset patch # User lorenm # Date 1137662499 0 # Node ID 2991dc5137267c7252eed4d660e92710acfb8982 # Parent 6c3f8730037814f98db55a37ca227edf8324d0bf detect when iterative_me fails to converge, and stop searching diff -r 6c3f87300378 -r 2991dc513726 snow.c --- 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 + #undef NDEBUG #include @@ -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; }