From 3d84da6b8d9e80d477b79726f27efe1b98a35302 Mon Sep 17 00:00:00 2001 From: Frank Galligan Date: Wed, 27 Oct 2010 11:28:56 -0400 Subject: [PATCH] Output the PSNR for the entire file. If --psnr option is enabled vpxenc will output PSNR values for the entire file. Added a \n before final output to make sure the output is on its own line. Overall and Avg psnr matches the values written to opsnr.stt file. Change-Id: I869268b704fe8b0c8389d318cceb6072fea102f8 --- vpxenc.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/vpxenc.c b/vpxenc.c index a8632b887..fc0b779ad 100644 --- a/vpxenc.c +++ b/vpxenc.c @@ -810,6 +810,23 @@ static unsigned int murmur ( const void * key, int len, unsigned int seed ) return h; } +#include "math.h" + +static double vp8_mse2psnr(double Samples, double Peak, double Mse) +{ + double psnr; + + if ((double)Mse > 0.0) + psnr = 10.0 * log10(Peak * Peak * Samples / Mse); + else + psnr = 60; // Limit to prevent / 0 + + if (psnr > 60) + psnr = 60; + + return psnr; +} + #include "args.h" @@ -1049,6 +1066,10 @@ int main(int argc, const char **argv_) int write_webm = 1; EbmlGlobal ebml = {0}; uint32_t hash = 0; + uint64_t psnr_sse_total = 0; + uint64_t psnr_samples_total = 0; + double psnr_totals[4] = {0, 0, 0, 0}; + int psnr_count = 0; exec_name = argv_[0]; @@ -1570,8 +1591,14 @@ int main(int argc, const char **argv_) { int i; + psnr_sse_total += pkt->data.psnr.sse[0]; + psnr_samples_total += pkt->data.psnr.samples[0]; for (i = 0; i < 4; i++) + { fprintf(stderr, "%.3lf ", pkt->data.psnr.psnr[i]); + psnr_totals[i] += pkt->data.psnr.psnr[i]; + } + psnr_count++; } break; @@ -1592,6 +1619,21 @@ int main(int argc, const char **argv_) cx_time > 9999999 ? "ms" : "us", (float)frames_in * 1000000.0 / (float)cx_time); + if ( (show_psnr) && (psnr_count>0) ) + { + int i; + double ovpsnr = vp8_mse2psnr(psnr_samples_total, 255.0, + psnr_sse_total); + + fprintf(stderr, "\nPSNR (Overall/Avg/Y/U/V)"); + + fprintf(stderr, " %.3lf", ovpsnr); + for (i = 0; i < 4; i++) + { + fprintf(stderr, " %.3lf", psnr_totals[i]/psnr_count); + } + } + vpx_codec_destroy(&encoder); fclose(infile);