]> git.sesse.net Git - vlc/commitdiff
Crash on quit fixed.
authorRocky Bernstein <rocky@videolan.org>
Sun, 10 Apr 2005 01:51:44 +0000 (01:51 +0000)
committerRocky Bernstein <rocky@videolan.org>
Sun, 10 Apr 2005 01:51:44 +0000 (01:51 +0000)
Add Track length mode.
Entry slider fixed update fixed.
Some small memory leaks fixed.

modules/access/vcdx/access.c
modules/access/vcdx/info.c
modules/access/vcdx/vcd.c
modules/access/vcdx/vcdplayer.h

index 0c377fe3fe0591d249cd2c3833b000b20bcacdf6..2a1420d923cd6d9eb9ad14087010d8f91aa5cbf4 100644 (file)
@@ -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 <rocky@panix.com>
@@ -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 ; 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 );
-    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;
 }
 
index aea381d8beaf4db185cae8ff632e5d060319a0d5..cbd422b2045ac47966c37eb8bd73d61f5e8126ac 100644 (file)
@@ -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);                                        \
index 24df65038ed1da140f23f352ddfb4f8738052584..76cd31b8a575bb8ec7060a8ec73d26ac3db0c53c 100644 (file)
@@ -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 <rocky@panix.com>
@@ -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();
 
index 8fb0b313f297773dab8867fb15726372b10b088d..e1174f97f193f6b5b346105a0c8ffd945ff706f8 100644 (file)
@@ -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;