[vlc-devel] [vlc-commits] demux: adaptative: add SourceStream

Hugo Beauzée-Luyssen hugo at beauzee.fr
Tue Oct 6 13:24:48 CEST 2015


Hi,

On 06/10/2015 13:16, Francois Cartegnie wrote:
> vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Tue Sep 29 22:03:32 2015 +0200| [42880f79c595f5c0c012d7f124e0abf361aa86dc] | committer: Francois Cartegnie
>
> demux: adaptative: add SourceStream
>
>> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=42880f79c595f5c0c012d7f124e0abf361aa86dc
> ---
>
>   modules/demux/Makefile.am                          |    3 +
>   modules/demux/adaptative/ChunksSource.hpp          |   39 ++++++
>   modules/demux/adaptative/plumbing/SourceStream.cpp |  139 ++++++++++++++++++++
>   modules/demux/adaptative/plumbing/SourceStream.hpp |   65 +++++++++
>   4 files changed, 246 insertions(+)
>
> diff --git a/modules/demux/Makefile.am b/modules/demux/Makefile.am
> index 8fa67c9..bfd79d9 100644
> --- a/modules/demux/Makefile.am
> +++ b/modules/demux/Makefile.am
> @@ -307,8 +307,11 @@ libadaptative_plugin_la_SOURCES = \
>       demux/adaptative/plumbing/FakeESOut.hpp \
>       demux/adaptative/plumbing/FakeESOutID.cpp \
>       demux/adaptative/plumbing/FakeESOutID.hpp \
> +    demux/adaptative/plumbing/SourceStream.cpp \
> +    demux/adaptative/plumbing/SourceStream.hpp \
>       demux/adaptative/plumbing/StreamOutput.cpp \
>       demux/adaptative/plumbing/StreamOutput.hpp \
> +    demux/adaptative/ChunksSource.hpp \
>       demux/adaptative/PlaylistManager.cpp \
>       demux/adaptative/PlaylistManager.h \
>       demux/adaptative/SegmentTracker.cpp \
> diff --git a/modules/demux/adaptative/ChunksSource.hpp b/modules/demux/adaptative/ChunksSource.hpp
> new file mode 100644
> index 0000000..75feb69
> --- /dev/null
> +++ b/modules/demux/adaptative/ChunksSource.hpp
> @@ -0,0 +1,39 @@
> +/*
> + * ChunksSource.hpp
> + *****************************************************************************
> + * Copyright © 2015 - VideoLAN and VLC Authors
> + *
> + * 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 Lesser 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.
> + *****************************************************************************/
> +#ifndef CHUNKSSOURCE_HPP
> +#define CHUNKSSOURCE_HPP
> +
> +#ifdef HAVE_CONFIG_H
> +# include "config.h"
> +#endif
> +
> +#include <vlc_common.h>
> +
> +namespace adaptative
> +{
> +    class ChunksSource
> +    {
> +        public:
> +            virtual block_t *readNextBlock(size_t) = 0;

This is missing a virtual destructor

> +    };
> +}
> +
> +#endif // CHUNKSSOURCE_HPP
> +
> diff --git a/modules/demux/adaptative/plumbing/SourceStream.cpp b/modules/demux/adaptative/plumbing/SourceStream.cpp
> new file mode 100644
> index 0000000..8d0034e
> --- /dev/null
> +++ b/modules/demux/adaptative/plumbing/SourceStream.cpp
> @@ -0,0 +1,139 @@
> +/*
> + * SourceStream.cpp
> + *****************************************************************************
> + * Copyright © 2015 - VideoLAN and VLC Authors
> + *
> + * 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 Lesser 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 "SourceStream.hpp"
> +
> +#include "../ChunksSource.hpp"
> +#include <vlc_stream.h>
> +#include <vlc_demux.h>
> +
> +using namespace adaptative;
> +
> +ChunksSourceStream::ChunksSourceStream(vlc_object_t *p_obj, ChunksSource *source_)
> +{
> +    p_block = NULL;
> +    b_eof = false;
> +
> +    custom_stream = stream_CustomNew( p_obj, delete_Callback );
> +    if(!custom_stream)

custom_stream won't get released if this throws

> +        throw VLC_EGENERIC;
> +
> +    custom_stream->pf_control = control_Callback;
> +    custom_stream->pf_read = read_Callback;
> +    custom_stream->pf_readdir = NULL;
> +    custom_stream->pf_seek = seek_Callback;
> +    custom_stream->p_sys = reinterpret_cast<stream_sys_t*>(this);
> +
> +    source = source_;
> +}
> +
> +ChunksSourceStream::~ChunksSourceStream()
> +{
> +    if (custom_stream)
> +        stream_Delete(custom_stream);
> +    Reset();
> +}
> +
> +void ChunksSourceStream::Reset()
> +{
> +    if(p_block)
> +        block_Release(p_block);
> +    p_block = NULL;
> +    b_eof = false;
> +}
> +
> +stream_t * ChunksSourceStream::getStream()
> +{
> +    return custom_stream;
> +}
> +
> +ssize_t ChunksSourceStream::Read(uint8_t *buf, size_t size)
> +{
> +    size_t i_copied = 0;
> +    size_t i_toread = size;
> +
> +    while(i_toread && !b_eof)
> +    {
> +        if(!p_block && !(p_block = source->readNextBlock(i_toread)))
> +        {
> +            b_eof = true;
> +            break;
> +        }
> +
> +        if(p_block->i_buffer > i_toread)
> +        {
> +            if(buf)
> +                memcpy(buf + i_copied, p_block->p_buffer, i_toread);
> +            i_copied += i_toread;
> +            p_block->p_buffer += i_toread;
> +            p_block->i_buffer -= i_toread;
> +            i_toread = 0;
> +        }
> +        else
> +        {
> +            if(buf)
> +                memcpy(buf + i_copied, p_block->p_buffer, p_block->i_buffer);
> +            i_copied += p_block->i_buffer;
> +            i_toread -= p_block->i_buffer;
> +            block_Release(p_block);
> +            p_block = NULL;
> +        }
> +    }
> +
> +    return i_copied;
> +}
> +
> +ssize_t ChunksSourceStream::read_Callback(stream_t *s, void *buf, size_t size)
> +{
> +    ChunksSourceStream *me = reinterpret_cast<ChunksSourceStream *>(s->p_sys);
> +    return me->Read(reinterpret_cast<uint8_t *>(buf), size);
> +}
> +
> +int ChunksSourceStream::seek_Callback(stream_t *, uint64_t)
> +{
> +    return VLC_EGENERIC;
> +}
> +
> +int ChunksSourceStream::control_Callback(stream_t *, int i_query, va_list args)
> +{
> +    switch( i_query )
> +    {
> +        case STREAM_GET_SIZE:
> +            *(va_arg( args, uint64_t * )) = 0;
> +            return VLC_SUCCESS;
> +
> +        case STREAM_CAN_SEEK:
> +        case STREAM_CAN_FASTSEEK:
> +        case STREAM_CAN_PAUSE:
> +        case STREAM_CAN_CONTROL_PACE:
> +            *va_arg( args, bool * ) = false;
> +            return VLC_SUCCESS;
> +
> +        case STREAM_GET_PTS_DELAY:
> +            *(va_arg( args, uint64_t * )) = DEFAULT_PTS_DELAY;
> +            return VLC_SUCCESS;
> +
> +        default:
> +            return VLC_EGENERIC;
> +    }
> +}
> +
> +void ChunksSourceStream::delete_Callback(stream_t *)
> +{
> +}
> diff --git a/modules/demux/adaptative/plumbing/SourceStream.hpp b/modules/demux/adaptative/plumbing/SourceStream.hpp
> new file mode 100644
> index 0000000..275c605
> --- /dev/null
> +++ b/modules/demux/adaptative/plumbing/SourceStream.hpp
> @@ -0,0 +1,65 @@
> +/*
> + * SourceStream.hpp
> + *****************************************************************************
> + * Copyright © 2015 - VideoLAN and VLC Authors
> + *
> + * 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 Lesser 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.
> + *****************************************************************************/
> +#ifndef SOURCESTREAM_HPP
> +#define SOURCESTREAM_HPP
> +
> +#ifdef HAVE_CONFIG_H
> +# include "config.h"
> +#endif
> +
> +#include <vlc_common.h>
> +#include <vlc_block.h>
> +
> +namespace adaptative
> +{
> +    class ChunksSource;
> +
> +    class AbstractSourceStream
> +    {
> +        public:
> +            virtual ~AbstractSourceStream() {}
> +            virtual stream_t *getStream() = 0;
> +            virtual void Reset() = 0;
> +    };
> +
> +    class ChunksSourceStream : public AbstractSourceStream
> +    {
> +        public:
> +            ChunksSourceStream(vlc_object_t *, ChunksSource *);
> +            virtual ~ChunksSourceStream();
> +            virtual stream_t *getStream(); /* impl */
> +            virtual void Reset(); /* impl */
> +
> +        protected:
> +            ssize_t Read(uint8_t *, size_t);
> +
> +        private:
> +            block_t *p_block;
> +            bool b_eof;
> +            static ssize_t read_Callback(stream_t *, void *, size_t);
> +            static int seek_Callback(stream_t *, uint64_t);
> +            static int control_Callback( stream_t *, int i_query, va_list );
> +            static void delete_Callback( stream_t * );
> +            stream_t *custom_stream;
> +            ChunksSource *source;
> +    };
> +
> +}
> +#endif // SOURCESTREAM_HPP
>

Regards,

-- 
Hugo Beauzée-Luyssen


More information about the vlc-devel mailing list