]> git.sesse.net Git - vlc/blobdiff - modules/access/vcdx/access.c
Used uint64_t for access_t::info.i_size/i_pos and access_t::pf_seek().
[vlc] / modules / access / vcdx / access.c
index e0eb969905501c05958fc1e42557d4f2d130fcea..f6bb46c5595746f17422effe9e9a465eb86f4666 100644 (file)
@@ -20,9 +20,9 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
- * 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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ * 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.,
+ * 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  *****************************************************************************/
 
 /*****************************************************************************
@@ -38,7 +38,6 @@
 #include <vlc_input.h>
 #include <vlc_access.h>
 #include <vlc_charset.h>
-#include "vlc_keys.h"
 
 #include <cdio/cdio.h>
 #include <cdio/cd_types.h>
@@ -88,52 +87,50 @@ static access_t *p_vcd_access = NULL;
 static void
 cdio_log_handler (cdio_log_level_t level, const char message[])
 {
-  const vcdplayer_t *p_vcdplayer = (vcdplayer_t *)p_vcd_access->p_sys;
-  switch (level) {
-  case CDIO_LOG_DEBUG:
-  case CDIO_LOG_INFO:
-    if (p_vcdplayer->i_debug & INPUT_DBG_CDIO)
-      msg_Dbg( p_vcd_access, "%s", message);
-    break;
-  case CDIO_LOG_WARN:
-    msg_Warn( p_vcd_access, "%s", message);
-    break;
-  case CDIO_LOG_ERROR:
-  case CDIO_LOG_ASSERT:
-    msg_Err( p_vcd_access, "%s", message);
-    break;
-  default:
-    msg_Warn( p_vcd_access, "%s\n%s %d", message,
-              "The above message had unknown log level",
-              level);
-  }
-  return;
+    const vcdplayer_t *p_vcdplayer = (vcdplayer_t *)p_vcd_access->p_sys;
+    switch (level) {
+    case CDIO_LOG_DEBUG:
+    case CDIO_LOG_INFO:
+        if (p_vcdplayer->i_debug & INPUT_DBG_CDIO)
+            msg_Dbg( p_vcd_access, "%s", message);
+        break;
+    case CDIO_LOG_WARN:
+        msg_Warn( p_vcd_access, "%s", message);
+        break;
+    case CDIO_LOG_ERROR:
+    case CDIO_LOG_ASSERT:
+        msg_Err( p_vcd_access, "%s", message);
+        break;
+    default:
+        msg_Warn( p_vcd_access, "%s\n%s %d", message,
+                  "The above message had unknown log level", level);
+    }
+    return;
 }
 
 /* process messages that originate from vcdinfo. */
 static void
 vcd_log_handler (vcd_log_level_t level, const char message[])
 {
-  vcdplayer_t *p_vcdplayer = (vcdplayer_t *)p_vcd_access->p_sys;
-  switch (level) {
-  case VCD_LOG_DEBUG:
-  case VCD_LOG_INFO:
-    if (p_vcdplayer->i_debug & INPUT_DBG_VCDINFO)
-      msg_Dbg( p_vcd_access, "%s", message);
-    break;
-  case VCD_LOG_WARN:
-    msg_Warn( p_vcd_access, "%s", message);
-    break;
-  case VCD_LOG_ERROR:
-  case VCD_LOG_ASSERT:
-    msg_Err( p_vcd_access, "%s", message);
-    break;
-  default:
-    msg_Warn( p_vcd_access, "%s\n%s %d", message,
-              "The above message had unknown vcdimager log level",
-              level);
-  }
-  return;
+    vcdplayer_t *p_vcdplayer = (vcdplayer_t *)p_vcd_access->p_sys;
+    switch (level) {
+    case VCD_LOG_DEBUG:
+    case VCD_LOG_INFO:
+        if (p_vcdplayer->i_debug & INPUT_DBG_VCDINFO)
+            msg_Dbg( p_vcd_access, "%s", message);
+        break;
+    case VCD_LOG_WARN:
+        msg_Warn( p_vcd_access, "%s", message);
+        break;
+    case VCD_LOG_ERROR:
+    case VCD_LOG_ASSERT:
+        msg_Err( p_vcd_access, "%s", message);
+        break;
+    default:
+        msg_Warn( p_vcd_access, "%s\n%s %d", message,
+                  "The above message had unknown vcdimager log level", level);
+    }
+    return;
 }
 
 /*****************************************************************************
@@ -149,8 +146,6 @@ VCDReadBlock( access_t * p_access )
     int          i_read;
     uint8_t     *p_buf;
 
-    i_read = 0;
-
     dbg_print( (INPUT_DBG_LSN), "lsn: %lu",
                (long unsigned int) p_vcdplayer->i_lsn );
 
@@ -166,79 +161,74 @@ VCDReadBlock( access_t * p_access )
     p_buf = (uint8_t *) p_block->p_buffer;
     for ( i_read = 0 ; i_read < i_blocks ; i_read++ )
     {
-      vcdplayer_read_status_t read_status = vcdplayer_read(p_access, p_buf);
+        vcdplayer_read_status_t read_status = vcdplayer_read(p_access, p_buf);
 
-      p_access->info.i_pos += M2F2_SECTOR_SIZE;
+        p_access->info.i_pos += M2F2_SECTOR_SIZE;
 
-      switch ( read_status ) {
-      case READ_END:
-        /* End reached. Return NULL to indicated this. */
-        /* We also set the postion to the end so the higher level
-           (demux?) doesn't try to keep reading. If everything works out
-           right this shouldn't have to happen.
-         */
+        switch ( read_status ) {
+        case READ_END:
+            /* End reached. Return NULL to indicated this. */
+            /* We also set the postion to the end so the higher level
+               (demux?) doesn't try to keep reading. If everything works out
+               right this shouldn't have to happen.
+             */
 #if 0
-        if ( p_access->info.i_pos != p_access->info.i_size ) {
-          msg_Warn( p_access,
+            if( p_access->info.i_pos != p_access->info.i_size ) {
+                msg_Warn( p_access,
                     "At end but pos (%llu) is not size (%llu). Adjusting.",
                     p_access->info.i_pos, p_access->info.i_size );
-          p_access->info.i_pos = p_access->info.i_size;
-        }
+                p_access->info.i_pos = p_access->info.i_size;
+            }
 #endif
 
-        block_Release( p_block );
-        return NULL;
+            block_Release( p_block );
+            return NULL;
 
-      case READ_ERROR:
-        /* Some sort of error. Should we increment lsn? to skip block?
-        */
-        block_Release( p_block );
-        return NULL;
-      case READ_STILL_FRAME:
-        {
+        case READ_ERROR:
+            /* Some sort of error. Should we increment lsn? to skip block? */
+            block_Release( p_block );
+            return NULL;
+        case READ_STILL_FRAME:
           /* FIXME The below should be done in an event thread.
              Until then...
            */
 #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 = false;
-          dbg_print(INPUT_DBG_STILL, "still wait time done");
+            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 = false;
+            dbg_print(INPUT_DBG_STILL, "still wait time done");
 #else
-          vcdIntfStillTime(p_vcdplayer->p_intf, *p_buf);
+            vcdIntfStillTime(p_vcdplayer->p_intf, *p_buf);
 #endif
 
-          block_Release( p_block );
-          return NULL;
+            block_Release( p_block );
+            return NULL;
+
+        default:
+        case READ_BLOCK:
+            /* Read buffer */
+            break;
         }
 
-      default:
-      case READ_BLOCK:
-        /* Read buffer */
-        ;
-      }
-
-      p_buf += M2F2_SECTOR_SIZE;
-      /* Update seekpoint */
-      if ( VCDINFO_ITEM_TYPE_ENTRY == p_vcdplayer->play_item.type )
-      {
-        unsigned int i_entry = p_vcdplayer->play_item.num+1;
-        lsn_t        i_lsn   = vcdinfo_get_entry_lsn(p_vcdplayer->vcd, i_entry);
-        if ( p_vcdplayer->i_lsn >= i_lsn && i_lsn != VCDINFO_NULL_LSN )
+        p_buf += M2F2_SECTOR_SIZE;
+        /* Update seekpoint */
+        if ( VCDINFO_ITEM_TYPE_ENTRY == p_vcdplayer->play_item.type )
         {
-            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);
+            size_t i_entry = p_vcdplayer->play_item.num+1;
+            lsn_t  i_lsn   = vcdinfo_get_entry_lsn(p_vcdplayer->vcd, i_entry);
+            if ( p_vcdplayer->i_lsn >= i_lsn && i_lsn != VCDINFO_NULL_LSN )
+            {
+                dbg_print( (INPUT_DBG_LSN|INPUT_DBG_PBC),
+                           "entry change to %zu, 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;
 
-            VCDSetOrigin( p_access,  i_lsn, i_track,
-                          &(p_vcdplayer->play_item) );
+                VCDSetOrigin( p_access,  i_lsn, p_vcdplayer->i_track,
+                              &(p_vcdplayer->play_item) );
+            }
         }
-      }
     }
 
     return p_block;
