Commit 3e5a8ba4 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

vcd: switch to ACCESS_GET_(TITLE|SEEKPOINT)

parent ae721f0a
...@@ -70,6 +70,8 @@ struct access_sys_t ...@@ -70,6 +70,8 @@ struct access_sys_t
/* Title infos */ /* Title infos */
int i_titles; int i_titles;
input_title_t *title[99]; /* No more that 99 track in a vcd ? */ input_title_t *title[99]; /* No more that 99 track in a vcd ? */
int i_current_title;
int i_current_seekpoint;
int i_sector; /* Current Sector */ int i_sector; /* Current Sector */
int *p_sectors; /* Track sectors */ int *p_sectors; /* Track sectors */
...@@ -196,8 +198,8 @@ static int Open( vlc_object_t *p_this ) ...@@ -196,8 +198,8 @@ static int Open( vlc_object_t *p_this )
p_access->info.b_eof = false; p_access->info.b_eof = false;
p_access->info.i_title = i_title; p_sys->i_current_title = i_title;
p_access->info.i_seekpoint = i_chapter; p_sys->i_current_seekpoint = i_chapter;
p_access->info.i_pos = (uint64_t)( p_sys->i_sector - p_sys->p_sectors[1+i_title] ) * p_access->info.i_pos = (uint64_t)( p_sys->i_sector - p_sys->p_sectors[1+i_title] ) *
VCD_DATA_SIZE; VCD_DATA_SIZE;
...@@ -231,7 +233,6 @@ static int Control( access_t *p_access, int i_query, va_list args ) ...@@ -231,7 +233,6 @@ static int Control( access_t *p_access, int i_query, va_list args )
{ {
access_sys_t *p_sys = p_access->p_sys; access_sys_t *p_sys = p_access->p_sys;
input_title_t ***ppp_title; input_title_t ***ppp_title;
int i;
switch( i_query ) switch( i_query )
{ {
...@@ -245,7 +246,7 @@ static int Control( access_t *p_access, int i_query, va_list args ) ...@@ -245,7 +246,7 @@ static int Control( access_t *p_access, int i_query, va_list args )
case ACCESS_GET_SIZE: case ACCESS_GET_SIZE:
*va_arg( args, uint64_t * ) = *va_arg( args, uint64_t * ) =
p_sys->title[p_access->info.i_title]->i_size; p_sys->title[p_sys->i_current_title]->i_size;
break; break;
/* */ /* */
...@@ -264,42 +265,49 @@ static int Control( access_t *p_access, int i_query, va_list args ) ...@@ -264,42 +265,49 @@ static int Control( access_t *p_access, int i_query, va_list args )
/* Duplicate title infos */ /* Duplicate title infos */
*ppp_title = malloc( sizeof(input_title_t **) * p_sys->i_titles ); *ppp_title = malloc( sizeof(input_title_t **) * p_sys->i_titles );
for( i = 0; i < p_sys->i_titles; i++ ) for( int i = 0; i < p_sys->i_titles; i++ )
{
(*ppp_title)[i] = vlc_input_title_Duplicate( p_sys->title[i] ); (*ppp_title)[i] = vlc_input_title_Duplicate( p_sys->title[i] );
} break;
case ACCESS_GET_TITLE:
*va_arg( args, unsigned * ) = p_sys->i_current_title;
break;
case ACCESS_GET_SEEKPOINT:
*va_arg( args, unsigned * ) = p_sys->i_current_seekpoint;
break; break;
case ACCESS_SET_TITLE: case ACCESS_SET_TITLE:
i = va_arg( args, int ); {
if( i != p_access->info.i_title ) int i = va_arg( args, int );
if( i != p_sys->i_current_title )
{ {
/* Update info */ /* Update info */
p_access->info.i_update |= p_sys->i_current_title = i;
INPUT_UPDATE_TITLE|INPUT_UPDATE_SEEKPOINT; p_sys->i_current_seekpoint = 0;
p_access->info.i_title = i; p_access->info.i_pos = 0;
p_access->info.i_seekpoint = 0;
p_access->info.i_pos = 0;
/* Next sector to read */ /* Next sector to read */
p_sys->i_sector = p_sys->p_sectors[1+i]; p_sys->i_sector = p_sys->p_sectors[1+i];
} }
break; break;
}
case ACCESS_SET_SEEKPOINT: case ACCESS_SET_SEEKPOINT:
{ {
input_title_t *t = p_sys->title[p_access->info.i_title]; int i = va_arg( args, int );
i = va_arg( args, int ); unsigned i_title = p_sys->i_current_title;
input_title_t *t = p_sys->title[i_title];
if( t->i_seekpoint > 0 ) if( t->i_seekpoint > 0 )
{ {
p_access->info.i_update |= INPUT_UPDATE_SEEKPOINT; p_sys->i_current_seekpoint = i;
p_access->info.i_seekpoint = i;
p_sys->i_sector = p_sys->p_sectors[1+p_access->info.i_title] + p_sys->i_sector = p_sys->p_sectors[1 + i_title] +
t->seekpoint[i]->i_byte_offset / VCD_DATA_SIZE; t->seekpoint[i]->i_byte_offset / VCD_DATA_SIZE;
p_access->info.i_pos = (uint64_t)(p_sys->i_sector - p_access->info.i_pos = (uint64_t)(p_sys->i_sector -
p_sys->p_sectors[1+p_access->info.i_title]) *VCD_DATA_SIZE; p_sys->p_sectors[1 + i_title]) *VCD_DATA_SIZE;
} }
break; break;
} }
...@@ -323,26 +331,24 @@ static block_t *Block( access_t *p_access ) ...@@ -323,26 +331,24 @@ static block_t *Block( access_t *p_access )
if( p_access->info.b_eof ) return NULL; if( p_access->info.b_eof ) return NULL;
/* Check end of title */ /* Check end of title */
while( p_sys->i_sector >= p_sys->p_sectors[p_access->info.i_title + 2] ) while( p_sys->i_sector >= p_sys->p_sectors[p_sys->i_current_title + 2] )
{ {
if( p_access->info.i_title + 2 >= p_sys->i_titles ) if( p_sys->i_current_title + 2 >= p_sys->i_titles )
{ {
p_access->info.b_eof = true; p_access->info.b_eof = true;
return NULL; return NULL;
} }
p_access->info.i_update |= p_sys->i_current_title++;
INPUT_UPDATE_TITLE | INPUT_UPDATE_SEEKPOINT; p_sys->i_current_seekpoint = 0;
p_access->info.i_title++;
p_access->info.i_seekpoint = 0;
p_access->info.i_pos = 0; p_access->info.i_pos = 0;
} }
/* Don't read after the end of a title */ /* Don't read after the end of a title */
if( p_sys->i_sector + i_blocks >= if( p_sys->i_sector + i_blocks >=
p_sys->p_sectors[p_access->info.i_title + 2] ) p_sys->p_sectors[p_sys->i_current_title + 2] )
{ {
i_blocks = p_sys->p_sectors[p_access->info.i_title + 2 ] - p_sys->i_sector; i_blocks = p_sys->p_sectors[p_sys->i_current_title + 2 ] - p_sys->i_sector;
} }
/* Do the actual reading */ /* Do the actual reading */
...@@ -368,17 +374,16 @@ static block_t *Block( access_t *p_access ) ...@@ -368,17 +374,16 @@ static block_t *Block( access_t *p_access )
/* Update seekpoints */ /* Update seekpoints */
for( int i_read = 0; i_read < i_blocks; i_read++ ) for( int i_read = 0; i_read < i_blocks; i_read++ )
{ {
input_title_t *t = p_sys->title[p_access->info.i_title]; input_title_t *t = p_sys->title[p_sys->i_current_title];
if( t->i_seekpoint > 0 && if( t->i_seekpoint > 0 &&
p_access->info.i_seekpoint + 1 < t->i_seekpoint && p_sys->i_current_seekpoint + 1 < t->i_seekpoint &&
(int64_t) /* Unlikely to go over 8192 PetaB */ (int64_t) /* Unlikely to go over 8192 PetaB */
(p_access->info.i_pos + i_read * VCD_DATA_SIZE) >= (p_access->info.i_pos + i_read * VCD_DATA_SIZE) >=
t->seekpoint[p_access->info.i_seekpoint+1]->i_byte_offset ) t->seekpoint[p_sys->i_current_seekpoint + 1]->i_byte_offset )
{ {
msg_Dbg( p_access, "seekpoint change" ); msg_Dbg( p_access, "seekpoint change" );
p_access->info.i_update |= INPUT_UPDATE_SEEKPOINT; p_sys->i_current_seekpoint++;
p_access->info.i_seekpoint++;
} }
} }
...@@ -395,13 +400,13 @@ static block_t *Block( access_t *p_access ) ...@@ -395,13 +400,13 @@ static block_t *Block( access_t *p_access )
static int Seek( access_t *p_access, uint64_t i_pos ) static int Seek( access_t *p_access, uint64_t i_pos )
{ {
access_sys_t *p_sys = p_access->p_sys; access_sys_t *p_sys = p_access->p_sys;
input_title_t *t = p_sys->title[p_access->info.i_title]; input_title_t *t = p_sys->title[p_sys->i_current_title];
int i_seekpoint; int i_seekpoint;
/* Next sector to read */ /* Next sector to read */
p_access->info.i_pos = i_pos; p_access->info.i_pos = i_pos;
p_sys->i_sector = i_pos / VCD_DATA_SIZE + p_sys->i_sector = i_pos / VCD_DATA_SIZE +
p_sys->p_sectors[p_access->info.i_title + 1]; p_sys->p_sectors[p_sys->i_current_title + 1];
/* Update current seekpoint */ /* Update current seekpoint */
for( i_seekpoint = 0; i_seekpoint < t->i_seekpoint; i_seekpoint++ ) for( i_seekpoint = 0; i_seekpoint < t->i_seekpoint; i_seekpoint++ )
...@@ -411,11 +416,10 @@ static int Seek( access_t *p_access, uint64_t i_pos ) ...@@ -411,11 +416,10 @@ static int Seek( access_t *p_access, uint64_t i_pos )
i_pos < (uint64_t)t->seekpoint[i_seekpoint + 1]->i_byte_offset ) break; i_pos < (uint64_t)t->seekpoint[i_seekpoint + 1]->i_byte_offset ) break;
} }
if( i_seekpoint != p_access->info.i_seekpoint ) if( i_seekpoint != p_sys->i_current_seekpoint )
{ {
msg_Dbg( p_access, "seekpoint change" ); msg_Dbg( p_access, "seekpoint change" );
p_access->info.i_update |= INPUT_UPDATE_SEEKPOINT; p_sys->i_current_seekpoint = i_seekpoint;
p_access->info.i_seekpoint = i_seekpoint;
} }
/* Reset eof */ /* Reset eof */
......
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