X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faccess%2Fvcdx%2Faccess.c;h=7f185a06aadedc6acaeae6fb6a4eb32523f37b29;hb=3efac1815fa020f080789566c39afa3fdab5abc2;hp=2a1420d923cd6d9eb9ad14087010d8f91aa5cbf4;hpb=0b0141010c38c6ad35ee03c0ff28b9b810ba0ce5;p=vlc diff --git a/modules/access/vcdx/access.c b/modules/access/vcdx/access.c index 2a1420d923..7f185a06aa 100644 --- a/modules/access/vcdx/access.c +++ b/modules/access/vcdx/access.c @@ -2,7 +2,7 @@ * vcd.c : VCD input module for vlc using libcdio, libvcd and libvcdinfo. * vlc-specific things tend to go here. ***************************************************************************** - * Copyright (C) 2000, 2003, 2004, 2005 VideoLAN + * Copyright (C) 2000, 2003, 2004, 2005 the VideoLAN team * $Id$ * * Authors: Rocky Bernstein @@ -22,16 +22,21 @@ * * 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. *****************************************************************************/ /***************************************************************************** * Preamble *****************************************************************************/ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + #include -#include -#include +#include +#include +#include #include "vlc_keys.h" #include @@ -44,8 +49,6 @@ #include "info.h" #include "intf.h" -#define FREE_AND_NULL(ptr) free(ptr); ptr = NULL; - extern void VCDSetOrigin( access_t *p_access, lsn_t i_lsn, track_t i_track, const vcdinfo_itemid_t *p_itemid ); @@ -92,17 +95,17 @@ cdio_log_handler (cdio_log_level_t level, const char message[]) case CDIO_LOG_DEBUG: case CDIO_LOG_INFO: if (p_vcdplayer->i_debug & INPUT_DBG_CDIO) - msg_Dbg( p_vcd_access, message); + msg_Dbg( p_vcd_access, "%s", message); break; case CDIO_LOG_WARN: - msg_Warn( p_vcd_access, message); + msg_Warn( p_vcd_access, "%s", message); break; case CDIO_LOG_ERROR: case CDIO_LOG_ASSERT: - msg_Err( p_vcd_access, message); + msg_Err( p_vcd_access, "%s", message); break; default: - msg_Warn( p_vcd_access, message, + msg_Warn( p_vcd_access, "%s\n%s %d", message, _("The above message had unknown log level"), level); } @@ -118,14 +121,14 @@ vcd_log_handler (vcd_log_level_t level, const char message[]) case VCD_LOG_DEBUG: case VCD_LOG_INFO: if (p_vcdplayer->i_debug & INPUT_DBG_VCDINFO) - msg_Dbg( p_vcd_access, message); + msg_Dbg( p_vcd_access, "%s", message); break; case VCD_LOG_WARN: - msg_Warn( p_vcd_access, message); + msg_Warn( p_vcd_access, "%s", message); break; case VCD_LOG_ERROR: case VCD_LOG_ASSERT: - msg_Err( p_vcd_access, message); + msg_Err( p_vcd_access, "%s", message); break; default: msg_Warn( p_vcd_access, "%s\n%s %d", message, @@ -200,6 +203,8 @@ VCDReadBlock( access_t * p_access ) */ #if 1 msleep( MILLISECONDS_PER_SEC * *p_buf ); + VCDSetOrigin(p_access, p_vcdplayer->origin_lsn, p_vcdplayer->i_track, + &(p_vcdplayer->play_item)); // p_vcd->in_still = VLC_FALSE; dbg_print(INPUT_DBG_STILL, "still wait time done"); #else @@ -226,9 +231,9 @@ VCDReadBlock( access_t * p_access ) { const track_t i_track = p_vcdplayer->i_track; - dbg_print( (INPUT_DBG_LSN|INPUT_DBG_PBC), - "entry change to %d, current LSN %u >= end %u", - i_entry, p_vcdplayer->i_lsn, i_lsn); + dbg_print( (INPUT_DBG_LSN|INPUT_DBG_PBC), + "entry change to %d, current LSN %u >= end %u", + i_entry, p_vcdplayer->i_lsn, i_lsn); p_vcdplayer->play_item.num = i_entry; @@ -259,7 +264,7 @@ VCDSeek( access_t * p_access, int64_t i_pos ) /* Next sector to read */ p_access->info.i_pos = i_pos; p_vcdplayer->i_lsn = (i_pos / (int64_t) M2F2_SECTOR_SIZE) + - p_vcdplayer->origin_lsn; + p_vcdplayer->origin_lsn; switch (p_vcdplayer->play_item.type) { case VCDINFO_ITEM_TYPE_TRACK: @@ -293,29 +298,30 @@ VCDSeek( access_t * p_access, int64_t i_pos ) dbg_print( (INPUT_DBG_CALL|INPUT_DBG_EXT|INPUT_DBG_SEEK), "orig %lu, cur: %lu, offset: %lld, entry %d", - (long unsigned int) p_vcdplayer->origin_lsn, + (long unsigned int) p_vcdplayer->origin_lsn, (long unsigned int) p_vcdplayer->i_lsn, i_pos, i_entry ); /* Find seekpoint */ for( i_seekpoint = 0; i_seekpoint < t->i_seekpoint; i_seekpoint++ ) - { - if( i_seekpoint + 1 >= t->i_seekpoint ) break; - if( i_pos < t->seekpoint[i_seekpoint + 1]->i_byte_offset ) break; - } - + { + if( i_seekpoint + 1 >= t->i_seekpoint ) break; + if( i_pos < t->seekpoint[i_seekpoint + 1]->i_byte_offset ) break; + } + /* Update current seekpoint */ if( i_seekpoint != p_access->info.i_seekpoint ) - { - dbg_print( (INPUT_DBG_SEEK), "seekpoint change %lu", - (long unsigned int) i_seekpoint ); - p_access->info.i_update |= INPUT_UPDATE_SEEKPOINT; - p_access->info.i_seekpoint = i_seekpoint; - } + { + dbg_print( (INPUT_DBG_SEEK), "seekpoint change %lu", + (long unsigned int) i_seekpoint ); + p_access->info.i_update |= INPUT_UPDATE_SEEKPOINT; + p_access->info.i_seekpoint = i_seekpoint; + } } + p_access->info.b_eof = VLC_FALSE; return VLC_SUCCESS; - + } /***************************************************************************** @@ -327,51 +333,51 @@ static vlc_bool_t VCDEntryPoints( access_t * p_access ) { if (!p_access || !p_access->p_sys) return VLC_FALSE; - + { vcdplayer_t *p_vcdplayer = (vcdplayer_t *) p_access->p_sys; - const unsigned int i_entries = + const unsigned int i_entries = vcdinfo_get_num_entries(p_vcdplayer->vcd); - const track_t i_last_track + const track_t i_last_track = cdio_get_num_tracks(vcdinfo_get_cd_image(p_vcdplayer->vcd)) + cdio_get_first_track_num(vcdinfo_get_cd_image(p_vcdplayer->vcd)); unsigned int i; - + if (0 == i_entries) { LOG_ERR ("no entires found -- something is wrong" ); return VLC_FALSE; } - + p_vcdplayer->p_entries = malloc( sizeof( lsn_t ) * i_entries ); - + if( p_vcdplayer->p_entries == NULL ) { - LOG_ERR ("not enough memory for entry points treatment" ); - return VLC_FALSE; + LOG_ERR ("not enough memory for entry points treatment" ); + return VLC_FALSE; } - + p_vcdplayer->i_entries = i_entries; - + for( i = 0 ; i < i_entries ; i++ ) { - const track_t i_track = vcdinfo_get_track(p_vcdplayer->vcd, i); - if( i_track <= i_last_track ) { - seekpoint_t *s = vlc_seekpoint_New(); - char psz_entry[100]; - - snprintf(psz_entry, sizeof(psz_entry), "%s%02d", _("Entry "), i ); - - p_vcdplayer->p_entries[i] = vcdinfo_get_entry_lsn(p_vcdplayer->vcd, i); - - s->psz_name = strdup(psz_entry); - s->i_byte_offset = - (p_vcdplayer->p_entries[i] - vcdinfo_get_track_lsn(p_vcdplayer->vcd, i_track)) - * M2F2_SECTOR_SIZE; - - dbg_print( INPUT_DBG_MRL, - "%s, lsn %d, byte_offset %ld", - s->psz_name, p_vcdplayer->p_entries[i], - (unsigned long int) s->i_byte_offset); + const track_t i_track = vcdinfo_get_track(p_vcdplayer->vcd, i); + if( i_track <= i_last_track ) { + seekpoint_t *s = vlc_seekpoint_New(); + char psz_entry[100]; + + snprintf(psz_entry, sizeof(psz_entry), "%s %02d", _("Entry"), i ); + + p_vcdplayer->p_entries[i] = vcdinfo_get_entry_lsn(p_vcdplayer->vcd, i); + + s->psz_name = strdup(psz_entry); + s->i_byte_offset = + (p_vcdplayer->p_entries[i] - vcdinfo_get_track_lsn(p_vcdplayer->vcd, i_track)) + * M2F2_SECTOR_SIZE; + + dbg_print( INPUT_DBG_MRL, + "%s, lsn %d, byte_offset %ld", + s->psz_name, p_vcdplayer->p_entries[i], + (unsigned long int) s->i_byte_offset); TAB_APPEND( p_vcdplayer->p_title[i_track-1]->i_seekpoint, p_vcdplayer->p_title[i_track-1]->seekpoint, s ); @@ -423,7 +429,7 @@ VCDSegments( access_t * p_access ) seekpoint_t *s = vlc_seekpoint_New(); p_vcdplayer->p_segments[i] = vcdinfo_get_seg_lsn(p_vcdplayer->vcd, i); - snprintf( psz_segment, sizeof(psz_segment), "%s%02d", _("Segment "), + snprintf( psz_segment, sizeof(psz_segment), "%s %02d", _("Segment"), i ); s->i_byte_offset = 0; /* Not sure what this would mean here */ @@ -443,7 +449,7 @@ VCDSegments( access_t * p_access ) Build title table which will be returned via ACCESS_GET_TITLE_INFO. We start area addressing for tracks at 1 since the default area 0 - is reserved for segments. + is reserved for segments. *****************************************************************************/ static int VCDTitles( access_t * p_access ) @@ -453,7 +459,7 @@ VCDTitles( access_t * p_access ) very careful about this. Note: cdio_get_first_track() will give the ISO-9660 track before the MPEG tracks. */ - + if (!p_access || !p_access->p_sys) return VLC_EGENERIC; { @@ -467,14 +473,14 @@ VCDTitles( access_t * p_access ) vlc_input_title_New(); char psz_track[80]; - snprintf( psz_track, sizeof(psz_track), "%s%02d", _("Track "), + snprintf( psz_track, sizeof(psz_track), "%s %02d", _("Track"), i ); - t->i_size = (int64_t) vcdinfo_get_track_size( p_vcdplayer->vcd, - i ) - * M2F2_SECTOR_SIZE / CDIO_CD_FRAMESIZE ; + t->i_size = (int64_t) vcdinfo_get_track_size( p_vcdplayer->vcd, + i ) + * M2F2_SECTOR_SIZE / CDIO_CD_FRAMESIZE ; t->psz_name = strdup(psz_track); - dbg_print( INPUT_DBG_MRL, "track[%d] i_size: %lld", i, t->i_size ); + dbg_print( INPUT_DBG_MRL, "track[%d] i_size: %lld", i, t->i_size ); p_vcdplayer->i_titles++; } @@ -528,7 +534,7 @@ VCDLIDs( access_t * p_access ) char psz_lid[100]; seekpoint_t *s = vlc_seekpoint_New(); - snprintf( psz_lid, sizeof(psz_lid), "%s%02d", _("LID "), + snprintf( psz_lid, sizeof(psz_lid), "%s %02d", _("LID"), i_lid ); s->i_byte_offset = 0; /* A lid doesn't have an offset @@ -687,17 +693,18 @@ VCDSetOrigin( access_t *p_access, lsn_t i_lsn, track_t i_track, VCDUpdateVar( p_access, p_itemid->num, VLC_VAR_SETVALUE, "chapter", _("Entry"), "Setting entry/segment"); p_access->info.i_title = i_track-1; - if (p_vcdplayer->b_track_length) + if (p_vcdplayer->b_track_length) { - p_access->info.i_size = p_vcdplayer->p_title[i_track-1]->i_size; - p_access->info.i_pos = (int64_t) i_lsn * M2F2_SECTOR_SIZE; + p_access->info.i_size = p_vcdplayer->p_title[i_track-1]->i_size; + p_access->info.i_pos = (int64_t) M2F2_SECTOR_SIZE * + (vcdinfo_get_track_lsn(p_vcdplayer->vcd, i_track) - i_lsn) ; } else { - p_access->info.i_size = M2F2_SECTOR_SIZE * (int64_t) - vcdinfo_get_entry_sect_count(p_vcdplayer->vcd, p_itemid->num); - p_access->info.i_pos = 0; + p_access->info.i_size = M2F2_SECTOR_SIZE * (int64_t) + vcdinfo_get_entry_sect_count(p_vcdplayer->vcd, p_itemid->num); + p_access->info.i_pos = 0; } - dbg_print( (INPUT_DBG_LSN|INPUT_DBG_PBC), "size: %llu, pos: %llu", - p_access->info.i_size, p_access->info.i_pos ); + dbg_print( (INPUT_DBG_LSN|INPUT_DBG_PBC), "size: %llu, pos: %llu", + p_access->info.i_size, p_access->info.i_pos ); p_access->info.i_seekpoint = p_itemid->num; break; @@ -851,7 +858,7 @@ VCDOpen ( vlc_object_t *p_this ) vlc_bool_t play_single_item = VLC_FALSE; p_access->pf_read = NULL; - p_access->pf_block = VCDReadBlock; + p_access->pf_block = VCDReadBlock; p_access->pf_control = VCDControl; p_access->pf_seek = VCDSeek; @@ -899,7 +906,7 @@ VCDOpen ( vlc_object_t *p_this ) p_vcdplayer->p_input = vlc_object_find( p_access, VLC_OBJECT_INPUT, FIND_PARENT ); - p_vcdplayer->p_meta = vlc_meta_New(); +// p_vcdplayer->p_meta = vlc_meta_New(); p_vcdplayer->p_segments = NULL; p_vcdplayer->p_entries = NULL; @@ -991,22 +998,22 @@ VCDClose ( vlc_object_t *p_this ) { unsigned int i; for (i=0 ; ii_titles; i++) - if (p_vcdplayer->p_title[i]) - free(p_vcdplayer->p_title[i]->psz_name); + if (p_vcdplayer->p_title[i]) + free(p_vcdplayer->p_title[i]->psz_name); } - + vcdinfo_close( p_vcdplayer->vcd ); if( p_vcdplayer->p_input ) vlc_object_release( p_vcdplayer->p_input ); - FREE_AND_NULL( p_vcdplayer->p_entries ); - FREE_AND_NULL( p_vcdplayer->p_segments ); - FREE_AND_NULL( p_vcdplayer->psz_source ); - FREE_AND_NULL( p_vcdplayer->track ); - FREE_AND_NULL( p_vcdplayer->segment ); - FREE_AND_NULL( p_vcdplayer->entry ); - FREE_AND_NULL( p_access->psz_demux ); - FREE_AND_NULL( p_vcdplayer ); + FREENULL( p_vcdplayer->p_entries ); + FREENULL( p_vcdplayer->p_segments ); + FREENULL( p_vcdplayer->psz_source ); + FREENULL( p_vcdplayer->track ); + FREENULL( p_vcdplayer->segment ); + FREENULL( p_vcdplayer->entry ); + FREENULL( p_access->psz_demux ); + FREENULL( p_vcdplayer ); p_vcd_access = NULL; } @@ -1034,11 +1041,14 @@ static int VCDControl( access_t *p_access, int i_query, va_list args ) vlc_meta_t **pp_meta = (vlc_meta_t**)va_arg( args, vlc_meta_t** ); dbg_print( INPUT_DBG_EVENT, "get meta info" ); - - if ( p_vcdplayer->p_meta ) { - *pp_meta = vlc_meta_Duplicate( p_vcdplayer->p_meta ); - dbg_print( INPUT_DBG_META, "%s", "Meta copied" ); - } else +#if 0 + if( p_vcdplayer->p_meta ) + { + *pp_meta = vlc_meta_Duplicate( p_vcdplayer->p_meta ); + dbg_print( INPUT_DBG_META, "%s", "Meta copied" ); + } + else +#endif msg_Warn( p_access, "tried to copy NULL meta info" ); return VLC_SUCCESS; @@ -1137,11 +1147,26 @@ static int VCDControl( access_t *p_access, int i_query, va_list args ) unsigned int i_entry = vcdinfo_track_get_entry( p_vcdplayer->vcd, i_track); - /* FIXME! For now we are assuming titles are only - tracks and that track == title+1 */ - itemid.num = i_track; - itemid.type = VCDINFO_ITEM_TYPE_TRACK; - + if( i < p_vcdplayer->i_tracks ) + { + /* FIXME! For now we are assuming titles are only + tracks and that track == title+1 */ + itemid.num = i_track; + itemid.type = VCDINFO_ITEM_TYPE_TRACK; + } + else + { + /* FIXME! i_tracks+2 are Segments, but we need to + be able to figure out which segment of that. + i_tracks+1 is either Segments (if no LIDs) or + LIDs otherwise. Again need a way to get the LID + number. */ + msg_Warn( p_access, + "Trying to set track (%u) beyond end of last track (%u).", + i+1, p_vcdplayer->i_tracks ); + return VLC_EGENERIC; + } + VCDSetOrigin(p_access, vcdinfo_get_entry_lsn(p_vcdplayer->vcd, i_entry), i_track, &itemid );