diff options
author | Juanjo <pulento@users.sourceforge.net> | 2002-02-26 22:14:27 +0000 |
---|---|---|
committer | Juanjo <pulento@users.sourceforge.net> | 2002-02-26 22:14:27 +0000 |
commit | 43f1708f8bb400790b226993ab1e6c3d12564d3b (patch) | |
tree | cb98d6f57b9964653dfc407897d0081429d572f2 /libavcodec | |
parent | 2b9ab1d54a35f7d689b2396cfc59f9dbdcae391f (diff) | |
download | ffmpeg-43f1708f8bb400790b226993ab1e6c3d12564d3b.tar.gz |
- Added PSNR feature to libavcodec and ffmpeg. By now just Y PSNR until I'm
sure it works ok. Also it's slow, so use it only when you _really_ need to
measure quality.
- Fix libavcodec Makefile to enable profiling.
Originally committed as revision 314 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/Makefile | 5 | ||||
-rw-r--r-- | libavcodec/avcodec.h | 6 | ||||
-rw-r--r-- | libavcodec/dsputil.c | 35 | ||||
-rw-r--r-- | libavcodec/dsputil.h | 6 | ||||
-rw-r--r-- | libavcodec/i386/mpegvideo_mmx.c | 16 | ||||
-rw-r--r-- | libavcodec/mpegvideo.c | 6 |
6 files changed, 66 insertions, 8 deletions
diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 4898e86a55..fe124a4a1c 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -16,6 +16,11 @@ OBJS+= ac3dec.o \ libac3/imdct.o libac3/parse.o endif +ifeq ($(TARGET_GPROF),yes) +CFLAGS+=-p +LDFLAGS+=-p +endif + # i386 mmx specific stuff ifeq ($(TARGET_MMX),yes) OBJS += i386/fdct_mmx.o i386/cputest.o \ diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index cc374c1cab..d8abfded9b 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -123,6 +123,12 @@ typedef struct AVCodecContext { /* with a Start Code (it should) H.263 does */ void (*rtp_callback)(void *data, int size, int packet_number); + /* These are for PSNR calculation, if you set get_psnr to 1 */ + /* after encoding you will have the PSNR on psnr_y/cb/cr */ + int get_psnr; + float psnr_y; + float psnr_cb; + float psnr_cr; /* the following fields are ignored */ void *opaque; /* can be used to carry app specific stuff */ diff --git a/libavcodec/dsputil.c b/libavcodec/dsputil.c index 701cb9969a..09c4c231fe 100644 --- a/libavcodec/dsputil.c +++ b/libavcodec/dsputil.c @@ -18,6 +18,7 @@ */ #include <stdlib.h> #include <stdio.h> +#include <math.h> #include "avcodec.h" #include "dsputil.h" #include "simple_idct.h" @@ -576,3 +577,37 @@ void dsputil_init(void) build_zigzag_end(); } + +void get_psnr(UINT8 *orig_image[3], UINT8 *coded_image[3], + int orig_linesize[3], int coded_linesize, + AVCodecContext *avctx) +{ + int quad, diff, x, y; + UINT8 *orig, *coded; + UINT32 *sq = squareTbl + 256; + + quad = 0; + diff = 0; + + /* Luminance */ + orig = orig_image[0]; + coded = coded_image[0]; + + for (y=0;y<avctx->height;y++) { + for (x=0;x<avctx->width;x++) { + diff = *(orig + x) - *(coded + x); + quad += sq[diff]; + } + orig += orig_linesize[0]; + coded += coded_linesize; + } + + avctx->psnr_y = (float) quad / (float) (avctx->width * avctx->height); + + if (avctx->psnr_y) { + avctx->psnr_y = (float) (255 * 255) / avctx->psnr_y; + avctx->psnr_y = 10 * (float) log10 (avctx->psnr_y); + } else + avctx->psnr_y = 99.99; +} + diff --git a/libavcodec/dsputil.h b/libavcodec/dsputil.h index bb57b09433..ed264c83b7 100644 --- a/libavcodec/dsputil.h +++ b/libavcodec/dsputil.h @@ -2,6 +2,7 @@ #define DSPUTIL_H #include "common.h" +#include "avcodec.h" /* dct code */ typedef short DCTELEM; @@ -138,4 +139,9 @@ void dsputil_init_alpha(void); #endif +/* PSNR */ +void get_psnr(UINT8 *orig_image[3], UINT8 *coded_image[3], + int orig_linesize[3], int coded_linesize, + AVCodecContext *avctx); + #endif diff --git a/libavcodec/i386/mpegvideo_mmx.c b/libavcodec/i386/mpegvideo_mmx.c index 017e3d4881..f23bdd827a 100644 --- a/libavcodec/i386/mpegvideo_mmx.c +++ b/libavcodec/i386/mpegvideo_mmx.c @@ -96,14 +96,14 @@ static void dct_unquantize_h263_mmx(MpegEncContext *s, block[0] = block[0] * s->c_dc_scale; } for(i=1; i<8; i++) { - level = block[i]; - if (level) { - if (level < 0) { - level = level * qmul - qadd; - } else { - level = level * qmul + qadd; - } - block[i] = level; + level = block[i]; + if (level) { + if (level < 0) { + level = level * qmul - qadd; + } else { + level = level * qmul + qadd; + } + block[i] = level; } } nCoeffs=64; diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index 7c866b794d..6c4e372e1a 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -522,6 +522,12 @@ int MPV_encode_picture(AVCodecContext *avctx, s->total_bits += (pbBufPtr(&s->pb) - s->pb.buf) * 8; avctx->quality = s->qscale; + if (avctx->get_psnr) { + /* At this point pict->data should have the original frame */ + /* an s->current_picture should have the coded/decoded frame */ + get_psnr(pict->data, s->current_picture, + pict->linesize, s->linesize, avctx); + } return pbBufPtr(&s->pb) - s->pb.buf; } |