From 058aae3ce7626334013dbc9aef9136ba42464814 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Fri, 9 May 2008 09:02:41 +0000 Subject: [PATCH] Improve motion estimation metric. Patch by Michael Niedermayer Originally committed as revision 13090 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/zmbvenc.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/libavcodec/zmbvenc.c b/libavcodec/zmbvenc.c index 2feeb66605..fbefa7cafc 100644 --- a/libavcodec/zmbvenc.c +++ b/libavcodec/zmbvenc.c @@ -54,6 +54,8 @@ typedef struct ZmbvEncContext { z_stream zstream; } ZmbvEncContext; +static int score_tab[256]; + /** Block comparing function * XXX should be optimized and moved to DSPContext * TODO handle out of edge ME @@ -62,13 +64,18 @@ static inline int block_cmp(uint8_t *src, int stride, uint8_t *src2, int stride2 { int sum = 0; int i, j; + uint8_t histogram[256]={0}; for(j = 0; j < bh; j++){ for(i = 0; i < bw; i++) - sum += src[i] ^ src2[i]; + histogram[src[i] ^ src2[i]]++; src += stride; src2 += stride2; } + + for(i=1; i<256; i++) + sum+= score_tab[histogram[i]]; + return sum; } @@ -235,8 +242,12 @@ static av_cold int encode_init(AVCodecContext *avctx) { ZmbvEncContext * const c = avctx->priv_data; int zret; // Zlib return code + int i; int lvl = 9; + for(i=1; i<256; i++) + score_tab[i]= -i * log2(i/256.0) * 256; + c->avctx = avctx; c->pic.data[0] = NULL;