载入中......

 
     
 
      placard
载入中......
      calendar
载入中......
      comment
载入中......
      newblog
载入中......
      newmessage
载入中......
      search

 

      login
载入中......
      link
      info
载入中......


 
 
载入中......
   
 
 
VLC086D播放列表不能正确载入m3u文件的分析及解决
[ 2008-1-2 10:37:00 | By: zyjzyj2000 ]
 

VLC0.8.6D版本中,windows下的GUI的播放列表只能储存,载入播放列表时的一些设置都不能使用。经过仔细的查看,发现界面的源代码在modules\gui\wxwidgets\dialogs\playlist.cpp中,在该文件中调用void Playlist::OnOpen( wxCommandEvent& WXUNUSED(event) )函数来载入播放列表,这个函数又调用src\playlist\Loadsave.c文件中的int playlist_Import( playlist_t * p_playlist, const char *psz_filename )函数。
在该函数中对于载入播放列表起重要作用的是src\playlist\item-ext.c文件中的int playlist_Add( playlist_t *p_playlist, const char *psz_uri,const char *psz_name, int i_mode, int i_pos )函数,该函数调用同一文件中的函数int playlist_AddExt( playlist_t *p_playlist, const char * psz_uri,const char *psz_name, int i_mode, int i_pos,mtime_t i_duration, const char **ppsz_options,int i_options )来完成载入列表的功能。
int playlist_AddExt( playlist_t *p_playlist, const char * psz_uri,
                     const char *psz_name, int i_mode, int i_pos,
                     mtime_t i_duration, const char **ppsz_options,
                     int i_options )
{
    playlist_item_t *p_item;
    p_item = playlist_ItemNew( p_playlist , psz_uri, psz_name );

    if( p_item == NULL )
    {
        msg_Err( p_playlist, "unable to add item to playlist" );
        return -1;
    }

    p_item->input.i_duration = i_duration;
    p_item->input.i_options = i_options;
    p_item->input.ppsz_options = NULL;

    for( p_item->input.i_options = 0; p_item->input.i_options < i_options;
         p_item->input.i_options++ )
    {
        if( !p_item->input.i_options )
        {
            p_item->input.ppsz_options = malloc( i_options * sizeof(char *) );
            if( !p_item->input.ppsz_options ) break;
        }

        p_item->input.ppsz_options[p_item->input.i_options] =
            strdup( ppsz_options[p_item->input.i_options] );
    }

    return playlist_AddItem( p_playlist, p_item, i_mode, i_pos );
}
在该函数中,playlist_ItemNew( p_playlist , psz_uri, psz_name );来生成一个新的播放列表的节点,下面是对播放列表节点的选项进行配置。然后把新生成的播放列表的节点添加到播放列表中,使用的函数是同一个文件中的int playlist_AddItem( playlist_t *p_playlist, playlist_item_t *p_item,int i_mode, int i_pos)函数。
在该函数中使用一个比较重要的函数是src\playlist\biew.c文件中的playlist_NodeAppend函数和playlist_NodeInsert函数,通过这两个函数在播放列表中生成一个节点,并且在该节点下添加播放的项。
通过对playlist_NodeInsert的监控,发现在src\playlist\item-ext.c文件的int playlist_NodeAddItem( playlist_t *p_playlist, playlist_item_t *p_item,int i_view,laylist_item_t *p_parent,int i_mode, int i_pos)函数中多次调用为节点添加播放项。
对playlist_NodeAddItem进行监测,发现在modules\demux\playlist\m3u.c文件中的static int Demux( demux_t *p_demux )调用。分析该函数,发现由于vlc_bool_t b_enable_extvlcopt = config_GetInt( p_demux, "m3u-extvlcopt" );语句在程序运行时,总是不能取得VLC_TRUE,所以造成函数对播放列表中的选项不能正确添加到播放列表的选项中。
    针对该问题对该处进行分析,修改,然后编译生成新的VLC.exe文件,问题就解决了。

 
 
发表评论:
载入中......