1
0
mirror of https://github.com/mpv-player/mpv synced 2024-12-26 09:02:38 +00:00

psnr and debug option added

git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@11921 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
iive 2004-02-04 23:18:25 +00:00
parent 2a3cc7641d
commit a0c452f355

View File

@ -31,6 +31,7 @@
#include <errno.h> #include <errno.h>
#include <math.h> #include <math.h>
#include <limits.h> #include <limits.h>
#include <time.h>
#include "../config.h" #include "../config.h"
#include "../mp_msg.h" #include "../mp_msg.h"
@ -165,6 +166,8 @@ static int xvidenc_stats = 0;
static int xvidenc_max_key_interval = 0; /* Let xvidcore set a 10s interval by default */ static int xvidenc_max_key_interval = 0; /* Let xvidcore set a 10s interval by default */
static int xvidenc_frame_drop_ratio = 0; static int xvidenc_frame_drop_ratio = 0;
static int xvidenc_greyscale = 0; static int xvidenc_greyscale = 0;
static int xvidenc_debug = 0;
static int xvidenc_psnr = 0;
static int xvidenc_max_bframes = 2; static int xvidenc_max_bframes = 2;
static int xvidenc_bquant_ratio = 150; static int xvidenc_bquant_ratio = 150;
@ -226,7 +229,9 @@ m_option_t xvidencopts_conf[] =
{"max_key_interval", &xvidenc_max_key_interval, CONF_TYPE_INT, CONF_MIN, 0, 0, NULL}, {"max_key_interval", &xvidenc_max_key_interval, CONF_TYPE_INT, CONF_MIN, 0, 0, NULL},
{"greyscale", &xvidenc_greyscale, CONF_TYPE_FLAG, 0, 0, 1, NULL}, {"greyscale", &xvidenc_greyscale, CONF_TYPE_FLAG, 0, 0, 1, NULL},
{"turbo", &xvidenc_turbo, CONF_TYPE_FLAG, 0, 0, 1, NULL}, {"turbo", &xvidenc_turbo, CONF_TYPE_FLAG, 0, 0, 1, NULL},
{"debug", &xvidenc_debug, CONF_TYPE_INT , 0 ,0,-1,NULL},
{"stats", &xvidenc_stats, CONF_TYPE_FLAG, 0, 0, 1, NULL}, {"stats", &xvidenc_stats, CONF_TYPE_FLAG, 0, 0, 1, NULL},
{"psnr", &xvidenc_psnr , CONF_TYPE_FLAG, 0, 0, 1, NULL},
/* section [quantizer] */ /* section [quantizer] */
@ -298,10 +303,13 @@ typedef struct _xvid_mplayer_module_t
int min_sse_y; int min_sse_y;
int min_sse_u; int min_sse_u;
int min_sse_v; int min_sse_v;
int min_framenum;
int max_sse_y; int max_sse_y;
int max_sse_u; int max_sse_u;
int max_sse_v; int max_sse_v;
int max_framenum;
int pixels;
int d_width, d_height; int d_width, d_height;
} xvid_mplayer_module_t; } xvid_mplayer_module_t;
@ -387,36 +395,34 @@ uninit(struct vf_instance_s* vf)
/* Display stats */ /* Display stats */
if(mod->frames) { if(mod->frames) {
int pixels;
mod->sse_y /= mod->frames; mod->sse_y /= mod->frames;
mod->sse_u /= mod->frames; mod->sse_u /= mod->frames;
mod->sse_v /= mod->frames; mod->sse_v /= mod->frames;
pixels = mod->create.width*mod->create.height;
#define SSE2PSNR(sse, nbpixels) \ #define SSE2PSNR(sse, nbpixels) \
((!(sse)) ? 99.99f : 48.131f - 10*(double)log10((double)(sse)/(double)((nbpixels)))) ((!(sse)) ? 99.99f : 48.131f - 10*(double)log10((double)(sse)/(double)((nbpixels))))
mp_msg(MSGT_MENCODER, MSGL_INFO, mp_msg(MSGT_MENCODER, MSGL_INFO,
"The value 99.99dB is a special value and represents " "The value 99.99dB is a special value and represents "
"the upper range limit\n"); "the upper range limit\n");
mp_msg(MSGT_MENCODER, MSGL_INFO, mp_msg(MSGT_MENCODER, MSGL_INFO,
"xvid: Min PSNR y : %.2f dB, u : %.2f dB, v : %.2f dB\n", "xvid: Min PSNR y : %.2f dB, u : %.2f dB, v : %.2f dB, in frame %d\n",
SSE2PSNR(mod->max_sse_y, pixels), SSE2PSNR(mod->max_sse_y, mod->pixels),
SSE2PSNR(mod->max_sse_u, pixels/4), SSE2PSNR(mod->max_sse_u, mod->pixels/4),
SSE2PSNR(mod->max_sse_v, pixels/4)); SSE2PSNR(mod->max_sse_v, mod->pixels/4),
mod->max_framenum);
mp_msg(MSGT_MENCODER, MSGL_INFO, mp_msg(MSGT_MENCODER, MSGL_INFO,
"xvid: Average PSNR y : %.2f dB, u : %.2f dB, v : %.2f dB\n", "xvid: Average PSNR y : %.2f dB, u : %.2f dB, v : %.2f dB, for %d frames\n",
SSE2PSNR(mod->sse_y, pixels), SSE2PSNR(mod->sse_y, mod->pixels),
SSE2PSNR(mod->sse_u, pixels/4), SSE2PSNR(mod->sse_u, mod->pixels/4),
SSE2PSNR(mod->sse_v, pixels/4)); SSE2PSNR(mod->sse_v, mod->pixels/4),
mod->frames);
mp_msg(MSGT_MENCODER, MSGL_INFO, mp_msg(MSGT_MENCODER, MSGL_INFO,
"xvid: Max PSNR y : %.2f dB, u : %.2f dB, v : %.2f dB\n", "xvid: Max PSNR y : %.2f dB, u : %.2f dB, v : %.2f dB, in frame %d\n",
SSE2PSNR(mod->min_sse_y, pixels), SSE2PSNR(mod->min_sse_y, mod->pixels),
SSE2PSNR(mod->min_sse_u, pixels/4), SSE2PSNR(mod->min_sse_u, mod->pixels/4),
SSE2PSNR(mod->min_sse_v, pixels/4)); SSE2PSNR(mod->min_sse_v, mod->pixels/4),
mod->min_framenum);
} }
#undef SSE2PSNR
/* ToDo: free matrices, and some string settings (quant method, matrix /* ToDo: free matrices, and some string settings (quant method, matrix
* filenames...) */ * filenames...) */
@ -495,7 +501,6 @@ put_image(struct vf_instance_s* vf, mp_image_t *mpi)
/* Did xvidcore returned stats about an encoded frame ? (asynchronous) */ /* Did xvidcore returned stats about an encoded frame ? (asynchronous) */
if(xvidenc_stats && stats.type > 0) { if(xvidenc_stats && stats.type > 0) {
mod->frames++;
mod->sse_y += stats.sse_y; mod->sse_y += stats.sse_y;
mod->sse_u += stats.sse_u; mod->sse_u += stats.sse_u;
mod->sse_v += stats.sse_v; mod->sse_v += stats.sse_v;
@ -504,14 +509,46 @@ put_image(struct vf_instance_s* vf, mp_image_t *mpi)
mod->min_sse_y = stats.sse_y; mod->min_sse_y = stats.sse_y;
mod->min_sse_u = stats.sse_u; mod->min_sse_u = stats.sse_u;
mod->min_sse_v = stats.sse_v; mod->min_sse_v = stats.sse_v;
mod->min_framenum = mod->frames;
} }
if(mod->max_sse_y < stats.sse_y) { if(mod->max_sse_y < stats.sse_y) {
mod->max_sse_y = stats.sse_y; mod->max_sse_y = stats.sse_y;
mod->max_sse_u = stats.sse_u; mod->max_sse_u = stats.sse_u;
mod->max_sse_v = stats.sse_v; mod->max_sse_v = stats.sse_v;
mod->max_framenum = mod->frames;
} }
if (xvidenc_psnr) {
static FILE *fvstats = NULL;
char filename[20];
if (!fvstats) {
time_t today2;
struct tm *today;
today2 = time (NULL);
today = localtime (&today2);
sprintf (filename, "psnr_%02d%02d%02d.log", today->tm_hour, today->tm_min, today->tm_sec);
fvstats = fopen (filename,"w");
if (!fvstats) {
perror ("fopen");
xvidenc_psnr = 0; // disable block
}
}
fprintf (fvstats, "%6d, %2d, %6d, %2.2f, %2.2f, %2.2f, %2.2f %c\n",
mod->frames,
stats.quant,
stats.length,
SSE2PSNR (stats.sse_y, mod->pixels),
SSE2PSNR (stats.sse_u, mod->pixels / 4),
SSE2PSNR (stats.sse_v, mod->pixels / 4),
SSE2PSNR (stats.sse_y + stats.sse_u + stats.sse_v,(double)mod->pixels * 1.5),
stats.type==1?'I':stats.type==2?'P':stats.type==3?'B':stats.type?'S':'?'
);
}
mod->frames++;
} }
#undef SSE2PSNR
/* xvidcore outputed bitstream -- mux it */ /* xvidcore outputed bitstream -- mux it */
muxer_write_chunk(mod->mux, muxer_write_chunk(mod->mux,
@ -590,6 +627,7 @@ vf_open(vf_instance_t *vf, char* args)
/* Initialize the xvid_gbl_init structure */ /* Initialize the xvid_gbl_init structure */
memset(&xvid_gbl_init, 0, sizeof(xvid_gbl_init_t)); memset(&xvid_gbl_init, 0, sizeof(xvid_gbl_init_t));
xvid_gbl_init.version = XVID_VERSION; xvid_gbl_init.version = XVID_VERSION;
xvid_gbl_init.debug = xvidenc_debug;
/* Initialize the xvidcore library */ /* Initialize the xvidcore library */
if (xvid_global(NULL, XVID_GBL_INIT, &xvid_gbl_init, NULL) < 0) { if (xvid_global(NULL, XVID_GBL_INIT, &xvid_gbl_init, NULL) < 0) {
@ -645,6 +683,9 @@ static void dispatch_settings(xvid_mplayer_module_t *mod)
if(xvidenc_closed_gop) if(xvidenc_closed_gop)
create->global |= XVID_GLOBAL_CLOSED_GOP; create->global |= XVID_GLOBAL_CLOSED_GOP;
if(xvidenc_psnr)
xvidenc_stats = 1;
if(xvidenc_stats) if(xvidenc_stats)
create->global |= XVID_GLOBAL_EXTRASTATS_ENABLE; create->global |= XVID_GLOBAL_EXTRASTATS_ENABLE;
@ -858,6 +899,9 @@ static int set_create_struct(xvid_mplayer_module_t *mod)
create->width = mod->mux->bih->biWidth; create->width = mod->mux->bih->biWidth;
create->height = mod->mux->bih->biHeight; create->height = mod->mux->bih->biHeight;
/* Pixels are needed for PSNR calculations */
mod->pixels = create->width * create->height;
/* FPS */ /* FPS */
create->fincr = mod->mux->h.dwScale; create->fincr = mod->mux->h.dwScale;
create->fbase = mod->mux->h.dwRate; create->fbase = mod->mux->h.dwRate;