[vlc-devel] [PATCH] demux: mpeg: add support for lame's replaygain extension

Jean-Baptiste Kempf jb at videolan.org
Tue Dec 30 16:30:14 CET 2014


Where is that specified?

On 30 Dec, Anatoliy Anischovich wrote :
> ---
>  modules/demux/mpeg/es.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 80 insertions(+)
> 
> diff --git a/modules/demux/mpeg/es.c b/modules/demux/mpeg/es.c
> index dacd452..85447d9 100644
> --- a/modules/demux/mpeg/es.c
> +++ b/modules/demux/mpeg/es.c
> @@ -91,6 +91,14 @@ typedef struct
>      int  (*pf_init)( demux_t *p_demux );
>  } codec_t;
>  
> +typedef struct
> +{
> +    char  psz_version[10];
> +    int   i_lowpass;
> +    float pf_replay_gain[AUDIO_REPLAY_GAIN_MAX];
> +    float pf_replay_peak[AUDIO_REPLAY_GAIN_MAX];
> +} lame_extra_t;
> +
>  struct demux_sys_t
>  {
>      codec_t codec;
> @@ -124,6 +132,8 @@ struct demux_sys_t
>          int i_bytes;
>          int i_bitrate_avg;
>          int i_frame_samples;
> +        lame_extra_t lame;
> +        bool b_lame;
>      } xing;
>  };
>  
> @@ -209,6 +219,26 @@ static int OpenCommon( demux_t *p_demux,
>          return VLC_EGENERIC;
>      }
>  
> +    if( p_sys->xing.b_lame )
> +    {
> +        lame_extra_t *p_lame = &p_sys->xing.lame;
> +        es_format_t *p_fmt = &p_sys->p_packetizer->fmt_out;
> +
> +        for( int i = 0; i < AUDIO_REPLAY_GAIN_MAX; i++ )
> +        {
> +            if ( p_lame->pf_replay_gain[i] != 0 )
> +            {
> +                p_fmt->audio_replay_gain.pb_gain[i] = true;
> +                p_fmt->audio_replay_gain.pf_gain[i] = p_lame->pf_replay_gain[i];
> +            }
> +            if ( p_lame->pf_replay_peak[i] != 0 )
> +            {
> +                p_fmt->audio_replay_gain.pb_peak[i] = true;
> +                p_fmt->audio_replay_gain.pf_peak[i] = p_lame->pf_replay_peak[i];
> +            }
> +        }
> +    }
> +
>      while( vlc_object_alive( p_demux ) )
>      {
>          if( Parse( p_demux, &p_sys->p_packetized_data ) )
> @@ -743,6 +773,30 @@ static uint32_t MpgaXingGetDWBE( const uint8_t **pp_xing, int *pi_xing, uint32_t
>      return v;
>  }
>  
> +static uint16_t MpgaXingGetWBE( const uint8_t **pp_xing, int *pi_xing, uint16_t i_default )
> +{
> +    if( *pi_xing < 2 )
> +        return i_default;
> +
> +    uint16_t v = GetWBE( *pp_xing );
> +
> +    MpgaXingSkip( pp_xing, pi_xing, 2 );
> +
> +    return v;
> +}
> +
> +static double MpgaXingLameConvertGain( uint16_t x )
> +{
> +    double gain = (x & 0x1FF) / 10.0;
> +
> +    return x & 0x200 ? -gain : gain;
> +}
> +
> +static double MpgaXingLameConvertPeak( uint32_t x )
> +{
> +    return x / 8388608.0; /* pow(2, 23) */
> +}
> +
>  static int MpgaInit( demux_t *p_demux )
>  {
>      demux_sys_t *p_sys = p_demux->p_sys;
> @@ -802,6 +856,32 @@ static int MpgaInit( demux_t *p_demux )
>                   p_sys->xing.i_bytes, p_sys->xing.i_frames,
>                   p_sys->xing.i_frame_samples );
>      }
> +
> +    if( i_xing >= 20 && memcmp( p_xing, "LAME", 4 ) == 0)
> +    {
> +        p_sys->xing.b_lame = true;
> +        lame_extra_t *p_lame = &p_sys->xing.lame;
> +
> +        memcpy( p_lame->psz_version, p_xing, 9 );
> +        p_lame->psz_version[9] = '\0';
> +
> +        MpgaXingSkip( &p_xing, &i_xing, 9 );
> +        MpgaXingSkip( &p_xing, &i_xing, 1 ); /* rev_method */
> +
> +        p_lame->i_lowpass = (*p_xing) * 100;
> +        MpgaXingSkip( &p_xing, &i_xing, 1 );
> +
> +        uint32_t peak  = MpgaXingGetDWBE( &p_xing, &i_xing, 0 );
> +        uint16_t track = MpgaXingGetWBE( &p_xing, &i_xing, 0 );
> +        uint16_t album = MpgaXingGetWBE( &p_xing, &i_xing, 0 );
> +
> +        p_lame->pf_replay_peak[AUDIO_REPLAY_GAIN_TRACK] = (float) MpgaXingLameConvertPeak( peak );
> +        p_lame->pf_replay_gain[AUDIO_REPLAY_GAIN_TRACK] = (float) MpgaXingLameConvertGain( track );
> +        p_lame->pf_replay_gain[AUDIO_REPLAY_GAIN_ALBUM] = (float) MpgaXingLameConvertGain( album );
> +
> +        MpgaXingSkip( &p_xing, &i_xing, 1 ); /* flags */
> +    }
> +
>      return VLC_SUCCESS;
>  }
>  
> -- 
> 1.9.1
> 
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel

-- 
With my kindest regards,

-- 
Jean-Baptiste Kempf
http://www.jbkempf.com/ - +33 672 704 734
Sent from my Electronic Device



More information about the vlc-devel mailing list