[vlc-devel] Dash Access Plugin status ?

Christopher Mueller christopher.mueller at itec.uni-klu.ac.at
Wed Aug 24 18:00:25 CEST 2011


Thank you for the feedback i will read it during the day.

> diff --git a/modules/stream_filter/Modules.am
> b/modules/stream_filter/Modules.am
> index bdc2e69..dc0e886 100644
> --- a/modules/stream_filter/Modules.am
> +++ b/modules/stream_filter/Modules.am
> @@ -1,3 +1,11 @@
> +LIBTOOL=@LIBTOOL@ --tag=CC
>
> What is this??
>
> +BASE_SUBDIRS = dash
> +EXTRA_SUBDIRS =
> +SUBDIRS = $(BASE_SUBDIRS)
> +DIST_SUBDIRS = $(BASE_SUBDIRS) $(EXTRA_SUBDIRS)
>
> SUBDIRS = dash
>
> should be enough
>
> diff --git a/modules/stream_filter/dash/DASHManager.cpp
> b/modules/stream_filter/dash/DASHManager.cpp
> new file mode 100644
> index 0000000..160182e
> --- /dev/null
> +++ b/modules/stream_filter/dash/DASHManager.cpp
> @@ -0,0 +1,96 @@
> +/*
> + * DASHManager.cpp
> +
> *****************************************************************************
> + * Copyright (C) 2010 - 2011 Klagenfurt University
> + *
> + * Created on: Aug 10, 2010
> + * Authors: Christopher Mueller <christopher.mueller at itec.uni-klu.ac.at>
> + *          Christian Timmerer  <christian.timmerer at itec.uni-klu.ac.at>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU Lesser General Public License as
> published
> + * by the Free Software Foundation; either version 2.1 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA
> 02110-1301, USA.
> +
> *****************************************************************************/
> +
> +#include "DASHManager.h"
>
> You really should have the standard <config.h> boiler plate at the
> beginning of every .c(pp) file.
>
> (...)
> +    if(DEBUG)
> +    {
> +        std::cout << "------------------------------------" << std::endl;
> +        std::cout << "New chunk bitrate: " << bitrate << std::endl;
> +    }
>
> Either you use CPP conditional:
> #ifdef DEBUG
> or you use the VLC infrastructure:
> msg_Dbg(...)
>
> (...)
> diff --git a/modules/stream_filter/dash/dash.cpp
> b/modules/stream_filter/dash/dash.cpp
> new file mode 100644
> index 0000000..34e93c2
> --- /dev/null
> +++ b/modules/stream_filter/dash/dash.cpp
> @@ -0,0 +1,260 @@
> +/*****************************************************************************
> + * dash.cpp: DASH module
> +
> *****************************************************************************
> + * Copyright (C) 2010 - 2011 Klagenfurt University
> + *
> + * Created on: Aug 10, 2010
> + * Authors: Christopher Mueller <christopher.mueller at itec.uni-klu.ac.at>
> + *          Christian Timmerer  <christian.timmerer at itec.uni-klu.ac.at>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU Lesser General Public License as
> published
> + * by the Free Software Foundation; either version 2.1 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA
> 02110-1301, USA.
> +
> *****************************************************************************/
> +
> +/*****************************************************************************
> + * Preamble
> +
> *****************************************************************************/
> +#ifdef HAVE_CONFIG_H
> +# include "config.h"
> +#endif
> +
> +#include <limits.h>
> +
> +#include <vlc_common.h>
> +#include <vlc_plugin.h>
> +#include <vlc_demux.h>
> +#include <vlc_stream.h>
> +#include <vlc_modules.h>
> +#include <vlc_input.h>
> +
> +#include <errno.h>
> +#include <string>
> +#include <map>
> +#include <fcntl.h>
> +#include <iostream>
> +#include <stdio.h>
> +
> +#include "DASHManager.h"
> +#include "xml/DOMParser.h"
> +#include "http/HTTPConnectionManager.h"
> +#include "adaptationlogic/IAdaptationLogic.h"
> +
> +#define SEEK 0
> +
> +static int count = 0;
>
> Any global variable is suspicious in multi-thread environment
>
> +/*****************************************************************************
> + * Module descriptor
> +
> *****************************************************************************/
> +static int  Open    (vlc_object_t *);
> +static void Close   (vlc_object_t *);
> +
> +vlc_module_begin ()
> +        set_shortname( N_("DASH"))
> +        set_description( N_("Dynamic Adaptive Streaming over HTTP") )
> +        set_capability( "stream_filter", 20 )
> +        set_category( CAT_INPUT )
> +        set_subcategory( SUBCAT_INPUT_STREAM_FILTER )
> +        set_callbacks( Open, Close )
> +vlc_module_end ()
> +/*****************************************************************************
> + * Local prototypes
> +
> *****************************************************************************/
> +struct stream_sys_t
> +{
> +        dash::DASHManager                   *p_dashManager;
> +        dash::http::HTTPConnectionManager   *p_conManager;
> +        dash::xml::Node                     *p_node;
> +        int                                 position;
> +        bool                                isLive;
> +};
> +
> +static int  Read            (stream_t *p_stream, void *p_buffer, unsigned
> int i_len);
> +static int  Peek            (stream_t *p_stream, const uint8_t **pp_peek,
> unsigned int i_peek);
> +static int  Control         (stream_t *p_stream, int i_query, va_list
> args);
> +static bool IsFilterLoop    (stream_t *p_stream);
> +static bool IsDash          (stream_t *p_stream, dash::xml::DOMParser
> *p_parser);
> +static void SetCacheSize    (stream_t *p_stream);
> +/*****************************************************************************
> + * Open:
> +
> *****************************************************************************/
> +static int Open(vlc_object_t *p_this)
> +{
> +    stream_t *p_stream = (stream_t*) p_this;
> +
> +    /* HACK */
> +    if(IsFilterLoop(p_stream))
> +        return VLC_EGENERIC;
> +
> +    msg_Dbg(p_this,"DASH filter: open (%s)", p_stream->psz_path);
>
> Please don't print debug until after the plug-in probed successfully. This
> will fill clutter the logs.
>
> +    dash::xml::DOMParser *p_parser = new
> dash::xml::DOMParser(p_stream->p_source);
> +
> +    if(!IsDash(p_stream, p_parser))
> +    {
> +        delete(p_parser);
> +        return VLC_EGENERIC;
> +    }
> +
> +    stream_sys_t *p_sys = (stream_sys_t *) malloc(sizeof(stream_sys_t));
> +    if (unlikely(p_sys == NULL))
> +        return VLC_ENOMEM;
>
> That's OK; but maybe the new operator would be simpler here.
>
> +    dash::http::HTTPConnectionManager   *p_conManager   = new
> dash::http::HTTPConnectionManager(p_stream);
> +    dash::xml::Node                     *p_node         =
> p_parser->getRootNode();
> +    dash::DASHManager                   *p_dashManager  = new
> dash::DASHManager(p_conManager,
> +
>      p_node,
> +
>      dash::logic::IAdaptationLogic::RateBased,
> +
>      p_parser->getProfile(p_node));
> +    delete(p_parser);
> +
> +    p_sys->p_dashManager    = p_dashManager;
> +    p_sys->p_node           = p_node;
> +    p_sys->p_conManager     = p_conManager;
> +    p_sys->position         = 0;
> +    p_sys->isLive           = true;
> +    p_stream->p_sys         = p_sys;
> +    p_stream->pf_read       = Read;
> +    p_stream->pf_peek       = Peek;
> +    p_stream->pf_control    = Control;
> +
> +    SetCacheSize(p_stream);
> +
> +    msg_Dbg(p_this,"DASH filter: success");
>
> Not needed. The module subsystem already prints a generic debug message
> for this.
>
> +
> +    return VLC_SUCCESS;
> +}
> +/*****************************************************************************
> + * Close:
> +
> *****************************************************************************/
> +static void Close(vlc_object_t *p_this)
> +{
> +    stream_t                            *p_stream       = (stream_t*)
> p_this;
> +    stream_sys_t                        *p_sys          = (stream_sys_t
> *) p_stream->p_sys;
> +    dash::DASHManager                   *p_dashManager  =
> p_sys->p_dashManager;
> +    dash::http::HTTPConnectionManager   *p_conManager   =
> p_sys->p_conManager;
> +    dash::xml::Node                     *p_node         = p_sys->p_node;
> +
> +    delete(p_conManager);
> +    delete(p_dashManager);
> +    delete(p_node);
> +    free(p_sys);
> +}
> +/*****************************************************************************
> + * Callbacks:
> +
> *****************************************************************************/
> +static int  Read            (stream_t *p_stream, void *p_buffer, unsigned
> int i_len)
> +{
> +    stream_sys_t        *p_sys          = (stream_sys_t *)
> p_stream->p_sys;
> +    dash::DASHManager   *p_dashManager  = p_sys->p_dashManager;
> +    int                 i_ret           = 0;
> +
> +    i_ret = p_dashManager->read(p_buffer, i_len);
> +
> +    if (i_ret < 0)
> +    {
> +        switch (errno)
> +        {
> +            case EINTR:
> +            case EAGAIN:
> +                break;
> +            default:
> +                msg_Dbg(p_stream, "DASH Read: failed to read");
>
> "%m" maybe?
>
> +                return 0;
> +        }
> +        return 0;
> +    }
> +
> +    p_sys->position += i_ret;
> +
> +    return i_ret;
> +}
> +static int  Peek            (stream_t *p_stream, const uint8_t **pp_peek,
> unsigned int i_peek)
> +{
> +    stream_sys_t        *p_sys          = (stream_sys_t *)
> p_stream->p_sys;
> +    dash::DASHManager   *p_dashManager  = p_sys->p_dashManager;
> +
> +    return p_dashManager->peek(pp_peek, i_peek);
> +}
> +static int  Control         (stream_t *p_stream, int i_query, va_list
> args)
> +{
> +    stream_sys_t *p_sys = p_stream->p_sys;
> +
> +    switch (i_query)
> +    {
> +        case STREAM_CAN_SEEK:
> +        case STREAM_CAN_FASTSEEK:
> +            /*TODO Support Seek */
> +            *(va_arg (args, bool *)) = SEEK;
> +            break;
> +        case STREAM_GET_POSITION:
> +            *(va_arg (args, uint64_t *)) = p_sys->position;
> +            break;
> +        case STREAM_SET_POSITION:
> +            return VLC_EGENERIC;
> +        case STREAM_GET_SIZE:
> +            if(p_sys->isLive)
> +                *(va_arg (args, uint64_t *)) = 0;
> +            break;
>
> Returning VLC_SUCCESS w/o setting the size does not look right.
>
> +        default:
> +            return VLC_EGENERIC;
> +    }
> +    return VLC_SUCCESS;
> +}
> +/*****************************************************************************
> + * Helpers:
> +
> *****************************************************************************/
> +static bool IsFilterLoop    (stream_t *p_stream)
> +{
> +    vlc_object_t *parent = p_stream->p_parent;
> +    while(parent != NULL)
> +    {
> +        if(!strcmp(parent->psz_object_type, "stream"))
> +            if(((stream_t *)parent)->p_module != NULL)
> +                if(!strcmp(module_get_name(((stream_t
> *)parent)->p_module, false), "DASH"))
> +                    return true;
> +
> +        parent = parent->p_parent;
> +    }
> +
> +    return false;
> +}
>
> You are not allowed to read p_parent->p_module from here.
> Besides, you should never use p_parent at all.
>
> And anyway, you should be able to detect this transparently in IsDash().
>
> +static bool IsDash          (stream_t *p_stream, dash::xml::DOMParser
> *p_parser)
> +{
> +    if(!p_parser->isDash())
> +    {
> +        msg_Dbg(p_stream,"DASH filter: file is no mpd");
> +        return false;
> +    }
> +
> +    if(!p_parser->parse())
> +    {
> +        msg_Dbg(p_stream,"DASH filter: could not parse file");
> +        return false;
> +    }
> +
> +    return true;
> +}
> +static void SetCacheSize    (stream_t *p_stream)
> +{
> +    vlc_object_t *parent = p_stream->p_parent;
> +    while(parent != NULL)
> +    {
> +        if(!strcmp(parent->psz_object_type, "access"))
> +            var_SetInteger(parent, "http-caching", 10000);
> +
> +        parent = parent->p_parent;
> +    }
> +}
>
> Same problem as IsLoop(). Just don't do this.
>
>
> And last note: you will probably break compilations w/o libxml2. You
> should either only enable the module when libxml2 is available, or
> (better)
> use the VLC XML API (include/vlc_xml.h).
>
> --
> Rémi Denis-Courmont
> http://www.remlab.net/
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> http://mailman.videolan.org/listinfo/vlc-devel
>





More information about the vlc-devel mailing list