[vlc-devel] [PATCH 1/2] DASH: implement Seek()

Hugo Beauzée-Luyssen beauze.h at gmail.com
Thu Mar 29 14:58:52 CEST 2012


On Wed, Mar 28, 2012 at 9:03 PM, Frederic YHUEL <fyhuel at viotech.net> wrote:
> On Wed, Mar 28, 2012 at 6:06 PM, Hugo Beauzée-Luyssen
> <beauze.h at gmail.com> wrote:
>>
>> 2012/3/26 Frédéric Yhuel <fyhuel at viotech.net>:
>> > This is needed for DASH module to work with (not yet ready) VLC MP4
>> > demux. Forward seeking is implemented by calling Read() with a NULL
>> > argument (= skipping), while backward seeking is limited to the current
>> > block in the block_bytestream_t upon which is built the internal buffer.
>> > This limitation is not really a problem because backward seeking will be
>> > needed only for the parsing of the initialization fragment.
>> > ---
>> >  modules/stream_filter/dash/DASHManager.cpp        |    5 ++
>> >  modules/stream_filter/dash/DASHManager.h          |    1 +
>> >  modules/stream_filter/dash/buffer/BlockBuffer.cpp |   16 ++++++
>> >  modules/stream_filter/dash/buffer/BlockBuffer.h   |    1 +
>> >  modules/stream_filter/dash/dash.cpp               |   53
>> > ++++++++++++++++++++-
>> >  5 files changed, 74 insertions(+), 2 deletions(-)
>> >
>> > diff --git a/modules/stream_filter/dash/DASHManager.cpp
>> > b/modules/stream_filter/dash/DASHManager.cpp
>> > index f649015..8483c9d 100644
>> > --- a/modules/stream_filter/dash/DASHManager.cpp
>> > +++ b/modules/stream_filter/dash/DASHManager.cpp
>> > @@ -74,6 +74,11 @@ int     DASHManager::read( void *p_buffer, size_t len
>> > )
>> >     return this->buffer->get(p_buffer, len);
>> >  }
>> >
>> > +int     DASHManager::seekBackwards( unsigned i_len )
>> > +{
>> > +    return this->buffer->seekBackwards( i_len );
>> > +}
>> > +
>> >  int     DASHManager::peek( const uint8_t **pp_peek, size_t i_peek )
>> >  {
>> >     return this->buffer->peek(pp_peek, i_peek);
>> > diff --git a/modules/stream_filter/dash/DASHManager.h
>> > b/modules/stream_filter/dash/DASHManager.h
>> > index a09e98e..90d9317 100644
>> > --- a/modules/stream_filter/dash/DASHManager.h
>> > +++ b/modules/stream_filter/dash/DASHManager.h
>> > @@ -47,6 +47,7 @@ namespace dash
>> >             bool    start   ();
>> >             int     read    ( void *p_buffer, size_t len );
>> >             int     peek    ( const uint8_t **pp_peek, size_t i_peek );
>> > +            int     seekBackwards ( unsigned len );
>> >
>> >             const mpd::IMPDManager*         getMpdManager   () const;
>> >             const logic::IAdaptationLogic*  getAdaptionLogic() const;
>> > diff --git a/modules/stream_filter/dash/buffer/BlockBuffer.cpp
>> > b/modules/stream_filter/dash/buffer/BlockBuffer.cpp
>> > index 056c481..1db9168 100644
>> > --- a/modules/stream_filter/dash/buffer/BlockBuffer.cpp
>> > +++ b/modules/stream_filter/dash/buffer/BlockBuffer.cpp
>> > @@ -85,6 +85,22 @@ int     BlockBuffer::peek                 (const
>> > uint8_t **pp_peek, unsigned int
>> >     vlc_mutex_unlock(&this->monitorMutex);
>> >     return ret;
>> >  }
>> > +
>> > +int     BlockBuffer::seekBackwards       (unsigned len)
>> > +{
>> > +    vlc_mutex_lock(&this->monitorMutex);
>> > +    if( this->buffer.i_offset > len )
>> > +    {
>> > +        this->buffer.i_offset -= len;
>> > +        this->sizeBytes += len;
>> > +        vlc_mutex_unlock(&this->monitorMutex);
>> > +        return VLC_SUCCESS;
>> > +    }
>> > +
>> > +    vlc_mutex_unlock(&this->monitorMutex);
>> > +    return VLC_EGENERIC;
>> > +}
>> > +
>> >  int     BlockBuffer::get                  (void *p_data, unsigned int
>> > len)
>> >  {
>> >     vlc_mutex_lock(&this->monitorMutex);
>> > diff --git a/modules/stream_filter/dash/buffer/BlockBuffer.h
>> > b/modules/stream_filter/dash/buffer/BlockBuffer.h
>> > index 570861f..2c39db1 100644
>> > --- a/modules/stream_filter/dash/buffer/BlockBuffer.h
>> > +++ b/modules/stream_filter/dash/buffer/BlockBuffer.h
>> > @@ -49,6 +49,7 @@ namespace dash
>> >                 void    put         (block_t *block);
>> >                 int     get         (void *p_data, unsigned int len);
>> >                 int     peek        (const uint8_t **pp_peek, unsigned
>> > int i_peek);
>> > +                int     seekBackwards (unsigned len);
>> >                 void    setEOF      (bool value);
>> >                 bool    getEOF      ();
>> >                 mtime_t size        ();
>> > diff --git a/modules/stream_filter/dash/dash.cpp
>> > b/modules/stream_filter/dash/dash.cpp
>> > index b503f27..9003a9d 100644
>> > --- a/modules/stream_filter/dash/dash.cpp
>> > +++ b/modules/stream_filter/dash/dash.cpp
>> > @@ -77,7 +77,7 @@ struct stream_sys_t
>> >         dash::DASHManager                   *p_dashManager;
>> >         dash::http::HTTPConnectionManager   *p_conManager;
>> >         dash::mpd::MPD                      *p_mpd;
>> > -        int                                 position;
>> > +        uint64_t                            position;
>> >         bool                                isLive;
>> >  };
>> >
>> > @@ -160,6 +160,46 @@ static void Close(vlc_object_t *p_obj)
>> >
>> >  /*****************************************************************************
>> >  * Callbacks:
>> >
>> >  *****************************************************************************/
>> > +static int  Seek            ( stream_t *p_stream, uint64_t pos )
>> > +{
>> > +    stream_sys_t        *p_sys          = (stream_sys_t *)
>> > p_stream->p_sys;
>> > +    dash::DASHManager   *p_dashManager  = p_sys->p_dashManager;
>> > +    int                 i_ret           = 0;
>> > +    unsigned            i_len           = 0;
>> > +    long                i_read          = 0;
>> > +
>> > +    if( pos < p_sys->position )
>> > +    {
>> > +        if( p_sys->position - pos > UINT_MAX )
>> > +        {
>> > +            msg_Err( p_stream, "Cannot seek backward that far!" );
>> > +            return VLC_EGENERIC;
>> > +        }
>> > +        i_len = p_sys->position - pos;
>> You are checking for an UINT overflow, but are assigning into an int.
>>
>
> No, i_len is unsigned :-)
>
> Have a good evening,
>
> --
> Frédéric
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> http://mailman.videolan.org/listinfo/vlc-devel

Indeed, by bad!

Applied, thanks!

-- 
Hugo Beauzée-Luyssen



More information about the vlc-devel mailing list