]> git.sesse.net Git - vlc/commitdiff
-I hope I have fixed the ifo bug lastly !
authorStéphane Borel <stef@videolan.org>
Sun, 15 Apr 2001 21:17:50 +0000 (21:17 +0000)
committerStéphane Borel <stef@videolan.org>
Sun, 15 Apr 2001 21:17:50 +0000 (21:17 +0000)
plugins/dvd/dvd_ifo.c
plugins/dvd/input_dvd.c

index 89ae97d7cb6c124ab3da2a488e06f8469ef4f1cf..97524b9bac455327ffe09f8f9d265685f4393ce8 100644 (file)
@@ -2,7 +2,7 @@
  * dvd_ifo.c: Functions for ifo parsing
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: dvd_ifo.c,v 1.21 2001/04/15 15:32:48 stef Exp $
+ * $Id: dvd_ifo.c,v 1.22 2001/04/15 21:17:50 stef Exp $
  *
  * Author: Stéphane Borel <stef@via.ecp.fr>
  *
@@ -78,9 +78,9 @@ static __inline__ u8 ReadByte( ifo_t * p_ifo, u8* pi_buffer, u8** pp_current )
 {
     u8      i_ret;
 
-    if( *pp_current >= pi_buffer + DVD_LB_SIZE )
+    if( *pp_current > pi_buffer + DVD_LB_SIZE )
     {
-        *pp_current = FillBuffer( p_ifo, pi_buffer, p_ifo->i_pos );
+        *pp_current = FillBuffer( p_ifo, pi_buffer, p_ifo->i_pos + DVD_LB_SIZE );
     }
 
     i_ret = *(*pp_current)++;
@@ -92,9 +92,9 @@ static __inline__ u16 ReadWord( ifo_t* p_ifo, u8* pi_buffer, u8** pp_current )
 {
     u16     i_ret;
 
-    if( *pp_current >= pi_buffer + DVD_LB_SIZE - 2 )
+    if( *pp_current > pi_buffer + DVD_LB_SIZE - 2 )
     {
-        *pp_current = FillBuffer( p_ifo, pi_buffer, p_ifo->i_pos );
+        *pp_current = FillBuffer( p_ifo, pi_buffer, p_ifo->i_pos + DVD_LB_SIZE );
     }
 
     i_ret = U16_AT(*pp_current);
@@ -108,9 +108,10 @@ static __inline__ u32 ReadDouble( ifo_t * p_ifo, u8* pi_buffer,
 {
     u32     i_ret;
 
-    if( *pp_current >= pi_buffer + DVD_LB_SIZE - 4 )
+    if( *pp_current > pi_buffer + DVD_LB_SIZE - 4 )
     {
-        *pp_current = FillBuffer( p_ifo, pi_buffer, p_ifo->i_pos );
+        *pp_current = FillBuffer( p_ifo, pi_buffer, p_ifo->i_pos + DVD_LB_SIZE);
+//     intf_WarnMsg( 1, "new buffer in double @ %lld", p_ifo->i_pos );
     }
 
     i_ret = U32_AT(*pp_current);
@@ -123,9 +124,9 @@ static __inline__ u64 ReadQuad( ifo_t* p_ifo, u8* pi_buffer, u8** pp_current )
 {
     u64     i_ret;
 
-    if( *pp_current >= pi_buffer + DVD_LB_SIZE - 8 )
+    if( *pp_current > pi_buffer + DVD_LB_SIZE - 8 )
     {
-        *pp_current = FillBuffer( p_ifo, pi_buffer, p_ifo->i_pos );
+        *pp_current = FillBuffer( p_ifo, pi_buffer, p_ifo->i_pos + DVD_LB_SIZE );
     }
 
     i_ret = U64_AT(*pp_current);
@@ -137,9 +138,9 @@ static __inline__ u64 ReadQuad( ifo_t* p_ifo, u8* pi_buffer, u8** pp_current )
 static __inline__ void ReadBits( ifo_t* p_ifo, u8* pi_buffer, u8** pp_current,
                                   u8* pi_dest, int i_nb )
 {
-    if( *pp_current >= pi_buffer + DVD_LB_SIZE - i_nb )
+    if( *pp_current > pi_buffer + DVD_LB_SIZE - i_nb )
     {
-        *pp_current = FillBuffer( p_ifo, pi_buffer, p_ifo->i_pos );
+        *pp_current = FillBuffer( p_ifo, pi_buffer, p_ifo->i_pos + DVD_LB_SIZE );
     }
 
     memcpy( pi_dest, *pp_current, i_nb );
@@ -151,9 +152,9 @@ static __inline__ void ReadBits( ifo_t* p_ifo, u8* pi_buffer, u8** pp_current,
 static __inline__ void DumpBits( ifo_t* p_ifo, u8* pi_buffer,
                                  u8** pp_current, int i_nb )
 {
-    if( *pp_current >= pi_buffer + DVD_LB_SIZE - i_nb )
+    if( *pp_current > pi_buffer + DVD_LB_SIZE - i_nb )
     {
-        *pp_current = FillBuffer( p_ifo, pi_buffer, p_ifo->i_pos );
+        *pp_current = FillBuffer( p_ifo, pi_buffer, p_ifo->i_pos + DVD_LB_SIZE );
     }
 
     *pp_current += i_nb;
@@ -1320,7 +1321,7 @@ static int ReadCellInf( ifo_t * p_ifo, cell_inf_t * p_cell_inf, off_t i_pos )
     DumpBits( p_ifo, pi_buffer, &p_current, 2 );
     p_cell_inf->i_end_byte = ReadDouble( p_ifo, pi_buffer, &p_current );
 
-    p_cell_inf->i_cell_nb = (p_cell_inf->i_end_byte - 8) / sizeof(cell_map_t);
+    p_cell_inf->i_cell_nb = (p_cell_inf->i_end_byte/* - 7*/) / sizeof(cell_map_t);
 
 //fprintf( stderr, "Cell inf: vob %d end %d cell %d\n", p_cell_inf->i_vob_nb, p_cell_inf->i_end_byte,  p_cell_inf->i_cell_nb );
 
@@ -1338,6 +1339,7 @@ static int ReadCellInf( ifo_t * p_ifo, cell_inf_t * p_cell_inf, off_t i_pos )
         p_cell_inf->p_cell_map[i].i_cell_id = ReadByte( p_ifo, pi_buffer, &p_current );
         DumpBits( p_ifo, pi_buffer, &p_current, 1 );
         p_cell_inf->p_cell_map[i].i_start_sector = ReadDouble( p_ifo, pi_buffer, &p_current );
+//     fprintf(stderr, "sector[%d] %d (%lld)\n", i,ntohl(*(u32*)(p_current)), p_ifo->i_pos);
         p_cell_inf->p_cell_map[i].i_end_sector = ReadDouble( p_ifo, pi_buffer, &p_current );
     }
     
index a4017cb6129a1333f2905603aba075f5b6601d25..f2dda925bbb7d53e45bb1cba1001a1b14cb090f8 100644 (file)
@@ -10,7 +10,7 @@
  *  -dvd_udf to find files
  *****************************************************************************
  * Copyright (C) 1998-2001 VideoLAN
- * $Id: input_dvd.c,v 1.46 2001/04/15 04:19:57 sam Exp $
+ * $Id: input_dvd.c,v 1.47 2001/04/15 21:17:50 stef Exp $
  *
  * Author: Stéphane Borel <stef@via.ecp.fr>
  *
@@ -350,35 +350,34 @@ static int DVDFindCell( thread_dvd_data_t * p_dvd )
 #define title \
         p_dvd->p_ifo->vts.title_unit.p_title[p_dvd->i_program_chain-1].title
 #define cell  p_dvd->p_ifo->vts.cell_inf
-
+               
     i_cell = p_dvd->i_cell;
     i_index = p_dvd->i_prg_cell;
 
+    if( i_cell >= cell.i_cell_nb )
+    {
+        return -1;
+    }
+
+
     while( ( ( title.p_cell_pos[i_index].i_vob_id !=
                    cell.p_cell_map[i_cell].i_vob_id ) ||
       ( title.p_cell_pos[i_index].i_cell_id !=
                    cell.p_cell_map[i_cell].i_cell_id ) ) &&
-           ( i_cell < cell.i_cell_nb ) )
+           ( i_cell < cell.i_cell_nb - 1 ) )
     {
         i_cell++;
     }
-/*
+
 intf_WarnMsg( 1, "FindCell: i_cell %d i_index %d found %d nb %d",
                     p_dvd->i_cell,
                     p_dvd->i_prg_cell,
                     i_cell,
                     cell.i_cell_nb );
-*/
-    if( i_cell == cell.i_cell_nb )
-    {
-        intf_ErrMsg( "dvd error: can't find cell" );
-        return -1;
-    }
-    else
-    {
-        p_dvd->i_cell = i_cell;
-        return 0;
-    }
+
+    p_dvd->i_cell = i_cell;
+    return 0;
+    
 #undef title
 #undef cell
 }
@@ -411,15 +410,15 @@ static int DVDFindSector( thread_dvd_data_t * p_dvd )
          p_dvd->p_ifo->vts.cell_inf.p_cell_map[p_dvd->i_cell].i_end_sector,
          title.p_cell_play[p_dvd->i_prg_cell].i_end_sector );
 
-/*    intf_WarnMsg( 1, "cell: %d sector1: 0x%x end1: 0x%x\n"
-                     "index: %d sector2: 0x%x end2: 0x%x", 
+    intf_WarnMsg( 1, "cell: %d sector1: 0x%x end1: 0x%x\n"
+                   "index: %d sector2: 0x%x end2: 0x%x", 
         p_dvd->i_cell,
         p_dvd->p_ifo->vts.cell_inf.p_cell_map[p_dvd->i_cell].i_start_sector,
         p_dvd->p_ifo->vts.cell_inf.p_cell_map[p_dvd->i_cell].i_end_sector,
         p_dvd->i_prg_cell,
         title.p_cell_play[p_dvd->i_prg_cell].i_start_sector,
         title.p_cell_play[p_dvd->i_prg_cell].i_end_sector );
-*/
+
 #undef title
 
     return 0;
@@ -427,7 +426,6 @@ static int DVDFindSector( thread_dvd_data_t * p_dvd )
 
 /*****************************************************************************
  * DVDChapterSelect: find the cell corresponding to requested chapter
- * When called to find chapter 1, also sets title size and end.
  *****************************************************************************/
 static int DVDChapterSelect( thread_dvd_data_t * p_dvd, int i_chapter )
 {
@@ -448,7 +446,7 @@ static int DVDChapterSelect( thread_dvd_data_t * p_dvd, int i_chapter )
 
     /* start is : beginning of vts vobs + offset to vob x */
     p_dvd->i_start = p_dvd->i_title_start +
-                     DVD_LB_SIZE * (off_t)( p_dvd->i_sector );
+                    DVD_LB_SIZE * (off_t)( p_dvd->i_sector );
 
     /* Position the fd pointer on the right address */
     p_dvd->i_start = lseek( p_dvd->i_fd, p_dvd->i_start, SEEK_SET );
@@ -574,11 +572,13 @@ static int DVDSetArea( input_thread_t * p_input, input_area_t * p_area )
         {
             p_dvd->i_cell = vts.cell_inf.i_cell_nb - 1;
         }
-
+       
+                       
         p_dvd->i_sector = 0;
         p_dvd->i_size = DVD_LB_SIZE *
           (off_t)( vts.cell_inf.p_cell_map[p_dvd->i_cell].i_end_sector );
-
+        intf_WarnMsg( 2, "dvd info: stream size 1: %lld @ %d", p_dvd->i_size,vts.cell_inf.p_cell_map[p_dvd->i_cell].i_end_sector );
+       
         if( DVDChapterSelect( p_dvd, 1 ) < 0 )
         {
             intf_ErrMsg( "dvd error: can't find first chapter" );
@@ -1217,6 +1217,7 @@ static void DVDSeek( input_thread_t * p_input, off_t i_off )
     /* Find first title cell which is inside program cell */
     if( DVDFindCell( p_dvd ) < 0 )
     {
+       /* no following cell : we're at eof */
         intf_ErrMsg( "dvd error: cell seeking failed" );
         p_input->b_error = 1;
         return;