summaryrefslogtreecommitdiff
path: root/libavfilter
diff options
context:
space:
mode:
authorLucas Cooper <bobobo-at-google.com@ffmpeg.org>2016-08-31 12:40:41 -0700
committerMichael Niedermayer <michael@niedermayer.cc>2016-09-01 11:54:31 +0200
commitaabe12eba3758d6f393ba754a54307d5c705084c (patch)
tree9b5d25087988fea160b9d6c59b33415e6fa80d17 /libavfilter
parent2b1d316ff68a3f973d8f342db6bf9755eb78ec10 (diff)
avfilter/vf_psnr: Add max value output option to psnr stats log.
This allows retroactive calculation/aggregation of PSNR from the stats log. Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libavfilter')
-rw-r--r--libavfilter/vf_psnr.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/libavfilter/vf_psnr.c b/libavfilter/vf_psnr.c
index 3bec747573..320f43307e 100644
--- a/libavfilter/vf_psnr.c
+++ b/libavfilter/vf_psnr.c
@@ -45,6 +45,7 @@ typedef struct PSNRContext {
char *stats_file_str;
int stats_version;
int stats_header_written;
+ int stats_add_max;
int max[4], average_max;
int is_rgb;
uint8_t rgba_map[4];
@@ -63,6 +64,7 @@ static const AVOption psnr_options[] = {
{"stats_file", "Set file where to store per-frame difference information", OFFSET(stats_file_str), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },
{"f", "Set file where to store per-frame difference information", OFFSET(stats_file_str), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },
{"stats_version", "Set the format version for the stats file.", OFFSET(stats_version), AV_OPT_TYPE_INT, {.i64=1}, 1, 2, FLAGS },
+ {"output_max", "Add raw stats (max values) to the output log.", OFFSET(stats_add_max), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
{ NULL }
};
@@ -182,6 +184,12 @@ static AVFrame *do_psnr(AVFilterContext *ctx, AVFrame *main,
for (j = 0; j < s->nb_components; j++) {
fprintf(s->stats_file, ",psnr_%c", s->comps[j]);
}
+ if (s->stats_add_max) {
+ fprintf(s->stats_file, ",max_avg");
+ for (j = 0; j < s->nb_components; j++) {
+ fprintf(s->stats_file, ",max_%c", s->comps[j]);
+ }
+ }
fprintf(s->stats_file, "\n");
s->stats_header_written = 1;
}
@@ -196,6 +204,13 @@ static AVFrame *do_psnr(AVFilterContext *ctx, AVFrame *main,
fprintf(s->stats_file, "psnr_%c:%0.2f ", s->comps[j],
get_psnr(comp_mse[c], 1, s->max[c]));
}
+ if (s->stats_version == 2 && s->stats_add_max) {
+ fprintf(s->stats_file, "max_avg:%d ", s->average_max);
+ for (j = 0; j < s->nb_components; j++) {
+ c = s->is_rgb ? s->rgba_map[j] : j;
+ fprintf(s->stats_file, "max_%c:%d ", s->comps[j], s->max[c]);
+ }
+ }
fprintf(s->stats_file, "\n");
}
@@ -210,6 +225,11 @@ static av_cold int init(AVFilterContext *ctx)
s->max_mse = -INFINITY;
if (s->stats_file_str) {
+ if (s->stats_version < 2 && s->stats_add_max) {
+ av_log(ctx, AV_LOG_ERROR,
+ "stats_add_max was specified but stats_version < 2.\n" );
+ return AVERROR(EINVAL);
+ }
if (!strcmp(s->stats_file_str, "-")) {
s->stats_file = stdout;
} else {