detect when iterative_me fails to converge, and stop searching

Originally committed as revision 4868 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Loren Merritt 2006-01-19 09:21:39 +00:00
parent d271481f1a
commit d3ac6ed667
2 changed files with 20 additions and 4 deletions

View File

@ -25,6 +25,8 @@
#include "mpegvideo.h"
#include <zlib.h>
#undef NDEBUG
#include <assert.h>
@ -3301,6 +3303,8 @@ static void iterative_me(SnowContext *s){
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 @@ static void iterative_me(SnowContext *s){
}
}
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;
}

View File

@ -119,10 +119,10 @@ a7ef4746f27be309138c188e327d3ebe *./data/a-ffv1.avi
2653642 ./data/a-ffv1.avi
799d3db687f6cdd7a837ec156efc171f *./data/out.yuv
stddev: 0.00 PSNR:99.99 bytes:7602176
97c7066617d9e6c86a43a2736b3e9f16 *./data/a-snow.avi
1190760 ./data/a-snow.avi
7e4d9c61252ff22b1a0d4e892cc1d957 *./data/out.yuv
stddev: 2.89 PSNR:38.87 bytes:7602176
b7e88c743458e60d59d83554d1e1ace5 *./data/a-snow.avi
1191118 ./data/a-snow.avi
2e0cda9acd71d339d72372a22591500a *./data/out.yuv
stddev: 2.90 PSNR:38.87 bytes:7602176
11fd61ee7e67ef7a7b2a3df973691305 *./data/a-snow53.avi
3533710 ./data/a-snow53.avi
799d3db687f6cdd7a837ec156efc171f *./data/out.yuv