* 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 <rocky@panix.com>
*
* 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 <vlc/vlc.h>
-#include <vlc/intf.h>
-#include <vlc/input.h>
+#include <vlc_interface.h>
+#include <vlc_input.h>
+#include <vlc_access.h>
#include "vlc_keys.h"
#include <cdio/cdio.h>
#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 );
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);
}
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,
*/
#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
{
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;
/* 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:
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;
-
+
}
/*****************************************************************************
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 );
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 */
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 )
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;
{
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++;
}
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
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;
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;
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;
{
unsigned int i;
for (i=0 ; i<p_vcdplayer->i_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;
}
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;
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 );