Commit be685831 authored by Sam Hocevar's avatar Sam Hocevar

* ./plugins/dvd/*: fixed a few inconsistences.

  * ./plugins/dvd/*: renamed i_start/i_end couples when they actually
    meant i_first/i_last.
parent 1ac32f37
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* dvd.h: thread structure of the DVD plugin * dvd.h: thread structure of the DVD plugin
***************************************************************************** *****************************************************************************
* Copyright (C) 1999-2001 VideoLAN * Copyright (C) 1999-2001 VideoLAN
* $Id: dvd.h,v 1.3 2002/03/09 16:48:33 stef Exp $ * $Id: dvd.h,v 1.4 2002/05/20 22:45:03 sam Exp $
* *
* Author: Stéphane Borel <stef@via.ecp.fr> * Author: Stéphane Borel <stef@via.ecp.fr>
* *
...@@ -56,7 +56,7 @@ typedef struct thread_dvd_data_s ...@@ -56,7 +56,7 @@ typedef struct thread_dvd_data_s
int i_vts_start; /* offset to beginning of vts */ int i_vts_start; /* offset to beginning of vts */
int i_vts_lb; /* sector in vts */ int i_vts_lb; /* sector in vts */
int i_end_lb; /* last sector of current cell */ int i_last_lb; /* last sector of current cell */
/* Structure that contains all information of the DVD */ /* Structure that contains all information of the DVD */
struct ifo_s * p_ifo; struct ifo_s * p_ifo;
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* -dvd_udf to find files * -dvd_udf to find files
***************************************************************************** *****************************************************************************
* Copyright (C) 1998-2001 VideoLAN * Copyright (C) 1998-2001 VideoLAN
* $Id: dvd_access.c,v 1.15 2002/04/25 21:52:42 sam Exp $ * $Id: dvd_access.c,v 1.16 2002/05/20 22:45:03 sam Exp $
* *
* Author: Stphane Borel <stef@via.ecp.fr> * Author: Stphane Borel <stef@via.ecp.fr>
* *
...@@ -102,7 +102,6 @@ void _M( access_getfunctions)( function_list_t * p_function_list ) ...@@ -102,7 +102,6 @@ void _M( access_getfunctions)( function_list_t * p_function_list )
* Data access functions * Data access functions
*/ */
#define DVDLB p_dvd->i_vts_start + p_dvd->i_vts_lb
#define DVDTell LB2OFF( p_dvd->i_vts_start + p_dvd->i_vts_lb ) \ #define DVDTell LB2OFF( p_dvd->i_vts_start + p_dvd->i_vts_lb ) \
- p_input->stream.p_selected_area->i_start - p_input->stream.p_selected_area->i_start
...@@ -295,8 +294,8 @@ static int DVDSetProgram( input_thread_t * p_input, ...@@ -295,8 +294,8 @@ static int DVDSetProgram( input_thread_t * p_input,
p_dvd->i_prg_cell += ( p_program->i_number - p_dvd->i_angle ); p_dvd->i_prg_cell += ( p_program->i_number - p_dvd->i_angle );
p_dvd->i_map_cell = CellPrg2Map( p_dvd ); p_dvd->i_map_cell = CellPrg2Map( p_dvd );
p_dvd->i_map_cell += p_dvd->i_angle_cell; p_dvd->i_map_cell += p_dvd->i_angle_cell;
p_dvd->i_vts_lb = CellStartSector( p_dvd ); p_dvd->i_vts_lb = CellFirstSector( p_dvd );
p_dvd->i_end_lb = CellEndSector( p_dvd ); p_dvd->i_last_lb = CellLastSector( p_dvd );
p_dvd->i_angle = p_program->i_number; p_dvd->i_angle = p_program->i_number;
} }
else else
...@@ -379,8 +378,8 @@ static int DVDSetArea( input_thread_t * p_input, input_area_t * p_area ) ...@@ -379,8 +378,8 @@ static int DVDSetArea( input_thread_t * p_input, input_area_t * p_area )
if( p_area != p_input->stream.p_selected_area ) if( p_area != p_input->stream.p_selected_area )
{ {
int i_vts_title; int i_vts_title;
u32 i_start; u32 i_first;
u32 i_size; u32 i_last;
/* Reset the Chapter position of the old title */ /* Reset the Chapter position of the old title */
p_input->stream.p_selected_area->i_part = 1; p_input->stream.p_selected_area->i_part = 1;
...@@ -418,31 +417,32 @@ static int DVDSetArea( input_thread_t * p_input, input_area_t * p_area ) ...@@ -418,31 +417,32 @@ static int DVDSetArea( input_thread_t * p_input, input_area_t * p_area )
vts.title_unit.p_title[p_dvd->i_title_id-1].title.i_cell_nb; vts.title_unit.p_title[p_dvd->i_title_id-1].title.i_cell_nb;
p_dvd->i_map_cell = 0; p_dvd->i_map_cell = 0;
p_dvd->i_map_cell = CellPrg2Map( p_dvd ); p_dvd->i_map_cell = CellPrg2Map( p_dvd );
i_size = CellEndSector( p_dvd ); i_last = CellLastSector( p_dvd );
/* first cell */ /* first cell */
p_dvd->i_prg_cell = 0; p_dvd->i_prg_cell = 0;
p_dvd->i_map_cell = 0; p_dvd->i_map_cell = 0;
p_dvd->i_angle_cell = 0; p_dvd->i_angle_cell = 0;
p_dvd->i_map_cell = CellPrg2Map ( p_dvd ); p_dvd->i_map_cell = CellPrg2Map ( p_dvd );
p_dvd->i_vts_lb = CellStartSector( p_dvd ); p_dvd->i_vts_lb = CellFirstSector( p_dvd );
p_dvd->i_end_lb = CellEndSector ( p_dvd ); p_dvd->i_last_lb = CellLastSector ( p_dvd );
/* Force libdvdcss to check its title key. /* Force libdvdcss to check its title key.
* It is only useful for title cracking method. Methods using the * It is only useful for title cracking method. Methods using the
* decrypted disc key are fast enough to check the key at each seek */ * decrypted disc key are fast enough to check the key at each seek */
if( ( i_start = dvdcss_seek( p_dvd->dvdhandle, DVDLB, i_first = dvdcss_seek( p_dvd->dvdhandle,
DVDCSS_SEEK_KEY ) ) < 0 ) p_dvd->i_vts_start + p_dvd->i_vts_lb,
DVDCSS_SEEK_KEY );
if( i_first < 0 )
{ {
intf_ErrMsg( "dvd error: %s", dvdcss_error( p_dvd->dvdhandle ) ); intf_ErrMsg( "dvd error: %s", dvdcss_error( p_dvd->dvdhandle ) );
return -1; return -1;
} }
i_size -= p_dvd->i_vts_lb + 1;
/* Area definition */ /* Area definition */
p_input->stream.p_selected_area->i_start = LB2OFF( i_start ); p_input->stream.p_selected_area->i_start = LB2OFF( i_first );
p_input->stream.p_selected_area->i_size = LB2OFF( i_size ); p_input->stream.p_selected_area->i_size =
LB2OFF( i_last - p_dvd->i_vts_lb + 1 );
/* Destroy obsolete ES by reinitializing programs */ /* Destroy obsolete ES by reinitializing programs */
DVDFlushStream( p_input ); DVDFlushStream( p_input );
...@@ -457,8 +457,8 @@ static int DVDSetArea( input_thread_t * p_input, input_area_t * p_area ) ...@@ -457,8 +457,8 @@ static int DVDSetArea( input_thread_t * p_input, input_area_t * p_area )
DVDSetProgram( p_input, DVDSetProgram( p_input,
p_input->stream.pp_programs[p_dvd->i_angle-1] ); p_input->stream.pp_programs[p_dvd->i_angle-1] );
intf_WarnMsg( 3, "dvd info: title start: %d size: %d", intf_WarnMsg( 3, "dvd info: title first %i, last %i, size %i",
i_start, i_size ); i_first, i_last, i_last - p_dvd->i_vts_lb + 1 );
IfoPrintTitle( p_dvd ); IfoPrintTitle( p_dvd );
/* No PSM to read in DVD mode, we already have all information */ /* No PSM to read in DVD mode, we already have all information */
...@@ -595,13 +595,13 @@ static void DVDSeek( input_thread_t * p_input, off_t i_off ) ...@@ -595,13 +595,13 @@ static void DVDSeek( input_thread_t * p_input, off_t i_off )
/* if we're inside a multi-angle zone, we have to choose i_sector /* if we're inside a multi-angle zone, we have to choose i_sector
* in the current angle ; we can't do it all the time since cells * in the current angle ; we can't do it all the time since cells
* can be very wide out of such zones */ * can be very wide out of such zones */
p_dvd->i_vts_lb = CellStartSector( p_dvd ); p_dvd->i_vts_lb = CellFirstSector( p_dvd );
} }
p_dvd->i_end_lb = CellEndSector ( p_dvd ); p_dvd->i_last_lb = CellLastSector( p_dvd );
p_dvd->i_chapter = CellPrg2Chapter( p_dvd ); p_dvd->i_chapter = CellPrg2Chapter( p_dvd );
if( dvdcss_seek( p_dvd->dvdhandle, DVDLB, if( dvdcss_seek( p_dvd->dvdhandle, p_dvd->i_vts_start + p_dvd->i_vts_lb,
DVDCSS_SEEK_MPEG ) < 0 ) DVDCSS_SEEK_MPEG ) < 0 )
{ {
intf_ErrMsg( "dvd error: %s", dvdcss_error( p_dvd->dvdhandle ) ); intf_ErrMsg( "dvd error: %s", dvdcss_error( p_dvd->dvdhandle ) );
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* dvd_ifo.c: Functions for ifo parsing * dvd_ifo.c: Functions for ifo parsing
***************************************************************************** *****************************************************************************
* Copyright (C) 1999-2001 VideoLAN * Copyright (C) 1999-2001 VideoLAN
* $Id: dvd_ifo.c,v 1.46 2002/04/03 06:23:08 sam Exp $ * $Id: dvd_ifo.c,v 1.47 2002/05/20 22:45:03 sam Exp $
* *
* Authors: Stphane Borel <stef@via.ecp.fr> * Authors: Stphane Borel <stef@via.ecp.fr>
* German Tischler <tanis@gaspode.franken.de> * German Tischler <tanis@gaspode.franken.de>
...@@ -197,7 +197,7 @@ int IfoInit( ifo_t * p_ifo ) ...@@ -197,7 +197,7 @@ int IfoInit( ifo_t * p_ifo )
TITINF.i_title_nb = ReadWord( p_ifo, p_buf, &p_tmp ); TITINF.i_title_nb = ReadWord( p_ifo, p_buf, &p_tmp );
//fprintf( stderr, "title_inf: TTU nb %d\n", TITINF.i_title_nb ); //fprintf( stderr, "title_inf: TTU nb %d\n", TITINF.i_title_nb );
DumpBytes( p_ifo, p_buf, &p_tmp, 2 ); DumpBytes( p_ifo, p_buf, &p_tmp, 2 );
TITINF.i_end_byte = ReadDouble( p_ifo, p_buf, &p_tmp ); TITINF.i_last_byte = ReadDouble( p_ifo, p_buf, &p_tmp );
/* parsing of title attributes */ /* parsing of title attributes */
TITINF.p_attr = malloc( TITINF.i_title_nb *sizeof(title_attr_t) ); TITINF.p_attr = malloc( TITINF.i_title_nb *sizeof(title_attr_t) );
...@@ -251,7 +251,7 @@ int IfoInit( ifo_t * p_ifo ) ...@@ -251,7 +251,7 @@ int IfoInit( ifo_t * p_ifo )
PARINF.i_country_nb = ReadWord( p_ifo, p_buf, &p_tmp ); PARINF.i_country_nb = ReadWord( p_ifo, p_buf, &p_tmp );
PARINF.i_vts_nb = ReadWord( p_ifo, p_buf, &p_tmp ); PARINF.i_vts_nb = ReadWord( p_ifo, p_buf, &p_tmp );
PARINF.i_end_byte = ReadDouble( p_ifo, p_buf, &p_tmp ); PARINF.i_last_byte = ReadDouble( p_ifo, p_buf, &p_tmp );
PARINF.p_parental_desc = malloc( PARINF.i_country_nb PARINF.p_parental_desc = malloc( PARINF.i_country_nb
* sizeof(parental_desc_t) ); * sizeof(parental_desc_t) );
...@@ -323,7 +323,7 @@ int IfoInit( ifo_t * p_ifo ) ...@@ -323,7 +323,7 @@ int IfoInit( ifo_t * p_ifo )
VTSINF.i_vts_nb = ReadWord( p_ifo, p_buf, &p_tmp );; VTSINF.i_vts_nb = ReadWord( p_ifo, p_buf, &p_tmp );;
//fprintf( stderr, "VTS ATTR Nb: %d\n", VTSINF.i_vts_nb ); //fprintf( stderr, "VTS ATTR Nb: %d\n", VTSINF.i_vts_nb );
DumpBytes( p_ifo, p_buf, &p_tmp, 2 ); DumpBytes( p_ifo, p_buf, &p_tmp, 2 );
VTSINF.i_end_byte = ReadDouble( p_ifo, p_buf, &p_tmp ); VTSINF.i_last_byte = ReadDouble( p_ifo, p_buf, &p_tmp );
VTSINF.pi_vts_attr_start_byte = VTSINF.pi_vts_attr_start_byte =
malloc( VTSINF.i_vts_nb * sizeof(u32) ); malloc( VTSINF.i_vts_nb * sizeof(u32) );
if( VTSINF.pi_vts_attr_start_byte == NULL ) if( VTSINF.pi_vts_attr_start_byte == NULL )
...@@ -351,7 +351,7 @@ int IfoInit( ifo_t * p_ifo ) ...@@ -351,7 +351,7 @@ int IfoInit( ifo_t * p_ifo )
OFF2LB( VTSINF.pi_vts_attr_start_byte[i] ) ) OFF2LB( VTSINF.pi_vts_attr_start_byte[i] ) )
+ ( VTSINF.pi_vts_attr_start_byte[i] & 0x7ff ); + ( VTSINF.pi_vts_attr_start_byte[i] & 0x7ff );
VTSINF.p_vts_attr[i].i_end_byte = VTSINF.p_vts_attr[i].i_last_byte =
ReadDouble( p_ifo, p_buf, &p_tmp ); ReadDouble( p_ifo, p_buf, &p_tmp );
VTSINF.p_vts_attr[i].i_cat_app_type = VTSINF.p_vts_attr[i].i_cat_app_type =
ReadDouble( p_ifo, p_buf, &p_tmp ); ReadDouble( p_ifo, p_buf, &p_tmp );
...@@ -471,9 +471,9 @@ int IfoTitleSet( ifo_t * p_ifo, int i_title ) ...@@ -471,9 +471,9 @@ int IfoTitleSet( ifo_t * p_ifo, int i_title )
ReadBytes( p_ifo, p_buf, &p_tmp, MGINF.psz_id , 12 ); ReadBytes( p_ifo, p_buf, &p_tmp, MGINF.psz_id , 12 );
MGINF.psz_id[12] = '\0'; MGINF.psz_id[12] = '\0';
MGINF.i_end_sector = ReadDouble( p_ifo, p_buf, &p_tmp ); MGINF.i_last_sector = ReadDouble( p_ifo, p_buf, &p_tmp );
DumpBytes( p_ifo, p_buf, &p_tmp, 12 ); DumpBytes( p_ifo, p_buf, &p_tmp, 12 );
MGINF.i_inf_end_sector = ReadDouble( p_ifo, p_buf, &p_tmp ); MGINF.i_inf_last_sector = ReadDouble( p_ifo, p_buf, &p_tmp );
DumpBytes( p_ifo, p_buf, &p_tmp, 1 ); DumpBytes( p_ifo, p_buf, &p_tmp, 1 );
MGINF.i_spec_ver = ReadByte( p_ifo, p_buf, &p_tmp ); MGINF.i_spec_ver = ReadByte( p_ifo, p_buf, &p_tmp );
MGINF.i_cat = ReadDouble( p_ifo, p_buf, &p_tmp ); MGINF.i_cat = ReadDouble( p_ifo, p_buf, &p_tmp );
...@@ -599,7 +599,7 @@ int IfoTitleSet( ifo_t * p_ifo, int i_title ) ...@@ -599,7 +599,7 @@ int IfoTitleSet( ifo_t * p_ifo, int i_title )
TITINF.i_title_nb = ReadWord( p_ifo, p_buf, &p_tmp ); TITINF.i_title_nb = ReadWord( p_ifo, p_buf, &p_tmp );
//fprintf( stderr, "VTS title_inf nb: %d\n", TITINF.i_title_nb ); //fprintf( stderr, "VTS title_inf nb: %d\n", TITINF.i_title_nb );
DumpBytes( p_ifo, p_buf, &p_tmp, 2 ); DumpBytes( p_ifo, p_buf, &p_tmp, 2 );
TITINF.i_end_byte = ReadDouble( p_ifo, p_buf, &p_tmp ); TITINF.i_last_byte = ReadDouble( p_ifo, p_buf, &p_tmp );
TITINF.pi_start_byte = malloc( TITINF.i_title_nb * sizeof(u32) ); TITINF.pi_start_byte = malloc( TITINF.i_title_nb * sizeof(u32) );
if( TITINF.pi_start_byte == NULL ) if( TITINF.pi_start_byte == NULL )
...@@ -675,7 +675,7 @@ int IfoTitleSet( ifo_t * p_ifo, int i_title ) ...@@ -675,7 +675,7 @@ int IfoTitleSet( ifo_t * p_ifo, int i_title )
TIMINF.i_nb = ReadWord( p_ifo, p_buf, &p_tmp );; TIMINF.i_nb = ReadWord( p_ifo, p_buf, &p_tmp );;
DumpBytes( p_ifo, p_buf, &p_tmp, 2 ); DumpBytes( p_ifo, p_buf, &p_tmp, 2 );
TIMINF.i_end_byte = ReadDouble( p_ifo, p_buf, &p_tmp ); TIMINF.i_last_byte = ReadDouble( p_ifo, p_buf, &p_tmp );
TIMINF.pi_start_byte = malloc( TIMINF.i_nb * sizeof(u32) ); TIMINF.pi_start_byte = malloc( TIMINF.i_nb * sizeof(u32) );
if( TIMINF.pi_start_byte == NULL ) if( TIMINF.pi_start_byte == NULL )
...@@ -702,18 +702,21 @@ int IfoTitleSet( ifo_t * p_ifo, int i_title ) ...@@ -702,18 +702,21 @@ int IfoTitleSet( ifo_t * p_ifo, int i_title )
DumpBytes( p_ifo, p_buf, &p_tmp, 1 ); DumpBytes( p_ifo, p_buf, &p_tmp, 1 );
TIMINF.p_time_map[i].i_entry_nb = ReadWord( p_ifo, p_buf, &p_tmp ); TIMINF.p_time_map[i].i_entry_nb = ReadWord( p_ifo, p_buf, &p_tmp );
TIMINF.p_time_map[i].pi_sector = if( TIMINF.p_time_map[i].i_entry_nb )
malloc( TIMINF.p_time_map[i].i_entry_nb * sizeof(u32) );
if( TIMINF.p_time_map[i].pi_sector == NULL )
{ {
intf_ErrMsg( "ifo error: out of memory in IfoTitleSet" ); TIMINF.p_time_map[i].pi_sector =
return -1; malloc( TIMINF.p_time_map[i].i_entry_nb * sizeof(u32) );
} if( TIMINF.p_time_map[i].pi_sector == NULL )
{
intf_ErrMsg( "ifo error: out of memory in IfoTitleSet" );
return -1;
}
for( j = 0 ; j < TIMINF.p_time_map[i].i_entry_nb ; j++ ) for( j = 0 ; j < TIMINF.p_time_map[i].i_entry_nb ; j++ )
{ {
TIMINF.p_time_map[i].pi_sector[j] = TIMINF.p_time_map[i].pi_sector[j] =
ReadDouble( p_ifo, p_buf, &p_tmp ); ReadDouble( p_ifo, p_buf, &p_tmp );
}
} }
} }
} }
...@@ -787,7 +790,10 @@ static int FreeTitleSet( vts_t * p_vts ) ...@@ -787,7 +790,10 @@ static int FreeTitleSet( vts_t * p_vts )
{ {
for( i = 0 ; i < p_vts->time_inf.i_nb ; i++ ) for( i = 0 ; i < p_vts->time_inf.i_nb ; i++ )
{ {
free( p_vts->time_inf.p_time_map[i].pi_sector ); if( p_vts->time_inf.p_time_map[i].i_entry_nb )
{
free( p_vts->time_inf.p_time_map[i].pi_sector );
}
} }
free( p_vts->time_inf.p_time_map ); free( p_vts->time_inf.p_time_map );
...@@ -1079,10 +1085,10 @@ static int ReadTitle( ifo_t * p_ifo, title_t * p_title, int i_block, int i_bytes ...@@ -1079,10 +1085,10 @@ static int ReadTitle( ifo_t * p_ifo, title_t * p_title, int i_block, int i_bytes
PLAY.i_still_time = ReadByte( p_ifo, p_buf, &p_tmp ); PLAY.i_still_time = ReadByte( p_ifo, p_buf, &p_tmp );
PLAY.i_command_nb = ReadByte( p_ifo, p_buf, &p_tmp ); PLAY.i_command_nb = ReadByte( p_ifo, p_buf, &p_tmp );
PLAY.i_play_time = ReadDouble( p_ifo, p_buf, &p_tmp ); PLAY.i_play_time = ReadDouble( p_ifo, p_buf, &p_tmp );
PLAY.i_start_sector = ReadDouble( p_ifo, p_buf, &p_tmp ); PLAY.i_first_sector = ReadDouble( p_ifo, p_buf, &p_tmp );
PLAY.i_first_ilvu_vobu_esector = ReadDouble( p_ifo, p_buf, &p_tmp ); PLAY.i_first_ilvu_vobu_esector = ReadDouble( p_ifo, p_buf, &p_tmp );
PLAY.i_last_vobu_start_sector = ReadDouble( p_ifo, p_buf, &p_tmp ); PLAY.i_last_vobu_start_sector = ReadDouble( p_ifo, p_buf, &p_tmp );
PLAY.i_end_sector = ReadDouble( p_ifo, p_buf, &p_tmp ); PLAY.i_last_sector = ReadDouble( p_ifo, p_buf, &p_tmp );
#undef PLAY #undef PLAY
} }
} }
...@@ -1174,7 +1180,7 @@ static int ReadUnitInf( ifo_t * p_ifo, unit_inf_t * p_unit_inf, ...@@ -1174,7 +1180,7 @@ static int ReadUnitInf( ifo_t * p_ifo, unit_inf_t * p_unit_inf,
p_unit_inf->i_title_nb = ReadWord( p_ifo, p_buf, &p_tmp ); p_unit_inf->i_title_nb = ReadWord( p_ifo, p_buf, &p_tmp );
//fprintf( stderr, "Unit nb: %d\n", p_unit_inf->i_title_nb ); //fprintf( stderr, "Unit nb: %d\n", p_unit_inf->i_title_nb );
DumpBytes( p_ifo, p_buf, &p_tmp, 2 ); DumpBytes( p_ifo, p_buf, &p_tmp, 2 );
p_unit_inf->i_end_byte = ReadDouble( p_ifo, p_buf, &p_tmp ); p_unit_inf->i_last_byte = ReadDouble( p_ifo, p_buf, &p_tmp );
p_unit_inf->p_title = p_unit_inf->p_title =
malloc( p_unit_inf->i_title_nb * sizeof(unit_title_t) ); malloc( p_unit_inf->i_title_nb * sizeof(unit_title_t) );
...@@ -1244,9 +1250,9 @@ static int ReadTitleUnit( ifo_t * p_ifo, title_unit_t * p_title_unit, ...@@ -1244,9 +1250,9 @@ static int ReadTitleUnit( ifo_t * p_ifo, title_unit_t * p_title_unit,
p_title_unit->i_unit_nb = ReadWord( p_ifo, p_buf, &p_tmp ); p_title_unit->i_unit_nb = ReadWord( p_ifo, p_buf, &p_tmp );
DumpBytes( p_ifo, p_buf, &p_tmp, 2 ); DumpBytes( p_ifo, p_buf, &p_tmp, 2 );
p_title_unit->i_end_byte = ReadDouble( p_ifo, p_buf, &p_tmp ); p_title_unit->i_last_byte = ReadDouble( p_ifo, p_buf, &p_tmp );
//fprintf(stderr, "Unit: nb %d end %d\n", p_title_unit->i_unit_nb, p_title_unit->i_end_byte ); //fprintf(stderr, "Unit: nb %d last %d\n", p_title_unit->i_unit_nb, p_title_unit->i_last_byte );
p_title_unit->p_unit = malloc( p_title_unit->i_unit_nb * sizeof(unit_t) ); p_title_unit->p_unit = malloc( p_title_unit->i_unit_nb * sizeof(unit_t) );
if( p_title_unit->p_unit == NULL ) if( p_title_unit->p_unit == NULL )
...@@ -1321,11 +1327,11 @@ static int ReadCellInf( ifo_t * p_ifo, cell_inf_t * p_cell_inf, int i_block ) ...@@ -1321,11 +1327,11 @@ static int ReadCellInf( ifo_t * p_ifo, cell_inf_t * p_cell_inf, int i_block )
p_cell_inf->i_vob_nb = ReadWord( p_ifo, p_buf, &p_tmp ); p_cell_inf->i_vob_nb = ReadWord( p_ifo, p_buf, &p_tmp );
DumpBytes( p_ifo, p_buf, &p_tmp, 2 ); DumpBytes( p_ifo, p_buf, &p_tmp, 2 );
p_cell_inf->i_end_byte = ReadDouble( p_ifo, p_buf, &p_tmp ); p_cell_inf->i_last_byte = ReadDouble( p_ifo, p_buf, &p_tmp );
p_cell_inf->i_cell_nb = (p_cell_inf->i_end_byte/* - 7*/) / sizeof(cell_map_t); p_cell_inf->i_cell_nb = (p_cell_inf->i_last_byte + 1/* - 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 ); /* fprintf( stderr, "Cell inf: vob %d, %d cells, last byte %d\n", p_cell_inf->i_vob_nb, p_cell_inf->i_cell_nb, p_cell_inf->i_last_byte );
*/ */
p_cell_inf->p_cell_map = p_cell_inf->p_cell_map =
malloc( p_cell_inf->i_cell_nb *sizeof(cell_map_t) ); malloc( p_cell_inf->i_cell_nb *sizeof(cell_map_t) );
...@@ -1341,9 +1347,9 @@ static int ReadCellInf( ifo_t * p_ifo, cell_inf_t * p_cell_inf, int i_block ) ...@@ -1341,9 +1347,9 @@ static int ReadCellInf( ifo_t * p_ifo, cell_inf_t * p_cell_inf, int i_block )
MAP.i_vob_id = ReadWord( p_ifo, p_buf, &p_tmp ); MAP.i_vob_id = ReadWord( p_ifo, p_buf, &p_tmp );
MAP.i_cell_id = ReadByte( p_ifo, p_buf, &p_tmp ); MAP.i_cell_id = ReadByte( p_ifo, p_buf, &p_tmp );
DumpBytes( p_ifo, p_buf, &p_tmp, 1 ); DumpBytes( p_ifo, p_buf, &p_tmp, 1 );
MAP.i_start_sector = ReadDouble( p_ifo, p_buf, &p_tmp ); MAP.i_first_sector = ReadDouble( p_ifo, p_buf, &p_tmp );
/* fprintf(stderr, "sector[%d] %d (%d)\n", i,ntohl(*(u32*)(p_tmp)), p_ifo->i_pos);*/ /* fprintf(stderr, "sector[%d] %d (%d)\n", i,ntohl(*(u32*)(p_tmp)), p_ifo->i_pos);*/
MAP.i_end_sector = ReadDouble( p_ifo, p_buf, &p_tmp ); MAP.i_last_sector = ReadDouble( p_ifo, p_buf, &p_tmp );
#undef MAP #undef MAP
} }
...@@ -1374,8 +1380,8 @@ static int ReadVobuMap( ifo_t * p_ifo, vobu_map_t * p_vobu_map, int i_block ) ...@@ -1374,8 +1380,8 @@ static int ReadVobuMap( ifo_t * p_ifo, vobu_map_t * p_vobu_map, int i_block )
i_start = p_ifo->i_pos; i_start = p_ifo->i_pos;
//fprintf( stderr, "VOBU ADMAP\n" ); //fprintf( stderr, "VOBU ADMAP\n" );
p_vobu_map->i_end_byte = ReadDouble( p_ifo, p_buf, &p_tmp ); p_vobu_map->i_last_byte = ReadDouble( p_ifo, p_buf, &p_tmp );
i_max = ( i_start + p_vobu_map->i_end_byte + 1 - p_ifo->i_pos ) i_max = ( i_start + p_vobu_map->i_last_byte + 1 - p_ifo->i_pos )
/ sizeof(u32); / sizeof(u32);
p_vobu_map->pi_vobu_start_sector = malloc( i_max * sizeof(u32) ); p_vobu_map->pi_vobu_start_sector = malloc( i_max * sizeof(u32) );
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* dvd_ifo.h: Structures for ifo parsing * dvd_ifo.h: Structures for ifo parsing
***************************************************************************** *****************************************************************************
* Copyright (C) 1999-2001 VideoLAN * Copyright (C) 1999-2001 VideoLAN
* $Id: dvd_ifo.h,v 1.18 2002/03/08 22:58:12 stef Exp $ * $Id: dvd_ifo.h,v 1.19 2002/05/20 22:45:03 sam Exp $
* *
* Author: Stphane Borel <stef@via.ecp.fr> * Author: Stphane Borel <stef@via.ecp.fr>
* *
...@@ -138,14 +138,14 @@ typedef struct chapter_map_s ...@@ -138,14 +138,14 @@ typedef struct chapter_map_s
typedef struct cell_play_s typedef struct cell_play_s
{ {
/* This information concerns the currently selected cell */ /* This information concerns the currently selected cell */
u16 i_category; // 2 bytes u16 i_category; // 2 bytes
u8 i_still_time; // 1 byte; in seconds; ff=inf u8 i_still_time; // 1 byte; in seconds; ff=inf
u8 i_command_nb; // 1 byte; 0 = no com u8 i_command_nb; // 1 byte; 0 = no com
u32 i_play_time; // 4 bytes u32 i_play_time; // 4 bytes
u32 i_start_sector; // 4 bytes u32 i_first_sector; // 4 bytes
u32 i_first_ilvu_vobu_esector; // 4 bytes; ??? u32 i_first_ilvu_vobu_esector; // 4 bytes; ???
u32 i_last_vobu_start_sector; // 4 bytes u32 i_last_vobu_start_sector; // 4 bytes
u32 i_end_sector; // 4 bytes u32 i_last_sector; // 4 bytes
} cell_play_t; } cell_play_t;
/* Cell Position Information Table /* Cell Position Information Table
...@@ -220,7 +220,7 @@ typedef struct unit_inf_s ...@@ -220,7 +220,7 @@ typedef struct unit_inf_s
{ {
u16 i_title_nb; // 2 bytes u16 i_title_nb; // 2 bytes
// char[2] ??? // char[2] ???
u32 i_end_byte; // 4 bytes u32 i_last_byte; // 4 bytes
unit_title_t * p_title; // i_srp_nb * 8 bytes unit_title_t * p_title; // i_srp_nb * 8 bytes
} unit_inf_t; } unit_inf_t;
...@@ -230,7 +230,7 @@ typedef struct title_unit_s ...@@ -230,7 +230,7 @@ typedef struct title_unit_s
{ {
u16 i_unit_nb; // 2 bytes; ??? u16 i_unit_nb; // 2 bytes; ???
// char[2] ??? // char[2] ???
u32 i_end_byte; // 4 bytes u32 i_last_byte; // 4 bytes
unit_t* p_unit; // i_lu_nb * 8 bytes unit_t* p_unit; // i_lu_nb * 8 bytes
unit_inf_t* p_unit_inf; // i_lu_nb * 8 bytes unit_inf_t* p_unit_inf; // i_lu_nb * 8 bytes
} title_unit_t; } title_unit_t;
...@@ -243,15 +243,15 @@ typedef struct cell_map_s ...@@ -243,15 +243,15 @@ typedef struct cell_map_s
u16 i_vob_id; // 2 bytes u16 i_vob_id; // 2 bytes
u8 i_cell_id; // 1 byte u8 i_cell_id; // 1 byte
// char ??? // char ???
u32 i_start_sector; // 4 bytes u32 i_first_sector; // 4 bytes
u32 i_end_sector; // 4 bytes u32 i_last_sector; // 4 bytes
} cell_map_t; } cell_map_t;
typedef struct cell_inf_s typedef struct cell_inf_s
{ {
u16 i_vob_nb; // 2 bytes u16 i_vob_nb; // 2 bytes
// char[2] ??? // char[2] ???
u32 i_end_byte; // 4 bytes u32 i_last_byte; // 4 bytes
u16 i_cell_nb; // not in ifo; computed u16 i_cell_nb; // not in ifo; computed
// with e_byte // with e_byte
cell_map_t* p_cell_map; cell_map_t* p_cell_map;
...@@ -263,7 +263,7 @@ typedef struct cell_inf_s ...@@ -263,7 +263,7 @@ typedef struct cell_inf_s
*/ */
typedef struct vobu_map_s typedef struct vobu_map_s
{ {
u32 i_end_byte; // 4 bytes u32 i_last_byte; // 4 bytes
u32* pi_vobu_start_sector; // (nb of vobu) * 4 bytes u32* pi_vobu_start_sector; // (nb of vobu) * 4 bytes
} vobu_map_t; } vobu_map_t;
...@@ -336,7 +336,7 @@ typedef struct title_inf_s ...@@ -336,7 +336,7 @@ typedef struct title_inf_s
{ {
u16 i_title_nb; // 2 bytes u16 i_title_nb; // 2 bytes
// char[2] ??? // char[2] ???
u32 i_end_byte; // 4 bytes u32 i_last_byte; // 4 bytes
title_attr_t * p_attr; // i_ttu_nb * 12 bytes title_attr_t * p_attr; // i_ttu_nb * 12 bytes
} title_inf_t; } title_inf_t;
...@@ -362,7 +362,7 @@ typedef struct parental_inf_s ...@@ -362,7 +362,7 @@ typedef struct parental_inf_s
{ {
u16 i_country_nb; // 2 bytes u16 i_country_nb; // 2 bytes
u16 i_vts_nb; // 2 bytes u16 i_vts_nb; // 2 bytes
u32 i_end_byte; // 4 bytes u32 i_last_byte; // 4 bytes
parental_desc_t* p_parental_desc; // i_country_nb * 8 bytes parental_desc_t* p_parental_desc; // i_country_nb * 8 bytes
parental_mask_t* p_parental_mask; // i_country_nb * sizeof(vmg_ptl_mask_t) parental_mask_t* p_parental_mask; // i_country_nb * sizeof(vmg_ptl_mask_t)
} parental_inf_t; } parental_inf_t;
...@@ -375,7 +375,7 @@ typedef struct parental_inf_s ...@@ -375,7 +375,7 @@ typedef struct parental_inf_s
* - start at pi_atrt_sbyte */ * - start at pi_atrt_sbyte */
typedef struct vts_attr_s typedef struct vts_attr_s
{ {
u32 i_end_byte; // 4 bytes u32 i_last_byte; // 4 bytes
u32 i_cat_app_type; // 4 bytes u32 i_cat_app_type; // 4 bytes
ifo_video_t vts_menu_video_attr; // 2 bytes ifo_video_t vts_menu_video_attr; // 2 bytes
// char ??? // char ???
...@@ -400,7 +400,7 @@ typedef struct vts_inf_s ...@@ -400,7 +400,7 @@ typedef struct vts_inf_s
{ {
u16 i_vts_nb; // 2 bytes u16 i_vts_nb; // 2 bytes
// char[2] ??? // char[2] ???
u32 i_end_byte; // 4 bytes u32 i_last_byte; // 4 bytes
u32* pi_vts_attr_start_byte; // i_vts_nb * 4 bytes u32* pi_vts_attr_start_byte; // i_vts_nb * 4 bytes
vts_attr_t* p_vts_attr; vts_attr_t* p_vts_attr;
} vts_inf_t; } vts_inf_t;
...@@ -430,9 +430,9 @@ typedef struct vmg_s ...@@ -430,9 +430,9 @@ typedef struct vmg_s
typedef struct vts_manager_s typedef struct vts_manager_s
{ {
char psz_id[13]; // 12 bytes (DVDVIDEO-VTS) char psz_id[13]; // 12 bytes (DVDVIDEO-VTS)
u32 i_end_sector; // 4 bytes u32 i_last_sector; // 4 bytes
// char[12] ??? // char[12] ???
u32 i_inf_end_sector; // 4 bytes u32 i_inf_last_sector; // 4 bytes
// char ??? // char ???
u8 i_spec_ver; // 1 byte u8 i_spec_ver; // 1 byte
u32 i_cat; // 4 bytes u32 i_cat; // 4 bytes
...@@ -486,7 +486,7 @@ typedef struct vts_title_s ...@@ -486,7 +486,7 @@ typedef struct vts_title_s
{ {
u16 i_title_nb; // 2 bytes u16 i_title_nb; // 2 bytes
// char[2] ??? // char[2] ???
u32 i_end_byte; // 4 bytes u32 i_last_byte; // 4 bytes
u32* pi_start_byte; u32* pi_start_byte;
title_start_t * p_title_start; // i_ttu_nb * 4 bytes title_start_t * p_title_start; // i_ttu_nb * 4 bytes
} vts_title_t; } vts_title_t;
...@@ -510,7 +510,7 @@ typedef struct time_inf_s ...@@ -510,7 +510,7 @@ typedef struct time_inf_s
{ {
u16 i_nb; // 2 bytes u16 i_nb; // 2 bytes
// char[2] ??? // char[2] ???
u32 i_end_byte; // 4 bytes u32 i_last_byte; // 4 bytes
u32* pi_start_byte; // i_tmap_nb * 4 bytes u32* pi_start_byte; // i_tmap_nb * 4 bytes
time_map_t* p_time_map; time_map_t* p_time_map;
} time_inf_t; } time_inf_t;
......
/* dvd_seek.c: functions to navigate through DVD. /* dvd_seek.c: functions to navigate through DVD.
***************************************************************************** *****************************************************************************
* Copyright (C) 1998-2001 VideoLAN * Copyright (C) 1998-2001 VideoLAN
* $Id: dvd_seek.c,v 1.6 2002/05/16 16:51:50 gbazin Exp $ * $Id: dvd_seek.c,v 1.7 2002/05/20 22:45:03 sam Exp $
* *
* Author: Stphane Borel <stef@via.ecp.fr> * Author: Stphane Borel <stef@via.ecp.fr>
* *
...@@ -71,7 +71,7 @@ int CellPrg2Map( thread_dvd_data_t * p_dvd ) ...@@ -71,7 +71,7 @@ int CellPrg2Map( thread_dvd_data_t * p_dvd )
{ {
int i_cell; int i_cell;
i_cell = p_dvd->i_map_cell; i_cell = 0;
if( i_cell >= cell.i_cell_nb ) if( i_cell >= cell.i_cell_nb )
{ {
...@@ -125,23 +125,23 @@ int CellAngleOffset( thread_dvd_data_t * p_dvd, int i_prg_cell ) ...@@ -125,23 +125,23 @@ int CellAngleOffset( thread_dvd_data_t * p_dvd, int i_prg_cell )
return i_cell_off; return i_cell_off;
} }
int CellStartSector( thread_dvd_data_t * p_dvd ) int CellFirstSector( thread_dvd_data_t * p_dvd )
{ {
return __MAX( cell.p_cell_map[p_dvd->i_map_cell].i_start_sector, return __MAX( cell.p_cell_map[p_dvd->i_map_cell].i_first_sector,
title.p_cell_play[p_dvd->i_prg_cell].i_start_sector ); title.p_cell_play[p_dvd->i_prg_cell].i_first_sector );
} }
int CellEndSector( thread_dvd_data_t * p_dvd ) int CellLastSector( thread_dvd_data_t * p_dvd )
{ {
return __MIN( cell.p_cell_map[p_dvd->i_map_cell].i_end_sector, return __MIN( cell.p_cell_map[p_dvd->i_map_cell].i_last_sector,
title.p_cell_play[p_dvd->i_prg_cell].i_end_sector ); title.p_cell_play[p_dvd->i_prg_cell].i_last_sector );
} }
int NextCellPrg( thread_dvd_data_t * p_dvd ) int NextCellPrg( thread_dvd_data_t * p_dvd )
{ {
int i_cell = p_dvd->i_prg_cell; int i_cell = p_dvd->i_prg_cell;
if( p_dvd->i_vts_lb > title.p_cell_play[i_cell].i_end_sector ) if( p_dvd->i_vts_lb > title.p_cell_play[i_cell].i_last_sector )
{ {
i_cell ++; i_cell ++;
i_cell += CellAngleOffset( p_dvd, i_cell ); i_cell += CellAngleOffset( p_dvd, i_cell );
...@@ -159,7 +159,7 @@ int Lb2CellPrg( thread_dvd_data_t * p_dvd ) ...@@ -159,7 +159,7 @@ int Lb2CellPrg( thread_dvd_data_t * p_dvd )
{ {
int i_cell = 0; int i_cell = 0;
while( p_dvd->i_vts_lb > title.p_cell_play[i_cell].i_end_sector ) while( p_dvd->i_vts_lb > title.p_cell_play[i_cell].i_last_sector )
{ {
i_cell ++; i_cell ++;
i_cell += CellAngleOffset( p_dvd, i_cell ); i_cell += CellAngleOffset( p_dvd, i_cell );
...@@ -177,7 +177,7 @@ int Lb2CellMap( thread_dvd_data_t * p_dvd ) ...@@ -177,7 +177,7 @@ int Lb2CellMap( thread_dvd_data_t * p_dvd )
{ {
int i_cell = 0; int i_cell = 0;
while( p_dvd->i_vts_lb > cell.p_cell_map[i_cell].i_end_sector ) while( p_dvd->i_vts_lb > cell.p_cell_map[i_cell].i_last_sector )
{ {
i_cell ++; i_cell ++;
...@@ -192,7 +192,7 @@ int Lb2CellMap( thread_dvd_data_t * p_dvd ) ...@@ -192,7 +192,7 @@ int Lb2CellMap( thread_dvd_data_t * p_dvd )
int LbMaxOnce( thread_dvd_data_t * p_dvd ) int LbMaxOnce( thread_dvd_data_t * p_dvd )
{ {
int i_block_once = p_dvd->i_end_lb - p_dvd->i_vts_lb + 1; int i_block_once = p_dvd->i_last_lb - p_dvd->i_vts_lb + 1;
/* Get the position of the next cell if we're at cell end */ /* Get the position of the next cell if we're at cell end */
if( i_block_once <= 0 ) if( i_block_once <= 0 )
...@@ -211,8 +211,8 @@ int LbMaxOnce( thread_dvd_data_t * p_dvd ) ...@@ -211,8 +211,8 @@ int LbMaxOnce( thread_dvd_data_t * p_dvd )
return 0; return 0;
} }
p_dvd->i_vts_lb = CellStartSector( p_dvd ); p_dvd->i_vts_lb = CellFirstSector( p_dvd );
p_dvd->i_end_lb = CellEndSector( p_dvd ); p_dvd->i_last_lb = CellLastSector( p_dvd );
if( ( p_dvd->i_chapter = NextChapter( p_dvd ) ) < 0) if( ( p_dvd->i_chapter = NextChapter( p_dvd ) ) < 0)
{ {
...@@ -229,7 +229,7 @@ int LbMaxOnce( thread_dvd_data_t * p_dvd ) ...@@ -229,7 +229,7 @@ int LbMaxOnce( thread_dvd_data_t * p_dvd )
return 0; return 0;
} }
i_block_once = p_dvd->i_end_lb - p_dvd->i_vts_lb + 1; i_block_once = p_dvd->i_last_lb - p_dvd->i_vts_lb + 1;
} }
return i_block_once; return i_block_once;
...@@ -275,6 +275,7 @@ int NextChapter( thread_dvd_data_t * p_dvd ) ...@@ -275,6 +275,7 @@ int NextChapter( thread_dvd_data_t * p_dvd )
return -1; return -1;
} }
p_dvd->b_new_chapter = 1; p_dvd->b_new_chapter = 1;
return p_dvd->i_chapter; return p_dvd->i_chapter;
} }
...@@ -300,8 +301,8 @@ int DVDSetChapter( thread_dvd_data_t * p_dvd, int i_chapter ) ...@@ -300,8 +301,8 @@ int DVDSetChapter( thread_dvd_data_t * p_dvd, int i_chapter )
p_dvd->i_map_cell = 0; p_dvd->i_map_cell = 0;
} }
p_dvd->i_map_cell = CellPrg2Map( p_dvd ); p_dvd->i_map_cell = CellPrg2Map( p_dvd );
p_dvd->i_vts_lb = CellStartSector( p_dvd ); p_dvd->i_vts_lb = CellFirstSector( p_dvd );
p_dvd->i_end_lb = CellEndSector( p_dvd ); p_dvd->i_last_lb = CellLastSector( p_dvd );
/* Position the fd pointer on the right address */ /* Position the fd pointer on the right address */
if( dvdcss_seek( p_dvd->dvdhandle, if( dvdcss_seek( p_dvd->dvdhandle,
......
/* dvd_seek.h: DVD access plugin. /* dvd_seek.h: DVD access plugin.
***************************************************************************** *****************************************************************************
* Copyright (C) 1998-2001 VideoLAN * Copyright (C) 1998-2001 VideoLAN
* $Id: dvd_seek.h,v 1.3 2002/03/09 16:48:33 stef Exp $ * $Id: dvd_seek.h,v 1.4 2002/05/20 22:45:03 sam Exp $
* *
* Author: Stphane Borel <stef@via.ecp.fr> * Author: Stphane Borel <stef@via.ecp.fr>
* *
...@@ -23,8 +23,8 @@ ...@@ -23,8 +23,8 @@
int CellIsInterleaved( thread_dvd_data_t * ); int CellIsInterleaved( thread_dvd_data_t * );
int CellAngleOffset ( thread_dvd_data_t *, int ); int CellAngleOffset ( thread_dvd_data_t *, int );
int CellPrg2Map ( thread_dvd_data_t * ); int CellPrg2Map ( thread_dvd_data_t * );
int CellStartSector ( thread_dvd_data_t * ); int CellFirstSector ( thread_dvd_data_t * );
int CellEndSector ( thread_dvd_data_t * ); int CellLastSector ( thread_dvd_data_t * );
int NextCellPrg ( thread_dvd_data_t * ); int NextCellPrg ( thread_dvd_data_t * );
int Lb2CellPrg ( thread_dvd_data_t * ); int Lb2CellPrg ( thread_dvd_data_t * );
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment