diff options
author | Jim Bankoski <jimbankoski@google.com> | 2015-04-22 06:45:56 -0700 |
---|---|---|
committer | Jim Bankoski <jimbankoski@google.com> | 2015-04-22 06:45:56 -0700 |
commit | a6e9ae906641db51acfa7ca9d3aeacb8c435d9a2 (patch) | |
tree | c5430f1c05787f7c6daf386a8f3a26ed8dc20829 | |
parent | e07b141da0e41fcfd6d069604376eade3a321fe9 (diff) | |
download | libvpx-a6e9ae906641db51acfa7ca9d3aeacb8c435d9a2.tar libvpx-a6e9ae906641db51acfa7ca9d3aeacb8c435d9a2.tar.gz libvpx-a6e9ae906641db51acfa7ca9d3aeacb8c435d9a2.tar.bz2 libvpx-a6e9ae906641db51acfa7ca9d3aeacb8c435d9a2.zip |
Adds worst frame metrics for a bunch of metrics.
Change-Id: Ieaccc36ed1bee024bb644a9cfaafdaaa65d31772
-rw-r--r-- | vp9/encoder/vp9_encoder.c | 146 | ||||
-rw-r--r-- | vp9/encoder/vp9_encoder.h | 45 |
2 files changed, 95 insertions, 96 deletions
diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c index e2a6dc2dc..bc09a16f1 100644 --- a/vp9/encoder/vp9_encoder.c +++ b/vp9/encoder/vp9_encoder.c @@ -1644,22 +1644,16 @@ VP9_COMP *vp9_create_compressor(VP9EncoderConfig *oxcf, cpi->b_calculate_blockiness = 1; cpi->b_calculate_consistency = 1; cpi->total_inconsistency = 0; + cpi->psnr.worst = 100.0; + cpi->worst_ssim = 100.0; cpi->count = 0; cpi->bytes = 0; if (cpi->b_calculate_psnr) { - cpi->total_y = 0.0; - cpi->total_u = 0.0; - cpi->total_v = 0.0; - cpi->total = 0.0; cpi->total_sq_error = 0; cpi->total_samples = 0; - cpi->totalp_y = 0.0; - cpi->totalp_u = 0.0; - cpi->totalp_v = 0.0; - cpi->totalp = 0.0; cpi->totalp_sq_error = 0; cpi->totalp_samples = 0; @@ -1671,31 +1665,20 @@ VP9_COMP *vp9_create_compressor(VP9EncoderConfig *oxcf, } if (cpi->b_calculate_ssimg) { - cpi->total_ssimg_y = 0; - cpi->total_ssimg_u = 0; - cpi->total_ssimg_v = 0; - cpi->total_ssimg_all = 0; + cpi->ssimg.worst= 100.0; } - cpi->total_fastssim_y = 0; - cpi->total_fastssim_u = 0; - cpi->total_fastssim_v = 0; - cpi->total_fastssim_all = 0; + cpi->fastssim.worst = 100.0; - cpi->total_psnrhvs_y = 0; - cpi->total_psnrhvs_u = 0; - cpi->total_psnrhvs_v = 0; - cpi->total_psnrhvs_all = 0; - - if (cpi->b_calculate_blockiness) { - cpi->total_blockiness = 0; - } + cpi->psnrhvs.worst = 100.0; if (cpi->b_calculate_blockiness) { cpi->total_blockiness = 0; + cpi->worst_blockiness = 0.0; } if (cpi->b_calculate_consistency) { cpi->ssim_vars = vpx_malloc(sizeof(*cpi->ssim_vars)*720*480); + cpi->worst_consistency = 100.0; } #endif @@ -1900,7 +1883,6 @@ VP9_COMP *vp9_create_compressor(VP9EncoderConfig *oxcf, #define SNPRINT2(H, T, V) \ snprintf((H) + strlen(H), sizeof(H) - strlen(H), (T), (V)) - void vp9_remove_compressor(VP9_COMP *cpi) { VP9_COMMON *const cm = &cpi->common; unsigned int i; @@ -1934,20 +1916,29 @@ void vp9_remove_compressor(VP9_COMP *cpi) { (double)cpi->totalp_sq_error); const double total_ssim = 100 * pow(cpi->summed_quality / cpi->summed_weights, 8.0); + const double totalp_ssim = 100 * pow(cpi->summedp_quality / + cpi->summedp_weights, 8.0); snprintf(headings, sizeof(headings), "Bitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\tGLPsnrP\t" - "VPXSSIM\tFASTSIM\tPSNRHVS"); + "VPXSSIM\tVPSSIMP\tFASTSIM\tPSNRHVS\t" + "WstPsnr\tWstSsim\tWstFast\tWstHVS"); snprintf(results, sizeof(results), "%7.2f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t" - "%7.3f\t%7.3f\t%7.3f", dr, - cpi->total / cpi->count, total_psnr, - cpi->totalp / cpi->count, totalp_psnr, total_ssim, - cpi->total_fastssim_all / cpi->count, - cpi->total_psnrhvs_all / cpi->count); + "%7.3f\t%7.3f\t%7.3f\t%7.3f" + "%7.3f\t%7.3f\t%7.3f\t%7.3f", + dr, cpi->psnr.stat[ALL] / cpi->count, total_psnr, + cpi->psnrp.stat[ALL] / cpi->count, totalp_psnr, + total_ssim, totalp_ssim, + cpi->fastssim.stat[ALL] / cpi->count, + cpi->psnrhvs.stat[ALL] / cpi->count, + cpi->psnr.worst, cpi->worst_ssim, cpi->fastssim.worst, + cpi->psnrhvs.worst); + if (cpi->b_calculate_blockiness) { - SNPRINT(headings, "\t Block"); + SNPRINT(headings, "\t Block\tWstBlck"); SNPRINT2(results, "\t%7.3f", cpi->total_blockiness / cpi->count); + SNPRINT2(results, "\t%7.3f", cpi->worst_blockiness); } if (cpi->b_calculate_consistency) { @@ -1955,13 +1946,15 @@ void vp9_remove_compressor(VP9_COMP *cpi) { vpx_sse_to_psnr((double)cpi->totalp_samples, peak, (double)cpi->total_inconsistency); - SNPRINT(headings, "\tConsist"); + SNPRINT(headings, "\tConsist\tWstCons"); SNPRINT2(results, "\t%7.3f", consistency); + SNPRINT2(results, "\t%7.3f", cpi->worst_consistency); } if (cpi->b_calculate_ssimg) { - SNPRINT(headings, "\t SSIMG"); - SNPRINT2(results, "\t%7.3f", cpi->total_ssimg_all / cpi->count); + SNPRINT(headings, "\t SSIMG\tWtSSIMG"); + SNPRINT2(results, "\t%7.3f", cpi->ssimg.stat[ALL] / cpi->count); + SNPRINT2(results, "\t%7.3f", cpi->ssimg.worst); } fprintf(f, "%s\t Time\n", headings); @@ -3881,6 +3874,14 @@ extern double vp9_get_blockiness(const unsigned char *img1, int img1_pitch, int width, int height); #endif +void adjust_image_stat(double y, double u, double v, double all, ImageStat *s) { + s->stat[Y] += y; + s->stat[U] += u; + s->stat[V] += v; + s->stat[ALL] += all; + s->worst = MIN(s->worst, all); +} + int vp9_get_compressed_data(VP9_COMP *cpi, unsigned int *frame_flags, size_t *size, uint8_t *dest, int64_t *time_stamp, int64_t *time_end, int flush) { @@ -4133,6 +4134,7 @@ int vp9_get_compressed_data(VP9_COMP *cpi, unsigned int *frame_flags, #if CONFIG_INTERNAL_STATS if (oxcf->pass != 1) { + double samples; cpi->bytes += (int)(*size); if (cm->show_frame) { @@ -4150,12 +4152,11 @@ int vp9_get_compressed_data(VP9_COMP *cpi, unsigned int *frame_flags, calc_psnr(orig, recon, &psnr); #endif // CONFIG_VP9_HIGHBITDEPTH - cpi->total += psnr.psnr[0]; - cpi->total_y += psnr.psnr[1]; - cpi->total_u += psnr.psnr[2]; - cpi->total_v += psnr.psnr[3]; + adjust_image_stat(psnr.psnr[1], psnr.psnr[2], psnr.psnr[3], + psnr.psnr[0], &cpi->psnr); cpi->total_sq_error += psnr.sse[0]; cpi->total_samples += psnr.samples[0]; + samples = psnr.samples[0]; { PSNR_STATS psnr2; @@ -4185,12 +4186,10 @@ int vp9_get_compressed_data(VP9_COMP *cpi, unsigned int *frame_flags, calc_psnr(orig, pp, &psnr2); #endif // CONFIG_VP9_HIGHBITDEPTH - cpi->totalp += psnr2.psnr[0]; - cpi->totalp_y += psnr2.psnr[1]; - cpi->totalp_u += psnr2.psnr[2]; - cpi->totalp_v += psnr2.psnr[3]; cpi->totalp_sq_error += psnr2.sse[0]; cpi->totalp_samples += psnr2.samples[0]; + adjust_image_stat(psnr2.psnr[1], psnr2.psnr[2], psnr2.psnr[3], + psnr2.psnr[0], &cpi->psnrp); #if CONFIG_VP9_HIGHBITDEPTH if (cm->use_highbitdepth) { @@ -4203,6 +4202,7 @@ int vp9_get_compressed_data(VP9_COMP *cpi, unsigned int *frame_flags, frame_ssim2 = vp9_calc_ssim(orig, recon, &weight); #endif // CONFIG_VP9_HIGHBITDEPTH + cpi->worst_ssim= MIN(cpi->worst_ssim, frame_ssim2); cpi->summed_quality += frame_ssim2 * weight; cpi->summed_weights += weight; @@ -4230,22 +4230,33 @@ int vp9_get_compressed_data(VP9_COMP *cpi, unsigned int *frame_flags, #endif } } - if (cpi->b_calculate_blockiness) - cpi->total_blockiness += - vp9_get_blockiness(cpi->Source->y_buffer, cpi->Source->y_stride, - cm->frame_to_show->y_buffer, - cm->frame_to_show->y_stride, - cpi->Source->y_width, cpi->Source->y_height); - - if (cpi->b_calculate_consistency) - cpi->total_inconsistency += vp9_get_ssim_metrics(cpi->Source->y_buffer, - cpi->Source->y_stride, - cm->frame_to_show->y_buffer, - cm->frame_to_show->y_stride, - cpi->Source->y_width, - cpi->Source->y_height, - cpi->ssim_vars, - &cpi->metrics, 1); + if (cpi->b_calculate_blockiness) { + double frame_blockiness = vp9_get_blockiness( + cpi->Source->y_buffer, cpi->Source->y_stride, + cm->frame_to_show->y_buffer, cm->frame_to_show->y_stride, + cpi->Source->y_width, cpi->Source->y_height); + cpi->worst_blockiness = MAX(cpi->worst_blockiness, frame_blockiness); + cpi->total_blockiness += frame_blockiness; + } + + if (cpi->b_calculate_consistency) { + double this_inconsistency = vp9_get_ssim_metrics( + cpi->Source->y_buffer, cpi->Source->y_stride, + cm->frame_to_show->y_buffer, cm->frame_to_show->y_stride, + cpi->Source->y_width, cpi->Source->y_height, cpi->ssim_vars, + &cpi->metrics, 1); + + const double peak = (double)((1 << cpi->oxcf.input_bit_depth) - 1); + + + double consistency = vpx_sse_to_psnr(samples, peak, + (double)cpi->total_inconsistency); + + if (consistency > 0.0) + cpi->worst_consistency = MIN(cpi->worst_consistency, + consistency); + cpi->total_inconsistency += this_inconsistency; + } if (cpi->b_calculate_ssimg) { double y, u, v, frame_all; @@ -4260,30 +4271,19 @@ int vp9_get_compressed_data(VP9_COMP *cpi, unsigned int *frame_flags, #else frame_all = vp9_calc_ssimg(cpi->Source, cm->frame_to_show, &y, &u, &v); #endif // CONFIG_VP9_HIGHBITDEPTH - cpi->total_ssimg_y += y; - cpi->total_ssimg_u += u; - cpi->total_ssimg_v += v; - cpi->total_ssimg_all += frame_all; + adjust_image_stat(y, u, v, frame_all, &cpi->ssimg); } { double y, u, v, frame_all; frame_all = vp9_calc_fastssim(cpi->Source, cm->frame_to_show, &y, &u, &v); - - cpi->total_fastssim_y += y; - cpi->total_fastssim_u += u; - cpi->total_fastssim_v += v; - cpi->total_fastssim_all += frame_all; + adjust_image_stat(y, u, v, frame_all, &cpi->fastssim); /* TODO(JBB): add 10/12 bit support */ } { double y, u, v, frame_all; frame_all = vp9_psnrhvs(cpi->Source, cm->frame_to_show, &y, &u, &v); - - cpi->total_psnrhvs_y += y; - cpi->total_psnrhvs_u += u; - cpi->total_psnrhvs_v += v; - cpi->total_psnrhvs_all += frame_all; + adjust_image_stat(y, u, v, frame_all, &cpi->psnrhvs); } } } diff --git a/vp9/encoder/vp9_encoder.h b/vp9/encoder/vp9_encoder.h index 9906929cf..41f1c13d4 100644 --- a/vp9/encoder/vp9_encoder.h +++ b/vp9/encoder/vp9_encoder.h @@ -275,6 +275,18 @@ typedef struct ActiveMap { unsigned char *map; } ActiveMap; +typedef enum { + Y, + U, + V, + ALL +} STAT_TYPE; + +typedef struct IMAGE_STAT { + double stat[ALL+1]; + double worst; +} ImageStat; + typedef struct VP9_COMP { QUANTS quants; ThreadData td; @@ -391,21 +403,16 @@ typedef struct VP9_COMP { unsigned int mode_chosen_counts[MAX_MODES]; int count; - double total_y; - double total_u; - double total_v; - double total; uint64_t total_sq_error; uint64_t total_samples; + ImageStat psnr; - double totalp_y; - double totalp_u; - double totalp_v; - double totalp; uint64_t totalp_sq_error; uint64_t totalp_samples; + ImageStat psnrp; double total_blockiness; + double worst_blockiness; int bytes; double summed_quality; @@ -413,27 +420,19 @@ typedef struct VP9_COMP { double summedp_quality; double summedp_weights; unsigned int tot_recode_hits; + double worst_ssim; - - double total_ssimg_y; - double total_ssimg_u; - double total_ssimg_v; - double total_ssimg_all; - - double total_fastssim_y; - double total_fastssim_u; - double total_fastssim_v; - double total_fastssim_all; - - double total_psnrhvs_y; - double total_psnrhvs_u; - double total_psnrhvs_v; - double total_psnrhvs_all; + ImageStat ssimg; + ImageStat fastssim; + ImageStat psnrhvs; int b_calculate_ssimg; int b_calculate_blockiness; + int b_calculate_consistency; + double total_inconsistency; + double worst_consistency; Ssimv *ssim_vars; Metrics metrics; #endif |