[vlmc-devel] [PATCH] Clip: compute length relying on ISource length()

Hugo Beauzée-Luyssen hugo at beauzee.fr
Mon May 9 11:36:37 CEST 2016


On 05/02/2016 08:20 PM, Pawel Golinski wrote:
> Length was computed using frames only (and ISource's length() was
> ignored) which caused it to be zero in sound files.
> ---
>   src/Media/Clip.cpp | 16 +++++++++++-----
>   src/Media/Clip.h   |  8 ++++++++
>   2 files changed, 19 insertions(+), 5 deletions(-)
>
> diff --git a/src/Media/Clip.cpp b/src/Media/Clip.cpp
> index 4f29f8e..b634442 100644
> --- a/src/Media/Clip.cpp
> +++ b/src/Media/Clip.cpp
> @@ -40,12 +40,15 @@ Clip::Clip( Media *media, qint64 begin /*= 0*/, qint64 end /*= -1*/, const QStri
>           m_end( end ),
>           m_parent( media->baseClip() )
>   {
> +    int64_t nbSourceFrames = media->source()->nbFrames();
>       if ( end == -1 )
> -        m_end = media->source()->nbFrames();
> +        m_end = nbSourceFrames;
>       if ( uuid.isEmpty() == true )
>           m_uuid = QUuid::createUuid();
>       else
>           m_uuid = QUuid( uuid );
> +    m_beginPosition = (float)begin / (float)nbSourceFrames;
> +    m_endPosition = (float)end / (float)nbSourceFrames;
>       m_childs = new MediaContainer( this );
>       m_rootClip = media->baseClip();
>       computeLength();
> @@ -61,6 +64,7 @@ Clip::Clip( Clip *parent, qint64 begin /*= -1*/, qint64 end /*= -1*/,
>           m_rootClip( parent->rootClip() ),
>           m_parent( parent )
>   {
> +    int64_t nbSourceFrames = parent->media()->source()->nbFrames();
>       if ( begin < 0 )
>           m_begin = parent->m_begin;
>       if ( end < 0 )
> @@ -69,6 +73,8 @@ Clip::Clip( Clip *parent, qint64 begin /*= -1*/, qint64 end /*= -1*/,
>           m_uuid = QUuid::createUuid();
>       else
>           m_uuid = QUuid( uuid );
> +    m_beginPosition = (float)begin / (float)nbSourceFrames;
> +    m_endPosition = (float)end / (float)nbSourceFrames;
>       m_childs = new MediaContainer( this );
>       computeLength();
>   }
> @@ -108,11 +114,9 @@ Clip::lengthSecond() const
>   void
>   Clip::computeLength()
>   {
> -    float   fps = m_media->source()->fps();
> -    if ( fps < 0.1f )
> -        fps = Clip::DefaultFPS;
> +    int64_t sourceLengthSeconds = m_media->source()->length() / 1000;
>       m_nbFrames = m_end - m_begin;
> -    m_lengthSeconds = qRound64( (float)m_nbFrames / fps );
> +    m_lengthSeconds = qRound64( ( m_endPosition - m_beginPosition ) * sourceLengthSeconds );

It would probably allow for a better precision to use milliseconds 
first, and then convert to seconds.
Though it feels strange to use seconds anyway, but I don't recall which 
unit gets used when :/

>   }
>
>   const QStringList&
> @@ -274,6 +278,8 @@ Clip::mediaMetadataUpdated()
>       {
>           m_begin = 0;
>           m_end = m_media->source()->nbFrames();
> +        m_beginPosition = 0.0f;
> +        m_endPosition = 1.0f;
>           computeLength();
>       }
>   }
> diff --git a/src/Media/Clip.h b/src/Media/Clip.h
> index 5fb5997..8b49b9a 100644
> --- a/src/Media/Clip.h
> +++ b/src/Media/Clip.h
> @@ -149,6 +149,14 @@ class   Clip : public QObject
>            *          beginning of the parent Media.
>            */
>           qint64              m_end;
> +        /**
> +         *  \brief  This represents the beginning of the Clip in form of [0; 1] float
> +         */
> +        float              m_beginPosition;
> +        /**
> +         *  \brief  This represents the end of the Clip in form of [0;1] float
> +         */
> +        float              m_endPosition;
>
>           /**
>            *  \brief  The length in frames
>

Do we need to keep m_begin & m_end if we switch to a position based 
approach?


More information about the Vlmc-devel mailing list