Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-2-2
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc-2-2
Commits
729e4dcb
Commit
729e4dcb
authored
Dec 17, 2012
by
Rémi Denis-Courmont
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
file: do not stat() non-seekable files and clean up
parent
16c2a7dd
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
69 additions
and
46 deletions
+69
-46
modules/access/file.c
modules/access/file.c
+69
-41
modules/access/fs.h
modules/access/fs.h
+0
-5
No files found.
modules/access/file.c
View file @
729e4dcb
...
...
@@ -130,6 +130,12 @@ static bool IsRemote (const char *path)
# define posix_fadvise(fd, off, len, adv)
#endif
static
ssize_t
FileRead
(
access_t
*
,
uint8_t
*
,
size_t
);
static
int
FileSeek
(
access_t
*
,
uint64_t
);
static
ssize_t
StreamRead
(
access_t
*
,
uint8_t
*
,
size_t
);
static
int
NoSeek
(
access_t
*
,
uint64_t
);
static
int
FileControl
(
access_t
*
,
int
,
va_list
);
/*****************************************************************************
* FileOpen: open the file
*****************************************************************************/
...
...
@@ -213,25 +219,19 @@ int FileOpen( vlc_object_t *p_this )
if
(
unlikely
(
p_sys
==
NULL
))
goto
error
;
access_InitFields
(
p_access
);
p_access
->
pf_read
=
FileRead
;
p_access
->
pf_block
=
NULL
;
p_access
->
pf_control
=
FileControl
;
p_access
->
pf_seek
=
FileSeek
;
p_access
->
p_sys
=
p_sys
;
p_sys
->
i_nb_reads
=
0
;
p_sys
->
fd
=
fd
;
p_sys
->
b_pace_control
=
true
;
if
(
S_ISREG
(
st
.
st_mode
))
p_access
->
info
.
i_size
=
st
.
st_size
;
else
if
(
!
S_ISBLK
(
st
.
st_mode
))
if
(
S_ISREG
(
st
.
st_mode
)
||
S_ISBLK
(
st
.
st_mode
))
{
p_access
->
pf_seek
=
NoSeek
;
p_sys
->
b_pace_control
=
strcasecmp
(
p_access
->
psz_access
,
"stream"
);
}
p_access
->
pf_read
=
FileRead
;
p_access
->
pf_seek
=
FileSeek
;
p_access
->
info
.
i_size
=
st
.
st_size
;
p_sys
->
b_pace_control
=
true
;
if
(
p_access
->
pf_seek
!=
NoSeek
)
{
/* Demuxers will need the beginning of the file for probing. */
posix_fadvise
(
fd
,
0
,
4096
,
POSIX_FADV_WILLNEED
);
/* In most cases, we only read the file once. */
...
...
@@ -247,6 +247,13 @@ int FileOpen( vlc_object_t *p_this )
# endif
#endif
}
else
{
p_access
->
pf_read
=
StreamRead
;
p_access
->
pf_seek
=
NoSeek
;
p_sys
->
b_pace_control
=
strcasecmp
(
p_access
->
psz_access
,
"stream"
);
}
return
VLC_SUCCESS
;
error:
...
...
@@ -276,46 +283,36 @@ void FileClose (vlc_object_t * p_this)
#include <vlc_network.h>
/**
***************************************************************************
* Read
: standard read on a file descriptor
.
*
****************************************************************************
/
s
size_t
FileRead
(
access_t
*
p_access
,
uint8_t
*
p_buffer
,
size_t
i_len
)
/**
* Read
s from a regular file
.
*/
s
tatic
ssize_t
FileRead
(
access_t
*
p_access
,
uint8_t
*
p_buffer
,
size_t
i_len
)
{
access_sys_t
*
p_sys
=
p_access
->
p_sys
;
int
fd
=
p_sys
->
fd
;
ssize_t
i_ret
;
ssize_t
val
=
read
(
fd
,
p_buffer
,
i_len
)
;
#if !defined (WIN32) && !defined (__OS2__)
if
(
p_access
->
pf_seek
==
NoSeek
)
i_ret
=
net_Read
(
p_access
,
fd
,
NULL
,
p_buffer
,
i_len
,
false
);
else
#endif
i_ret
=
read
(
fd
,
p_buffer
,
i_len
);
if
(
i_ret
<
0
)
if
(
val
<
0
)
{
switch
(
errno
)
{
case
EINTR
:
case
EAGAIN
:
break
;
default:
msg_Err
(
p_access
,
"failed to read (%m)"
);
dialog_Fatal
(
p_access
,
_
(
"File reading failed"
),
_
(
"VLC could not read the file (%m)."
));
p_access
->
info
.
b_eof
=
true
;
return
0
;
return
-
1
;
}
msg_Err
(
p_access
,
"read error: %m"
);
dialog_Fatal
(
p_access
,
_
(
"File reading failed"
),
_
(
"VLC could not read the file (%m)."
));
val
=
0
;
}
else
if
(
i_ret
>
0
)
p_access
->
info
.
i_pos
+=
i_ret
;
else
p_access
->
info
.
b_eof
=
true
;
p_access
->
info
.
i_pos
+=
val
;
p_access
->
info
.
b_eof
=
!
val
;
p_sys
->
i_nb_reads
++
;
if
(
(
p_access
->
info
.
i_size
&&
!
(
p_sys
->
i_nb_reads
%
INPUT_FSTAT_NB_READS
)
)
if
(
!
(
p_sys
->
i_nb_reads
%
INPUT_FSTAT_NB_READS
)
||
(
p_access
->
info
.
i_pos
>
p_access
->
info
.
i_size
))
{
struct
stat
st
;
...
...
@@ -327,14 +324,14 @@ ssize_t FileRead( access_t *p_access, uint8_t *p_buffer, size_t i_len )
p_access
->
info
.
i_update
|=
INPUT_UPDATE_SIZE
;
}
}
return
i_ret
;
return
val
;
}
/*****************************************************************************
* Seek: seek to a specific location in a file
*****************************************************************************/
int
FileSeek
(
access_t
*
p_access
,
uint64_t
i_pos
)
static
int
FileSeek
(
access_t
*
p_access
,
uint64_t
i_pos
)
{
p_access
->
info
.
i_pos
=
i_pos
;
p_access
->
info
.
b_eof
=
false
;
...
...
@@ -343,7 +340,38 @@ int FileSeek (access_t *p_access, uint64_t i_pos)
return
VLC_SUCCESS
;
}
int
NoSeek
(
access_t
*
p_access
,
uint64_t
i_pos
)
/**
* Reads from a non-seekable file.
*/
static
ssize_t
StreamRead
(
access_t
*
p_access
,
uint8_t
*
p_buffer
,
size_t
i_len
)
{
access_sys_t
*
p_sys
=
p_access
->
p_sys
;
int
fd
=
p_sys
->
fd
;
#if !defined (WIN32) && !defined (__OS2__)
ssize_t
val
=
net_Read
(
p_access
,
fd
,
NULL
,
p_buffer
,
i_len
,
false
);
#else
ssize_t
val
=
read
(
fd
,
p_buffer
,
i_len
);
#endif
if
(
val
<
0
)
{
switch
(
errno
)
{
case
EINTR
:
case
EAGAIN
:
return
-
1
;
}
msg_Err
(
p_access
,
"read error: %m"
);
val
=
0
;
}
p_access
->
info
.
i_pos
+=
val
;
p_access
->
info
.
b_eof
=
!
val
;
return
val
;
}
static
int
NoSeek
(
access_t
*
p_access
,
uint64_t
i_pos
)
{
/* assert(0); ?? */
(
void
)
p_access
;
(
void
)
i_pos
;
...
...
@@ -353,7 +381,7 @@ int NoSeek (access_t *p_access, uint64_t i_pos)
/*****************************************************************************
* Control:
*****************************************************************************/
int
FileControl
(
access_t
*
p_access
,
int
i_query
,
va_list
args
)
static
int
FileControl
(
access_t
*
p_access
,
int
i_query
,
va_list
args
)
{
access_sys_t
*
p_sys
=
p_access
->
p_sys
;
bool
*
pb_bool
;
...
...
modules/access/fs.h
View file @
729e4dcb
...
...
@@ -22,11 +22,6 @@
int
FileOpen
(
vlc_object_t
*
);
void
FileClose
(
vlc_object_t
*
);
int
NoSeek
(
access_t
*
,
uint64_t
);
ssize_t
FileRead
(
access_t
*
,
uint8_t
*
,
size_t
);
int
FileSeek
(
access_t
*
,
uint64_t
);
int
FileControl
(
access_t
*
,
int
,
va_list
);
int
DirOpen
(
vlc_object_t
*
);
int
DirInit
(
access_t
*
p_access
,
DIR
*
handle
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment