diff mbox

[FFmpeg-devel] Add max value output option to psnr stats log.

Message ID 1472238617-16213-1-git-send-email-bobobo@google.com
State Superseded
Headers show

Commit Message

Lucas Cooper Aug. 26, 2016, 7:10 p.m. UTC
This allows retroactive calculation/aggregation of PSNR from the stats
log.
---
 libavfilter/vf_psnr.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

Comments

Michael Niedermayer Aug. 27, 2016, 10:13 a.m. UTC | #1
On Fri, Aug 26, 2016 at 12:10:17PM -0700, Lucas Cooper wrote:
> This allows retroactive calculation/aggregation of PSNR from the stats
> log.
> ---
>  libavfilter/vf_psnr.c | 15 +++++++++++++++
>  1 file changed, 15 insertions(+)
> 
> diff --git a/libavfilter/vf_psnr.c b/libavfilter/vf_psnr.c
> index 3bec747..9ad1423 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");

if the user sets output_max without stats_version 2 this would just
silently ignore the option
also missing doc/*.texi update


[...]
Lucas Cooper Aug. 29, 2016, 8:12 p.m. UTC | #2
> if the user sets output_max without stats_version 2 this would just
silently ignore the option

Do you think this warrants a fatal error? A warning seems insufficient as
the output_max option is explicitly requested by the user.

> also missing doc/*.texi update

Should I send that in a followup patch once this one is finalized or would
you prefer them both in the same patch?

On 27 August 2016 at 03:13, Michael Niedermayer <michael@niedermayer.cc>
wrote:

> On Fri, Aug 26, 2016 at 12:10:17PM -0700, Lucas Cooper wrote:
> > This allows retroactive calculation/aggregation of PSNR from the stats
> > log.
> > ---
> >  libavfilter/vf_psnr.c | 15 +++++++++++++++
> >  1 file changed, 15 insertions(+)
> >
> > diff --git a/libavfilter/vf_psnr.c b/libavfilter/vf_psnr.c
> > index 3bec747..9ad1423 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");
>
> if the user sets output_max without stats_version 2 this would just
> silently ignore the option
> also missing doc/*.texi update
>
>
> [...]
>
> --
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> Awnsering whenever a program halts or runs forever is
> On a turing machine, in general impossible (turings halting problem).
> On any real computer, always possible as a real computer has a finite
> number
> of states N, and will either halt in less than N cycles or never halt.
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
>
Michael Niedermayer Aug. 29, 2016, 10:59 p.m. UTC | #3
On Mon, Aug 29, 2016 at 01:12:10PM -0700, Lucas Cooper wrote:
> > if the user sets output_max without stats_version 2 this would just
> silently ignore the option
> 
> Do you think this warrants a fatal error? A warning seems insufficient as
> the output_max option is explicitly requested by the user.

yes


> 
> > also missing doc/*.texi update
> 

> Should I send that in a followup patch once this one is finalized or would
> you prefer them both in the same patch?

iam fine with either but a single patch for docs and corresponding
feature makes more sense to me

thx

[...]
diff mbox

Patch

diff --git a/libavfilter/vf_psnr.c b/libavfilter/vf_psnr.c
index 3bec747..9ad1423 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");
     }