[vlc-devel] [PATCH 03/12] access: extend STREAM_IS_DIRECTORY
Thomas Guillem
thomas at gllm.fr
Tue May 19 10:27:43 CEST 2015
It now takes two new bool* arguments.
- specify if the access returns items that are already sorted.
- specify if directories can loop into themselves
---
include/vlc_access.h | 7 +++++++
include/vlc_stream.h | 2 +-
modules/access/archive/stream.c | 2 ++
modules/demux/playlist/directory.c | 3 ++-
modules/demux/playlist/playlist.h | 2 +-
src/input/demux.c | 6 +++++-
src/input/stream.c | 6 ++++++
7 files changed, 24 insertions(+), 4 deletions(-)
diff --git a/include/vlc_access.h b/include/vlc_access.h
index a23d3b1..a6a84cf 100644
--- a/include/vlc_access.h
+++ b/include/vlc_access.h
@@ -111,6 +111,13 @@ struct access_t
{
uint64_t i_pos; /* idem */
bool b_eof; /* idem */
+
+ bool b_dir_sorted; /* Set it to true if items returned by
+ * pf_readdir are already sorted. */
+
+ bool b_dir_can_loop; /* Set it to true if the access can't know
+ * if children can loop into their parents.
+ * It's the case for most network accesses. */
} info;
access_sys_t *p_sys;
diff --git a/include/vlc_stream.h b/include/vlc_stream.h
index a9e8586..dda58ce 100644
--- a/include/vlc_stream.h
+++ b/include/vlc_stream.h
@@ -93,7 +93,7 @@ enum stream_query_e
STREAM_CAN_FASTSEEK, /**< arg1= bool * res=cannot fail*/
STREAM_CAN_PAUSE, /**< arg1= bool * res=cannot fail*/
STREAM_CAN_CONTROL_PACE, /**< arg1= bool * res=cannot fail*/
- STREAM_IS_DIRECTORY, /**< arg1= bool * res=cannot fail*/
+ STREAM_IS_DIRECTORY, /**< arg1= bool *, arg2= bool *, arg3=bool *, res=cannot fail*/
/* */
STREAM_SET_POSITION, /**< arg1= uint64_t res=can fail */
diff --git a/modules/access/archive/stream.c b/modules/access/archive/stream.c
index a74bf53..dcd21ea 100644
--- a/modules/access/archive/stream.c
+++ b/modules/access/archive/stream.c
@@ -48,6 +48,8 @@ static int Control(stream_t *p_stream, int i_query, va_list args)
{
case STREAM_IS_DIRECTORY:
*va_arg( args, bool* ) = true;
+ *va_arg( args, bool* ) = false;
+ *va_arg( args, bool* ) = false;
break;
case STREAM_CAN_SEEK:
diff --git a/modules/demux/playlist/directory.c b/modules/demux/playlist/directory.c
index f614307..30b2bfa 100644
--- a/modules/demux/playlist/directory.c
+++ b/modules/demux/playlist/directory.c
@@ -44,7 +44,8 @@ int Import_Dir ( vlc_object_t *p_this)
demux_t *p_demux = (demux_t *)p_this;
bool b_is_dir = false;
- int i_err = stream_Control( p_demux->s, STREAM_IS_DIRECTORY, &b_is_dir );
+ int i_err = stream_Control( p_demux->s, STREAM_IS_DIRECTORY, &b_is_dir,
+ NULL, NULL );
if ( !( i_err == VLC_SUCCESS && b_is_dir ) )
return VLC_EGENERIC;
diff --git a/modules/demux/playlist/playlist.h b/modules/demux/playlist/playlist.h
index ea6ef4b..eb3a583 100644
--- a/modules/demux/playlist/playlist.h
+++ b/modules/demux/playlist/playlist.h
@@ -84,7 +84,7 @@ bool CheckContentType( stream_t * p_stream, const char * psz_ctype );
#define CHECK_FILE() do { \
bool b_is_dir = false; \
- stream_Control( ((demux_t *)p_this)->s, STREAM_IS_DIRECTORY, &b_is_dir ); \
+ stream_Control( ((demux_t *)p_this)->s, STREAM_IS_DIRECTORY, &b_is_dir, NULL, NULL ); \
if( b_is_dir ) \
return VLC_EGENERIC; \
} while(0)
diff --git a/src/input/demux.c b/src/input/demux.c
index dcc6b16..ff5c1ba 100644
--- a/src/input/demux.c
+++ b/src/input/demux.c
@@ -309,7 +309,11 @@ int demux_vaControlHelper( stream_t *s,
return stream_vaControl( s, STREAM_GET_META, args );
case DEMUX_IS_PLAYLIST:
- return stream_vaControl(s, STREAM_IS_DIRECTORY, args );
+ {
+ bool *pb_isplaylist = va_arg( args, bool * );
+ return stream_Control( s, STREAM_IS_DIRECTORY, pb_isplaylist,
+ NULL, NULL );
+ }
case DEMUX_GET_PTS_DELAY:
case DEMUX_GET_FPS:
diff --git a/src/input/stream.c b/src/input/stream.c
index e220742..b74a05c 100644
--- a/src/input/stream.c
+++ b/src/input/stream.c
@@ -644,7 +644,13 @@ static int AStreamControl( stream_t *s, int i_query, va_list args )
case STREAM_IS_DIRECTORY:
{
bool *pb_canreaddir = va_arg( args, bool * );
+ bool *pb_dirsorted = va_arg( args, bool * );
+ bool *pb_dircanloop = va_arg( args, bool * );
*pb_canreaddir = p_sys->method == STREAM_METHOD_READDIR;
+ if( pb_dirsorted )
+ *pb_dirsorted = p_access->info.b_dir_sorted;
+ if( pb_dircanloop )
+ *pb_dircanloop = p_access->info.b_dir_can_loop;
return VLC_SUCCESS;
}
--
2.1.4
More information about the vlc-devel
mailing list