X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=images%2Fsig-seg.c;h=8deeca91677d98ebec30b70ce48183885ba285e6;hb=c4bf633211b0424492b5a3937d6a6d2e0d79a4cf;hp=7e6e09f5a2a802ad1e71870848af0e9883ff65b2;hpb=3cbca97fcc3bd2708329315fa60e535ba319b9d2;p=libucw.git diff --git a/images/sig-seg.c b/images/sig-seg.c index 7e6e09f5..8deeca91 100644 --- a/images/sig-seg.c +++ b/images/sig-seg.c @@ -7,9 +7,9 @@ * of the GNU Lesser General Public License. */ -#define LOCAL_DEBUG +#undef LOCAL_DEBUG -#include "sherlock/sherlock.h" +#include "lib/lib.h" #include "lib/conf.h" #include "lib/heap.h" #include "images/images.h" @@ -68,7 +68,9 @@ static void prequant_finish_region(struct image_sig_region *region) { if (region->count < 2) - memcpy(region->c, region->a, sizeof(region->c)); + { + region->e = 0; + } else { u64 a = 0; @@ -120,13 +122,13 @@ prequant(struct image_sig_block *blocks, uns blocks_count, struct image_sig_regi DBG("Step... regions_count=%u heap_count=%u region->count=%u, region->e=%u", regions_count, heap_count, region->count, (uns)region->e); if (region->count < 2 || - region->e < image_sig_prequant_thresholds[regions_count - 1] * region->count) + region->e < image_sig_prequant_thresholds[regions_count - 1] * blocks_count) { HEAP_DELMIN(struct image_sig_region *, heap, heap_count, prequant_heap_cmp, HEAP_SWAP); continue; } - /* Select axis to split - the one with maximum covariance */ + /* Select axis to split - the one with maximum average quadratic error */ axis = 0; u64 cov = (u64)region->count * region->c[0] - (u64)region->b[0] * region->b[0]; for (uns i = 1; i < 6; i++) @@ -174,7 +176,7 @@ prequant(struct image_sig_block *blocks, uns blocks_count, struct image_sig_regi cval++; } } - + /* Select split value - to minimize error */ uns b1 = val[0] * cnt[0]; uns c1 = isqr(val[0]) * cnt[0]; @@ -193,14 +195,14 @@ prequant(struct image_sig_block *blocks, uns blocks_count, struct image_sig_regi c2 -= c0; i += cnt[k]; j -= cnt[k]; - u64 err = (u64)c1 - (u64)b1 * b1 / i + (u64)c2 - (u64)b2 * b2 / j; + u64 err = (u64)c1 - (u64)b1 * b1 / i + (u64)c2 - (u64)b2 * b2 / j; if (err < best_err) { best_err = err; split_val = val[k]; } } - DBG("split_val=%u best_err=%Lu b[axis]=%u c[axis]=%u", split_val, (long long)best_err, region->b[axis], region->c[axis]); + DBG("split_val=%u best_err=%llu b[axis]=%u c[axis]=%u", split_val, (long long)best_err, region->b[axis], region->c[axis]); /* Split region */ block = region->blocks; @@ -324,7 +326,7 @@ postquant(struct image_sig_block *blocks, uns blocks_count, struct image_sig_reg if (error > last_error) break; u64 dif = last_error - error; - if (dif * image_sig_postquant_threshold < last_error * 100) + if (dif * image_sig_postquant_threshold < (u64)last_error * 100) break; } }