]> git.sesse.net Git - vlc/blobdiff - modules/demux/mp4/mp4.c
Merge back branch 0.8.6-playlist-vlm to trunk.
[vlc] / modules / demux / mp4 / mp4.c
index 4eb266ea8069b8ad4196285e77b5fa7c234f8016..586bcfdc3beaf556538e8c15a6f6fe569fe9db68 100644 (file)
@@ -387,6 +387,8 @@ static int Open( vlc_object_t * p_this )
                         !strncmp( psz_ref, "rtsp://", 7 ) )
                     {
                         msg_Dbg( p_demux, "adding ref = `%s'", psz_ref );
+                        msg_Err( p_demux, "REF is broken (fix playlist") ;
+#if 0
                         if( p_item )
                         {
                             playlist_item_t *p_child =
@@ -402,33 +404,29 @@ static int Open( vlc_object_t * p_this )
                                 b_play = VLC_TRUE;
                             }
                         }
+#endif
                     }
                     else
                     {
                         /* msg dbg relative ? */
                         int i_path_size = strlen( p_demux->psz_access ) + 3 +
                                          strlen( p_demux->psz_path ) + strlen( psz_ref ) + 1;
-#ifdef HAVE_ALLOCA
-                        char *psz_absolute = alloca( i_path_size );
-#else
-                        char *psz_absolute = (char *)malloc( i_path_size );
-#endif
+                        char psz_absolute[i_path_size];
                         char *end = strrchr( p_demux->psz_path, '/' );
 
                         if( end )
                         {
-                            int i_len = end + 1 - p_demux->psz_path;
-
-                            strcpy( psz_absolute, p_demux->psz_access );
-                            strcat( psz_absolute, "://" );
-                            strncat( psz_absolute, p_demux->psz_path, i_len);
+                            snprintf( psz_absolute, i_path_size, "%s://%s",
+                                      p_demux->psz_access, p_demux->psz_path );
                         }
                         else
                         {
-                            strcpy( psz_absolute, "" );
+                            *psz_absolute = '\0';
                         }
                         strcat( psz_absolute, psz_ref );
                         msg_Dbg( p_demux, "adding ref = `%s'", psz_absolute );
+                        msg_Err( p_demux, "Ref broken (fix playlist" );
+#if 0
                         if( p_item )
                         {
                             playlist_item_t *p_child =
@@ -445,8 +443,6 @@ static int Open( vlc_object_t * p_this )
                                 b_play = VLC_TRUE;
                             }
                         }
-#ifndef HAVE_ALLOCA
-                        free( psz_absolute );
 #endif
                     }
                 }
@@ -459,7 +455,6 @@ static int Open( vlc_object_t * p_this )
             if( b_play == VLC_TRUE )
             {
                  playlist_Control( p_playlist, PLAYLIST_VIEWPLAY,
-                                   p_playlist->status.i_view,
                                    p_playlist->status.p_item, NULL );
             }
             vlc_object_release( p_playlist );
@@ -809,47 +804,48 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
 
         case DEMUX_GET_META:
         {
-            vlc_meta_t **pp_meta = (vlc_meta_t**)va_arg( args, vlc_meta_t** );
-            vlc_meta_t *meta;
+            vlc_meta_t *p_meta = (vlc_meta_t *)va_arg( args, vlc_meta_t*);
             MP4_Box_t  *p_udta   = MP4_BoxGet( p_sys->p_root, "/moov/udta" );
             MP4_Box_t  *p_0xa9xxx;
             if( p_udta == NULL )
             {
                 return VLC_EGENERIC;
             }
-            *pp_meta = meta = vlc_meta_New();
             for( p_0xa9xxx = p_udta->p_first; p_0xa9xxx != NULL;
                  p_0xa9xxx = p_0xa9xxx->p_next )
             {
+                char *psz_utf;
+                if( !p_0xa9xxx || !p_0xa9xxx->data.p_0xa9xxx )
+                    continue;
+                psz_utf = strdup( p_0xa9xxx->data.p_0xa9xxx->psz_text );
+                if( psz_utf == NULL )
+                    continue;
+                /* FIXME FIXME: should convert from whatever the character
+                 * encoding of MP4 meta data is to UTF-8. */
+                EnsureUTF8( psz_utf );
+
                 switch( p_0xa9xxx->i_type )
                 {
                 case FOURCC_0xa9nam: /* Full name */
-                    vlc_meta_Add( meta, VLC_META_TITLE,
-                                  p_0xa9xxx->data.p_0xa9xxx->psz_text );
+                    vlc_meta_SetArtist( p_meta, psz_utf );
                     break;
                 case FOURCC_0xa9aut:
-                    vlc_meta_Add( meta, VLC_META_AUTHOR,
-                                  p_0xa9xxx->data.p_0xa9xxx->psz_text );
+                    vlc_meta_SetAuthor( p_meta, psz_utf );
                     break;
                 case FOURCC_0xa9ART:
-                    vlc_meta_Add( meta, VLC_META_ARTIST,
-                                  p_0xa9xxx->data.p_0xa9xxx->psz_text );
+                    vlc_meta_SetArtist( p_meta, psz_utf );
                     break;
                 case FOURCC_0xa9cpy:
-                    vlc_meta_Add( meta, VLC_META_COPYRIGHT,
-                                  p_0xa9xxx->data.p_0xa9xxx->psz_text );
+                    vlc_meta_SetCopyright( p_meta, psz_utf );
                     break;
                 case FOURCC_0xa9day: /* Creation Date */
-                    vlc_meta_Add( meta, VLC_META_DATE,
-                                  p_0xa9xxx->data.p_0xa9xxx->psz_text );
+                    vlc_meta_SetDate( p_meta, psz_utf );
                     break;
                 case FOURCC_0xa9des: /* Description */
-                    vlc_meta_Add( meta, VLC_META_DESCRIPTION,
-                                  p_0xa9xxx->data.p_0xa9xxx->psz_text );
+                    vlc_meta_SetDescription( p_meta, psz_utf );
                     break;
                 case FOURCC_0xa9gen: /* Genre */
-                    vlc_meta_Add( meta, VLC_META_GENRE,
-                                  p_0xa9xxx->data.p_0xa9xxx->psz_text );
+                    vlc_meta_SetGenre( p_meta, psz_utf );
                     break;
 
                 case FOURCC_0xa9swr:
@@ -878,6 +874,7 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
                 default:
                     break;
                 }
+                free( psz_utf );
             }
             return VLC_SUCCESS;
         }
@@ -888,7 +885,7 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
             return VLC_EGENERIC;
 
         default:
-            msg_Warn( p_demux, "control query unimplemented!" );
+            msg_Warn( p_demux, "control query %u unimplemented", i_query );
             return VLC_EGENERIC;
     }
 }
@@ -1310,7 +1307,7 @@ static int TrackCreateES( demux_t *p_demux, mp4_track_t *p_track,
             p_track->fmt.i_codec = VLC_FOURCC( 's', 'u', 'b', 't' );
             /* FIXME: Not true, could be UTF-16 with a Byte Order Mark (0xfeff) */
             /* FIXME UTF-8 doesn't work here ? */
-            /* p_track->fmt.subs.psz_encoding = strdup( "UTF-8" ); */
+            p_track->fmt.subs.psz_encoding = strdup( "UTF-8" );
             break;
 
         default: