avfilter/vf_psnr: Add max value output option to psnr stats log.
authorLucas Cooper <bobobo-at-google.com@ffmpeg.org>
Wed, 31 Aug 2016 19:40:41 +0000 (12:40 -0700)
committerMichael Niedermayer <michael@niedermayer.cc>
Thu, 1 Sep 2016 09:54:31 +0000 (11:54 +0200)
This allows retroactive calculation/aggregation of PSNR from the stats
log.

Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
doc/filters.texi
libavfilter/vf_psnr.c

index b50d7a6..88c6f65 100644 (file)
@@ -10832,6 +10832,12 @@ standard output.
 Specifies which version of the stats file format to use. Details of
 each format are written below.
 Default value is 1.
+
+@item stats_add_max
+Determines whether the max value is output to the stats log.
+Default value is 0.
+Requires stats_version >= 2. If this is set and stats_version < 2,
+the filter will return an error.
 @end table
 
 The file printed if @var{stats_file} is selected, contains a sequence of
@@ -10868,6 +10874,10 @@ frames for the component specified by the suffix.
 @item psnr_y, psnr_u, psnr_v, psnr_r, psnr_g, psnr_b, psnr_a
 Peak Signal to Noise ratio of the compared frames for the component
 specified by the suffix.
+
+@item max_avg, max_y, max_u, max_v
+Maximum allowed value for each channel, and average over all
+channels.
 @end table
 
 For example:
index 3bec747..320f433 100644 (file)
@@ -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 {