@@ -249,77 +239,76 @@ VCDReadBlock( access_t * p_access )
  * VCDSeek
  ****************************************************************************/
 int
-VCDSeek( access_t * p_access, int64_t i_pos )
+VCDSeek( access_t * p_access, uint64_t i_pos )
 {
     if (!p_access || !p_access->p_sys) return VLC_EGENERIC;
-
     {
-      vcdplayer_t         *p_vcdplayer = (vcdplayer_t *)p_vcd_access->p_sys;
-      const input_title_t *t = p_vcdplayer->p_title[p_access->info.i_title];
-      unsigned int         i_entry = VCDINFO_INVALID_ENTRY;
-      int i_seekpoint;
-
-      /* 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;
-
-      switch (p_vcdplayer->play_item.type) {
-      case VCDINFO_ITEM_TYPE_TRACK:
-      case VCDINFO_ITEM_TYPE_ENTRY:
-        break ;
-      default:
-        p_vcdplayer->b_valid_ep = false;
-      }
-
-      /* Find entry */
-      if( p_vcdplayer->b_valid_ep )
-      {
-          for( i_entry = 0 ; i_entry < p_vcdplayer->i_entries ; i_entry ++ )
-          {
-              if( p_vcdplayer->i_lsn < p_vcdplayer->p_entries[i_entry] )
-              {
-                  VCDUpdateVar( p_access, i_entry, VLC_VAR_SETVALUE,
-                                "chapter", _("Entry"), "Setting entry" );
-                  break;
-              }
-          }
-
-          {
-              vcdinfo_itemid_t itemid;
-              itemid.num  = i_entry;
-              itemid.type = VCDINFO_ITEM_TYPE_ENTRY;
-              VCDSetOrigin(p_access, p_vcdplayer->i_lsn, p_vcdplayer->i_track,
-                           &itemid);
-          }
+        vcdplayer_t         *p_vcdplayer = (vcdplayer_t *)p_vcd_access->p_sys;
+        const input_title_t *t = p_vcdplayer->p_title[p_access->info.i_title];
+        unsigned int         i_entry = VCDINFO_INVALID_ENTRY;
+        int i_seekpoint;
+
+        /* Next sector to read */
+        p_access->info.i_pos = i_pos;
+        p_vcdplayer->i_lsn = (i_pos / (uint64_t) M2F2_SECTOR_SIZE) +
+                             p_vcdplayer->origin_lsn;
+
+        switch (p_vcdplayer->play_item.type)
+        {
+        case VCDINFO_ITEM_TYPE_TRACK:
+        case VCDINFO_ITEM_TYPE_ENTRY:
+            break;
+        default:
+            p_vcdplayer->b_valid_ep = false;
+            break;
+        }
+
+        /* Find entry */
+        if( p_vcdplayer->b_valid_ep )
+        {
+            for( i_entry = 0 ; i_entry < p_vcdplayer->i_entries ; i_entry ++ )
+            {
+                if( p_vcdplayer->i_lsn < p_vcdplayer->p_entries[i_entry] )
+                {
+                    VCDUpdateVar( p_access, i_entry, VLC_VAR_SETVALUE,
+                                  "chapter", _("Entry"), "Setting entry" );
+                    break;
+                }
+            }
+
+            {
+                vcdinfo_itemid_t itemid;
+                itemid.num  = i_entry;
+                itemid.type = VCDINFO_ITEM_TYPE_ENTRY;
+                VCDSetOrigin(p_access, p_vcdplayer->i_lsn,
+                             p_vcdplayer->i_track, &itemid);
+            }
         }
 
-      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->i_lsn, i_pos,
-                 i_entry );
+        dbg_print( (INPUT_DBG_CALL|INPUT_DBG_EXT|INPUT_DBG_SEEK),
+                   "orig %lu, cur: %lu, offset: %"PRIi64", entry %d",
+                   (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;
-    }
+        /* 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;
+        }
  
-      /* 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;
-    }
-
+        /* 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;
+        }
     }
     p_access->info.b_eof = false;
     return VLC_SUCCESS;
 }
 
 /*****************************************************************************
@@ -330,61 +319,59 @@ VCDSeek( access_t * p_access, int64_t i_pos )
 static bool
 VCDEntryPoints( access_t * p_access )
 {
-  if (!p_access || !p_access->p_sys) return false;
+    if (!p_access || !p_access->p_sys) return false;
  
-  {
     vcdplayer_t       *p_vcdplayer = (vcdplayer_t *) p_access->p_sys;
-    const unsigned int i_entries   =
-      vcdinfo_get_num_entries(p_vcdplayer->vcd);
+    const unsigned int i_entries   = vcdinfo_get_num_entries(p_vcdplayer->vcd);
     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));
+           = 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 false;
+        LOG_ERR ("no entires found -- something is wrong" );
+        return 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 false;
-      }
+    {
+        LOG_ERR ("not enough memory for entry points treatment" );
+        return 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];
+        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 );
+            snprintf(psz_entry, sizeof(psz_entry), "%s %02d", _("Entry"), i );
 
-      p_vcdplayer->p_entries[i] = vcdinfo_get_entry_lsn(p_vcdplayer->vcd, 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;
+            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 );
+            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 );
 
         } else
-          msg_Warn( p_access, "wrong track number found in entry points" );
+            msg_Warn( p_access, "wrong track number found in entry points" );
     }
     p_vcdplayer->b_valid_ep = true;
     return true;
-  }
 }
 
 /*****************************************************************************
@@ -413,8 +400,7 @@ VCDSegments( access_t * p_access )
     /* We have one additional segment allocated so we can get the size
        by subtracting seg[i+1] - seg[i].
      */
-    p_vcdplayer->p_segments =
-      malloc( sizeof( lsn_t ) * (p_vcdplayer->i_segments+1) );
+    p_vcdplayer->p_segments=malloc(sizeof(lsn_t)*(p_vcdplayer->i_segments+1));
     if( p_vcdplayer->p_segments == NULL )
     {
         LOG_ERR ("not enough memory for segment treatment" );
@@ -468,17 +454,15 @@ VCDTitles( access_t * p_access )
         for( i = 1 ; i <= p_vcdplayer->i_tracks ; i++ )
         {
             input_title_t *t = p_vcdplayer->p_title[i-1] =
-              vlc_input_title_New();
+                                                        vlc_input_title_New();
             char psz_track[80];
 
-            snprintf( psz_track, sizeof(psz_track), "%s %02d", _("Track"),
-                                                    i );
+            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 ;
+                                 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: %"PRIi64, i, t->i_size );
 
             p_vcdplayer->i_titles++;
         }
@@ -532,8 +516,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"),
-                  i_lid );
+        snprintf( psz_lid, sizeof(psz_lid), "%s %02d", _("LID"), i_lid );
 
         s->i_byte_offset = 0; /*  A lid doesn't have an offset
                                   size associated with it */
@@ -563,7 +546,7 @@ VCDParse( access_t * p_access, /*out*/ vcdinfo_itemid_t * p_itemid,
     char        *psz_source;
     char        *psz_next;
 
-    if( config_GetInt( p_access, MODULE_STRING "-PBC" ) ) {
+    if( var_InheritInteger( p_access, MODULE_STRING "-PBC" ) ) {
       p_itemid->type = VCDINFO_ITEM_TYPE_LID;
       p_itemid->num = 1;
       *play_single_item = false;
@@ -600,69 +583,69 @@ VCDParse( access_t * p_access, /*out*/ vcdinfo_itemid_t * p_itemid,
          type+entry number. */
       unsigned int num;
 
-      *psz_parser = '\0';
-      ++psz_parser;
-      if( *psz_parser )
-        {
-          switch(*psz_parser) {
-          case 'E':
+        *psz_parser = '\0';
+        ++psz_parser;
+        if( *psz_parser )
+        switch(*psz_parser) {
+        case 'E':
             p_itemid->type = VCDINFO_ITEM_TYPE_ENTRY;
             ++psz_parser;
             *play_single_item = true;
             break;
-          case 'P':
+        case 'P':
             p_itemid->type = VCDINFO_ITEM_TYPE_LID;
             ++psz_parser;
             *play_single_item = false;
             break;
-          case 'S':
+        case 'S':
             p_itemid->type = VCDINFO_ITEM_TYPE_SEGMENT;
             ++psz_parser;
             *play_single_item = true;
             break;
-          case 'T':
+        case 'T':
             p_itemid->type = VCDINFO_ITEM_TYPE_TRACK;
             ++psz_parser;
             *play_single_item = true;
             break;
-          default: ;
-          }
+        default:
+            break;
         }
 
-      num = strtol( psz_parser, &psz_next, 10 );
-      if ( *psz_parser != '\0' && *psz_next == '\0')
+        num = strtol( psz_parser, &psz_next, 10 );
+        if ( *psz_parser != '\0' && *psz_next == '\0')
         {
-          p_itemid->num = num;
+            p_itemid->num = num;
         }
 
     } else {
-      *play_single_item = ( VCDINFO_ITEM_TYPE_LID == p_itemid->type );
+        *play_single_item = ( VCDINFO_ITEM_TYPE_LID == p_itemid->type );
     }
 
 
-    if( !*psz_source ) {
+    if( !*psz_source )
+    {
 
-      /* No source specified, so figure it out. */
-      if( !p_access->psz_access ) return NULL;
+        /* No source specified, so figure it out. */
+        if( !p_access->psz_access ) return NULL;
 
-      psz_source = config_GetPsz( p_access, "vcd" );
+        psz_source = var_InheritString( p_access, "vcd" );
 
-      if( !psz_source || 0==strlen(psz_source) ) {
-        free( psz_source );
-        /* Scan for a CD-ROM drive with a VCD in it. */
-        char **cd_drives = cdio_get_devices_with_cap( NULL,
-                            ( CDIO_FS_ANAL_SVCD | CDIO_FS_ANAL_CVD
-                              |CDIO_FS_ANAL_VIDEOCD | CDIO_FS_UNKNOWN ),
-                                                     true );
-        if( NULL == cd_drives ) return NULL;
-        if( cd_drives[0] == NULL )
+        if( !psz_source )
         {
-         cdio_free_device_list( cd_drives );
-          return NULL;
+            /* Scan for a CD-ROM drive with a VCD in it. */
+            char **cd_drives = cdio_get_devices_with_cap(NULL,
+                                       (CDIO_FS_ANAL_SVCD|CDIO_FS_ANAL_CVD
+                                       |CDIO_FS_ANAL_VIDEOCD|CDIO_FS_UNKNOWN),
+                                       true);
+            if( NULL == cd_drives ) return NULL;
+            if( cd_drives[0] == NULL )
+            {
+                cdio_free_device_list( cd_drives );
+                return NULL;
+            }
+            psz_source = strdup( cd_drives[0] );
+            cdio_free_device_list( cd_drives );
         }
-        psz_source = strdup( cd_drives[0] );
-        cdio_free_device_list( cd_drives );
-      }
     }
 
     dbg_print( (INPUT_DBG_CALL|INPUT_DBG_MRL),
@@ -679,65 +662,65 @@ void
 VCDSetOrigin( access_t *p_access, lsn_t i_lsn, track_t i_track,
               const vcdinfo_itemid_t *p_itemid )
 {
-  vcdplayer_t *p_vcdplayer= (vcdplayer_t *)p_access->p_sys;
-
-  dbg_print( (INPUT_DBG_CALL|INPUT_DBG_LSN),
-             "i_lsn: %lu, track: %d", (long unsigned int) i_lsn,
-             i_track );
-
-  vcdplayer_set_origin(p_access, i_lsn, i_track, p_itemid);
-
-  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;
-      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) 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;
-      }
-      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;
-
-  case VCDINFO_ITEM_TYPE_SEGMENT:
-      VCDUpdateVar( p_access, p_itemid->num, VLC_VAR_SETVALUE,
-                  "chapter", _("Segment"),  "Setting entry/segment");
-      /* The last title entry is the for segments (when segments exist
-         and they must here. The segment seekpoints are stored after
-         the entry seekpoints and (zeroed) lid seekpoints.
-      */
-      p_access->info.i_title     = p_vcdplayer->i_titles - 1;
-      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;
-
-  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 );
+    vcdplayer_t *p_vcdplayer= (vcdplayer_t *)p_access->p_sys;
+
+    dbg_print( (INPUT_DBG_CALL|INPUT_DBG_LSN),
+               "i_lsn: %lu, track: %d", (long unsigned int) i_lsn, i_track );
+
+    vcdplayer_set_origin(p_access, i_lsn, i_track, p_itemid);
+
+    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;
+        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  = (uint64_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;
+        }
+        dbg_print( (INPUT_DBG_LSN|INPUT_DBG_PBC), "size: %"PRIu64", pos: %"PRIu64,
+                   p_access->info.i_size, p_access->info.i_pos );
+        p_access->info.i_seekpoint = p_itemid->num;
+        break;
+
+    case VCDINFO_ITEM_TYPE_SEGMENT:
+        VCDUpdateVar( p_access, p_itemid->num, VLC_VAR_SETVALUE,
+                      "chapter", _("Segment"),  "Setting entry/segment");
+        /* The last title entry is the for segments (when segments exist
+           and they must here. The segment seekpoints are stored after
+           the entry seekpoints and (zeroed) lid seekpoints.
+        */
+        p_access->info.i_title     = p_vcdplayer->i_titles - 1;
+        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;
+
+    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 );
 
 }
 
@@ -759,10 +742,11 @@ vcd_Open( vlc_object_t *p_this, const char *psz_dev )
     if( !psz_dev ) return NULL;
 
     actual_dev= ToLocaleDup(psz_dev);
-    if ( vcdinfo_open(&p_vcdobj, &actual_dev, DRIVER_UNKNOWN, NULL) !=
-         VCDINFO_OPEN_VCD) {
-      free(actual_dev);
-      return NULL;
+    if( vcdinfo_open(&p_vcdobj, &actual_dev, DRIVER_UNKNOWN, NULL) !=
+                                                    VCDINFO_OPEN_VCD)
+    {
+        free(actual_dev);
+        return NULL;
     }
     free(actual_dev);
 
@@ -770,41 +754,49 @@ vcd_Open( vlc_object_t *p_this, const char *psz_dev )
        Save summary info on tracks, segments and entries...
     */
 
-    if ( 0 < (p_vcdplayer->i_tracks = vcdinfo_get_num_tracks(p_vcdobj)) ) {
-      p_vcdplayer->track = (vcdplayer_play_item_info_t *)
-        calloc(p_vcdplayer->i_tracks, sizeof(vcdplayer_play_item_info_t));
-
-      for (i=0; i<p_vcdplayer->i_tracks; i++) {
-        unsigned int track_num=i+1;
-        p_vcdplayer->track[i].size  =
-          vcdinfo_get_track_sect_count(p_vcdobj, track_num);
-        p_vcdplayer->track[i].start_LSN =
-          vcdinfo_get_track_lsn(p_vcdobj, track_num);
-      }
+    if ( 0 < (p_vcdplayer->i_tracks = vcdinfo_get_num_tracks(p_vcdobj)) )
+    {
+        p_vcdplayer->track = (vcdplayer_play_item_info_t *)
+          calloc(p_vcdplayer->i_tracks, sizeof(vcdplayer_play_item_info_t));
+
+        for (i=0; i<p_vcdplayer->i_tracks; i++)
+        {
+            unsigned int track_num=i+1;
+            p_vcdplayer->track[i].size  =
+            vcdinfo_get_track_sect_count(p_vcdobj, track_num);
+            p_vcdplayer->track[i].start_LSN =
+            vcdinfo_get_track_lsn(p_vcdobj, track_num);
+        }
     } else
-      p_vcdplayer->track = NULL;
+        p_vcdplayer->track = NULL;
 
-    if ( 0 < (p_vcdplayer->i_entries = vcdinfo_get_num_entries(p_vcdobj)) ) {
-      p_vcdplayer->entry = (vcdplayer_play_item_info_t *)
-        calloc(p_vcdplayer->i_entries, sizeof(vcdplayer_play_item_info_t));
+    if( 0 < (p_vcdplayer->i_entries = vcdinfo_get_num_entries(p_vcdobj)) )
+    {
+        p_vcdplayer->entry = (vcdplayer_play_item_info_t *)
+            calloc(p_vcdplayer->i_entries, sizeof(vcdplayer_play_item_info_t));
 
-      for (i=0; i<p_vcdplayer->i_entries; i++) {
-        p_vcdplayer->entry[i].size =
-          vcdinfo_get_entry_sect_count(p_vcdobj, i);
-        p_vcdplayer->entry[i].start_LSN = vcdinfo_get_entry_lsn(p_vcdobj, i);
-      }
+        for (i=0; i<p_vcdplayer->i_entries; i++)
+        {
+            p_vcdplayer->entry[i].size =
+                                    vcdinfo_get_entry_sect_count(p_vcdobj, i);
+            p_vcdplayer->entry[i].start_LSN =
+                                           vcdinfo_get_entry_lsn(p_vcdobj, i);
+        }
     } else
       p_vcdplayer->entry = NULL;
 
-    if ( 0 < (p_vcdplayer->i_segments = vcdinfo_get_num_segments(p_vcdobj)) ) {
-      p_vcdplayer->segment = (vcdplayer_play_item_info_t *)
-        calloc(p_vcdplayer->i_segments,  sizeof(vcdplayer_play_item_info_t));
+    if ( 0 < (p_vcdplayer->i_segments = vcdinfo_get_num_segments(p_vcdobj)) )
+    {
+        p_vcdplayer->segment = (vcdplayer_play_item_info_t *)
+          calloc(p_vcdplayer->i_segments,  sizeof(vcdplayer_play_item_info_t));
 
-      for (i=0; i<p_vcdplayer->i_segments; i++) {
-        p_vcdplayer->segment[i].size =
-          vcdinfo_get_seg_sector_count(p_vcdobj, i);
-        p_vcdplayer->segment[i].start_LSN = vcdinfo_get_seg_lsn(p_vcdobj, i);
-      }
+        for (i=0; i<p_vcdplayer->i_segments; i++)
+        {
+            p_vcdplayer->segment[i].size =
+                                    vcdinfo_get_seg_sector_count(p_vcdobj, i);
+            p_vcdplayer->segment[i].start_LSN =
+                                             vcdinfo_get_seg_lsn(p_vcdobj, i);
+        }
     } else
       p_vcdplayer->segment = NULL;
 
@@ -819,18 +811,20 @@ VCDUpdateVar( access_t *p_access, int i_num, int i_action,
               const char *p_varname, char *p_label,
               const char *p_debug_label)
 {
-  vlc_value_t val;
-  val.i_int = i_num;
-  if (p_access) {
-    const vcdplayer_t *p_vcdplayer = (vcdplayer_t *)p_vcd_access->p_sys;
-    dbg_print( INPUT_DBG_PBC, "%s %d", p_debug_label, i_num );
-  }
-  if (p_label) {
-    vlc_value_t text;
-    text.psz_string = p_label;
-    var_Change( p_access, p_varname, VLC_VAR_SETTEXT, &text, NULL );
-  }
-  var_Change( p_access, p_varname, i_action, &val, NULL );
+    vlc_value_t val;
+    val.i_int = i_num;
+    if( p_access )
+    {
+        const vcdplayer_t *p_vcdplayer = (vcdplayer_t *)p_vcd_access->p_sys;
+        dbg_print( INPUT_DBG_PBC, "%s %d", p_debug_label, i_num );
+    }
+    if( p_label )
+    {
+        vlc_value_t text;
+        text.psz_string = p_label;
+        var_Change( p_access, p_varname, VLC_VAR_SETTEXT, &text, NULL );
+    }
+    var_Change( p_access, p_varname, i_action, &val, NULL );
 }
 
 
@@ -873,7 +867,7 @@ VCDOpen ( vlc_object_t *p_this )
     if( p_vcdplayer == NULL )
         return VLC_ENOMEM;
 
-    p_vcdplayer->i_debug = config_GetInt( p_this, MODULE_STRING "-debug" );
+    p_vcdplayer->i_debug = var_InheritInteger( p_this, MODULE_STRING "-debug" );
     p_access->p_sys = (access_sys_t *) p_vcdplayer;
 
     /* Set where to log errors messages from libcdio. */
@@ -885,23 +879,21 @@ VCDOpen ( vlc_object_t *p_this )
 
     if ( NULL == psz_source )
     {
-      free( p_vcdplayer );
-      return( VLC_EGENERIC );
+        free( p_vcdplayer );
+        return( VLC_EGENERIC );
     }
 
     dbg_print( (INPUT_DBG_CALL|INPUT_DBG_EXT), "source: %s: mrl: %s",
                psz_source, p_access->psz_path );
 
     p_vcdplayer->psz_source        = strdup(psz_source);
-    p_vcdplayer->i_blocks_per_read = config_GetInt( p_this, MODULE_STRING
+    p_vcdplayer->i_blocks_per_read = var_InheritInteger( p_this, MODULE_STRING
                                                     "-blocks-per-read" );
-    p_vcdplayer->b_track_length    = config_GetInt( p_this, MODULE_STRING
+    p_vcdplayer->b_track_length    = var_InheritInteger( p_this, MODULE_STRING
                                                     "-track-length" );
     p_vcdplayer->in_still          = 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_input           = access_GetParentInput( p_access );
 //    p_vcdplayer->p_meta            = vlc_meta_New();
     p_vcdplayer->p_segments        = NULL;
     p_vcdplayer->p_entries         = NULL;
@@ -913,12 +905,13 @@ VCDOpen ( vlc_object_t *p_this )
         goto err_exit;
     }
 
-    p_vcdplayer->b_svd= (bool) vcdinfo_get_tracksSVD(p_vcdplayer->vcd);;
+    p_vcdplayer->b_svd = vcdinfo_get_tracksSVD(p_vcdplayer->vcd);
 
     /* Get track information. */
     p_vcdplayer->i_tracks = vcdinfo_get_num_tracks(p_vcdplayer->vcd);
 
-    if( p_vcdplayer->i_tracks < 1 || CDIO_INVALID_TRACK == p_vcdplayer->i_tracks ) {
+    if( p_vcdplayer->i_tracks<1 || CDIO_INVALID_TRACK==p_vcdplayer->i_tracks )
+    {
         vcdinfo_close( p_vcdplayer->vcd );
         LOG_ERR ("no movie tracks found" );
         goto err_exit;
@@ -956,9 +949,8 @@ VCDOpen ( vlc_object_t *p_this )
     p_access->psz_demux = strdup( "ps" );
 
 #ifdef FIXED
-    if (play_single_item)
-      VCDFixupPlayList( p_access, p_vcd, psz_source, &itemid,
-                        play_single_item );
+    if( play_single_item )
+        VCDFixupPlayList(p_access,p_vcd,psz_source,&itemid,play_single_item);
 #endif
 
 #ifdef FIXED
@@ -990,10 +982,10 @@ 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);
+        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 );
@@ -1030,186 +1022,167 @@ static int VCDControl( access_t *p_access, int i_query, va_list args )
         /* Pass back a copy of meta information that was gathered when we
            during the Open/Initialize call.
          */
-        case ACCESS_GET_META:
-        {
-            dbg_print( INPUT_DBG_EVENT, "get meta info" );
+    case ACCESS_GET_META:
+        dbg_print( INPUT_DBG_EVENT, "get meta info" );
 #if 0
-            if( p_vcdplayer->p_meta )
-            {
-                vlc_meta_t **pp_meta = (vlc_meta_t**)va_arg(args,vlc_meta_t**);
+        if( p_vcdplayer->p_meta )
+        {
+            vlc_meta_t **pp_meta = (vlc_meta_t**)va_arg(args,vlc_meta_t**);
 
-                *pp_meta = vlc_meta_Duplicate( p_vcdplayer->p_meta );
-                dbg_print( INPUT_DBG_META, "%s", "Meta copied" );
-            }
-            else
+            *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" );
+            msg_Warn( p_access, "tried to copy NULL meta info" );
 
-            return VLC_SUCCESS;
-          }
-          return VLC_EGENERIC;
+        return VLC_SUCCESS;
 
-        case ACCESS_CAN_SEEK:
-        case ACCESS_CAN_FASTSEEK:
-        case ACCESS_CAN_PAUSE:
-        case ACCESS_CAN_CONTROL_PACE:
-        {
-            bool *pb_bool = (bool*)va_arg( args, bool* );
+    case ACCESS_CAN_SEEK:
+    case ACCESS_CAN_FASTSEEK:
+    case ACCESS_CAN_PAUSE:
+    case ACCESS_CAN_CONTROL_PACE:
 
-            dbg_print( INPUT_DBG_EVENT,
-                       "seek/fastseek/pause/can_control_pace" );
-            *pb_bool = true;
-            return VLC_SUCCESS;
-            break;
-          }
+        dbg_print( INPUT_DBG_EVENT,
+                   "seek/fastseek/pause/can_control_pace" );
+        *((bool*)va_arg( args, bool* )) = true;
+        return VLC_SUCCESS;
+
+    /* */
+    case ACCESS_GET_PTS_DELAY:
+        *(int64_t*)va_arg(args,int64_t *) = MILLISECONDS_PER_SEC *
+                         var_GetInteger( p_access, MODULE_STRING "-caching" );
+        dbg_print( INPUT_DBG_EVENT, "GET PTS DELAY" );
+        return VLC_SUCCESS;
 
         /* */
-        case ACCESS_GET_PTS_DELAY:
+    case ACCESS_SET_PAUSE_STATE:
+        dbg_print( INPUT_DBG_EVENT, "SET PAUSE STATE" );
+        return VLC_SUCCESS;
+
+    case ACCESS_GET_TITLE_INFO:
+    {
+        unsigned int psz_mrl_max = strlen(VCD_MRL_PREFIX)
+          + strlen(p_vcdplayer->psz_source) + sizeof("@E999")+3;
+        input_title_t ***ppp_title
+          = (input_title_t***)va_arg( args, input_title_t*** );
+        char *psz_mrl = malloc( psz_mrl_max );
+        unsigned int i;
+
+        pi_int    = (int*)va_arg( args, int* );
+
+        dbg_print( INPUT_DBG_EVENT, "GET TITLE: i_titles %d",
+                   p_vcdplayer->i_titles );
+
+        if( psz_mrl  )
         {
-            int64_t *pi_64 = (int64_t*)va_arg( args, int64_t * );
-            *pi_64 = var_GetInteger( p_access, MODULE_STRING "-caching" )
-              * MILLISECONDS_PER_SEC;
-            dbg_print( INPUT_DBG_EVENT, "GET PTS DELAY" );
-            return VLC_SUCCESS;
-            break;
+            snprintf(psz_mrl, psz_mrl_max, "%s%s",
+                     VCD_MRL_PREFIX, p_vcdplayer->psz_source);
+            VCDMetaInfo( p_access, psz_mrl );
+            free(psz_mrl);
         }
 
-        /* */
-        case ACCESS_SET_PAUSE_STATE:
-            dbg_print( INPUT_DBG_EVENT, "SET PAUSE STATE" );
+        /* Duplicate title info */
+        if( p_vcdplayer->i_titles == 0 )
+        {
+            *pi_int = 0; ppp_title = NULL;
             return VLC_SUCCESS;
-            break;
+        }
+        *pi_int = p_vcdplayer->i_titles;
+        *ppp_title = malloc(sizeof(input_title_t **)*p_vcdplayer->i_titles);
 
-        case ACCESS_GET_TITLE_INFO:
-        {
-            unsigned int psz_mrl_max = strlen(VCD_MRL_PREFIX)
-              + strlen(p_vcdplayer->psz_source) + sizeof("@E999")+3;
-            input_title_t ***ppp_title
-              = (input_title_t***)va_arg( args, input_title_t*** );
-            char *psz_mrl = malloc( psz_mrl_max );
-            unsigned int i;
+        if (!*ppp_title) return VLC_ENOMEM;
 
-            pi_int    = (int*)va_arg( args, int* );
+        for( i = 0; i < p_vcdplayer->i_titles; i++ )
+            if( p_vcdplayer->p_title[i] )
+                (*ppp_title)[i] =
+                           vlc_input_title_Duplicate(p_vcdplayer->p_title[i]);
+    }
+    break;
 
-            dbg_print( INPUT_DBG_EVENT, "GET TITLE: i_titles %d",
-                       p_vcdplayer->i_titles );
+    case ACCESS_SET_TITLE:
+        i = (int)va_arg( args, int );
 
-            if( psz_mrl  )
-            {
-               snprintf(psz_mrl, psz_mrl_max, "%s%s",
-                        VCD_MRL_PREFIX, p_vcdplayer->psz_source);
-               VCDMetaInfo( p_access, psz_mrl );
-               free(psz_mrl);
-            }
+        dbg_print( INPUT_DBG_EVENT, "set title %d" , i);
+        if( i != p_access->info.i_title )
+        {
+            vcdinfo_itemid_t itemid;
+            track_t          i_track = i+1;
+            unsigned int     i_entry =
+                        vcdinfo_track_get_entry(p_vcdplayer->vcd,i_track);
 
-            /* Duplicate title info */
-            if( p_vcdplayer->i_titles == 0 )
+            if( i < p_vcdplayer->i_tracks )
             {
-                *pi_int = 0; ppp_title = NULL;
-                return VLC_SUCCESS;
+                /* 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;
             }
-            *pi_int = p_vcdplayer->i_titles;
-            *ppp_title = malloc( sizeof( input_title_t **)
-                                         * p_vcdplayer->i_titles );
-
-            if (!*ppp_title) return VLC_ENOMEM;
-
-            for( i = 0; i < p_vcdplayer->i_titles; i++ )
+            else
             {
-                if ( p_vcdplayer->p_title[i] )
-                  (*ppp_title)[i] =
-                    vlc_input_title_Duplicate( p_vcdplayer->p_title[i] );
+                /* 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;
             }
-          }
-          break;
 
-        case ACCESS_SET_TITLE:
-            i = (int)va_arg( args, int );
+            VCDSetOrigin(p_access,
+                         vcdinfo_get_entry_lsn(p_vcdplayer->vcd,i_entry),
+                         i_track, &itemid);
+        }
+        break;
 
-            dbg_print( INPUT_DBG_EVENT, "set title %d" , i);
-            if( i != p_access->info.i_title )
-            {
-                vcdinfo_itemid_t itemid;
-                track_t          i_track = i+1;
-                unsigned int     i_entry =
-                  vcdinfo_track_get_entry( p_vcdplayer->vcd, i_track);
+    case ACCESS_SET_SEEKPOINT:
+    {
+        input_title_t *t = p_vcdplayer->p_title[p_access->info.i_title];
+        unsigned int i = (unsigned int)va_arg( args, unsigned int );
 
-        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
+        dbg_print( INPUT_DBG_EVENT, "set seekpoint %d", i );
+        if( t->i_seekpoint > 0 )
         {
-            /* 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 );
-            }
-            break;
+            track_t i_track = p_access->info.i_title+1;
+            lsn_t lsn;
 
-        case ACCESS_SET_SEEKPOINT:
-        {
-            input_title_t *t = p_vcdplayer->p_title[p_access->info.i_title];
-            unsigned int i = (unsigned int)va_arg( args, unsigned int );
+            /* FIXME! For now we are assuming titles are only tracks and
+               that track == title+1 and we the play item is entries (not
+               tracks or lids). We need to generalize all of this.
+             */
 
-            dbg_print( INPUT_DBG_EVENT, "set seekpoint %d", i );
-            if( t->i_seekpoint > 0 )
+            if (i < p_vcdplayer->i_entries)
             {
-                track_t i_track = p_access->info.i_title+1;
-                lsn_t lsn;
-
-                /* FIXME! For now we are assuming titles are only
-                 tracks and that track == title+1 and we the play
-                 item is entries (not tracks or lids).
-                 We need to generalize all of this.
-                */
-
-                if (i < p_vcdplayer->i_entries)
-                {
-                    p_vcdplayer->play_item.num  = i;
-                    p_vcdplayer->play_item.type = VCDINFO_ITEM_TYPE_ENTRY;
-                    lsn = vcdinfo_get_entry_lsn(p_vcdplayer->vcd, i);
-                } else if ( i < p_vcdplayer->i_entries + p_vcdplayer->i_lids )
-                {
-                    p_vcdplayer->play_item.num  = i
-                      = i - p_vcdplayer->i_entries;
-                    p_vcdplayer->play_item.type = VCDINFO_ITEM_TYPE_LID;
-                    lsn = 0;
-                } else
-                {
-                    p_vcdplayer->play_item.num  = i
+                p_vcdplayer->play_item.num  = i;
+                p_vcdplayer->play_item.type = VCDINFO_ITEM_TYPE_ENTRY;
+                lsn = vcdinfo_get_entry_lsn(p_vcdplayer->vcd, i);
+            } else if ( i < p_vcdplayer->i_entries + p_vcdplayer->i_lids )
+            {
+                p_vcdplayer->play_item.num = i = i - p_vcdplayer->i_entries;
+                p_vcdplayer->play_item.type = VCDINFO_ITEM_TYPE_LID;
+                lsn = 0;
+            } else
+            {
+                p_vcdplayer->play_item.num  = i
                       = i - p_vcdplayer->i_entries - p_vcdplayer->i_lids;
-                    p_vcdplayer->play_item.type = VCDINFO_ITEM_TYPE_SEGMENT;
-                    lsn = vcdinfo_get_seg_lsn(p_vcdplayer->vcd, i);
-                }
-
-                VCDSetOrigin( p_access,
-                              vcdinfo_get_entry_lsn(p_vcdplayer->vcd, i),
-                              i_track, &(p_vcdplayer->play_item) );
+                p_vcdplayer->play_item.type = VCDINFO_ITEM_TYPE_SEGMENT;
+                lsn = vcdinfo_get_seg_lsn(p_vcdplayer->vcd, i);
             }
-            return VLC_SUCCESS;
+
+            VCDSetOrigin(p_access,vcdinfo_get_entry_lsn(p_vcdplayer->vcd,i),
+                         i_track,&(p_vcdplayer->play_item));
         }
+        return VLC_SUCCESS;
+    }
 
-        case ACCESS_SET_PRIVATE_ID_STATE:
-            dbg_print( INPUT_DBG_EVENT, "set private id" );
-            return VLC_EGENERIC;
+    case ACCESS_SET_PRIVATE_ID_STATE:
+        dbg_print( INPUT_DBG_EVENT, "set private id" );
+        return VLC_EGENERIC;
 
-        default:
-          msg_Warn( p_access, "unimplemented query in control" );
-            return VLC_EGENERIC;
+    default:
+        msg_Warn( p_access, "unimplemented query in control" );
+        return VLC_EGENERIC;
 
     }
     return VLC_SUCCESS;