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: Ibac5fa9baf8d5a626ea0d6ba161b484e6e8427ee
This commit is contained in:
Frank Galligan 2010-10-27 11:28:56 -04:00 коммит произвёл John Koleszar
Родитель a0ae3682aa
Коммит 483ce40346
1 изменённых файлов: 42 добавлений и 0 удалений

Просмотреть файл

@ -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);