On dom, apr 06, 2014 at 04:25:08 +0200, Alessandro Ghedini wrote:
> This adds a new "replaygain_noclip" option to the filter, and, if enabled,
> limits the gain applied for tracks where clipping would occur.
> ---
> Restored the fallback mechanism, if track gain is selected but undefined.
> 
>  doc/filters.texi        |  5 +++++
>  libavfilter/af_volume.c | 25 ++++++++++++++++++-------
>  libavfilter/af_volume.h |  1 +
>  3 files changed, 24 insertions(+), 7 deletions(-)
> 
> diff --git a/doc/filters.texi b/doc/filters.texi
> index f986623..1ed57dd 100644
> --- a/doc/filters.texi
> +++ b/doc/filters.texi
> @@ -639,6 +639,11 @@ Pre-amplification gain in dB to apply to the selected 
> replaygain gain.
>  
>  Default value for @var{replaygain_preamp} is 0.0.
>  
> +@item replaygain_noclip
> +Prevent clipping by limiting the gain applied.
> +
> +Default value for @var{replaygain_noclip} is 1.
> +
>  @end table
>  
>  @subsection Examples
> diff --git a/libavfilter/af_volume.c b/libavfilter/af_volume.c
> index 823fa15..81fb281 100644
> --- a/libavfilter/af_volume.c
> +++ b/libavfilter/af_volume.c
> @@ -61,6 +61,8 @@ static const AVOption options[] = {
>          { "album",  "album gain is preferred",         0, AV_OPT_TYPE_CONST, 
> { .i64 = REPLAYGAIN_ALBUM  }, 0, 0, A, "replaygain" },
>      { "replaygain_preamp", "Apply replaygain pre-amplification",
>              OFFSET(replaygain_preamp), AV_OPT_TYPE_DOUBLE, { .dbl = 0.0 }, 
> -15.0, 15.0, A },
> +    { "replaygain_noclip", "Apply replaygain clipping prevention",
> +            OFFSET(replaygain_noclip), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, 
> A },
>      { NULL },
>  };
>  
> @@ -246,25 +248,34 @@ static int filter_frame(AVFilterLink *inlink, AVFrame 
> *buf)
>      if (sd && vol->replaygain != REPLAYGAIN_IGNORE) {
>          if (vol->replaygain != REPLAYGAIN_DROP) {
>              AVReplayGain *replaygain = (AVReplayGain*)sd->data;
> -            int32_t gain;
> -            float g;
> +            int32_t gain  = 100000;
> +            uint32_t peak = 100000;
> +            float g, p;
>  
> -            if (vol->replaygain == REPLAYGAIN_TRACK &&
> -                replaygain->track_gain != INT32_MIN)
> +            if ((vol->replaygain == REPLAYGAIN_TRACK) &&
> +                (replaygain->track_gain != INT32_MIN)) {
>                  gain = replaygain->track_gain;
> -            else if (replaygain->album_gain != INT32_MIN)
> +
> +                if (replaygain->track_peak != 0)
> +                    peak = replaygain->track_peak;
> +            } else if (replaygain->album_gain != INT32_MIN) {
>                  gain = replaygain->album_gain;
> -            else {
> +
> +                if (replaygain->album_peak != 0)
> +                    peak = replaygain->album_peak;
> +            } else {
>                  av_log(inlink->dst, AV_LOG_WARNING, "Both ReplayGain gain "
>                         "values are unknown.\n");
> -                gain = 100000;
>              }
>              g = gain / 100000.0f;
> +            p = peak / 100000.0f;
>  
>              av_log(inlink->dst, AV_LOG_VERBOSE,
>                     "Using gain %f dB from replaygain side data.\n", g);
>  
>              vol->volume   = pow(10, (g + vol->replaygain_preamp) / 20);
> +            if (vol->replaygain_noclip)
> +                vol->volume = FFMIN(vol->volume, 1.0 / p);
>              vol->volume_i = (int)(vol->volume * 256 + 0.5);
>  
>              volume_init(vol);
> diff --git a/libavfilter/af_volume.h b/libavfilter/af_volume.h
> index d831ec4..6bd89ac 100644
> --- a/libavfilter/af_volume.h
> +++ b/libavfilter/af_volume.h
> @@ -48,6 +48,7 @@ typedef struct VolumeContext {
>      enum PrecisionType precision;
>      enum ReplayGainType replaygain;
>      double replaygain_preamp;
> +    int    replaygain_noclip;
>      double volume;
>      int    volume_i;
>      int    channels;
> -- 
> 1.9.1

Ping?

-- 
perl -E '$_=q;$/= @{[@_]};and s;\S+;<inidehG ordnasselA>;eg;say~~reverse'
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to