# include "config.h"
#endif
-#include <vlc/vlc.h>
+#include <vlc_common.h>
+#include <vlc_plugin.h>
#include <vlc_input.h>
#include <vlc_access.h>
#include <vlc_interface.h>
"value should be set in milliseconds." )
vlc_module_begin();
- set_description( _("File input") );
- set_shortname( _("File") );
+ set_description( N_("File input") );
+ set_shortname( N_("File") );
set_category( CAT_INPUT );
set_subcategory( SUBCAT_INPUT_ACCESS );
add_integer( "file-caching", DEFAULT_PTS_DELAY / 1000, NULL, CACHING_TEXT, CACHING_LONGTEXT, true );
add_obsolete_string( "file-cat" );
- set_capability( "access2", 50 );
+ set_capability( "access", 50 );
add_shortcut( "file" );
add_shortcut( "stream" );
- add_shortcut( "kfir" );
set_callbacks( Open, Close );
vlc_module_end();
struct access_sys_t
{
unsigned int i_nb_reads;
- bool b_kfir;
int fd;
STANDARD_READ_ACCESS_INIT;
p_sys->i_nb_reads = 0;
- p_sys->b_kfir = false;
int fd = p_sys->fd = -1;
if (!strcasecmp (p_access->psz_access, "stream"))
p_sys->b_seekable = false;
p_sys->b_pace_control = false;
}
- else if (!strcasecmp (p_access->psz_access, "kfir"))
- {
- p_sys->b_seekable = false;
- p_sys->b_pace_control = false;
- p_sys->b_kfir = true;
- }
else
{
p_sys->b_seekable = true;
#ifdef HAVE_SYS_STAT_H
p_access->info.i_size = st.st_size;
- if (!S_ISREG (st.st_mode)
- && !S_ISBLK (st.st_mode)
- && !S_ISCHR (st.st_mode))
+ if (!S_ISREG (st.st_mode))
p_sys->b_seekable = false;
#else
p_sys->b_seekable = !b_stdin;
int fd = p_sys->fd;
#if !defined(WIN32) && !defined(UNDER_CE)
- if( !p_sys->b_pace_control )
+ if( !p_sys->b_seekable )
{
- if( !p_sys->b_kfir )
- {
- /* Find if some data is available. This won't work under Windows. */
- do
- {
- struct pollfd ufd;
-
- if( p_access->b_die )
- return 0;
-
- memset (&ufd, 0, sizeof (ufd));
- ufd.fd = fd;
- ufd.events = POLLIN;
-
- i_ret = poll (&ufd, 1, 500);
- }
- while (i_ret <= 0);
-
- i_ret = read (fd, p_buffer, i_len);
- }
- else
- {
- /* b_kfir ; work around a buggy poll() driver implementation */
- while (((i_ret = read (fd, p_buffer, i_len)) == 0)
- && !p_access->b_die)
- {
- msleep( INPUT_ERROR_SLEEP );
- }
- }
+ /* Note that POSIX regular files (b_seekable) opened for read are
+ * guaranteed to always set POLLIN immediately, so we can spare
+ * poll()ing them. */
+ /* Wait until some data is available. Impossible on Windows. */
+ struct pollfd ufd[2] = {
+ { .fd = fd, .events = POLLIN, },
+ { .fd = vlc_object_waitpipe (p_access), .events = POLLIN, },
+ };
+
+ if (poll (ufd, 2, -1) < 0 || ufd[1].revents)
+ return -1;
}
- else
#endif /* WIN32 || UNDER_CE */
- /* b_pace_control || WIN32 */
- i_ret = read( fd, p_buffer, i_len );
+ i_ret = read (fd, p_buffer, i_len);
if( i_ret < 0 )
{
switch (errno)
intf_UserFatal (p_access, false, _("File reading failed"),
_("VLC could not read the file."));
}
-
- /* Delay a bit to avoid consuming all the CPU. This is particularly
- * useful when reading from an unconnected FIFO. */
- msleep( INPUT_ERROR_SLEEP );
}
+ else if( i_ret > 0 )
+ p_access->info.i_pos += i_ret;
+ else if( i_ret == 0 )
+ p_access->info.b_eof = true;
p_sys->i_nb_reads++;
}
}
#endif
-
- if( i_ret > 0 )
- p_access->info.i_pos += i_ret;
- else if( i_ret == 0 )
- p_access->info.b_eof = true;
-
return i_ret;
}
case ACCESS_GET_PTS_DELAY:
pi_64 = (int64_t*)va_arg( args, int64_t * );
- *pi_64 = var_GetInteger( p_access, "file-caching" ) * I64C(1000);
+ *pi_64 = var_GetInteger( p_access, "file-caching" ) * INT64_C(1000);
break;
/* */