Mercurial > libavcodec.hg
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; }