Add Track length mode.
Entry slider fixed update fixed.
Some small memory leaks fixed.
* vcd.c : VCD input module for vlc using libcdio, libvcd and libvcdinfo.
* vlc-specific things tend to go here.
*****************************************************************************
* vcd.c : VCD input module for vlc using libcdio, libvcd and libvcdinfo.
* vlc-specific things tend to go here.
*****************************************************************************
- * Copyright (C) 2000, 2003, 2004 VideoLAN
+ * Copyright (C) 2000, 2003, 2004, 2005 VideoLAN
* $Id$
*
* Authors: Rocky Bernstein <rocky@panix.com>
* $Id$
*
* Authors: Rocky Bernstein <rocky@panix.com>
#include "info.h"
#include "intf.h"
#include "info.h"
#include "intf.h"
-#define FREE_AND_NULL(ptr) if (NULL != ptr) free(ptr); ptr = NULL;
+#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 );
extern void VCDSetOrigin( access_t *p_access, lsn_t i_lsn, track_t i_track,
const vcdinfo_itemid_t *p_itemid );
block_Release( p_block );
return NULL;
block_Release( p_block );
return NULL;
-#else
- {
- memset(p_buf, 0, M2F2_SECTOR_SIZE);
- p_buf += 2;
- *p_buf = 0x01;
- printf("++++hacked\n");
- return p_block;
- }
-#endif
case READ_ERROR:
/* Some sort of error. Should we increment lsn? to skip block?
case READ_ERROR:
/* Some sort of error. Should we increment lsn? to skip block?
/* FIXME The below should be done in an event thread.
Until then...
*/
/* FIXME The below should be done in an event thread.
Until then...
*/
msleep( MILLISECONDS_PER_SEC * *p_buf );
msleep( MILLISECONDS_PER_SEC * *p_buf );
- p_vcd->in_still = VLC_FALSE;
+ // p_vcd->in_still = VLC_FALSE;
dbg_print(INPUT_DBG_STILL, "still wait time done");
#else
vcdIntfStillTime(p_vcdplayer->p_intf, *p_buf);
#endif
dbg_print(INPUT_DBG_STILL, "still wait time done");
#else
vcdIntfStillTime(p_vcdplayer->p_intf, *p_buf);
#endif
block_Release( p_block );
return NULL;
block_Release( p_block );
return NULL;
-#else
- memset(p_buf, 0, M2F2_SECTOR_SIZE);
- p_buf += 2;
- *p_buf = 0x01;
- return p_block;
-#endif
if ( p_vcdplayer->i_lsn >= i_lsn && i_lsn != VCDINFO_NULL_LSN )
{
const track_t i_track = p_vcdplayer->i_track;
if ( p_vcdplayer->i_lsn >= i_lsn && i_lsn != VCDINFO_NULL_LSN )
{
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);
+
p_vcdplayer->play_item.num = i_entry;
p_vcdplayer->play_item.num = i_entry;
- dbg_print( (INPUT_DBG_LSN|INPUT_DBG_PBC), "entry change" );
VCDSetOrigin( p_access, i_lsn, i_track,
&(p_vcdplayer->play_item) );
}
VCDSetOrigin( p_access, i_lsn, i_track,
&(p_vcdplayer->play_item) );
}
/* Next sector to read */
p_access->info.i_pos = 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->track_lsn;
+ p_vcdplayer->i_lsn = (i_pos / (int64_t) M2F2_SECTOR_SIZE) +
+ p_vcdplayer->origin_lsn;
switch (p_vcdplayer->play_item.type) {
case VCDINFO_ITEM_TYPE_TRACK:
switch (p_vcdplayer->play_item.type) {
case VCDINFO_ITEM_TYPE_TRACK:
{
input_title_t *t = p_vcdplayer->p_title[i-1] =
vlc_input_title_New();
{
input_title_t *t = p_vcdplayer->p_title[i-1] =
vlc_input_title_New();
- char psz_track[100];
- uint32_t i_secsize =
- vcdinfo_get_track_sect_count( p_vcdplayer->vcd, i );
snprintf( psz_track, sizeof(psz_track), "%s%02d", _("Track "),
i );
snprintf( psz_track, sizeof(psz_track), "%s%02d", _("Track "),
i );
-
- t->i_size = (i_secsize) * (int64_t) M2F2_SECTOR_SIZE;
+ 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);
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++;
}
p_vcdplayer->i_titles++;
}
if (vcdinfo_read_psd (p_vcdplayer->vcd)) {
if (vcdinfo_read_psd (p_vcdplayer->vcd)) {
- vcdinfo_visit_lot (p_vcdplayer->vcd, VLC_FALSE);
+ vcdinfo_visit_lot (p_vcdplayer->vcd, false);
- Set's start origin subsequent seeks/reads
+ Sets start origin for subsequent seeks/reads
*/
void
VCDSetOrigin( access_t *p_access, lsn_t i_lsn, track_t i_track,
*/
void
VCDSetOrigin( access_t *p_access, lsn_t i_lsn, track_t i_track,
vcdplayer_set_origin(p_access, i_lsn, i_track, p_itemid);
vcdplayer_set_origin(p_access, i_lsn, i_track, p_itemid);
- p_access->info.i_pos = ( i_lsn - p_vcdplayer->track_lsn )
- * M2F2_SECTOR_SIZE;
- p_access->info.i_update |= INPUT_UPDATE_TITLE|INPUT_UPDATE_SIZE
- | INPUT_UPDATE_SEEKPOINT;
-
-
switch (p_vcdplayer->play_item.type) {
case VCDINFO_ITEM_TYPE_ENTRY:
VCDUpdateVar( p_access, p_itemid->num, VLC_VAR_SETVALUE,
"chapter", _("Entry"), "Setting entry/segment");
p_access->info.i_title = i_track-1;
switch (p_vcdplayer->play_item.type) {
case VCDINFO_ITEM_TYPE_ENTRY:
VCDUpdateVar( p_access, p_itemid->num, VLC_VAR_SETVALUE,
"chapter", _("Entry"), "Setting entry/segment");
p_access->info.i_title = i_track-1;
- p_access->info.i_size = p_vcdplayer->p_title[i_track-1]->i_size;
+ 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;
+ } 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;
+ }
+ 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;
p_access->info.i_seekpoint = p_itemid->num;
break;
the entry seekpoints and (zeroed) lid seekpoints.
*/
p_access->info.i_title = p_vcdplayer->i_titles - 1;
the entry seekpoints and (zeroed) lid seekpoints.
*/
p_access->info.i_title = p_vcdplayer->i_titles - 1;
- p_access->info.i_size = 150 * M2F2_SECTOR_SIZE;
+ p_access->info.i_size = 0; /* No seeking on stills, please. */
+ p_access->info.i_pos = 0;
p_access->info.i_seekpoint = p_vcdplayer->i_entries
+ p_vcdplayer->i_lids + p_itemid->num;
break;
p_access->info.i_seekpoint = p_vcdplayer->i_entries
+ p_vcdplayer->i_lids + p_itemid->num;
break;
case VCDINFO_ITEM_TYPE_TRACK:
p_access->info.i_title = i_track-1;
p_access->info.i_size = p_vcdplayer->p_title[i_track-1]->i_size;
case VCDINFO_ITEM_TYPE_TRACK:
p_access->info.i_title = i_track-1;
p_access->info.i_size = p_vcdplayer->p_title[i_track-1]->i_size;
+ p_access->info.i_pos = 0;
p_access->info.i_seekpoint = vcdinfo_track_get_entry(p_vcdplayer->vcd,
i_track);
break;
p_access->info.i_seekpoint = vcdinfo_track_get_entry(p_vcdplayer->vcd,
i_track);
break;
default:
msg_Warn( p_access, "can't set origin for play type %d",
p_vcdplayer->play_item.type );
}
default:
msg_Warn( p_access, "can't set origin for play type %d",
p_vcdplayer->play_item.type );
}
+ p_access->info.i_update = INPUT_UPDATE_TITLE|INPUT_UPDATE_SIZE
+ | INPUT_UPDATE_SEEKPOINT;
VCDUpdateTitle( p_access );
VCDUpdateTitle( p_access );
+ p_vcdplayer->i_debug = config_GetInt( p_this, MODULE_STRING "-debug" );
p_access->p_sys = (access_sys_t *) p_vcdplayer;
/* Set where to log errors messages from libcdio. */
p_access->p_sys = (access_sys_t *) p_vcdplayer;
/* Set where to log errors messages from libcdio. */
psz_source, p_access->psz_path );
p_vcdplayer->psz_source = strdup(psz_source);
psz_source, p_access->psz_path );
p_vcdplayer->psz_source = strdup(psz_source);
- p_vcdplayer->i_debug = config_GetInt( p_this,
- MODULE_STRING "-debug" );
p_vcdplayer->i_blocks_per_read = config_GetInt( p_this, MODULE_STRING
"-blocks-per-read" );
p_vcdplayer->i_blocks_per_read = config_GetInt( p_this, MODULE_STRING
"-blocks-per-read" );
+ p_vcdplayer->b_track_length = config_GetInt( p_this, MODULE_STRING
+ "-track-length" );
p_vcdplayer->in_still = VLC_FALSE;
p_vcdplayer->play_item.type = VCDINFO_ITEM_TYPE_NOTFOUND;
p_vcdplayer->p_input = vlc_object_find( p_access,
VLC_OBJECT_INPUT,
FIND_PARENT );
p_vcdplayer->in_still = VLC_FALSE;
p_vcdplayer->play_item.type = VCDINFO_ITEM_TYPE_NOTFOUND;
p_vcdplayer->p_input = vlc_object_find( p_access,
VLC_OBJECT_INPUT,
FIND_PARENT );
- p_vcdplayer->p_demux = vlc_object_find( p_access,
- VLC_OBJECT_DEMUX,
- FIND_PARENT );
p_vcdplayer->p_meta = vlc_meta_New();
p_vcdplayer->p_segments = NULL;
p_vcdplayer->p_entries = NULL;
p_vcdplayer->p_meta = vlc_meta_New();
p_vcdplayer->p_segments = NULL;
p_vcdplayer->p_entries = NULL;
play_single_item );
#endif
play_single_item );
#endif
p_vcdplayer->p_intf = intf_Create( p_access, "vcdx" );
p_vcdplayer->p_intf->b_block = VLC_FALSE;
p_vcdplayer->p_intf = intf_Create( p_access, "vcdx" );
p_vcdplayer->p_intf->b_block = VLC_FALSE;
p_vcdplayer->p_access = p_access;
#ifdef FIXED
p_vcdplayer->p_access = p_access;
#ifdef FIXED
return VLC_SUCCESS;
err_exit:
if( p_vcdplayer->p_input ) vlc_object_release( p_vcdplayer->p_input );
return VLC_SUCCESS;
err_exit:
if( p_vcdplayer->p_input ) vlc_object_release( p_vcdplayer->p_input );
- if( p_vcdplayer->p_demux ) vlc_object_release( p_vcdplayer->p_demux );
free( psz_source );
free( p_vcdplayer );
return VLC_EGENERIC;
free( psz_source );
free( p_vcdplayer );
return VLC_EGENERIC;
dbg_print( (INPUT_DBG_CALL|INPUT_DBG_EXT), "VCDClose" );
dbg_print( (INPUT_DBG_CALL|INPUT_DBG_EXT), "VCDClose" );
+ {
+ 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);
+ }
+
vcdinfo_close( p_vcdplayer->vcd );
if( p_vcdplayer->p_input ) vlc_object_release( p_vcdplayer->p_input );
vcdinfo_close( p_vcdplayer->vcd );
if( p_vcdplayer->p_input ) vlc_object_release( p_vcdplayer->p_input );
- if( p_vcdplayer->p_demux ) vlc_object_release( p_vcdplayer->p_demux );
-
FREE_AND_NULL( p_vcdplayer->p_entries );
FREE_AND_NULL( p_vcdplayer->p_segments );
FREE_AND_NULL( p_vcdplayer->p_entries );
FREE_AND_NULL( p_vcdplayer->p_segments );
FREE_AND_NULL( p_vcdplayer->track );
FREE_AND_NULL( p_vcdplayer->segment );
FREE_AND_NULL( p_vcdplayer->entry );
FREE_AND_NULL( p_vcdplayer->track );
FREE_AND_NULL( p_vcdplayer->segment );
FREE_AND_NULL( p_vcdplayer->entry );
-
- free( p_vcdplayer );
- p_access->p_sys = NULL;
+ FREE_AND_NULL( p_access->psz_demux );
+ FREE_AND_NULL( p_vcdplayer );
#define add_format_str_info(val) \
{ \
#define add_format_str_info(val) \
{ \
- const char *str = val; \
+ const char *str = strdup(val); \
unsigned int len; \
if (val != NULL) { \
len=strlen(str); \
unsigned int len; \
if (val != NULL) { \
len=strlen(str); \
/*****************************************************************************
* vcd.c : VCD input module for vlc
*****************************************************************************
/*****************************************************************************
* vcd.c : VCD input module for vlc
*****************************************************************************
- * Copyright (C) 2000, 2003, 2004 VideoLAN
+ * Copyright (C) 2000, 2003, 2004, 2005 VideoLAN
* $Id$
*
* Authors: Rocky Bernstein <rocky@panix.com>
* $Id$
*
* Authors: Rocky Bernstein <rocky@panix.com>
"Otherwise we play by tracks."),
VLC_FALSE );
"Otherwise we play by tracks."),
VLC_FALSE );
+ add_bool( MODULE_STRING "-track-length", VLC_TRUE,
+ NULL,
+ N_("Use track length as maximum unit in seek?"),
+ N_("If set, the length of the seek bar is the track rather than "
+ "the length of an entry"),
+ VLC_FALSE );
+
add_bool( MODULE_STRING "-extended-info", 0, NULL,
N_("Show extended VCD info?"),
N_("Show the maximum about of information under Stream and "
add_bool( MODULE_STRING "-extended-info", 0, NULL,
N_("Show extended VCD info?"),
N_("Show the maximum about of information under Stream and "
N_("Format to use in playlist \"title\" field"),
VCD_TITLE_FMT_LONGTEXT, VLC_FALSE );
N_("Format to use in playlist \"title\" field"),
VCD_TITLE_FMT_LONGTEXT, VLC_FALSE );
-#ifdef FIXED
- add_submodule();
- set_capability( "interface", 0 );
- set_callbacks( VCDOpenIntf, VCDCloseIntf );
-#endif
-
int i_audio_nb;
int i_still;
bool b_end_of_cell;
int i_audio_nb;
int i_still;
bool b_end_of_cell;
+ bool b_track_length; /* Use track as max unit in seek */
access_t *p_access;
} vcdplayer_t;
access_t *p_access;
} vcdplayer_t;