summaryrefslogtreecommitdiff
path: root/libavcodec/dsputil.c
diff options
context:
space:
mode:
authorJuanjo <pulento@users.sourceforge.net>2002-02-26 22:14:27 +0000
committerJuanjo <pulento@users.sourceforge.net>2002-02-26 22:14:27 +0000
commit43f1708f8bb400790b226993ab1e6c3d12564d3b (patch)
treecb98d6f57b9964653dfc407897d0081429d572f2 /libavcodec/dsputil.c
parent2b9ab1d54a35f7d689b2396cfc59f9dbdcae391f (diff)
- 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/dsputil.c')
-rw-r--r--libavcodec/dsputil.c35
1 files changed, 35 insertions, 0 deletions
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;
+}
+