[vlc-commits] demux: es: add replaygain from ID3

Francois Cartegnie git at videolan.org
Fri May 26 21:13:02 CEST 2017


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Fri May 26 18:07:47 2017 +0200| [e548661079bac8c9ff6dfb5ada78b901ff1f4f98] | committer: Francois Cartegnie

demux: es: add replaygain from ID3

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=e548661079bac8c9ff6dfb5ada78b901ff1f4f98
---

 modules/demux/mpeg/es.c | 82 +++++++++++++++++++++++++++++++++++++------------
 1 file changed, 62 insertions(+), 20 deletions(-)

diff --git a/modules/demux/mpeg/es.c b/modules/demux/mpeg/es.c
index 3fa6b8cfc8..cbd459be03 100644
--- a/modules/demux/mpeg/es.c
+++ b/modules/demux/mpeg/es.c
@@ -40,6 +40,7 @@
 #include "../../packetizer/a52.h"
 #include "../../packetizer/dts_header.h"
 #include "../meta_engine/ID3Tag.h"
+#include "../meta_engine/ID3Text.h"
 
 /*****************************************************************************
  * Module descriptor
@@ -96,8 +97,6 @@ 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;
 
 typedef struct
@@ -157,6 +156,9 @@ struct demux_sys_t
         bool b_lame;
     } xing;
 
+    float rgf_replay_gain[AUDIO_REPLAY_GAIN_MAX];
+    float rgf_replay_peak[AUDIO_REPLAY_GAIN_MAX];
+
     sync_table_t mllt;
 };
 
@@ -244,23 +246,18 @@ static int OpenCommon( demux_t *p_demux,
         return VLC_EGENERIC;
     }
 
-    if( p_sys->xing.b_lame )
+    es_format_t *p_fmt = &p_sys->p_packetizer->fmt_out;
+    for( int i = 0; i < AUDIO_REPLAY_GAIN_MAX; i++ )
     {
-        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_sys->rgf_replay_gain[i] != 0.0 )
         {
-            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];
-            }
+            p_fmt->audio_replay_gain.pb_gain[i] = true;
+            p_fmt->audio_replay_gain.pf_gain[i] = p_sys->rgf_replay_gain[i];
+        }
+        if ( p_sys->rgf_replay_peak[i] != 0.0 )
+        {
+            p_fmt->audio_replay_gain.pb_peak[i] = true;
+            p_fmt->audio_replay_gain.pf_peak[i] = p_sys->rgf_replay_peak[i];
         }
     }
 
@@ -914,6 +911,51 @@ static int ID3TAG_Parse_Handler( uint32_t i_tag, const uint8_t *p_payload, size_
         }
         return VLC_EGENERIC;
     }
+    else if( i_tag == VLC_FOURCC('T', 'X', 'X', 'X') )
+    {
+        char *psz_alloc;
+        const char *psz = ID3TextConvert( p_payload, i_payload, &psz_alloc );
+        if( psz )
+        {
+            const size_t i_len = 21 + 2;
+            if( i_len < i_payload )
+            {
+                if( !strcasecmp( psz, "REPLAYGAIN_TRACK_GAIN" ) )
+                {
+                    free( psz_alloc );
+                    psz = ID3TextConv( &p_payload[i_len], i_payload - i_len,
+                                       p_payload[0], &psz_alloc );
+                    if( psz )
+                        p_sys->rgf_replay_gain[AUDIO_REPLAY_GAIN_TRACK] = us_atof( psz );
+                }
+                else if( !strcasecmp( psz, "REPLAYGAIN_TRACK_PEAK" ) )
+                {
+                    free( psz_alloc );
+                    psz = ID3TextConv( &p_payload[i_len], i_payload - i_len,
+                                       p_payload[0], &psz_alloc );
+                    if( psz )
+                        p_sys->rgf_replay_peak[AUDIO_REPLAY_GAIN_TRACK] = us_atof( psz );
+                }
+                else if( !strcasecmp( psz, "REPLAYGAIN_ALBUM_GAIN" ) )
+                {
+                    free( psz_alloc );
+                    psz = ID3TextConv( &p_payload[i_len], i_payload - i_len,
+                                       p_payload[0], &psz_alloc );
+                    if( psz )
+                        p_sys->rgf_replay_gain[AUDIO_REPLAY_GAIN_ALBUM] = us_atof( psz );
+                }
+                else if( !strcasecmp( psz, "REPLAYGAIN_ALBUM_PEAK" ) )
+                {
+                    free( psz_alloc );
+                    psz = ID3TextConv( &p_payload[i_len], i_payload - i_len,
+                                       p_payload[0], &psz_alloc );
+                    if( psz )
+                        p_sys->rgf_replay_peak[AUDIO_REPLAY_GAIN_ALBUM] = us_atof( psz );
+                }
+            }
+            free( psz_alloc );
+        }
+    }
 
     return VLC_SUCCESS;
 }
@@ -1027,9 +1069,9 @@ static int MpgaInit( demux_t *p_demux )
         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 );
+        p_sys->rgf_replay_peak[AUDIO_REPLAY_GAIN_TRACK] = (float) MpgaXingLameConvertPeak( peak );
+        p_sys->rgf_replay_gain[AUDIO_REPLAY_GAIN_TRACK] = (float) MpgaXingLameConvertGain( track );
+        p_sys->rgf_replay_gain[AUDIO_REPLAY_GAIN_ALBUM] = (float) MpgaXingLameConvertGain( album );
 
         MpgaXingSkip( &p_xing, &i_xing, 1 ); /* flags */
     }



More information about the vlc-commits mailing list