From d4c5d2adf3cb15fd67bad5a916bac52089fdba82 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Mon, 7 Jun 2004 17:30:02 +0000 Subject: nsse weight Originally committed as revision 3205 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/avcodec.h | 11 +++++++++-- libavcodec/dsputil.c | 14 ++++++++------ libavcodec/motion_est.c | 2 +- libavcodec/mpegvideo.c | 6 +++--- 4 files changed, 21 insertions(+), 12 deletions(-) (limited to 'libavcodec') diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 70df542500..de6fd958fc 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -17,7 +17,7 @@ extern "C" { #define FFMPEG_VERSION_INT 0x000408 #define FFMPEG_VERSION "0.4.8" -#define LIBAVCODEC_BUILD 4715 +#define LIBAVCODEC_BUILD 4716 #define LIBAVCODEC_VERSION_INT FFMPEG_VERSION_INT #define LIBAVCODEC_VERSION FFMPEG_VERSION @@ -1591,11 +1591,18 @@ typedef struct AVCodecContext { int mb_threshold; /** - * + * precision of the intra dc coefficient - 8. * - encoding: set by user * - decoding: unused */ int intra_dc_precision; + + /** + * noise vs. sse weight for the nsse comparsion function. + * - encoding: set by user + * - decoding: unused + */ + int nsse_weight; } AVCodecContext; diff --git a/libavcodec/dsputil.c b/libavcodec/dsputil.c index 5c84a139be..4afe743b71 100644 --- a/libavcodec/dsputil.c +++ b/libavcodec/dsputil.c @@ -2587,11 +2587,11 @@ static int pix_abs8_xy2_c(void *v, uint8_t *pix1, uint8_t *pix2, int line_size, return s; } -static int nsse16_c(/*MpegEncContext*/ void *c, uint8_t *s1, uint8_t *s2, int stride, int h){ +static int nsse16_c(MpegEncContext *c, uint8_t *s1, uint8_t *s2, int stride, int h){ int score1=0; int score2=0; int x,y; - + for(y=0; yavctx->nsse_weight; + else return score1 + ABS(score2)*8; } -static int nsse8_c(/*MpegEncContext*/ void *c, uint8_t *s1, uint8_t *s2, int stride, int h){ +static int nsse8_c(MpegEncContext *c, uint8_t *s1, uint8_t *s2, int stride, int h){ int score1=0; int score2=0; int x,y; @@ -2632,7 +2633,8 @@ static int nsse8_c(/*MpegEncContext*/ void *c, uint8_t *s1, uint8_t *s2, int str s2+= stride; } - return score1 + ABS(score2)*8; + if(c) return score1 + ABS(score2)*c->avctx->nsse_weight; + else return score1 + ABS(score2)*8; } static int try_8x8basis_c(int16_t rem[64], int16_t weight[64], int16_t basis[64], int scale){ diff --git a/libavcodec/motion_est.c b/libavcodec/motion_est.c index bee1e07f00..be8465b626 100644 --- a/libavcodec/motion_est.c +++ b/libavcodec/motion_est.c @@ -223,7 +223,6 @@ static inline int get_penalty_factor(MpegEncContext *s, int type){ switch(type&0xFF){ default: case FF_CMP_SAD: - case FF_CMP_NSSE: return s->lambda>>FF_LAMBDA_SHIFT; case FF_CMP_DCT: return (3*s->lambda)>>(FF_LAMBDA_SHIFT+1); @@ -232,6 +231,7 @@ static inline int get_penalty_factor(MpegEncContext *s, int type){ case FF_CMP_RD: case FF_CMP_PSNR: case FF_CMP_SSE: + case FF_CMP_NSSE: return s->lambda2>>FF_LAMBDA_SHIFT; case FF_CMP_BIT: return 1; diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index f402a81269..d3f849ff18 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -3917,9 +3917,9 @@ static int sse_mb(MpegEncContext *s){ if(w==16 && h==16) if(s->avctx->mb_cmp == FF_CMP_NSSE){ - return s->dsp.nsse[0](NULL, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16, s->dest[0], s->linesize, 16) - +s->dsp.nsse[1](NULL, s->new_picture.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,s->dest[1], s->uvlinesize, 8) - +s->dsp.nsse[1](NULL, s->new_picture.data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,s->dest[2], s->uvlinesize, 8); + return s->dsp.nsse[0](s, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16, s->dest[0], s->linesize, 16) + +s->dsp.nsse[1](s, s->new_picture.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,s->dest[1], s->uvlinesize, 8) + +s->dsp.nsse[1](s, s->new_picture.data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,s->dest[2], s->uvlinesize, 8); }else{ return s->dsp.sse[0](NULL, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16, s->dest[0], s->linesize, 16) +s->dsp.sse[1](NULL, s->new_picture.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,s->dest[1], s->uvlinesize, 8) -- cgit v1.2.3