X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faccess%2Fvcdx%2Finfo.c;h=dc0ec98ba54cb62dbe46ca8149e2016e753109e4;hb=31a163942d6682ae31679e6e2be898f9314b2cc0;hp=c268048210517423ca010b6cd63a87b5863503f4;hpb=6ba6c14fd5e810734e4170bbb95b1a731525212c;p=vlc diff --git a/modules/access/vcdx/info.c b/modules/access/vcdx/info.c index c268048210..dc0ec98ba5 100644 --- a/modules/access/vcdx/info.c +++ b/modules/access/vcdx/info.c @@ -1,8 +1,8 @@ /***************************************************************************** * info.c : CD digital audio input information routines ***************************************************************************** - * Copyright (C) 2004 VideoLAN - * $Id: info.c 8845 2004-09-29 09:00:41Z rocky $ + * Copyright (C) 2004 the VideoLAN team + * $Id$ * * Authors: Rocky Bernstein * @@ -18,15 +18,18 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ -#include -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif +#include +#include +#include #include "vcd.h" -#include -#include "vlc_keys.h" +#include #include "info.h" #include @@ -37,13 +40,14 @@ #include static inline void -MetaInfoAddStr(access_t *p_access, char *p_cat, - char *title, const char *str) +MetaInfoAddStr(access_t *p_access, char *psz_cat, + char *title, const char *psz) { - access_vcd_data_t *p_vcd = (access_vcd_data_t *) p_access->p_sys; - if ( str ) { - dbg_print( INPUT_DBG_META, "field: %s: %s", title, str); - input_Control( p_vcd->p_input, INPUT_ADD_INFO, p_cat, title, "%s", str); + vcdplayer_t *p_vcdplayer = (vcdplayer_t *) p_access->p_sys; + if ( psz ) { + dbg_print( INPUT_DBG_META, "cat %s, field: %s: %s", psz_cat, title, psz); + input_Control( p_vcdplayer->p_input, INPUT_ADD_INFO, psz_cat, title, "%s", + psz); } } @@ -51,9 +55,19 @@ MetaInfoAddStr(access_t *p_access, char *p_cat, static inline void MetaInfoAddNum(access_t *p_access, char *psz_cat, char *title, int num) { - access_vcd_data_t *p_vcd = (access_vcd_data_t *) p_access->p_sys; - dbg_print( INPUT_DBG_META, "field %s: %d", title, num); - input_Control( p_vcd->p_input, INPUT_ADD_INFO, psz_cat, title, "%d", num ); + vcdplayer_t *p_vcdplayer = (vcdplayer_t *) p_access->p_sys; + dbg_print( INPUT_DBG_META, "cat %s, field %s: %d", psz_cat, title, num); + input_Control( p_vcdplayer->p_input, INPUT_ADD_INFO, psz_cat, title, + "%d", num ); +} + +static inline void +MetaInfoAddHex(access_t *p_access, char *psz_cat, char *title, int hex) +{ + vcdplayer_t *p_vcdplayer = (vcdplayer_t *) p_access->p_sys; + dbg_print( INPUT_DBG_META, "cat %s, field %s: %d", psz_cat, title, hex); + input_Control( p_vcdplayer->p_input, INPUT_ADD_INFO, psz_cat, title, + "%x", hex ); } #define addstr(title, str) \ @@ -62,93 +76,142 @@ MetaInfoAddNum(access_t *p_access, char *psz_cat, char *title, int num) #define addnum(title, num) \ MetaInfoAddNum( p_access, psz_cat, title, num ); -void +#define addhex(title, hex) \ + MetaInfoAddHex( p_access, psz_cat, title, hex ); + +void VCDMetaInfo( access_t *p_access, /*const*/ char *psz_mrl ) { - access_vcd_data_t *p_vcd = (access_vcd_data_t *) p_access->p_sys; - unsigned int i_entries = vcdinfo_get_num_entries(p_vcd->vcd); + vcdplayer_t *p_vcdplayer = (vcdplayer_t *) p_access->p_sys; + unsigned int i_entries = vcdinfo_get_num_entries(p_vcdplayer->vcd); unsigned int last_entry = 0; char *psz_cat; track_t i_track; - psz_cat = _("General"); - - addstr( _("VCD Format"), vcdinfo_get_format_version_str(p_vcd->vcd) ); - addstr( _("Album"), vcdinfo_get_album_id(p_vcd->vcd)); - addstr( _("Application"), vcdinfo_get_application_id(p_vcd->vcd) ); - addstr( _("Preparer"), vcdinfo_get_preparer_id(p_vcd->vcd) ); - addnum( _("Vol #"), vcdinfo_get_volume_num(p_vcd->vcd) ); - addnum( _("Vol max #"), vcdinfo_get_volume_count(p_vcd->vcd) ); - addstr( _("Volume Set"), vcdinfo_get_volumeset_id(p_vcd->vcd) ); - addstr( _("Volume"), vcdinfo_get_volume_id(p_vcd->vcd) ); - addstr( _("Publisher"), vcdinfo_get_publisher_id(p_vcd->vcd) ); - addstr( _("System Id"), vcdinfo_get_system_id(p_vcd->vcd) ); - addnum( "LIDs", vcdinfo_get_num_LIDs(p_vcd->vcd) ); - addnum( _("Entries"), vcdinfo_get_num_entries(p_vcd->vcd) ); - addnum( _("Segments"), vcdinfo_get_num_segments(p_vcd->vcd) ); - addnum( _("Tracks"), vcdinfo_get_num_tracks(p_vcd->vcd) ); + psz_cat = _("Disc"); + + addstr( _("VCD Format"), vcdinfo_get_format_version_str(p_vcdplayer->vcd) ); + addstr( _("Album"), vcdinfo_get_album_id(p_vcdplayer->vcd)); + addstr( _("Application"), vcdinfo_get_application_id(p_vcdplayer->vcd) ); + addstr( _("Preparer"), vcdinfo_get_preparer_id(p_vcdplayer->vcd) ); + addnum( _("Vol #"), vcdinfo_get_volume_num(p_vcdplayer->vcd) ); + addnum( _("Vol max #"), vcdinfo_get_volume_count(p_vcdplayer->vcd) ); + addstr( _("Volume Set"), vcdinfo_get_volumeset_id(p_vcdplayer->vcd) ); + addstr( _("Volume"), vcdinfo_get_volume_id(p_vcdplayer->vcd) ); + addstr( _("Publisher"), vcdinfo_get_publisher_id(p_vcdplayer->vcd) ); + addstr( _("System Id"), vcdinfo_get_system_id(p_vcdplayer->vcd) ); + addnum( "LIDs", vcdinfo_get_num_LIDs(p_vcdplayer->vcd) ); + addnum( _("Entries"), vcdinfo_get_num_entries(p_vcdplayer->vcd) ); + addnum( _("Segments"), vcdinfo_get_num_segments(p_vcdplayer->vcd) ); + addnum( _("Tracks"), vcdinfo_get_num_tracks(p_vcdplayer->vcd) ); /* Spit out track information. Could also include MSF info. Also build title table. */ #define TITLE_MAX 30 - for( i_track = 1 ; i_track < p_vcd->i_tracks ; i_track++ ) { - unsigned int audio_type = vcdinfo_get_track_audio_type(p_vcd->vcd, - i_track); - uint32_t i_secsize = vcdinfo_get_track_sect_count(p_vcd->vcd, i_track); - - if (p_vcd->b_svd) { - addnum(_("Audio Channels"), - vcdinfo_audio_type_num_channels(p_vcd->vcd, audio_type) ); + for( i_track = 1 ; i_track < p_vcdplayer->i_tracks ; i_track++ ) { + char psz_cat[20]; + unsigned int audio_type = vcdinfo_get_track_audio_type(p_vcdplayer->vcd, + i_track); + uint32_t i_secsize = vcdinfo_get_track_sect_count(p_vcdplayer->vcd, i_track); + + snprintf(psz_cat, sizeof(psz_cat), "Track %d", i_track); + if (p_vcdplayer->b_svd) { + addnum(_("Audio Channels"), + vcdinfo_audio_type_num_channels(p_vcdplayer->vcd, audio_type) ); } addnum(_("First Entry Point"), last_entry ); - for ( ; last_entry < i_entries - && vcdinfo_get_track(p_vcd->vcd, last_entry) == i_track; - last_entry++ ) ; + for ( ; last_entry < i_entries + && vcdinfo_get_track(p_vcdplayer->vcd, last_entry) == i_track; + last_entry++ ) ; addnum(_("Last Entry Point"), last_entry-1 ); addnum(_("Track size (in sectors)"), i_secsize ); } + + { + lid_t i_lid; + for( i_lid = 1 ; i_lid <= p_vcdplayer->i_lids ; i_lid++ ) { + PsdListDescriptor_t pxd; + char psz_cat[20]; + snprintf(psz_cat, sizeof(psz_cat), "LID %d", i_lid); + if (vcdinfo_lid_get_pxd(p_vcdplayer->vcd, &pxd, i_lid)) { + switch (pxd.descriptor_type) { + case PSD_TYPE_END_LIST: + addstr(_("type"), _("end")); + break; + case PSD_TYPE_PLAY_LIST: + addstr(_("type"), _("play list")); + addnum("items", vcdinf_pld_get_noi(pxd.pld)); + addhex("next", vcdinf_pld_get_next_offset(pxd.pld)); + addhex("previous", vcdinf_pld_get_prev_offset(pxd.pld)); + addhex("return", vcdinf_pld_get_return_offset(pxd.pld)); + addnum("wait time", vcdinf_get_wait_time(pxd.pld)); + break; + case PSD_TYPE_SELECTION_LIST: + case PSD_TYPE_EXT_SELECTION_LIST: + addstr(_("type"), + PSD_TYPE_SELECTION_LIST == pxd.descriptor_type + ? _("extended selection list") + : _("selection list") + ); + addhex("default", vcdinf_psd_get_default_offset(pxd.psd)); + addhex("loop count", vcdinf_get_loop_count(pxd.psd)); + addhex("next", vcdinf_psd_get_next_offset(pxd.psd)); + addhex("previous", vcdinf_psd_get_prev_offset(pxd.psd)); + addhex("return", vcdinf_psd_get_return_offset(pxd.psd)); + addhex("rejected", vcdinf_psd_get_lid_rejected(pxd.psd)); + addhex("time-out offset", vcdinf_get_timeout_offset(pxd.psd)); + addnum("time-out time", vcdinf_get_timeout_time(pxd.psd)); + break; + default: + addstr(_("type"), _("unknown type")); + break; + } + } + } + } if ( CDIO_INVALID_TRACK != i_track ) - { - char *psz_name = - VCDFormatStr( p_access, p_vcd, - config_GetPsz( p_access, MODULE_STRING "-title-format" ), - psz_mrl, &(p_vcd->play_item) ); - - input_Control( p_vcd->p_input, INPUT_SET_NAME, psz_name ); + { + char* psz_title_format = config_GetPsz( p_access, MODULE_STRING "-title-format" ); + char *psz_name = + VCDFormatStr( p_access, p_vcdplayer, psz_title_format, psz_mrl, + &(p_vcdplayer->play_item) ); + free( psz_title_format ); + + input_Control( p_vcdplayer->p_input, INPUT_SET_NAME, psz_name ); } } -#define add_format_str_info(val) \ - { \ - const char *str = val; \ - unsigned int len; \ - if (val != NULL) { \ - len=strlen(str); \ - if (len != 0) { \ - strncat(tp, str, TEMP_STR_LEN-(tp-temp_str)); \ - tp += len; \ +#define add_format_str_info(val) \ + { \ + const char *str = strdup(val); \ + unsigned int len; \ + if (val != NULL) { \ + len=strlen(str); \ + if (len != 0) { \ + strncat(tp, str, TEMP_STR_LEN-(tp-temp_str)); \ + tp += len; \ } \ - saw_control_prefix = VLC_FALSE; \ - } \ + saw_control_prefix = false; \ + } \ } -#define add_format_num_info( val, fmt ) \ - { \ - char num_str[10]; \ - unsigned int len; \ +#define add_format_num_info( val, fmt ) \ + { \ + char num_str[10]; \ + unsigned int len; \ sprintf(num_str, fmt, val); \ - len = strlen(num_str); \ + len = strlen(num_str); \ if( len != 0 ) \ - { \ + { \ strncat(tp, num_str, TEMP_STR_LEN-(tp-temp_str)); \ - tp += len; \ - } \ - saw_control_prefix = VLC_FALSE; \ + tp += len; \ + } \ + saw_control_prefix = false; \ } /*! @@ -174,7 +237,7 @@ VCDMetaInfo( access_t *p_access, /*const*/ char *psz_mrl ) %% : a % */ char * -VCDFormatStr(const access_t *p_access, access_vcd_data_t *p_vcd, +VCDFormatStr(const access_t *p_access, vcdplayer_t *p_vcdplayer, const char format_str[], const char *mrl, const vcdinfo_itemid_t *itemid) { @@ -183,7 +246,7 @@ VCDFormatStr(const access_t *p_access, access_vcd_data_t *p_vcd, static char temp_str[TEMP_STR_SIZE]; size_t i; char * tp = temp_str; - vlc_bool_t saw_control_prefix = VLC_FALSE; + bool saw_control_prefix = false; size_t format_len = strlen(format_str); memset(temp_str, 0, TEMP_STR_SIZE); @@ -192,7 +255,7 @@ VCDFormatStr(const access_t *p_access, access_vcd_data_t *p_vcd, if (!saw_control_prefix && format_str[i] != '%') { *tp++ = format_str[i]; - saw_control_prefix = VLC_FALSE; + saw_control_prefix = false; continue; } @@ -204,20 +267,20 @@ VCDFormatStr(const access_t *p_access, access_vcd_data_t *p_vcd, saw_control_prefix = !saw_control_prefix; break; case 'A': - add_format_str_info(vcdinfo_strip_trail(vcdinfo_get_album_id(p_vcd->vcd), + add_format_str_info(vcdinfo_strip_trail(vcdinfo_get_album_id(p_vcdplayer->vcd), MAX_ALBUM_LEN)); break; case 'c': - add_format_num_info(vcdinfo_get_volume_num(p_vcd->vcd), "%d"); + add_format_num_info(vcdinfo_get_volume_num(p_vcdplayer->vcd), "%d"); break; case 'C': - add_format_num_info(vcdinfo_get_volume_count(p_vcd->vcd), "%d"); + add_format_num_info(vcdinfo_get_volume_count(p_vcdplayer->vcd), "%d"); break; case 'F': - add_format_str_info(vcdinfo_get_format_version_str(p_vcd->vcd)); + add_format_str_info(vcdinfo_get_format_version_str(p_vcdplayer->vcd)); break; case 'I': @@ -247,18 +310,18 @@ VCDFormatStr(const access_t *p_access, access_vcd_data_t *p_vcd, /* What to do? */ ; } - saw_control_prefix = VLC_FALSE; + saw_control_prefix = false; } break; case 'L': - if (vcdplayer_pbc_is_on(p_vcd)) { + if (vcdplayer_pbc_is_on(p_vcdplayer)) { char num_str[40]; - sprintf(num_str, "%s %d", _("List ID"), p_vcd->i_lid); + sprintf(num_str, "%s %d", _("List ID"), p_vcdplayer->i_lid); strncat(tp, num_str, TEMP_STR_LEN-(tp-temp_str)); tp += strlen(num_str); } - saw_control_prefix = VLC_FALSE; + saw_control_prefix = false; break; case 'M': @@ -270,147 +333,67 @@ VCDFormatStr(const access_t *p_access, access_vcd_data_t *p_vcd, break; case 'p': - add_format_str_info(vcdinfo_get_preparer_id(p_vcd->vcd)); + add_format_str_info(vcdinfo_get_preparer_id(p_vcdplayer->vcd)); break; case 'P': - add_format_str_info(vcdinfo_get_publisher_id(p_vcd->vcd)); + add_format_str_info(vcdinfo_get_publisher_id(p_vcdplayer->vcd)); break; case 'S': if ( VCDINFO_ITEM_TYPE_SEGMENT==itemid->type ) { - char seg_type_str[10]; + char seg_type_str[30]; sprintf(seg_type_str, " %s", - vcdinfo_video_type2str(p_vcd->vcd, itemid->num)); + vcdinfo_video_type2str(p_vcdplayer->vcd, itemid->num)); strncat(tp, seg_type_str, TEMP_STR_LEN-(tp-temp_str)); tp += strlen(seg_type_str); } - saw_control_prefix = VLC_FALSE; + saw_control_prefix = false; break; case 'T': - add_format_num_info(p_vcd->i_track, "%d"); + add_format_num_info(p_vcdplayer->i_track, "%d"); break; case 'V': - add_format_str_info(vcdinfo_get_volumeset_id(p_vcd->vcd)); + add_format_str_info(vcdinfo_get_volumeset_id(p_vcdplayer->vcd)); break; case 'v': - add_format_str_info(vcdinfo_get_volume_id(p_vcd->vcd)); + add_format_str_info(vcdinfo_get_volume_id(p_vcdplayer->vcd)); break; default: *tp++ = '%'; *tp++ = format_str[i]; - saw_control_prefix = VLC_FALSE; + saw_control_prefix = false; } } return strdup(temp_str); } -static void -VCDCreatePlayListItem(const access_t *p_access, - access_vcd_data_t *p_vcd, - playlist_t *p_playlist, - const vcdinfo_itemid_t *itemid, - char *psz_mrl, int psz_mrl_max, - const char *psz_source, int playlist_operation, - int i_pos) -{ - char *p_author; - char *p_title; - char c_type; - - switch(itemid->type) { - case VCDINFO_ITEM_TYPE_TRACK: - c_type='T'; - break; - case VCDINFO_ITEM_TYPE_SEGMENT: - c_type='S'; - break; - case VCDINFO_ITEM_TYPE_LID: - c_type='P'; - break; - case VCDINFO_ITEM_TYPE_ENTRY: - c_type='E'; - break; - default: - c_type='?'; - break; - } - - snprintf(psz_mrl, psz_mrl_max, "%s%s@%c%u", VCD_MRL_PREFIX, psz_source, - c_type, itemid->num); - - p_title = - VCDFormatStr( p_access, p_vcd, - config_GetPsz( p_access, MODULE_STRING "-title-format" ), - psz_mrl, itemid ); - - playlist_Add( p_playlist, psz_mrl, p_title, playlist_operation, i_pos ); - - p_author = - VCDFormatStr( p_access, p_vcd, - config_GetPsz( p_access, MODULE_STRING "-author-format" ), - psz_mrl, itemid ); - - if( i_pos == PLAYLIST_END ) i_pos = p_playlist->i_size - 1; - playlist_AddInfo(p_playlist, i_pos, _("General"), _("Author"), "%s", - p_author); -} - -int -VCDFixupPlayList( access_t *p_access, access_vcd_data_t *p_vcd, - const char *psz_source, vcdinfo_itemid_t *itemid, - vlc_bool_t b_single_item ) +void +VCDUpdateTitle( access_t *p_access ) { - unsigned int i; - playlist_t * p_playlist; - char * psz_mrl; - unsigned int psz_mrl_max = strlen(VCD_MRL_PREFIX) + strlen(psz_source) + - strlen("@T") + strlen("100") + 1; - psz_mrl = malloc( psz_mrl_max ); + vcdplayer_t *p_vcdplayer= (vcdplayer_t *)p_access->p_sys; - if( psz_mrl == NULL ) - { - msg_Warn( p_access, "out of memory" ); - return -1; - } + unsigned int psz_mrl_max = strlen(VCD_MRL_PREFIX) + + strlen(p_vcdplayer->psz_source) + sizeof("@E999")+3; + char *psz_mrl = malloc( psz_mrl_max ); - p_playlist = (playlist_t *) vlc_object_find( p_access, VLC_OBJECT_PLAYLIST, - FIND_ANYWHERE ); - if( !p_playlist ) + if( psz_mrl ) { - msg_Warn( p_access, "can't find playlist" ); - free(psz_mrl); - return -1; + char *psz_name; + char* psz_title_format = config_GetPsz( p_access, MODULE_STRING "-title-format" ) + snprintf( psz_mrl, psz_mrl_max, "%s%s", + VCD_MRL_PREFIX, p_vcdplayer->psz_source ); + psz_name = VCDFormatStr( p_access, p_vcdplayer, psz_title_format, psz_mrl, + &(p_vcdplayer->play_item) ); + input_Control( p_vcdplayer->p_input, INPUT_SET_NAME, psz_name ); + free( psz_title_format ); + free(psz_mrl); } - - { - vcdinfo_itemid_t list_itemid; - list_itemid.type=VCDINFO_ITEM_TYPE_ENTRY; - - playlist_LockDelete( p_playlist, p_playlist->i_index); - - for( i = 0 ; i < p_vcd->i_entries ; i++ ) - { - list_itemid.num=i; - VCDCreatePlayListItem(p_access, p_vcd, p_playlist, &list_itemid, - psz_mrl, psz_mrl_max, psz_source, - PLAYLIST_APPEND, PLAYLIST_END); - } - -#if LOOKED_OVER - playlist_Command( p_playlist, PLAYLIST_GOTO, 0 ); -#endif - - } - - vlc_object_release( p_playlist ); - free(psz_mrl); - return 0; }