Commit 8f8ff669 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

access: info.i_size -> control(ACCESS_GET_SIZE)

parent f9053346
...@@ -43,6 +43,7 @@ enum access_query_e ...@@ -43,6 +43,7 @@ enum access_query_e
ACCESS_CAN_FASTSEEK, /* arg1= bool* cannot fail */ ACCESS_CAN_FASTSEEK, /* arg1= bool* cannot fail */
ACCESS_CAN_PAUSE, /* arg1= bool* cannot fail */ ACCESS_CAN_PAUSE, /* arg1= bool* cannot fail */
ACCESS_CAN_CONTROL_PACE,/* arg1= bool* cannot fail */ ACCESS_CAN_CONTROL_PACE,/* arg1= bool* cannot fail */
ACCESS_GET_SIZE=6, /* arg1= uin64_t* */
/* */ /* */
ACCESS_GET_PTS_DELAY = 0x101,/* arg1= int64_t* cannot fail */ ACCESS_GET_PTS_DELAY = 0x101,/* arg1= int64_t* cannot fail */
...@@ -107,7 +108,6 @@ struct access_t ...@@ -107,7 +108,6 @@ struct access_t
unsigned int i_update; /* Access sets them on change, unsigned int i_update; /* Access sets them on change,
Input removes them once take into account*/ Input removes them once take into account*/
uint64_t i_size; /* Write only for access, read only for input */
uint64_t i_pos; /* idem */ uint64_t i_pos; /* idem */
bool b_eof; /* idem */ bool b_eof; /* idem */
...@@ -137,10 +137,17 @@ static inline int access_Control( access_t *p_access, int i_query, ... ) ...@@ -137,10 +137,17 @@ static inline int access_Control( access_t *p_access, int i_query, ... )
return i_result; return i_result;
} }
static inline uint64_t access_GetSize( access_t *p_access )
{
uint64_t val;
if( access_Control( p_access, ACCESS_GET_SIZE, &val ) )
val = 0;
return val;
}
static inline void access_InitFields( access_t *p_a ) static inline void access_InitFields( access_t *p_a )
{ {
p_a->info.i_update = 0; p_a->info.i_update = 0;
p_a->info.i_size = 0;
p_a->info.i_pos = 0; p_a->info.i_pos = 0;
p_a->info.b_eof = false; p_a->info.b_eof = false;
p_a->info.i_title = 0; p_a->info.i_title = 0;
......
...@@ -73,8 +73,10 @@ static int UrlInterruptCallback(void *access) ...@@ -73,8 +73,10 @@ static int UrlInterruptCallback(void *access)
return !vlc_object_alive((vlc_object_t*)access); return !vlc_object_alive((vlc_object_t*)access);
} }
struct access_sys_t { struct access_sys_t
{
AVIOContext *context; AVIOContext *context;
uint64_t size;
}; };
struct sout_access_out_sys_t { struct sout_access_out_sys_t {
...@@ -185,10 +187,10 @@ int OpenAvio(vlc_object_t *object) ...@@ -185,10 +187,10 @@ int OpenAvio(vlc_object_t *object)
seekable = sys->context->seekable; seekable = sys->context->seekable;
#endif #endif
msg_Dbg(access, "%sseekable, size=%"PRIi64, seekable ? "" : "not ", size); msg_Dbg(access, "%sseekable, size=%"PRIi64, seekable ? "" : "not ", size);
sys->size = size > 0 ? size : 0;
/* */ /* */
access_InitFields(access); access_InitFields(access);
access->info.i_size = size > 0 ? size : 0;
access->pf_read = Read; access->pf_read = Read;
access->pf_block = NULL; access->pf_block = NULL;
...@@ -368,7 +370,7 @@ static int Seek(access_t *access, uint64_t position) ...@@ -368,7 +370,7 @@ static int Seek(access_t *access, uint64_t position)
if (ret < 0) { if (ret < 0) {
errno = AVUNERROR(ret); errno = AVUNERROR(ret);
msg_Err(access, "Seek to %"PRIu64" failed: %m", position); msg_Err(access, "Seek to %"PRIu64" failed: %m", position);
if (access->info.i_size <= 0 || position != access->info.i_size) if (sys->size == 0 || position != sys->size)
return VLC_EGENERIC; return VLC_EGENERIC;
} }
access->info.i_pos = position; access->info.i_pos = position;
...@@ -431,6 +433,9 @@ static int Control(access_t *access, int query, va_list args) ...@@ -431,6 +433,9 @@ static int Control(access_t *access, int query, va_list args)
b = va_arg(args, bool *); b = va_arg(args, bool *);
*b = true; /* FIXME */ *b = true; /* FIXME */
return VLC_SUCCESS; return VLC_SUCCESS;
case ACCESS_GET_SIZE:
*va_arg(args, uint64_t *) = sys->size;
return VLC_SUCCESS;
case ACCESS_GET_PTS_DELAY: { case ACCESS_GET_PTS_DELAY: {
int64_t *delay = va_arg(args, int64_t *); int64_t *delay = va_arg(args, int64_t *);
*delay = DEFAULT_PTS_DELAY; /* FIXME */ *delay = DEFAULT_PTS_DELAY; /* FIXME */
......
...@@ -96,6 +96,7 @@ vlc_module_end () ...@@ -96,6 +96,7 @@ vlc_module_end ()
struct access_sys_t struct access_sys_t
{ {
vcddev_t *vcddev; /* vcd device descriptor */ vcddev_t *vcddev; /* vcd device descriptor */
uint64_t size;
/* Current position */ /* Current position */
int i_sector; /* Current Sector */ int i_sector; /* Current Sector */
...@@ -219,7 +220,7 @@ static int Open( vlc_object_t *p_this ) ...@@ -219,7 +220,7 @@ static int Open( vlc_object_t *p_this )
} }
p_sys->i_sector = p_sys->i_first_sector; p_sys->i_sector = p_sys->i_first_sector;
p_access->info.i_size = (p_sys->i_last_sector - p_sys->i_first_sector) p_sys->size = (p_sys->i_last_sector - p_sys->i_first_sector)
* (int64_t)CDDA_DATA_SIZE; * (int64_t)CDDA_DATA_SIZE;
} }
...@@ -333,7 +334,9 @@ static int Control( access_t *p_access, int i_query, va_list args ) ...@@ -333,7 +334,9 @@ static int Control( access_t *p_access, int i_query, va_list args )
case ACCESS_CAN_CONTROL_PACE: case ACCESS_CAN_CONTROL_PACE:
*va_arg( args, bool* ) = true; *va_arg( args, bool* ) = true;
break; break;
case ACCESS_GET_SIZE:
*va_arg( args, uint64_t * ) = p_access->p_sys->size;
break;
case ACCESS_GET_PTS_DELAY: case ACCESS_GET_PTS_DELAY:
*va_arg( args, int64_t * ) = *va_arg( args, int64_t * ) =
INT64_C(1000) * var_InheritInteger( p_access, "disc-caching" ); INT64_C(1000) * var_InheritInteger( p_access, "disc-caching" );
......
...@@ -814,7 +814,6 @@ static int AccessOpen( vlc_object_t *p_this ) ...@@ -814,7 +814,6 @@ static int AccessOpen( vlc_object_t *p_this )
p_access->pf_control = AccessControl; p_access->pf_control = AccessControl;
p_access->pf_seek = NULL; p_access->pf_seek = NULL;
p_access->info.i_update = 0; p_access->info.i_update = 0;
p_access->info.i_size = 0;
p_access->info.i_pos = 0; p_access->info.i_pos = 0;
p_access->info.b_eof = false; p_access->info.b_eof = false;
p_access->info.i_title = 0; p_access->info.i_title = 0;
......
...@@ -68,8 +68,8 @@ struct access_sys_t ...@@ -68,8 +68,8 @@ struct access_sys_t
{ {
int fd; int fd;
/* */
bool b_pace_control; bool b_pace_control;
uint64_t size;
}; };
#if !defined (_WIN32) && !defined (__OS2__) #if !defined (_WIN32) && !defined (__OS2__)
...@@ -226,8 +226,8 @@ int FileOpen( vlc_object_t *p_this ) ...@@ -226,8 +226,8 @@ int FileOpen( vlc_object_t *p_this )
{ {
p_access->pf_read = FileRead; p_access->pf_read = FileRead;
p_access->pf_seek = FileSeek; p_access->pf_seek = FileSeek;
p_access->info.i_size = st.st_size;
p_sys->b_pace_control = true; p_sys->b_pace_control = true;
p_sys->size = st.st_size;
/* Demuxers will need the beginning of the file for probing. */ /* Demuxers will need the beginning of the file for probing. */
posix_fadvise (fd, 0, 4096, POSIX_FADV_WILLNEED); posix_fadvise (fd, 0, 4096, POSIX_FADV_WILLNEED);
...@@ -245,6 +245,7 @@ int FileOpen( vlc_object_t *p_this ) ...@@ -245,6 +245,7 @@ int FileOpen( vlc_object_t *p_this )
p_access->pf_read = StreamRead; p_access->pf_read = StreamRead;
p_access->pf_seek = NoSeek; p_access->pf_seek = NoSeek;
p_sys->b_pace_control = strcasecmp (p_access->psz_access, "stream"); p_sys->b_pace_control = strcasecmp (p_access->psz_access, "stream");
p_sys->size = 0;
} }
return VLC_SUCCESS; return VLC_SUCCESS;
...@@ -302,12 +303,12 @@ static ssize_t FileRead (access_t *p_access, uint8_t *p_buffer, size_t i_len) ...@@ -302,12 +303,12 @@ static ssize_t FileRead (access_t *p_access, uint8_t *p_buffer, size_t i_len)
p_access->info.i_pos += val; p_access->info.i_pos += val;
p_access->info.b_eof = !val; p_access->info.b_eof = !val;
if (p_access->info.i_pos >= p_access->info.i_size) if (p_access->info.i_pos >= p_sys->size)
{ {
struct stat st; struct stat st;
if (fstat (fd, &st) == 0) if (fstat (fd, &st) == 0)
p_access->info.i_size = st.st_size; p_sys->size = st.st_size;
} }
return val; return val;
} }
...@@ -387,6 +388,10 @@ static int FileControl( access_t *p_access, int i_query, va_list args ) ...@@ -387,6 +388,10 @@ static int FileControl( access_t *p_access, int i_query, va_list args )
*pb_bool = p_sys->b_pace_control; *pb_bool = p_sys->b_pace_control;
break; break;
case ACCESS_GET_SIZE:
*va_arg( args, uint64_t * ) = p_sys->size;
break;
/* */ /* */
case ACCESS_GET_PTS_DELAY: case ACCESS_GET_PTS_DELAY:
pi_64 = (int64_t*)va_arg( args, int64_t * ); pi_64 = (int64_t*)va_arg( args, int64_t * );
......
...@@ -109,6 +109,7 @@ struct access_sys_t ...@@ -109,6 +109,7 @@ struct access_sys_t
char sz_epsv_ip[NI_MAXNUMERICHOST]; char sz_epsv_ip[NI_MAXNUMERICHOST];
bool out; bool out;
bool directory; bool directory;
uint64_t size;
}; };
#define GET_OUT_SYS( p_this ) \ #define GET_OUT_SYS( p_this ) \
((access_sys_t *)(((sout_access_out_t *)(p_this))->p_sys)) ((access_sys_t *)(((sout_access_out_t *)(p_this))->p_sys))
...@@ -475,6 +476,7 @@ static int InOpen( vlc_object_t *p_this ) ...@@ -475,6 +476,7 @@ static int InOpen( vlc_object_t *p_this )
p_sys->fd_data = -1; p_sys->fd_data = -1;
p_sys->out = false; p_sys->out = false;
p_sys->directory = false; p_sys->directory = false;
p_sys->size = 0;
if( parseURL( &p_sys->url, p_access->psz_location ) ) if( parseURL( &p_sys->url, p_access->psz_location ) )
goto exit_error; goto exit_error;
...@@ -491,9 +493,9 @@ static int InOpen( vlc_object_t *p_this ) ...@@ -491,9 +493,9 @@ static int InOpen( vlc_object_t *p_this )
else else
if ( ftp_RecvCommand( p_this, p_sys, NULL, &psz_arg ) == 2 ) if ( ftp_RecvCommand( p_this, p_sys, NULL, &psz_arg ) == 2 )
{ {
p_access->info.i_size = atoll( &psz_arg[4] ); p_sys->size = atoll( &psz_arg[4] );
free( psz_arg ); free( psz_arg );
msg_Dbg( p_access, "file size: %"PRIu64, p_access->info.i_size ); msg_Dbg( p_access, "file size: %"PRIu64, p_sys->size );
} }
else else
if( ftp_SendCommand( p_this, p_sys, "CWD %s", p_sys->url.psz_path ) < 0 ) if( ftp_SendCommand( p_this, p_sys, "CWD %s", p_sys->url.psz_path ) < 0 )
...@@ -728,6 +730,9 @@ static int Control( access_t *p_access, int i_query, va_list args ) ...@@ -728,6 +730,9 @@ static int Control( access_t *p_access, int i_query, va_list args )
pb_bool = (bool*)va_arg( args, bool* ); pb_bool = (bool*)va_arg( args, bool* );
*pb_bool = true; /* FIXME */ *pb_bool = true; /* FIXME */
break; break;
case ACCESS_GET_SIZE:
*va_arg( args, uint64_t * ) = p_access->p_sys->size;
break;
/* */ /* */
case ACCESS_GET_PTS_DELAY: case ACCESS_GET_PTS_DELAY:
......
...@@ -213,7 +213,6 @@ static int Open( vlc_object_t *p_this ) ...@@ -213,7 +213,6 @@ static int Open( vlc_object_t *p_this )
p_sys->p_file_info->type == GNOME_VFS_FILE_TYPE_BLOCK_DEVICE ) p_sys->p_file_info->type == GNOME_VFS_FILE_TYPE_BLOCK_DEVICE )
{ {
p_sys->b_seekable = true; p_sys->b_seekable = true;
p_access->info.i_size = (int64_t)(p_sys->p_file_info->size);
} }
else if( p_sys->p_file_info->type == GNOME_VFS_FILE_TYPE_FIFO else if( p_sys->p_file_info->type == GNOME_VFS_FILE_TYPE_FIFO
|| p_sys->p_file_info->type == GNOME_VFS_FILE_TYPE_SOCKET ) || p_sys->p_file_info->type == GNOME_VFS_FILE_TYPE_SOCKET )
...@@ -226,7 +225,7 @@ static int Open( vlc_object_t *p_this ) ...@@ -226,7 +225,7 @@ static int Open( vlc_object_t *p_this )
return VLC_EGENERIC; return VLC_EGENERIC;
} }
if( p_sys->b_seekable && !p_access->info.i_size ) if( p_sys->b_seekable && !p_sys->p_file_info->size )
{ {
/* FIXME that's bad because all others access will be probed */ /* FIXME that's bad because all others access will be probed */
msg_Warn( p_access, "file %s is empty, aborting", psz_name ); msg_Warn( p_access, "file %s is empty, aborting", psz_name );
...@@ -288,8 +287,8 @@ static ssize_t Read( access_t *p_access, uint8_t *p_buffer, size_t i_len ) ...@@ -288,8 +287,8 @@ static ssize_t Read( access_t *p_access, uint8_t *p_buffer, size_t i_len )
} }
p_access->info.i_pos += (int64_t)i_read_len; p_access->info.i_pos += (int64_t)i_read_len;
if( p_access->info.i_pos >= p_access->info.i_size if( p_access->info.i_pos >= p_sys->p_file_info->size
&& p_access->info.i_size != 0 && p_sys->b_local ) && p_sys->p_file_info->size != 0 && p_sys->b_local )
{ {
gnome_vfs_file_info_clear( p_sys->p_file_info ); gnome_vfs_file_info_clear( p_sys->p_file_info );
i_ret = gnome_vfs_get_file_info_from_handle( p_sys->p_handle, i_ret = gnome_vfs_get_file_info_from_handle( p_sys->p_handle,
...@@ -297,8 +296,6 @@ static ssize_t Read( access_t *p_access, uint8_t *p_buffer, size_t i_len ) ...@@ -297,8 +296,6 @@ static ssize_t Read( access_t *p_access, uint8_t *p_buffer, size_t i_len )
if( i_ret ) if( i_ret )
msg_Warn( p_access, "couldn't get file properties again (%s)", msg_Warn( p_access, "couldn't get file properties again (%s)",
gnome_vfs_result_to_string( i_ret ) ); gnome_vfs_result_to_string( i_ret ) );
else
p_access->info.i_size = (int64_t)(p_sys->p_file_info->size);
} }
return (int)i_read_len; return (int)i_read_len;
} }
...@@ -361,6 +358,10 @@ static int Control( access_t *p_access, int i_query, va_list args ) ...@@ -361,6 +358,10 @@ static int Control( access_t *p_access, int i_query, va_list args )
*pb_bool = p_sys->b_pace_control; *pb_bool = p_sys->b_pace_control;
break; break;
case ACCESS_GET_SIZE:
*va_arg( args, uint64_t * ) = p_sys->p_file_info->size;
break;
case ACCESS_GET_PTS_DELAY: case ACCESS_GET_PTS_DELAY:
pi_64 = (int64_t*)va_arg( args, int64_t * ); pi_64 = (int64_t*)va_arg( args, int64_t * );
*pi_64 = DEFAULT_PTS_DELAY; /* FIXME */ *pi_64 = DEFAULT_PTS_DELAY; /* FIXME */
......
...@@ -176,6 +176,7 @@ struct access_sys_t ...@@ -176,6 +176,7 @@ struct access_sys_t
char *psz_icy_title; char *psz_icy_title;
uint64_t i_remaining; uint64_t i_remaining;
uint64_t size;
bool b_seekable; bool b_seekable;
bool b_reconnect; bool b_reconnect;
...@@ -281,7 +282,7 @@ static int OpenWithCookies( vlc_object_t *p_this, const char *psz_access, ...@@ -281,7 +282,7 @@ static int OpenWithCookies( vlc_object_t *p_this, const char *psz_access,
p_sys->i_remaining = 0; p_sys->i_remaining = 0;
p_sys->b_persist = false; p_sys->b_persist = false;
p_sys->b_has_size = false; p_sys->b_has_size = false;
p_access->info.i_size = 0; p_sys->size = 0;
p_access->info.i_pos = 0; p_access->info.i_pos = 0;
p_access->info.b_eof = false; p_access->info.b_eof = false;
...@@ -732,7 +733,7 @@ static ssize_t Read( access_t *p_access, uint8_t *p_buffer, size_t i_len ) ...@@ -732,7 +733,7 @@ static ssize_t Read( access_t *p_access, uint8_t *p_buffer, size_t i_len )
if( p_sys->b_has_size ) if( p_sys->b_has_size )
{ {
/* Remaining bytes in the file */ /* Remaining bytes in the file */
uint64_t remainder = p_access->info.i_size - p_access->info.i_pos; uint64_t remainder = p_sys->size - p_access->info.i_pos;
if( remainder < i_len ) if( remainder < i_len )
i_len = remainder; i_len = remainder;
...@@ -805,7 +806,7 @@ static ssize_t Read( access_t *p_access, uint8_t *p_buffer, size_t i_len ) ...@@ -805,7 +806,7 @@ static ssize_t Read( access_t *p_access, uint8_t *p_buffer, size_t i_len )
p_access->info.i_pos += i_read; p_access->info.i_pos += i_read;
if( p_sys->b_has_size ) if( p_sys->b_has_size )
{ {
assert( p_access->info.i_pos <= p_access->info.i_size ); assert( p_access->info.i_pos <= p_sys->size );
assert( (unsigned)i_read <= p_sys->i_remaining ); assert( (unsigned)i_read <= p_sys->i_remaining );
p_sys->i_remaining -= i_read; p_sys->i_remaining -= i_read;
} }
...@@ -929,14 +930,15 @@ static ssize_t ReadCompressed( access_t *p_access, uint8_t *p_buffer, ...@@ -929,14 +930,15 @@ static ssize_t ReadCompressed( access_t *p_access, uint8_t *p_buffer,
*****************************************************************************/ *****************************************************************************/
static int Seek( access_t *p_access, uint64_t i_pos ) static int Seek( access_t *p_access, uint64_t i_pos )
{ {
msg_Dbg( p_access, "trying to seek to %"PRId64, i_pos ); access_sys_t *p_sys = p_access->p_sys;
msg_Dbg( p_access, "trying to seek to %"PRId64, i_pos );
Disconnect( p_access ); Disconnect( p_access );
if( p_access->info.i_size if( p_sys->size && i_pos >= p_sys->size )
&& i_pos >= p_access->info.i_size ) { {
msg_Err( p_access, "seek too far" ); msg_Err( p_access, "seek too far" );
int retval = Seek( p_access, p_access->info.i_size - 1 ); int retval = Seek( p_access, p_sys->size - 1 );
if( retval == VLC_SUCCESS ) { if( retval == VLC_SUCCESS ) {
uint8_t p_buffer[2]; uint8_t p_buffer[2];
Read( p_access, p_buffer, 1); Read( p_access, p_buffer, 1);
...@@ -1058,7 +1060,7 @@ static int Connect( access_t *p_access, uint64_t i_tell ) ...@@ -1058,7 +1060,7 @@ static int Connect( access_t *p_access, uint64_t i_tell )
p_sys->i_remaining = 0; p_sys->i_remaining = 0;
p_sys->b_persist = false; p_sys->b_persist = false;
p_sys->b_has_size = false; p_sys->b_has_size = false;
p_access->info.i_size = 0; p_sys->size = 0;
p_access->info.i_pos = i_tell; p_access->info.i_pos = i_tell;
p_access->info.b_eof = false; p_access->info.b_eof = false;
...@@ -1337,25 +1339,25 @@ static int Request( access_t *p_access, uint64_t i_tell ) ...@@ -1337,25 +1339,25 @@ static int Request( access_t *p_access, uint64_t i_tell )
if( !strcasecmp( psz, "Content-Length" ) ) if( !strcasecmp( psz, "Content-Length" ) )
{ {
uint64_t i_size = i_tell + (p_sys->i_remaining = (uint64_t)atoll( p )); uint64_t i_size = i_tell + (p_sys->i_remaining = (uint64_t)atoll( p ));
if(i_size > p_access->info.i_size) { if(i_size > p_sys->size) {
p_sys->b_has_size = true; p_sys->b_has_size = true;
p_access->info.i_size = i_size; p_sys->size = i_size;
} }
msg_Dbg( p_access, "this frame size=%"PRIu64, p_sys->i_remaining ); msg_Dbg( p_access, "this frame size=%"PRIu64, p_sys->i_remaining );
} }
else if( !strcasecmp( psz, "Content-Range" ) ) { else if( !strcasecmp( psz, "Content-Range" ) ) {
uint64_t i_ntell = i_tell; uint64_t i_ntell = i_tell;
uint64_t i_nend = (p_access->info.i_size > 0)?(p_access->info.i_size - 1):i_tell; uint64_t i_nend = (p_sys->size > 0) ? (p_sys->size - 1) : i_tell;
uint64_t i_nsize = p_access->info.i_size; uint64_t i_nsize = p_sys->size;
sscanf(p,"bytes %"SCNu64"-%"SCNu64"/%"SCNu64,&i_ntell,&i_nend,&i_nsize); sscanf(p,"bytes %"SCNu64"-%"SCNu64"/%"SCNu64,&i_ntell,&i_nend,&i_nsize);
if(i_nend > i_ntell ) { if(i_nend > i_ntell ) {
p_access->info.i_pos = i_ntell; p_access->info.i_pos = i_ntell;
p_sys->i_icy_offset = i_ntell; p_sys->i_icy_offset = i_ntell;
p_sys->i_remaining = i_nend+1-i_ntell; p_sys->i_remaining = i_nend+1-i_ntell;
uint64_t i_size = (i_nsize > i_nend) ? i_nsize : (i_nend + 1); uint64_t i_size = (i_nsize > i_nend) ? i_nsize : (i_nend + 1);
if(i_size > p_access->info.i_size) { if(i_size > p_sys->size) {
p_sys->b_has_size = true; p_sys->b_has_size = true;
p_access->info.i_size = i_size; p_sys->size = i_size;
} }
msg_Dbg( p_access, "stream size=%"PRIu64",pos=%"PRIu64",remaining=%"PRIu64, msg_Dbg( p_access, "stream size=%"PRIu64",pos=%"PRIu64",remaining=%"PRIu64,
i_nsize, i_ntell, p_sys->i_remaining); i_nsize, i_ntell, p_sys->i_remaining);
......
...@@ -309,7 +309,6 @@ static int OpenAccess(vlc_object_t *object) ...@@ -309,7 +309,6 @@ static int OpenAccess(vlc_object_t *object)
access->pf_block = Block; access->pf_block = Block;
access->pf_seek = NULL; access->pf_seek = NULL;
access->p_sys = (access_sys_t*)sys; access->p_sys = (access_sys_t*)sys;
access->info.i_size = var_InheritInteger(object, "imem-size");
return VLC_SUCCESS; return VLC_SUCCESS;
} }
...@@ -344,6 +343,11 @@ static int ControlAccess(access_t *access, int i_query, va_list args) ...@@ -344,6 +343,11 @@ static int ControlAccess(access_t *access, int i_query, va_list args)
*b = true; *b = true;
return VLC_SUCCESS; return VLC_SUCCESS;
} }
case ACCESS_GET_SIZE: {
uint64_t *s = va_arg(args, uint64_t *);
*s = var_InheritInteger(access, "imem-size");
return VLC_SUCCESS;
}
case ACCESS_GET_PTS_DELAY: { case ACCESS_GET_PTS_DELAY: {
int64_t *delay = va_arg(args, int64_t *); int64_t *delay = va_arg(args, int64_t *);
*delay = DEFAULT_PTS_DELAY; /* FIXME? */ *delay = DEFAULT_PTS_DELAY; /* FIXME? */
......
...@@ -185,11 +185,6 @@ int MMSHOpen( access_t *p_access ) ...@@ -185,11 +185,6 @@ int MMSHOpen( access_t *p_access )
goto error; goto error;
} }
if( !p_sys->b_broadcast )
{
p_access->info.i_size = p_sys->asfh.i_file_size;
}
return VLC_SUCCESS; return VLC_SUCCESS;
error: error:
...@@ -245,6 +240,13 @@ static int Control( access_t *p_access, int i_query, va_list args ) ...@@ -245,6 +240,13 @@ static int Control( access_t *p_access, int i_query, va_list args )
*pb_bool = true; *pb_bool = true;
break; break;
case ACCESS_GET_SIZE:
{
uint64_t *s = va_arg( args, uint64_t * );
*s = p_sys->b_broadcast ? 0 : p_sys->asfh.i_file_size;
return VLC_SUCCESS;
}
/* */ /* */
case ACCESS_GET_PTS_DELAY: case ACCESS_GET_PTS_DELAY:
pi_64 = (int64_t*)va_arg( args, int64_t * ); pi_64 = (int64_t*)va_arg( args, int64_t * );
......
...@@ -176,7 +176,7 @@ int MMSTUOpen( access_t *p_access ) ...@@ -176,7 +176,7 @@ int MMSTUOpen( access_t *p_access )
else else
{ {
p_sys->b_seekable = true; p_sys->b_seekable = true;
p_access->info.i_size = p_sys->i_size =
(uint64_t)p_sys->i_header + (uint64_t)p_sys->i_header +
(uint64_t)p_sys->i_packet_count * (uint64_t)p_sys->i_packet_length; (uint64_t)p_sys->i_packet_count * (uint64_t)p_sys->i_packet_length;
} }
...@@ -250,6 +250,10 @@ static int Control( access_t *p_access, int i_query, va_list args ) ...@@ -250,6 +250,10 @@ static int Control( access_t *p_access, int i_query, va_list args )
*pb_bool = true; *pb_bool = true;
break; break;
case ACCESS_GET_SIZE:
*va_arg( args, uint64_t * ) = p_sys->i_size;
break;
/* */ /* */
case ACCESS_GET_PTS_DELAY: case ACCESS_GET_PTS_DELAY:
pi_64 = (int64_t*)va_arg( args, int64_t * ); pi_64 = (int64_t*)va_arg( args, int64_t * );
......
...@@ -43,6 +43,7 @@ struct access_sys_t ...@@ -43,6 +43,7 @@ struct access_sys_t
char sz_bind_addr[NI_MAXNUMERICHOST]; /* used by udp */ char sz_bind_addr[NI_MAXNUMERICHOST]; /* used by udp */
vlc_url_t url; vlc_url_t url;
uint64_t i_size;
asf_header_t asfh; asf_header_t asfh;
......
...@@ -153,11 +153,6 @@ static int Open( vlc_object_t *p_this ) ...@@ -153,11 +153,6 @@ static int Open( vlc_object_t *p_this )
} }
p_sys->fd = fd; p_sys->fd = fd;
struct stat st;
if( fstat( fd, &st ) )
msg_Err( p_access, "fstat(%d): %m", fd );
p_access->info.i_size = st.st_size;
return VLC_SUCCESS; return VLC_SUCCESS;
} }
...@@ -229,6 +224,7 @@ static int Seek( access_t *p_access, uint64_t i_pos ) ...@@ -229,6 +224,7 @@ static int Seek( access_t *p_access, uint64_t i_pos )
*****************************************************************************/ *****************************************************************************/
static int Control( access_t *p_access, int i_query, va_list args ) static int Control( access_t *p_access, int i_query, va_list args )
{ {
access_sys_t *sys = p_access->p_sys;
bool *pb_bool; bool *pb_bool;
int64_t *pi_64; int64_t *pi_64;
...@@ -247,6 +243,19 @@ static int Control( access_t *p_access, int i_query, va_list args ) ...@@ -247,6 +243,19 @@ static int Control( access_t *p_access, int i_query, va_list args )
*pb_bool = true; *pb_bool = true;
break; break;
case ACCESS_GET_SIZE:
{
uint64_t *s = va_arg( args, uint64_t * );
struct stat st;
if( fstat( sys->fd, &st ) )
{
msg_Err( p_access, "fstat error: %m" );
return VLC_EGENERIC;
}
*s = st.st_size;
break;
}
case ACCESS_GET_PTS_DELAY: case ACCESS_GET_PTS_DELAY:
pi_64 = ( int64_t* )va_arg( args, int64_t * ); pi_64 = ( int64_t* )va_arg( args, int64_t * );
*pi_64 = INT64_C(1000) *pi_64 = INT64_C(1000)
......
...@@ -123,7 +123,8 @@ static ssize_t Read(access_t *access, uint8_t *data, size_t size) ...@@ -123,7 +123,8 @@ static ssize_t Read(access_t *access, uint8_t *data, size_t size)
static int Control(access_t *access, int query, va_list args) static int Control(access_t *access, int query, va_list args)
{ {
stream_t *s = access->p_sys->s; access_sys_t *sys = access->p_sys;
stream_t *s = sys->s;
if (!s) if (!s)
return VLC_EGENERIC; return VLC_EGENERIC;
...@@ -143,6 +144,9 @@ static int Control(access_t *access, int query, va_list args) ...@@ -143,6 +144,9 @@ static int Control(access_t *access, int query, va_list args)
*b = true; *b = true;
return VLC_SUCCESS; return VLC_SUCCESS;
} }
case ACCESS_GET_SIZE:
*va_arg(args, uint64_t *) = sys->file->size;
return VLC_SUCCESS;
case ACCESS_GET_PTS_DELAY: { case ACCESS_GET_PTS_DELAY: {
int64_t *delay = va_arg(args, int64_t *); int64_t *delay = va_arg(args, int64_t *);
*delay = DEFAULT_PTS_DELAY; *delay = DEFAULT_PTS_DELAY;
...@@ -198,7 +202,6 @@ static int Open(vlc_object_t *object) ...@@ -198,7 +202,6 @@ static int Open(vlc_object_t *object)
access->pf_seek = Seek; access->pf_seek = Seek;
access_InitFields(access); access_InitFields(access);
access->info.i_size = file->size;
rar_file_chunk_t dummy = { rar_file_chunk_t dummy = {
.mrl = base, .mrl = base,
......
...@@ -160,7 +160,6 @@ static int Open( vlc_object_t *p_this ) ...@@ -160,7 +160,6 @@ static int Open( vlc_object_t *p_this )
p_access->pf_seek = Seek; p_access->pf_seek = Seek;
p_access->pf_control = Control; p_access->pf_control = Control;
p_access->info.i_update = 0; p_access->info.i_update = 0;
p_access->info.i_size = 0;
p_access->info.i_pos = 0; p_access->info.i_pos = 0;
p_access->info.b_eof = false; p_access->info.b_eof = false;
p_access->info.i_title = 0; p_access->info.i_title = 0;
......
...@@ -80,6 +80,7 @@ struct access_sys_t ...@@ -80,6 +80,7 @@ struct access_sys_t
LIBSSH2_SESSION* ssh_session; LIBSSH2_SESSION* ssh_session;
LIBSSH2_SFTP* sftp_session; LIBSSH2_SFTP* sftp_session;
LIBSSH2_SFTP_HANDLE* file; LIBSSH2_SFTP_HANDLE* file;
uint64_t filesize;
size_t i_read_size; size_t i_read_size;
}; };
...@@ -233,7 +234,7 @@ static int Open( vlc_object_t* p_this ) ...@@ -233,7 +234,7 @@ static int Open( vlc_object_t* p_this )
msg_Err( p_access, "Impossible to get information about the remote file %s", url.psz_path ); msg_Err( p_access, "Impossible to get information about the remote file %s", url.psz_path );
goto error; goto error;
} }
p_access->info.i_size = attributes.filesize; p_sys->filesize = attributes.filesize;
p_sys->i_read_size = var_InheritInteger( p_access, "sftp-readsize" ); p_sys->i_read_size = var_InheritInteger( p_access, "sftp-readsize" );
...@@ -269,12 +270,14 @@ static void Close( vlc_object_t* p_this ) ...@@ -269,12 +270,14 @@ static void Close( vlc_object_t* p_this )
static block_t* Block( access_t* p_access ) static block_t* Block( access_t* p_access )
{ {
access_sys_t *p_sys = p_access->p_sys;
if( p_access->info.b_eof ) if( p_access->info.b_eof )
return NULL; return NULL;
/* Allocate the buffer we need */ /* Allocate the buffer we need */
size_t i_len = __MIN( p_access->p_sys->i_read_size, p_access->info.i_size - size_t i_len = __MIN( p_sys->i_read_size,
p_access->info.i_pos ); p_sys->filesize - p_access->info.i_pos );
block_t* p_block = block_Alloc( i_len ); block_t* p_block = block_Alloc( i_len );
if( !p_block ) if( !p_block )
return NULL; return NULL;
...@@ -335,6 +338,10 @@ static int Control( access_t* p_access, int i_query, va_list args ) ...@@ -335,6 +338,10 @@ static int Control( access_t* p_access, int i_query, va_list args )
*pb_bool = true; *pb_bool = true;
break; break;
case ACCESS_GET_SIZE:
*va_arg( args, uint64_t * ) = p_access->p_sys->filesize;
break;
case ACCESS_GET_PTS_DELAY: case ACCESS_GET_PTS_DELAY:
pi_64 = (int64_t*)va_arg( args, int64_t* ); pi_64 = (int64_t*)va_arg( args, int64_t* );
*pi_64 = INT64_C(1000) *pi_64 = INT64_C(1000)
......
...@@ -91,6 +91,7 @@ static int Control( access_t *, int, va_list ); ...@@ -91,6 +91,7 @@ static int Control( access_t *, int, va_list );
struct access_sys_t struct access_sys_t
{ {
int i_smb; int i_smb;
uint64_t size;
}; };
#ifdef _WIN32 #ifdef _WIN32
...@@ -234,7 +235,7 @@ static int Open( vlc_object_t *p_this ) ...@@ -234,7 +235,7 @@ static int Open( vlc_object_t *p_this )
msg_Err( p_access, "stat failed (%m)" ); msg_Err( p_access, "stat failed (%m)" );
} }
else else
p_access->info.i_size = filestat.st_size; p_sys->size = filestat.st_size;
free( psz_uri ); free( psz_uri );
...@@ -318,6 +319,10 @@ static int Control( access_t *p_access, int i_query, va_list args ) ...@@ -318,6 +319,10 @@ static int Control( access_t *p_access, int i_query, va_list args )
*va_arg( args, bool* ) = true; *va_arg( args, bool* ) = true;
break; break;
case ACCESS_GET_SIZE:
*va_arg( args, uint64_t * ) = p_access->p_sys->size;
break;
case ACCESS_GET_PTS_DELAY: case ACCESS_GET_PTS_DELAY:
*va_arg( args, int64_t * ) = INT64_C(1000) *va_arg( args, int64_t * ) = INT64_C(1000)
* var_InheritInteger( p_access, "network-caching" ); * var_InheritInteger( p_access, "network-caching" );
......
...@@ -199,7 +199,6 @@ static int Open( vlc_object_t *p_this ) ...@@ -199,7 +199,6 @@ static int Open( vlc_object_t *p_this )
p_access->info.i_title = i_title; p_access->info.i_title = i_title;
p_access->info.i_seekpoint = i_chapter; p_access->info.i_seekpoint = i_chapter;
p_access->info.i_size = p_sys->title[i_title]->i_size;
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;
...@@ -245,6 +244,11 @@ static int Control( access_t *p_access, int i_query, va_list args ) ...@@ -245,6 +244,11 @@ static int Control( access_t *p_access, int i_query, va_list args )
*va_arg( args, bool* ) = true; *va_arg( args, bool* ) = true;
break; break;
case ACCESS_GET_SIZE:
*va_arg( args, uint64_t * ) =
p_sys->title[p_access->info.i_title]->i_size;
break;
/* */ /* */
case ACCESS_GET_PTS_DELAY: case ACCESS_GET_PTS_DELAY:
*va_arg( args, int64_t * ) = INT64_C(1000) *va_arg( args, int64_t * ) = INT64_C(1000)
...@@ -276,7 +280,6 @@ static int Control( access_t *p_access, int i_query, va_list args ) ...@@ -276,7 +280,6 @@ static int Control( access_t *p_access, int i_query, va_list args )
INPUT_UPDATE_TITLE|INPUT_UPDATE_SEEKPOINT; INPUT_UPDATE_TITLE|INPUT_UPDATE_SEEKPOINT;
p_access->info.i_title = i; p_access->info.i_title = i;
p_access->info.i_seekpoint = 0; p_access->info.i_seekpoint = 0;
p_access->info.i_size = p_sys->title[i]->i_size;
p_access->info.i_pos = 0; p_access->info.i_pos = 0;
/* Next sector to read */ /* Next sector to read */
...@@ -339,7 +342,6 @@ static block_t *Block( access_t *p_access ) ...@@ -339,7 +342,6 @@ static block_t *Block( access_t *p_access )
INPUT_UPDATE_TITLE | INPUT_UPDATE_SEEKPOINT; INPUT_UPDATE_TITLE | INPUT_UPDATE_SEEKPOINT;
p_access->info.i_title++; p_access->info.i_title++;
p_access->info.i_seekpoint = 0; p_access->info.i_seekpoint = 0;
p_access->info.i_size = p_sys->title[p_access->info.i_title]->i_size;
p_access->info.i_pos = 0; p_access->info.i_pos = 0;
} }
......
...@@ -675,16 +675,16 @@ VCDSetOrigin( access_t *p_access, lsn_t i_lsn, track_t i_track, ...@@ -675,16 +675,16 @@ VCDSetOrigin( access_t *p_access, lsn_t i_lsn, track_t i_track,
p_access->info.i_title = i_track-1; p_access->info.i_title = i_track-1;
if (p_vcdplayer->b_track_length) if (p_vcdplayer->b_track_length)
{ {
p_access->info.i_size = p_vcdplayer->p_title[i_track-1]->i_size; p_access->p_sys->size = p_vcdplayer->p_title[i_track-1]->i_size;
p_access->info.i_pos = (uint64_t) M2F2_SECTOR_SIZE * p_access->info.i_pos = (uint64_t) M2F2_SECTOR_SIZE *
(vcdinfo_get_track_lsn(p_vcdplayer->vcd, i_track)-i_lsn); (vcdinfo_get_track_lsn(p_vcdplayer->vcd, i_track)-i_lsn);
} else { } else {
p_access->info.i_size = M2F2_SECTOR_SIZE * (int64_t) p_access->p_sys->size = M2F2_SECTOR_SIZE * (int64_t)
vcdinfo_get_entry_sect_count(p_vcdplayer->vcd,p_itemid->num); vcdinfo_get_entry_sect_count(p_vcdplayer->vcd,p_itemid->num);
p_access->info.i_pos = 0; p_access->info.i_pos = 0;
} }
dbg_print( (INPUT_DBG_LSN|INPUT_DBG_PBC), "size: %"PRIu64", pos: %"PRIu64, dbg_print( (INPUT_DBG_LSN|INPUT_DBG_PBC), "size: %"PRIu64", pos: %"PRIu64,
p_access->info.i_size, p_access->info.i_pos ); p_access->p_sys->size, p_access->info.i_pos );
p_access->info.i_seekpoint = p_itemid->num; p_access->info.i_seekpoint = p_itemid->num;
break; break;
...@@ -696,7 +696,7 @@ VCDSetOrigin( access_t *p_access, lsn_t i_lsn, track_t i_track, ...@@ -696,7 +696,7 @@ VCDSetOrigin( access_t *p_access, lsn_t i_lsn, track_t i_track,
the entry seekpoints and (zeroed) lid seekpoints. the entry seekpoints and (zeroed) lid seekpoints.
*/ */
p_access->info.i_title = p_vcdplayer->i_titles - 1; p_access->info.i_title = p_vcdplayer->i_titles - 1;
p_access->info.i_size = 0; /* No seeking on stills, please. */ p_access->p_sys->size = 0; /* No seeking on stills, please. */
p_access->info.i_pos = 0; p_access->info.i_pos = 0;
p_access->info.i_seekpoint = p_vcdplayer->i_entries p_access->info.i_seekpoint = p_vcdplayer->i_entries
+ p_vcdplayer->i_lids + p_itemid->num; + p_vcdplayer->i_lids + p_itemid->num;
...@@ -704,7 +704,7 @@ VCDSetOrigin( access_t *p_access, lsn_t i_lsn, track_t i_track, ...@@ -704,7 +704,7 @@ VCDSetOrigin( access_t *p_access, lsn_t i_lsn, track_t i_track,
case VCDINFO_ITEM_TYPE_TRACK: case VCDINFO_ITEM_TYPE_TRACK:
p_access->info.i_title = i_track-1; p_access->info.i_title = i_track-1;
p_access->info.i_size = p_vcdplayer->p_title[i_track-1]->i_size; p_access->p_sys->size = p_vcdplayer->p_title[i_track-1]->i_size;
p_access->info.i_pos = 0; p_access->info.i_pos = 0;
p_access->info.i_seekpoint = vcdinfo_track_get_entry(p_vcdplayer->vcd, p_access->info.i_seekpoint = vcdinfo_track_get_entry(p_vcdplayer->vcd,
i_track); i_track);
...@@ -853,7 +853,6 @@ VCDOpen ( vlc_object_t *p_this ) ...@@ -853,7 +853,6 @@ VCDOpen ( vlc_object_t *p_this )
p_access->pf_seek = VCDSeek; p_access->pf_seek = VCDSeek;
p_access->info.i_update = 0; p_access->info.i_update = 0;
p_access->info.i_size = 0;
p_access->info.i_pos = 0; p_access->info.i_pos = 0;
p_access->info.b_eof = false; p_access->info.b_eof = false;
p_access->info.i_title = 0; p_access->info.i_title = 0;
...@@ -866,6 +865,7 @@ VCDOpen ( vlc_object_t *p_this ) ...@@ -866,6 +865,7 @@ VCDOpen ( vlc_object_t *p_this )
p_vcdplayer->i_debug = var_InheritInteger( 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; p_access->p_sys = (access_sys_t *) p_vcdplayer;
p_access->p_sys->size = 0;
/* Set where to log errors messages from libcdio. */ /* Set where to log errors messages from libcdio. */
p_vcd_access = p_access; p_vcd_access = p_access;
......
...@@ -160,6 +160,7 @@ typedef struct vcdplayer_input_s ...@@ -160,6 +160,7 @@ typedef struct vcdplayer_input_s
bool b_track_length; /* Use track as max unit in seek */ bool b_track_length; /* Use track as max unit in seek */
input_thread_t *p_input; input_thread_t *p_input;
access_t *p_access; access_t *p_access;
uint64_t size;
} vcdplayer_t; } vcdplayer_t;
......
...@@ -114,6 +114,7 @@ struct access_sys_t ...@@ -114,6 +114,7 @@ struct access_sys_t
{ {
/* file sizes of all parts */ /* file sizes of all parts */
size_array_t file_sizes; size_array_t file_sizes;
uint64_t size; /* total size */
/* index and fd of current open file */ /* index and fd of current open file */
unsigned i_current_file; unsigned i_current_file;
...@@ -379,7 +380,7 @@ static int Seek( access_t *p_access, uint64_t i_pos ) ...@@ -379,7 +380,7 @@ 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;
/* might happen if called by ACCESS_SET_SEEKPOINT */ /* might happen if called by ACCESS_SET_SEEKPOINT */
i_pos = __MIN( i_pos, p_access->info.i_size ); i_pos = __MIN( i_pos, p_sys->size );
p_access->info.i_pos = i_pos; p_access->info.i_pos = i_pos;
p_access->info.b_eof = false; p_access->info.b_eof = false;
...@@ -478,7 +479,7 @@ static bool ImportNextFile( access_t *p_access ) ...@@ -478,7 +479,7 @@ static bool ImportNextFile( access_t *p_access )
free( psz_path ); free( psz_path );
ARRAY_APPEND( p_sys->file_sizes, st.st_size ); ARRAY_APPEND( p_sys->file_sizes, st.st_size );
p_access->info.i_size += st.st_size; p_sys->size += st.st_size;
return true; return true;
} }
...@@ -571,7 +572,7 @@ static void UpdateFileSize( access_t *p_access ) ...@@ -571,7 +572,7 @@ static void UpdateFileSize( access_t *p_access )
access_sys_t *p_sys = p_access->p_sys; access_sys_t *p_sys = p_access->p_sys;
struct stat st; struct stat st;
if( p_access->info.i_size >= p_access->info.i_pos ) if( p_sys->size >= p_access->info.i_pos )
return; return;
/* TODO: not sure if this can happen or what to do in this case */ /* TODO: not sure if this can happen or what to do in this case */
...@@ -580,9 +581,9 @@ static void UpdateFileSize( access_t *p_access ) ...@@ -580,9 +581,9 @@ static void UpdateFileSize( access_t *p_access )
if( (uint64_t)st.st_size <= CURRENT_FILE_SIZE ) if( (uint64_t)st.st_size <= CURRENT_FILE_SIZE )
return; return;
p_access->info.i_size -= CURRENT_FILE_SIZE; p_sys->size -= CURRENT_FILE_SIZE;
CURRENT_FILE_SIZE = st.st_size; CURRENT_FILE_SIZE = st.st_size;
p_access->info.i_size += CURRENT_FILE_SIZE; p_sys->size += CURRENT_FILE_SIZE;
} }
/***************************************************************************** /*****************************************************************************
...@@ -808,7 +809,7 @@ static void ImportMarks( access_t *p_access ) ...@@ -808,7 +809,7 @@ static void ImportMarks( access_t *p_access )
} }
p_marks->psz_name = strdup( _("VDR Cut Marks") ); p_marks->psz_name = strdup( _("VDR Cut Marks") );
p_marks->i_length = i_frame_count * (int64_t)( CLOCK_FREQ / p_sys->fps ); p_marks->i_length = i_frame_count * (int64_t)( CLOCK_FREQ / p_sys->fps );
p_marks->i_size = p_access->info.i_size; p_marks->i_size = p_sys->size;
/* offset for chapter positions */ /* offset for chapter positions */
int i_chapter_offset = p_sys->fps / 1000 * int i_chapter_offset = p_sys->fps / 1000 *
......
...@@ -101,7 +101,6 @@ int AccessOpen( vlc_object_t *p_this ) ...@@ -101,7 +101,6 @@ int AccessOpen( vlc_object_t *p_this )
access_t *p_access = (access_t*)p_this; access_t *p_access = (access_t*)p_this;
access_sys_t *p_sys; access_sys_t *p_sys;
int i_ret = VLC_EGENERIC; int i_ret = VLC_EGENERIC;
unzFile file = 0;
char *psz_pathToZip = NULL, *psz_path = NULL, *psz_sep = NULL; char *psz_pathToZip = NULL, *psz_path = NULL, *psz_sep = NULL;
...@@ -163,8 +162,8 @@ int AccessOpen( vlc_object_t *p_this ) ...@@ -163,8 +162,8 @@ int AccessOpen( vlc_object_t *p_this )
p_func->opaque = p_access; p_func->opaque = p_access;
/* Open zip archive */ /* Open zip archive */
file = p_access->p_sys->zipFile = unzOpen2( psz_pathToZip, p_func ); p_access->p_sys->zipFile = unzOpen2( psz_pathToZip, p_func );
if( !file ) if( !p_access->p_sys->zipFile )
{ {
msg_Err( p_access, "not a valid zip archive: '%s'", psz_pathToZip ); msg_Err( p_access, "not a valid zip archive: '%s'", psz_pathToZip );
i_ret = VLC_EGENERIC; i_ret = VLC_EGENERIC;
...@@ -178,12 +177,6 @@ int AccessOpen( vlc_object_t *p_this ) ...@@ -178,12 +177,6 @@ int AccessOpen( vlc_object_t *p_this )
/* Set callback */ /* Set callback */
ACCESS_SET_CALLBACKS( AccessRead, NULL, AccessControl, AccessSeek ); ACCESS_SET_CALLBACKS( AccessRead, NULL, AccessControl, AccessSeek );
/* Get some infos about current file. Maybe we could want some more ? */
unz_file_info z_info;
unzGetCurrentFileInfo( file, &z_info, NULL, 0, NULL, 0, NULL, 0 );
/* Set access information: size is needed for AccessSeek */
p_access->info.i_size = z_info.uncompressed_size;
p_access->info.i_pos = 0; p_access->info.i_pos = 0;
p_access->info.b_eof = false; p_access->info.b_eof = false;
...@@ -192,10 +185,10 @@ int AccessOpen( vlc_object_t *p_this ) ...@@ -192,10 +185,10 @@ int AccessOpen( vlc_object_t *p_this )
exit: exit:
if( i_ret != VLC_SUCCESS ) if( i_ret != VLC_SUCCESS )
{ {
if( file ) if( p_access->p_sys->zipFile )
{ {
unzCloseCurrentFile( file ); unzCloseCurrentFile( p_access->p_sys->zipFile );
unzClose( file ); unzClose( p_access->p_sys->zipFile );
} }
free( p_sys->psz_fileInzip ); free( p_sys->psz_fileInzip );
free( p_sys->fileFunctions ); free( p_sys->fileFunctions );
...@@ -251,6 +244,16 @@ static int AccessControl( access_t *p_access, int i_query, va_list args ) ...@@ -251,6 +244,16 @@ static int AccessControl( access_t *p_access, int i_query, va_list args )
*pb_bool = false; *pb_bool = false;
break; break;
case ACCESS_GET_SIZE:
{
unz_file_info z_info;
unzGetCurrentFileInfo( p_access->p_sys->zipFile, &z_info,
NULL, 0, NULL, 0, NULL, 0 );
*va_arg( args, uint64_t * ) = z_info.uncompressed_size;
break;
}
case ACCESS_GET_PTS_DELAY: case ACCESS_GET_PTS_DELAY:
pi_64 = (int64_t*)va_arg( args, int64_t * ); pi_64 = (int64_t*)va_arg( args, int64_t * );
*pi_64 = DEFAULT_PTS_DELAY; *pi_64 = DEFAULT_PTS_DELAY;
......
...@@ -318,7 +318,7 @@ stream_t *stream_AccessNew( access_t *p_access, char **ppsz_list ) ...@@ -318,7 +318,7 @@ stream_t *stream_AccessNew( access_t *p_access, char **ppsz_list )
if( !p_entry ) if( !p_entry )
goto error; goto error;
p_entry->i_size = p_access->info.i_size; p_entry->i_size = access_GetSize( p_access );
p_entry->psz_path = strdup( p_access->psz_location ); p_entry->psz_path = strdup( p_access->psz_location );
if( !p_entry->psz_path ) if( !p_entry->psz_path )
{ {
...@@ -328,7 +328,7 @@ stream_t *stream_AccessNew( access_t *p_access, char **ppsz_list ) ...@@ -328,7 +328,7 @@ stream_t *stream_AccessNew( access_t *p_access, char **ppsz_list )
p_sys->p_list_access = p_access; p_sys->p_list_access = p_access;
TAB_APPEND( p_sys->i_list, p_sys->list, p_entry ); TAB_APPEND( p_sys->i_list, p_sys->list, p_entry );
msg_Dbg( p_access, "adding file `%s', (%"PRId64" bytes)", msg_Dbg( p_access, "adding file `%s', (%"PRId64" bytes)",
p_entry->psz_path, p_access->info.i_size ); p_entry->psz_path, p_entry->i_size );
for( int i = 0; ppsz_list[i] != NULL; i++ ) for( int i = 0; ppsz_list[i] != NULL; i++ )
{ {
...@@ -342,15 +342,14 @@ stream_t *stream_AccessNew( access_t *p_access, char **ppsz_list ) ...@@ -342,15 +342,14 @@ stream_t *stream_AccessNew( access_t *p_access, char **ppsz_list )
if( !p_tmp ) if( !p_tmp )
continue; continue;
msg_Dbg( p_access, "adding file `%s', (%"PRId64" bytes)",
psz_name, p_tmp->info.i_size );
p_entry = malloc( sizeof(*p_entry) ); p_entry = malloc( sizeof(*p_entry) );
if( p_entry ) if( p_entry )
{ {
p_entry->i_size = p_tmp->info.i_size; p_entry->i_size = access_GetSize( p_tmp );
p_entry->psz_path = psz_name; p_entry->psz_path = psz_name;
TAB_APPEND( p_sys->i_list, p_sys->list, p_entry ); TAB_APPEND( p_sys->i_list, p_sys->list, p_entry );
msg_Dbg( p_access, "adding file `%s', (%"PRId64" bytes)",
p_entry->psz_path, p_entry->i_size );
} }
access_Delete( p_tmp ); access_Delete( p_tmp );
} }
...@@ -562,7 +561,7 @@ static int AStreamControl( stream_t *s, int i_query, va_list args ) ...@@ -562,7 +561,7 @@ static int AStreamControl( stream_t *s, int i_query, va_list args )
*pi_64 += s->p_sys->list[i]->i_size; *pi_64 += s->p_sys->list[i]->i_size;
break; break;
} }
*pi_64 = p_access->info.i_size; *pi_64 = access_GetSize( p_access );
break; break;
case STREAM_CAN_SEEK: case STREAM_CAN_SEEK:
......
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