[vlmc-devel] [PATCH 4/4] VLCSource: Avoid deleting VmemRenderer too early

Hugo Beauzée-Luyssen hugo at beauzee.fr
Tue Apr 12 14:51:16 CEST 2016


On 04/12/2016 01:10 PM, Yikai Lu wrote:
> If we declare in a function like "VmemRenderer renderer( some values )" just as we did before, it will be removed as soon as the function ends. Since the renderer don't know how much time should be needed to render a snapshot, we should keep it alive as long as possible.
> ---
>   src/Backend/VLC/VLCSource.cpp | 20 +++++++++++++-------
>   src/Backend/VLC/VLCSource.h   |  4 +++-
>   2 files changed, 16 insertions(+), 8 deletions(-)
>
> diff --git a/src/Backend/VLC/VLCSource.cpp b/src/Backend/VLC/VLCSource.cpp
> index d38d12f..3257781 100644
> --- a/src/Backend/VLC/VLCSource.cpp
> +++ b/src/Backend/VLC/VLCSource.cpp
> @@ -39,10 +39,16 @@ VLCSource::VLCSource( VLCBackend* backend, const QString& path )
>       , m_snapshot( nullptr )
>       , m_isParsed( false )
>       , m_nbFrames( 0 )
> +    , m_vmemRenderer( nullptr )
>   {
>       m_media = ::VLC::Media( backend->vlcInstance(), path.toStdString(), ::VLC::Media::FromPath );
>   }
>
> +VLCSource::~VLCSource()
> +{
> +    delete m_vmemRenderer;
> +}
> +
>   ::VLC::Media&
>   VLCSource::media()
>   {
> @@ -63,7 +69,6 @@ VLCSource::preparse()
>       Q_ASSERT( m_nbAudioTracks == 0 );
>       Q_ASSERT( m_nbVideoTracks == 0 );
>
> -    VmemRenderer renderer( m_backend, this, nullptr );
>       m_media.parse();
>       m_length = m_media.duration();
>       auto tracks = m_media.tracks();
> @@ -85,7 +90,7 @@ VLCSource::preparse()
>                   m_width = t.width();
>                   m_height = t.height();
>                   m_nbFrames = (int64_t)( (float)( m_length / 1000 ) * m_fps );
> -                computeSnapshot( renderer );
> +                computeSnapshot();
>               }
>           }
>           else if ( t.type() == ::VLC::MediaTrack::Type::Audio )
> @@ -102,25 +107,26 @@ VLCSource::isParsed() const
>   }
>
>   bool
> -VLCSource::computeSnapshot( VmemRenderer& renderer )
> +VLCSource::computeSnapshot()
>   {
>       Q_ASSERT( m_snapshot == nullptr );
> -    renderer.start();
> +    m_vmemRenderer = new VmemRenderer( m_backend, this, nullptr );
> +    m_vmemRenderer->start();
>       {
>           QMutex mutex;
>           QWaitCondition cond;
> -        auto em = renderer.mediaPlayer().eventManager();
> +        auto em = m_vmemRenderer->mediaPlayer().eventManager();
>           em.onPositionChanged([&mutex, &cond](float pos) {
>               QMutexLocker lock( &mutex );
>               if ( pos > 0.2 )
>                   cond.wakeAll();
>           });
>           QMutexLocker lock( &mutex );
> -        renderer.setPosition( 0.3 );
> +        m_vmemRenderer->setPosition( 0.3 );
>           if ( cond.wait( &mutex, 2000 ) == false )
>               return false;
>       }
> -    m_snapshot = renderer.waitSnapshot();
> +    m_snapshot = m_vmemRenderer->waitSnapshot();
>       return m_snapshot != nullptr;
>   }
>
> diff --git a/src/Backend/VLC/VLCSource.h b/src/Backend/VLC/VLCSource.h
> index 10a7d08..346adbe 100644
> --- a/src/Backend/VLC/VLCSource.h
> +++ b/src/Backend/VLC/VLCSource.h
> @@ -40,6 +40,7 @@ class VLCSource : public ISource
>   {
>   public:
>       VLCSource( VLCBackend* backend, const QString& path );
> +    virtual ~VLCSource();
>       virtual ISourceRenderer*    createRenderer( ISourceRendererEventCb* callback );
>       virtual bool                preparse();
>       virtual bool                isParsed() const;
> @@ -58,7 +59,7 @@ public:
>       ::VLC::Media&               media();
>
>   private:
> -    bool                        computeSnapshot( VmemRenderer& renderer );
> +    bool                        computeSnapshot();
>
>   private:
>       VLCBackend*                 m_backend;
> @@ -72,6 +73,7 @@ private:
>       uint8_t*                    m_snapshot;
>       bool                        m_isParsed;
>       int64_t                     m_nbFrames;
> +    VmemRenderer*               m_vmemRenderer;
>   };
>
>
>
The renderer will stop the VLC::MediaPlayer upon destruction, so that 
shouldn't be a problem. Moreover, the waitSnapshot method ensure we 
block until the snapshot is computed, so the timing shouldn't be an issue.
Did you encounter an issue related to this code?


More information about the Vlmc-devel mailing list