Changeset 12077fd171905b6c9c958986d69d071a302d83b8

Show
Ignore:
Timestamp:
20/12/04 08:44:39 (4 years ago)
Author:
Rocky Bernstein <rocky@videolan.org>
git-committer:
Rocky Bernstein <rocky@videolan.org> 1103528679 +0000
git-parent:

[6ba6c14fd5e810734e4170bbb95b1a731525212c]

git-author:
Rocky Bernstein <rocky@videolan.org> 1103528679 +0000
Message:

Improve entry navigation and title update.

Next/Prev chapter don't work yet, nor does entry detection when random
seeking.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • modules/access/vcdx/access.c

    r6ba6c14 r12077fd  
    11/***************************************************************************** 
    2  * vcd.c : VCD input module for vlc 
    3  *         using libcdio, libvcd and libvcdinfo. vlc-specific things tend 
    4  *         to go here. 
     2 * vcd.c : VCD input module for vlc using libcdio, libvcd and libvcdinfo.  
     3 *         vlc-specific things tend to go here. 
    54 ***************************************************************************** 
    65 * Copyright (C) 2000, 2003, 2004 VideoLAN 
     
    98 * Authors: Rocky Bernstein <rocky@panix.com> 
    109 *   Some code is based on the non-libcdio VCD plugin (as there really 
    11  *   isn't real documentation yet.) 
     10 *   isn't real developer documentation yet on how to write a  
     11 *   navigable plugin.) 
    1212 * 
    1313 * This program is free software; you can redistribute it and/or modify 
     
    155155    block_t                *p_block; 
    156156    int                     i_blocks = VCD_BLOCKS_ONCE; 
    157     int                     i_index; 
    158157    int                     i_read; 
    159158    byte_t                  p_last_sector[ M2F2_SECTOR_SIZE ]; 
     
    177176    } 
    178177 
    179     for ( i_index = 0 ; i_index < i_blocks ; i_index++ ) 
     178    for ( i_read = 0 ; i_read < i_blocks ; i_read++ ) 
    180179    { 
    181180 
     
    204203            byte_t * p_buf = (byte_t *) p_block->p_buffer; 
    205204 
    206             p_buf += (i_index*M2F2_SECTOR_SIZE); 
     205            p_buf += (i_read*M2F2_SECTOR_SIZE); 
    207206            memset(p_buf, 0, M2F2_SECTOR_SIZE); 
    208207            p_buf += 2; 
     
    224223                          p_vcd->i_lsn, 
    225224                          (byte_t *) p_block->p_buffer  
    226               + (i_index*M2F2_SECTOR_SIZE) ) < 0 ) 
     225              + (i_read*M2F2_SECTOR_SIZE) ) < 0 ) 
    227226      { 
    228227          LOG_ERR ("could not read sector %lu",  
     
    240239      if ( VCDINFO_ITEM_TYPE_ENTRY == p_vcd->play_item.type ) 
    241240      { 
    242         const input_title_t *t = p_vcd->p_title[p_access->info.i_title]; 
    243      
    244         if( t->i_seekpoint > 0 && 
    245             p_access->info.i_seekpoint + 1 < t->i_seekpoint && 
    246             p_access->info.i_pos + i_read * M2F2_SECTOR_SIZE >= 
    247             t->seekpoint[p_access->info.i_seekpoint+1]->i_byte_offset ) 
     241    unsigned int i_entry = p_vcd->play_item.num+1; 
     242 
     243    if (p_vcd->i_lsn >= vcdinfo_get_entry_lba(p_vcd->vcd, i_entry)) 
    248244        { 
    249245        const track_t i_track = p_vcd->i_track; 
    250         const unsigned int i_entry = ++p_vcd->play_item.num
    251             msg_Dbg( p_access, "seekpoint change" ); 
     246        p_vcd->play_item.num = i_entry
     247       dbg_print( (INPUT_DBG_LSN|INPUT_DBG_PBC), "entry change" ); 
    252248        VCDSetOrigin( p_access,  
    253               vcdinfo_get_track_lsn(p_vcd->vcd, i_track), 
    254               vcdinfo_get_entry_lsn(p_vcd->vcd, i_entry), 
    255               vcdinfo_get_track_lsn(p_vcd->vcd, i_track+1), 
     249              vcdinfo_get_track_lba(p_vcd->vcd, i_track), 
     250              vcdinfo_get_entry_lba(p_vcd->vcd, i_entry), 
     251              vcdinfo_get_track_lba(p_vcd->vcd, i_track+1), 
    256252              i_track, &(p_vcd->play_item) ); 
    257253        } 
     
    259255    } 
    260256 
    261     if ( i_index != i_blocks ) /* this should not happen */ 
     257    if ( i_read != i_blocks ) /* this should not happen */ 
    262258    { 
    263259        if ( VCDReadSector( VLC_OBJECT(p_access), p_vcd->vcd, 
     
    312308    } 
    313309       
     310      dbg_print( (INPUT_DBG_CALL|INPUT_DBG_EXT|INPUT_DBG_SEEK), 
     311         "orig %lu, cur: %lu, offset: %lld, entry %d", 
     312         (long unsigned int) p_vcd->origin_lsn,  
     313         (long unsigned int) p_vcd->i_lsn, i_pos, 
     314         i_entry ); 
     315       
    314316      /* Find seekpoint */ 
    315317      for( i_seekpoint = 0; i_seekpoint < t->i_seekpoint; i_seekpoint++ ) 
     
    322324      if( i_seekpoint != p_access->info.i_seekpoint ) 
    323325    { 
    324       msg_Dbg( p_access, "seekpoint change" ); 
     326      dbg_print( (INPUT_DBG_SEEK), "seekpoint change %lu",  
     327             (long unsigned int) i_seekpoint ); 
    325328      p_access->info.i_update |= INPUT_UPDATE_SEEKPOINT; 
    326329      p_access->info.i_seekpoint = i_seekpoint; 
    327330    } 
    328331 
    329       dbg_print( (INPUT_DBG_CALL|INPUT_DBG_EXT|INPUT_DBG_SEEK), 
    330          "orig %lu, cur: %lu, offset: %lld, entry %d", 
    331          (long unsigned int) p_vcd->origin_lsn,  
    332          (long unsigned int) p_vcd->i_lsn, i_pos, 
    333          i_entry ); 
    334        
    335332    } 
    336333    return VLC_SUCCESS; 
     
    368365        vcdinfo_track_get_entry( p_vcd->vcd, i_track); 
    369366       
    370       /* Valid tracks go from 1...i_tracks-1, because track 0 is 
    371          unplayable. */ 
     367      /* Valid MPEG tracks go from 1...i_tracks. */ 
    372368     
    373       if (i_track == 0 || i_track >= p_vcd->i_tracks) { 
     369      if (i_track == 0 || i_track > p_vcd->i_tracks) { 
    374370        LOG_ERR ("Invalid track number %d", i_track ); 
    375371        return VLC_EGENERIC; 
     
    377373      p_vcd->in_still  = VLC_FALSE; 
    378374      VCDSetOrigin( p_access,  
    379             vcdinfo_get_track_lsn(p_vcd->vcd, i_track), 
    380             vcdinfo_get_entry_lsn(p_vcd->vcd, i_entry), 
    381             vcdinfo_get_track_lsn(p_vcd->vcd, i_track+1), 
     375            vcdinfo_get_track_lba(p_vcd->vcd, i_track), 
     376            vcdinfo_get_entry_lba(p_vcd->vcd, i_entry), 
     377            vcdinfo_get_track_lba(p_vcd->vcd, i_track+1), 
    382378            i_track, &itemid ); 
    383379      break; 
     
    473469        p_vcd->in_still = VLC_FALSE; 
    474470        VCDSetOrigin( p_access,  
    475               vcdinfo_get_entry_lsn(p_vcd->vcd, i_track), 
    476               vcdinfo_get_entry_lsn(p_vcd->vcd, i_entry), 
    477               vcdinfo_get_entry_lsn(p_vcd->vcd, i_track+1), 
     471              vcdinfo_get_entry_lba(p_vcd->vcd, i_track), 
     472              vcdinfo_get_entry_lba(p_vcd->vcd, i_entry), 
     473              vcdinfo_get_entry_lba(p_vcd->vcd, i_track+1), 
    478474              i_track, &itemid ); 
    479475      } 
     
    536532      snprintf(psz_entry, sizeof(psz_entry), "%s%02d", _("Entry "), i ); 
    537533 
    538       p_vcd->p_entries[i] = vcdinfo_get_entry_lsn(p_vcd->vcd, i); 
     534      p_vcd->p_entries[i] = vcdinfo_get_entry_lba(p_vcd->vcd, i); 
    539535       
    540536      s->psz_name      = strdup(psz_entry); 
    541537      s->i_byte_offset =  
    542         (p_vcd->p_entries[i] - vcdinfo_get_track_lsn(p_vcd->vcd, i_track)) 
     538        (p_vcd->p_entries[i] - vcdinfo_get_track_lba(p_vcd->vcd, i_track)) 
    543539        * M2F2_SECTOR_SIZE; 
    544540       
     541      dbg_print( INPUT_DBG_MRL,  
     542             "%s, lsn %d,  byte_offset %ld\n", 
     543             s->psz_name, p_vcd->p_entries[i],  
     544             (unsigned long int) s->i_byte_offset); 
    545545      TAB_APPEND( p_vcd->p_title[i_track-1]->i_seekpoint, 
    546546              p_vcd->p_title[i_track-1]->seekpoint, s ); 
     547 
    547548    } else  
    548549      msg_Warn( p_access, "wrong track number found in entry points" ); 
     
    847848 
    848849  p_access->info.i_title     = i_track-1; 
    849   p_access->info.i_seekpoint = p_itemid->num; 
    850850  p_access->info.i_size      = p_vcd->p_title[i_title]->i_size; 
    851851  p_access->info.i_pos       = ( i_lsn - origin_lsn ) * M2F2_SECTOR_SIZE; 
     
    12651265            vlc_input_title_Duplicate( p_vcd->p_title[i] ); 
    12661266        } 
    1267  
    1268  
    1269         return VLC_SUCCESS; 
    12701267      } 
    12711268      break; 
     
    12881285         
    12891286        VCDSetOrigin(p_access,  
    1290                  vcdinfo_get_track_lsn(p_vcd->vcd, i_track), 
    1291                  vcdinfo_get_entry_lsn(p_vcd->vcd, i_entry), 
    1292                  vcdinfo_get_track_lsn(p_vcd->vcd, i_track+1), 
     1287                 vcdinfo_get_track_lba(p_vcd->vcd, i_track), 
     1288                 vcdinfo_get_entry_lba(p_vcd->vcd, i_entry), 
     1289                 vcdinfo_get_track_lba(p_vcd->vcd, i_track+1), 
    12931290                 i_track, &itemid ); 
    12941291        } 
     
    13041301            { 
    13051302        track_t i_track = p_access->info.i_title+1; 
    1306         lsn_t   track_lsn = vcdinfo_get_track_lsn(p_vcd->vcd, i_track); 
    1307  
    1308                 p_access->info.i_update |= INPUT_UPDATE_SEEKPOINT; 
    1309                 p_access->info.i_seekpoint = i; 
    13101303 
    13111304        /* FIXME! For now we are assuming titles are only  
    1312          tracks and that track == title+1 */ 
    1313  
    1314                 p_vcd->i_lsn = track_lsn  
    1315           + (t->seekpoint[i]->i_byte_offset / M2F2_SECTOR_SIZE); 
    1316  
    1317                 p_access->info.i_pos = (int64_t)(p_vcd->i_lsn - track_lsn) 
    1318           * M2F2_SECTOR_SIZE; 
     1305         tracks and that track == title+1 and we the play 
     1306         item is entries (not tracks or lids). 
     1307         We need to generalize all of this. 
     1308        */ 
     1309 
     1310        p_vcd->play_item.num  = i; 
     1311        p_vcd->play_item.type = VCDINFO_ITEM_TYPE_ENTRY; 
     1312 
     1313        VCDSetOrigin( p_access,  
     1314                  vcdinfo_get_track_lba(p_vcd->vcd, i_track), 
     1315                  vcdinfo_get_entry_lba(p_vcd->vcd, i), 
     1316                  vcdinfo_get_track_lba(p_vcd->vcd, i_track+1), 
     1317                  i_track, &(p_vcd->play_item) ); 
    13191318            } 
    13201319            return VLC_SUCCESS; 
  • modules/access/vcdx/info.c

    r6ba6c14 r12077fd  
    342342  } 
    343343 
    344   snprintf(psz_mrl, psz_mrl_max, "%s%s@%c%u", VCD_MRL_PREFIX, psz_source, 
     344  snprintf(psz_mrl, psz_mrl_max, "%s%s@%c%3u", VCD_MRL_PREFIX, psz_source, 
    345345           c_type, itemid->num); 
    346346