From 0b0141010c38c6ad35ee03c0ff28b9b810ba0ce5 Mon Sep 17 00:00:00 2001 From: Rocky Bernstein Date: Sun, 10 Apr 2005 01:51:44 +0000 Subject: [PATCH] Crash on quit fixed. Add Track length mode. Entry slider fixed update fixed. Some small memory leaks fixed. --- modules/access/vcdx/access.c | 102 ++++++++++++++++---------------- modules/access/vcdx/info.c | 2 +- modules/access/vcdx/vcd.c | 15 ++--- modules/access/vcdx/vcdplayer.h | 2 +- 4 files changed, 60 insertions(+), 61 deletions(-) diff --git a/modules/access/vcdx/access.c b/modules/access/vcdx/access.c index 0c377fe3fe..2a1420d923 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 VideoLAN + * Copyright (C) 2000, 2003, 2004, 2005 VideoLAN * $Id$ * * Authors: Rocky Bernstein @@ -44,7 +44,7 @@ #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 ); @@ -185,18 +185,8 @@ VCDReadBlock( access_t * p_access ) } #endif -#if 1 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? @@ -208,23 +198,16 @@ VCDReadBlock( access_t * p_access ) /* FIXME The below should be done in an event thread. Until then... */ -#if 0 +#if 1 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 -#if 1 block_Release( p_block ); return NULL; -#else - memset(p_buf, 0, M2F2_SECTOR_SIZE); - p_buf += 2; - *p_buf = 0x01; - return p_block; -#endif } default: @@ -242,8 +225,13 @@ VCDReadBlock( access_t * p_access ) 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; - dbg_print( (INPUT_DBG_LSN|INPUT_DBG_PBC), "entry change" ); + VCDSetOrigin( p_access, i_lsn, i_track, &(p_vcdplayer->play_item) ); } @@ -270,8 +258,8 @@ 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->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: @@ -477,18 +465,16 @@ VCDTitles( access_t * p_access ) { 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 ); + char psz_track[80]; 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); - 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++; } @@ -517,7 +503,7 @@ VCDLIDs( access_t * p_access ) if (vcdinfo_read_psd (p_vcdplayer->vcd)) { - vcdinfo_visit_lot (p_vcdplayer->vcd, VLC_FALSE); + vcdinfo_visit_lot (p_vcdplayer->vcd, false); #if FIXED /* @@ -682,7 +668,7 @@ VCDParse( access_t * p_access, /*out*/ vcdinfo_itemid_t * p_itemid, } /* - 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, @@ -696,18 +682,22 @@ VCDSetOrigin( access_t *p_access, lsn_t i_lsn, track_t i_track, 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; - 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; @@ -719,7 +709,8 @@ VCDSetOrigin( access_t *p_access, lsn_t i_lsn, track_t i_track, 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; @@ -727,14 +718,18 @@ VCDSetOrigin( access_t *p_access, lsn_t i_lsn, track_t i_track, 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; + 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 ); @@ -875,6 +870,7 @@ VCDOpen ( vlc_object_t *p_this ) return VLC_ENOMEM; } + 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. */ @@ -894,18 +890,15 @@ VCDOpen ( vlc_object_t *p_this ) 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->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->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; @@ -964,8 +957,10 @@ VCDOpen ( vlc_object_t *p_this ) play_single_item ); #endif +#if FIXED p_vcdplayer->p_intf = intf_Create( p_access, "vcdx" ); p_vcdplayer->p_intf->b_block = VLC_FALSE; +#endif p_vcdplayer->p_access = p_access; #ifdef FIXED @@ -977,7 +972,6 @@ VCDOpen ( vlc_object_t *p_this ) 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; @@ -994,11 +988,16 @@ VCDClose ( vlc_object_t *p_this ) dbg_print( (INPUT_DBG_CALL|INPUT_DBG_EXT), "VCDClose" ); + { + unsigned int i; + for (i=0 ; ii_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 ); - 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 ); @@ -1006,9 +1005,8 @@ VCDClose ( vlc_object_t *p_this ) 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 ); p_vcd_access = NULL; } diff --git a/modules/access/vcdx/info.c b/modules/access/vcdx/info.c index aea381d8be..cbd422b204 100644 --- a/modules/access/vcdx/info.c +++ b/modules/access/vcdx/info.c @@ -182,7 +182,7 @@ VCDMetaInfo( access_t *p_access, /*const*/ char *psz_mrl ) #define add_format_str_info(val) \ { \ - const char *str = val; \ + const char *str = strdup(val); \ unsigned int len; \ if (val != NULL) { \ len=strlen(str); \ diff --git a/modules/access/vcdx/vcd.c b/modules/access/vcdx/vcd.c index 24df65038e..76cd31b8a5 100644 --- a/modules/access/vcdx/vcd.c +++ b/modules/access/vcdx/vcd.c @@ -1,7 +1,7 @@ /***************************************************************************** * vcd.c : VCD input module for vlc ***************************************************************************** - * Copyright (C) 2000, 2003, 2004 VideoLAN + * Copyright (C) 2000, 2003, 2004, 2005 VideoLAN * $Id$ * * Authors: Rocky Bernstein @@ -118,6 +118,13 @@ vlc_module_begin(); "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 " @@ -136,11 +143,5 @@ vlc_module_begin(); 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 - vlc_module_end(); diff --git a/modules/access/vcdx/vcdplayer.h b/modules/access/vcdx/vcdplayer.h index 8fb0b313f2..e1174f97f1 100644 --- a/modules/access/vcdx/vcdplayer.h +++ b/modules/access/vcdx/vcdplayer.h @@ -156,8 +156,8 @@ typedef struct vcdplayer_input_s int i_audio_nb; int i_still; bool b_end_of_cell; + bool b_track_length; /* Use track as max unit in seek */ input_thread_t *p_input; - demux_t *p_demux; access_t *p_access; } vcdplayer_t; -- 2.39.5