[vlc-devel] [PATCH 2/7] demux: allow demuxer to expose pf_readdir

Thomas Guillem thomas at gllm.fr
Mon Sep 28 10:16:37 CEST 2020



On Mon, Sep 28, 2020, at 10:15, Thomas Guillem wrote:
> 
> 
> On Sun, Sep 27, 2020, at 12:36, RĂ©mi Denis-Courmont wrote:
> > This makes the demux_Demux() function handle a demuxer plugin that
> > exposes a pf_readdir function, and invoke it if the demuxer does not
> > provide a pf_demux function.
> > ---
> >  src/input/demux.c | 18 ++++++++++++++++++
> >  src/input/input.c |  6 ++++--
> >  2 files changed, 22 insertions(+), 2 deletions(-)
> > 
> > diff --git a/src/input/demux.c b/src/input/demux.c
> > index 849fde2a3a..5946013755 100644
> > --- a/src/input/demux.c
> > +++ b/src/input/demux.c
> > @@ -149,6 +149,7 @@ demux_t *demux_NewAdvanced( vlc_object_t *p_obj, 
> > input_thread_t *p_input,
> >      p_demux->out            = out;
> >      p_demux->b_preparsing   = b_preparsing;
> >  
> > +    p_demux->pf_readdir = NULL;
> >      p_demux->pf_demux   = NULL;
> >      p_demux->pf_control = NULL;
> >      p_demux->p_sys      = NULL;
> > @@ -202,6 +203,23 @@ int demux_Demux(demux_t *demux)
> >  {
> >      if (demux->pf_demux != NULL)
> >          return demux->pf_demux(demux);
> > +
> > +    if (demux->pf_readdir != NULL && demux->p_input_item != NULL) {
> > +        input_item_node_t *node = input_item_node_Create(demux->p_input_item);
> 
> So, a demuxer could implement both pf_demux and pf_readdir ? This seems 
> weird to me.

Forget it, I missed the *return* demux->pf_demux(demux);

> 
> > +
> > +        if (unlikely(node == NULL))
> > +            return VLC_DEMUXER_EGENERIC;
> > +
> > +        if (vlc_stream_ReadDir(demux, node)) {
> > +             input_item_node_Delete(node);
> > +             return VLC_DEMUXER_EGENERIC;
> > +        }
> > +
> > +        if (es_out_Control(demux->out, ES_OUT_POST_SUBNODE, node))
> > +            input_item_node_Delete(node);
> > +        return VLC_DEMUXER_EOF;
> > +    }
> > +
> >      return VLC_DEMUXER_SUCCESS;
> >  }
> >  
> > diff --git a/src/input/input.c b/src/input/input.c
> > index 73b52530aa..d28507bd97 100644
> > --- a/src/input/input.c
> > +++ b/src/input/input.c
> > @@ -500,7 +500,7 @@ static void *Preparse( void *data )
> >          if ( input_item_ShouldPreparseSubItems( priv->p_item )
> >            && demux_Control( priv->master->p_demux, DEMUX_IS_PLAYLIST,
> >                              &b_is_playlist ) )
> > -            b_is_playlist = false;
> > +            b_is_playlist = priv->master->p_demux->pf_readdir != NULL;
> >          if( b_is_playlist )
> >              MainLoop( p_input, false );
> >          End( p_input );
> > @@ -675,7 +675,8 @@ static void MainLoop( input_thread_t *p_input, bool 
> > b_interactive )
> >      bool b_paused_at_eof = false;
> >  
> >      demux_t *p_demux = input_priv(p_input)->master->p_demux;
> > -    const bool b_can_demux = p_demux->pf_demux != NULL;
> > +    const bool b_can_demux = p_demux->pf_demux != NULL
> > +                          || p_demux->pf_readdir != NULL;
> >  
> >      while( !input_Stopped( p_input ) && input_priv(p_input)->i_state 
> > != ERROR_S )
> >      {
> > @@ -2713,6 +2714,7 @@ static int InputSourceInit( input_source_t *in, 
> > input_thread_t *p_input,
> >                         &in->b_can_pace_control ) )
> >          in->b_can_pace_control = false;
> >  
> > +    /* Threaded and directory demuxers do not have pace control */
> >      assert( in->p_demux->pf_demux != NULL || !in->b_can_pace_control );
> >  
> >      if( !in->b_can_pace_control )
> > -- 
> > 2.28.0
> > 
> > _______________________________________________
> > vlc-devel mailing list
> > To unsubscribe or modify your subscription options:
> > https://mailman.videolan.org/listinfo/vlc-devel


More information about the vlc-devel mailing list