From: Limin Wang <lance.lmw...@gmail.com> Signed-off-by: Limin Wang <lance.lmw...@gmail.com> --- libavfilter/af_loudnorm.c | 41 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-)
diff --git a/libavfilter/af_loudnorm.c b/libavfilter/af_loudnorm.c index 3012aa2471..380d0570d4 100644 --- a/libavfilter/af_loudnorm.c +++ b/libavfilter/af_loudnorm.c @@ -96,6 +96,7 @@ typedef struct LoudNormContext { int above_threshold; int prev_nb_samples; int channels; + int pass; FFEBUR128State *r128_in; FFEBUR128State *r128_out; @@ -128,6 +129,7 @@ static const AVOption loudnorm_options[] = { { "compact", 0, 0, AV_OPT_TYPE_CONST, {.i64 = COMPACT}, 0, 0, FLAGS, "print_format" }, { "file", "set file path for the measured stats", OFFSET(filename), AV_OPT_TYPE_STRING, {.str=NULL}, FLAGS }, { "f", "set file path for the measured stats", OFFSET(filename), AV_OPT_TYPE_STRING, {.str=NULL}, FLAGS }, + { "pass", "enable two pass stats for measure", OFFSET(pass), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 2, FLAGS }, { NULL } }; @@ -833,11 +835,42 @@ static av_cold int init(AVFilterContext *ctx) } if (s->print_format != NONE && s->filename) { + if (s->pass == 1 && s->print_format != COMPACT) { + av_log(ctx, AV_LOG_ERROR, "first pass must be in compact format\n"); + return AVERROR_INVALIDDATA; + } s->print = print_file; } else { s->print = print_log; } + /* load first pass stats for second pass*/ + if (s->filename && s->pass == 2) { + char buf[1024] = { 0 }; + FILE *f = av_fopen_utf8(s->filename, "r"); + if (!f) { + av_log(ctx, AV_LOG_ERROR, "Could not open %s\n", s->filename); + return AVERROR_INVALIDDATA; + } + + if (fgets(buf, sizeof(buf)-1, f)) { + if (sscanf(buf, "input_i: %lf, input_tp: %lf, input_lra: %lf, input_thresh: %lf, target_offset: %lf\n", + &s->measured_i, &s->measured_lra, &s->measured_tp, &s->measured_thresh, + &s->offset) != 5) { + av_log(ctx, AV_LOG_ERROR, "Invalid first pass stats file(%s) for parse\n", s->filename); + return AVERROR_INVALIDDATA; + } + av_log(ctx, AV_LOG_INFO, "load first pass stats: measured_i %.2f, measured_lra: %.2f, " + "measured_tp: %.2f, measured_thresh: %.2f, target_offset: %.2f\n", + s->measured_i, s->measured_lra, s->measured_tp, s->measured_thresh, s->offset); + } else { + av_log(ctx, AV_LOG_ERROR, "Invalid first pass stats file(%s) for parse\n", s->filename); + return AVERROR_INVALIDDATA; + } + + fclose(f); + } + if (s->filename) { int ret = avio_open(&s->pb, s->filename, AVIO_FLAG_WRITE); if (ret < 0) { @@ -912,7 +945,13 @@ static av_cold void uninit(AVFilterContext *ctx) break; case COMPACT: - s->print(ctx, "input_i: %.2f, input_tp: %.2f, input_lra: %.2f, input_thresh: %.2f, " + if (s->pass == 1) + s->print(ctx, "input_i: %.2f, input_tp: %.2f, input_lra: %.2f, input_thresh: %.2f, " + "target_offset: %.2f \n", + i_in, 20. * log10(tp_in), lra_in, thresh_in, + s->target_i - i_out); + else + s->print(ctx, "input_i: %.2f, input_tp: %.2f, input_lra: %.2f, input_thresh: %.2f, " "output_i: %.2f, output_tp: %.2f, output_lra: %.2f, output_thresh: %.2f, " "normalization_type: %s, target_offset: %.2f\n", i_in, 20. * log10(tp_in), lra_in, thresh_in, -- 2.21.0 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".