[vlc-devel] [PATCH 3/5] input/input: simplify InputDemuxNew

Denis Charmet typx at dinauz.org
Sun Dec 4 12:14:16 CET 2016


On 2016-12-03 16:38, Filip Roséen wrote:
> The functionality remains the same, the implementation should however
> be easier to follow than what we had previously.
> ---
>  src/input/input.c | 129 
> +++++++++++++++++++++++++-----------------------------
>  1 file changed, 59 insertions(+), 70 deletions(-)
> 
> diff --git a/src/input/input.c b/src/input/input.c
> index 3494b69..b5303f1 100644
> --- a/src/input/input.c
> +++ b/src/input/input.c
> @@ -51,6 +51,7 @@
>  #include <vlc_fs.h>
>  #include <vlc_strings.h>
>  #include <vlc_modules.h>
> +#include <vlc_stream.h>
> 
>  
> /*****************************************************************************
>   * Local prototypes
> @@ -2248,82 +2249,74 @@ static void UpdateTitleListfromDemux(
> input_thread_t *p_input )
>      InitTitle( p_input );
>  }
> 
> -static demux_t *InputDemuxNew( vlc_object_t *obj, const char 
> *access_name,
> -                               const char *demux_name, const char 
> *path,
> -                               es_out_t *out, bool preparsing,
> input_thread_t *input )
> +static demux_t *InputDemuxNew( input_thread_t *p_input,
> input_source_t *p_source,
> +                               const char *psz_access, const char 
> *psz_demux,
> +                               const char *psz_path, const char 
> *psz_anchor )
>  {
> -    assert( access_name != NULL );
> -    assert( demux_name != NULL );
> -    assert( path != NULL );
> +    input_thread_private_t *priv = input_priv(p_input );
> +    demux_t *p_demux = NULL;
> 
> -    demux_t *demux = NULL;
> -
> -    if( preparsing )
> +    /* first, try to create an access demux */
> +    p_demux = demux_NewAdvanced( VLC_OBJECT( p_source ), p_input,
> +                                 psz_access, psz_demux, psz_path,
> +                                 NULL, priv->p_es_out, 
> priv->b_preparsing );
> +    if( p_demux )
>      {
> -        if( strcasecmp( demux_name, "any" ) )
> -            goto out;
> +        MRLSections( psz_anchor,
> +            &p_source->i_title_start, &p_source->i_title_end,
> +            &p_source->i_seekpoint_start, &p_source->i_seekpoint_end 
> );
> 
> -        msg_Dbg( obj, "preparsing %s://%s", access_name, path );
> +        return p_demux;
>      }
> -    else /* Try access_demux first */
> -        demux = demux_NewAdvanced( obj, input, access_name, 
> demux_name, path,
> -                                   NULL, out, false );
> 
> -    if( demux == NULL )
> -    {   /* Then try a real access,stream,demux chain */
> -        /* Create the stream_t */
> -        stream_t *stream = NULL;
> -        char *url;
> +    /* not an access-demux: create the underlying access stream */
> +    char *psz_filters = var_InheritString( p_source, "stream-filter" 
> );
> +    char *psz_base_mrl;
> 
> -        if( likely(asprintf( &url, "%s://%s", access_name, path) >= 
> 0) )
> -        {
> -            stream = stream_AccessNew( obj, input, preparsing, url );
> -            free( url );
> -        }
> +    if( asprintf( &psz_base_mrl, "%s://%s", psz_access, psz_path ) < 
> 0 )

free(psz_filters)

> +        return NULL;
> 
> -        if( stream == NULL )
> -        {
> -            msg_Err( obj, "cannot access %s://%s", access_name, path 
> );
> -            goto out;
> -        }
> +    stream_t* p_stream = stream_AccessNew( VLC_OBJECT( p_source ), 
> p_input,
> +                                           priv->b_preparsing,
> +                                           psz_base_mrl );
> +    FREENULL( psz_base_mrl );
> 
> -        /* Add stream filters */
> -        stream = stream_FilterAutoNew( stream );
> +    if( p_stream == NULL )
> +        goto error;
> 
> -        char *filters = var_InheritString( obj, "stream-filter" );
> -        if( filters != NULL )
> -        {
> -            stream = stream_FilterChainNew( stream, filters );
> -            free( filters );
> -        }
> +    p_stream = stream_FilterAutoNew( p_stream );
> 
> -        if( var_InheritBool( obj, "input-record-native" ) )
> -            stream = stream_FilterChainNew( stream, "record" );
> +    /* attach explicit stream filters to stream */
> +    if( psz_filters )
> +        p_stream = stream_FilterChainNew( p_stream, psz_filters );
> 
> -        /* FIXME: Hysterical raisins. Access is not updated according 
> to any
> -         * redirect but path is. This does not make much sense. 
> Probably the
> -         * URL should be passed as a whole and demux_t.psz_access 
> removed. */
> -        if( stream->psz_url != NULL )
> -        {
> -            path = strstr( stream->psz_url, "://" );
> -            if( path == NULL )
> -            {
> -                vlc_stream_Delete( stream );
> -                goto out;
> -            }
> -            path += 3;
> -        }
> +    FREENULL( psz_filters );
> 
> -        demux = demux_NewAdvanced( obj, input, access_name, 
> demux_name, path,
> -                                   stream, out, preparsing );
> -        if( demux == NULL )
> -        {
> -            msg_Err( obj, "cannot parse %s://%s", access_name, path 
> );
> -            vlc_stream_Delete( stream );
> -        }
> -    }
> -out:
> -    return demux;
> +    /* handle anchors */
> +    MRLSections( psz_anchor,
> +        &p_source->i_title_start, &p_source->i_title_end,
> +        &p_source->i_seekpoint_start, &p_source->i_seekpoint_end );
> +
> +    /* attach conditional record stream-filter */
> +    if( var_InheritBool( p_source, "input-record-native" ) )
> +        p_stream = stream_FilterChainNew( p_stream, "record" );
> +
> +    /* create a regular demux with the access stream created */
> +    p_demux = demux_NewAdvanced( VLC_OBJECT( p_source ), p_input,
> +                                 psz_access, psz_demux, psz_path,
> +                                 p_stream, priv->p_es_out,
> +                                 priv->b_preparsing );
> +    if( p_demux )
> +        return p_demux;
> +
> +error:
> +    free( psz_base_mrl );
> +    free( psz_filters );
> +
> +    if( p_stream )
> +        vlc_stream_Delete( p_stream );
> +
> +    return NULL;
>  }
> 
>  
> /*****************************************************************************
> @@ -2367,10 +2360,6 @@ static input_source_t *InputSourceNew(
> input_thread_t *p_input,
>      msg_Dbg( p_input, "`%s' gives access `%s' demux `%s' path `%s'",
>               psz_mrl, psz_access, psz_demux, psz_path );
> 
> -    /* Find optional titles and seekpoints */
> -    MRLSections( psz_anchor, &in->i_title_start, &in->i_title_end,
> -                 &in->i_seekpoint_start, &in->i_seekpoint_end );
> -
>      if( input_priv(p_input)->master == NULL /* XXX ugly */)
>      {   /* On master stream only, use input-list */
>          char *str = var_InheritString( p_input, "input-list" );
> @@ -2424,9 +2413,9 @@ static input_source_t *InputSourceNew(
> input_thread_t *p_input,
>          TAB_CLEAN( count, tab );
>      }
> 
> -    in->p_demux = InputDemuxNew( VLC_OBJECT(in), psz_access, 
> psz_demux,
> -                                 psz_path, 
> input_priv(p_input)->p_es_out,
> -                                 input_priv(p_input)->b_preparsing, 
> p_input );
> +    in->p_demux = InputDemuxNew( p_input, in, psz_access, psz_demux,
> +                                 psz_path, psz_anchor );
> +
>      free( psz_demux_var );
>      free( psz_dup );

Regards,
-- 
Denis Charmet - TypX
Le mauvais esprit est un art de vivre


More information about the vlc-devel mailing list