]> git.sesse.net Git - vlc/blobdiff - src/input/meta.c
decoder: fix potential NULL dereference
[vlc] / src / input / meta.c
index c5efa9cb0f92761bf95518e6ae84cd38ddb8f746..17987e3c2feea498d40241f6686ce4b64aaabf25 100644 (file)
@@ -33,6 +33,7 @@
 #include <vlc_url.h>
 #include <vlc_arrays.h>
 #include <vlc_modules.h>
+#include <vlc_charset.h>
 
 #include "input_internal.h"
 #include "../playlist/art.h"
@@ -49,7 +50,7 @@ struct vlc_meta_t
 /* FIXME bad name convention */
 const char * vlc_meta_TypeToLocalizedString( vlc_meta_type_t meta_type )
 {
-    static const char posix_names[][16] =
+    static const char posix_names[][17] =
     {
         [vlc_meta_Title]       = N_("Title"),
         [vlc_meta_Artist]      = N_("Artist"),
@@ -68,6 +69,12 @@ const char * vlc_meta_TypeToLocalizedString( vlc_meta_type_t meta_type )
         [vlc_meta_EncodedBy]   = N_("Encoded by"),
         [vlc_meta_ArtworkURL]  = N_("Artwork URL"),
         [vlc_meta_TrackID]     = N_("Track ID"),
+        [vlc_meta_TrackTotal]  = N_("Number of Tracks"),
+        [vlc_meta_Director]    = N_("Director"),
+        [vlc_meta_Season]      = N_("Season"),
+        [vlc_meta_Episode]     = N_("Episode"),
+        [vlc_meta_ShowName]    = N_("Show Name"),
+        [vlc_meta_Actors]      = N_("Actors"),
     };
 
     assert (meta_type < (sizeof(posix_names) / sizeof(posix_names[0])));
@@ -115,6 +122,7 @@ void vlc_meta_Delete( vlc_meta_t *m )
 void vlc_meta_Set( vlc_meta_t *p_meta, vlc_meta_type_t meta_type, const char *psz_val )
 {
     free( p_meta->ppsz_meta[meta_type] );
+    assert( psz_val == NULL || IsUTF8( psz_val ) );
     p_meta->ppsz_meta[meta_type] = psz_val ? strdup( psz_val ) : NULL;
 }
 
@@ -196,26 +204,17 @@ void vlc_meta_Merge( vlc_meta_t *dst, const vlc_meta_t *src )
 }
 
 
-void input_ExtractAttachmentAndCacheArt( input_thread_t *p_input )
+void input_ExtractAttachmentAndCacheArt( input_thread_t *p_input,
+                                         const char *name )
 {
     input_item_t *p_item = p_input->p->p_item;
 
-    /* */
-    char *psz_arturl = input_item_GetArtURL( p_item );
-    if( !psz_arturl || strncmp( psz_arturl, "attachment://", strlen("attachment://") ) )
-    {
-        msg_Err( p_input, "internal input error with input_ExtractAttachmentAndCacheArt" );
-        free( psz_arturl );
-        return;
-    }
-
     if( input_item_IsArtFetched( p_item ) )
-    {
-        /* XXX Weird, we should not have end up with attachment:// art url unless there is a race
-         * condition */
-        msg_Warn( p_input, "internal input error with input_ExtractAttachmentAndCacheArt" );
+    {   /* XXX Weird, we should not end up with attachment:// art URL
+         * unless there is a race condition */
+        msg_Warn( p_input, "art already fetched" );
         playlist_FindArtInCache( p_item );
-        goto exit;
+        return;
     }
 
     /* */
@@ -224,38 +223,33 @@ void input_ExtractAttachmentAndCacheArt( input_thread_t *p_input )
     vlc_mutex_lock( &p_item->lock );
     for( int i_idx = 0; i_idx < p_input->p->i_attachment; i_idx++ )
     {
-        if( !strcmp( p_input->p->attachment[i_idx]->psz_name,
-                     &psz_arturl[strlen("attachment://")] ) )
+        input_attachment_t *a = p_input->p->attachment[i_idx];
+
+        if( !strcmp( a->psz_name, name ) )
         {
-            p_attachment = vlc_input_attachment_Duplicate( p_input->p->attachment[i_idx] );
+            p_attachment = vlc_input_attachment_Duplicate( a );
             break;
         }
     }
     vlc_mutex_unlock( &p_item->lock );
 
-    if( !p_attachment || p_attachment->i_data <= 0 )
+    if( p_attachment == NULL )
     {
-        if( p_attachment )
-            vlc_input_attachment_Delete( p_attachment );
-        msg_Warn( p_input, "internal input error with input_ExtractAttachmentAndCacheArt" );
-        goto exit;
+        msg_Warn( p_input, "art attachment %s not found", name );
+        return;
     }
 
     /* */
     const char *psz_type = NULL;
+
     if( !strcmp( p_attachment->psz_mime, "image/jpeg" ) )
         psz_type = ".jpg";
     else if( !strcmp( p_attachment->psz_mime, "image/png" ) )
         psz_type = ".png";
 
-    /* */
     playlist_SaveArt( VLC_OBJECT(p_input), p_item,
                       p_attachment->p_data, p_attachment->i_data, psz_type );
-
     vlc_input_attachment_Delete( p_attachment );
-
-exit:
-    free( psz_arturl );
 }
 
 int input_item_WriteMeta( vlc_object_t *obj, input_item_t *p_item )
@@ -291,3 +285,39 @@ error:
     vlc_object_release( p_export );
     return VLC_EGENERIC;
 }
+
+void vlc_audio_replay_gain_MergeFromMeta( audio_replay_gain_t *p_dst,
+                                          const vlc_meta_t *p_meta )
+{
+    const char * psz_value;
+
+    if( !p_meta )
+        return;
+
+    if( (psz_value = vlc_meta_GetExtra(p_meta, "REPLAYGAIN_TRACK_GAIN")) ||
+        (psz_value = vlc_meta_GetExtra(p_meta, "RG_RADIO")) )
+    {
+        p_dst->pb_gain[AUDIO_REPLAY_GAIN_TRACK] = true;
+        p_dst->pf_gain[AUDIO_REPLAY_GAIN_TRACK] = us_atof( psz_value );
+    }
+
+    if( (psz_value = vlc_meta_GetExtra(p_meta, "REPLAYGAIN_TRACK_PEAK" )) ||
+             (psz_value = vlc_meta_GetExtra(p_meta, "RG_PEAK" )) )
+    {
+        p_dst->pb_peak[AUDIO_REPLAY_GAIN_TRACK] = true;
+        p_dst->pf_peak[AUDIO_REPLAY_GAIN_TRACK] = us_atof( psz_value );
+    }
+
+    if( (psz_value = vlc_meta_GetExtra(p_meta, "REPLAYGAIN_ALBUM_GAIN" )) ||
+             (psz_value = vlc_meta_GetExtra(p_meta, "RG_AUDIOPHILE" )) )
+    {
+        p_dst->pb_gain[AUDIO_REPLAY_GAIN_ALBUM] = true;
+        p_dst->pf_gain[AUDIO_REPLAY_GAIN_ALBUM] = us_atof( psz_value );
+    }
+
+    if( (psz_value = vlc_meta_GetExtra(p_meta, "REPLAYGAIN_ALBUM_PEAK" )) )
+    {
+        p_dst->pb_peak[AUDIO_REPLAY_GAIN_ALBUM] = true;
+        p_dst->pf_peak[AUDIO_REPLAY_GAIN_ALBUM] = us_atof( psz_value );
+    }
+}