[vlc-commits] [Git][videolan/vlc][master] 2 commits: medialib: fix crash

Steve Lhomme (@robUx4) gitlab at videolan.org
Thu Feb 27 06:42:50 UTC 2025



Steve Lhomme pushed to branch master at VideoLAN / VLC


Commits:
c062cd49 by Gabriel Lafond-Thenaille at 2025-02-27T05:58:16+00:00
medialib: fix crash

 * Fix a crash due to variable on a stack not available when a callback
   try to use it.

- - - - -
a878e9d6 by Gabriel Lafond-Thenaille at 2025-02-27T05:58:16+00:00
medialib: Use the `vlc_preparser_GenerateThumbnailToFiles` function

 * Replace `vlc_preparser_GenerateThumbnail` and `vlc_picture_Export`
   by `vlc_preparser_GenerateThumbnailToFiles`.

- - - - -


2 changed files:

- modules/misc/medialibrary/Thumbnailer.cpp
- modules/misc/medialibrary/medialibrary.h


Changes:

=====================================
modules/misc/medialibrary/Thumbnailer.cpp
=====================================
@@ -30,7 +30,9 @@
 #include <vlc_cxx_helpers.hpp>
 #include <vlc_preparser.h>
 
+#include <climits>
 #include <stdexcept>
+#include <climits>
 
 Thumbnailer::Thumbnailer( vlc_medialibrary_module_t* ml )
     : m_ml( ml )
@@ -39,8 +41,9 @@ Thumbnailer::Thumbnailer( vlc_medialibrary_module_t* ml )
 {
     const struct vlc_preparser_cfg cfg = []{
         struct vlc_preparser_cfg cfg{};
-        cfg.types = VLC_PREPARSER_TYPE_THUMBNAIL;
+        cfg.types = VLC_PREPARSER_TYPE_THUMBNAIL_TO_FILES;
         cfg.timeout = VLC_TICK_FROM_SEC( 3 );
+        cfg.max_thumbnailer_threads = 1;
         return cfg;
     }();
     m_thumbnailer.reset( vlc_preparser_New( VLC_OBJECT( ml ), &cfg ) );
@@ -48,23 +51,34 @@ Thumbnailer::Thumbnailer( vlc_medialibrary_module_t* ml )
         throw std::runtime_error( "Failed to instantiate a vlc_preparser_t" );
 }
 
-void Thumbnailer::onThumbnailComplete( input_item_t *, int, picture_t* thumbnail, void *data )
+void Thumbnailer::onThumbnailToFilesComplete(input_item_t *, int ,
+                                             const bool *result_array,
+                                             size_t result_count, void *data)
 {
     ThumbnailerCtx* ctx = static_cast<ThumbnailerCtx*>( data );
 
     vlc::threads::mutex_locker lock( ctx->thumbnailer->m_mutex );
     ctx->done = true;
-    if (thumbnail != nullptr)
-        ctx->thumbnail = picture_Hold(thumbnail);
+    if (result_count != 1) {
+        ctx->error = true;
+    } else {
+        ctx->error = !result_array[0];
+    }
     ctx->thumbnailer->m_currentContext = nullptr;
-    ctx->thumbnailer->m_cond.signal();
+    ctx->thumbnailer->m_cond.broadcast();
 }
 
 bool Thumbnailer::generate( const medialibrary::IMedia&, const std::string& mrl,
                             uint32_t desiredWidth, uint32_t desiredHeight,
                             float position, const std::string& dest )
 {
+#if INT_MAX < UINT32_MAX
+    assert(desiredWidth < (uint32_t)INT_MAX);
+    assert(desiredHeight < (uint32_t)INT_MAX);
+#endif
+
     ThumbnailerCtx ctx{};
+
     auto item = vlc::wrap_cptr( input_item_New( mrl.c_str(), nullptr ),
                                 &input_item_Release );
     if ( unlikely( item == nullptr ) )
@@ -72,6 +86,7 @@ bool Thumbnailer::generate( const medialibrary::IMedia&, const std::string& mrl,
 
     ctx.done = false;
     ctx.thumbnailer = this;
+    ctx.error = true;
     {
         vlc::threads::mutex_locker lock( m_mutex );
         m_currentContext = &ctx;
@@ -84,12 +99,25 @@ bool Thumbnailer::generate( const medialibrary::IMedia&, const std::string& mrl,
             .hw_dec = false,
         };
 
-        static const struct vlc_thumbnailer_cbs cbs = {
-            .on_ended = onThumbnailComplete,
+        struct vlc_thumbnailer_output thumb_out = {
+            .format = VLC_THUMBNAILER_FORMAT_JPEG,
+            .width = (int)desiredWidth,
+            .height = (int)desiredHeight,
+            .crop = true,
+            .file_path = dest.c_str(),
+            .creat_mode = 0600,
         };
-        vlc_preparser_req_id requestId =
-            vlc_preparser_GenerateThumbnail( m_thumbnailer.get(), item.get(),
-                                             &thumb_arg, &cbs, &ctx );
+
+        static const struct vlc_thumbnailer_to_files_cbs cbs = {
+            .on_ended = onThumbnailToFilesComplete,
+        };
+
+        vlc_preparser_req_id requestId;
+        requestId = vlc_preparser_GenerateThumbnailToFiles(m_thumbnailer.get(), 
+                                                           item.get(),
+                                                           &thumb_arg,
+                                                           &thumb_out, 1,
+                                                           &cbs, &ctx);
 
         if (requestId == VLC_PREPARSER_REQ_ID_INVALID)
         {
@@ -101,29 +129,17 @@ bool Thumbnailer::generate( const medialibrary::IMedia&, const std::string& mrl,
         m_currentContext = nullptr;
     }
 
-    if ( ctx.thumbnail == nullptr )
-        return false;
-
-    block_t* block;
-    if ( picture_Export( VLC_OBJECT( m_ml ), &block, nullptr, ctx.thumbnail,
-                         VLC_CODEC_JPEG, desiredWidth, desiredHeight, true ) != VLC_SUCCESS )
-        return false;
-    auto blockPtr = vlc::wrap_cptr( block, &block_Release );
-
-    auto f = vlc::wrap_cptr( vlc_fopen( dest.c_str(), "wb" ), &fclose );
-    if ( f == nullptr )
-        return false;
-    if ( fwrite( block->p_buffer, block->i_buffer, 1, f.get() ) != 1 )
-        return false;
-    return true;
+    return !ctx.error;
 }
 
 void Thumbnailer::stop()
 {
+    vlc_preparser_Cancel(m_thumbnailer.get(), VLC_PREPARSER_REQ_ID_INVALID);
+
     vlc::threads::mutex_locker lock{ m_mutex };
     if ( m_currentContext != nullptr )
     {
-        m_currentContext->done = true;
-        m_cond.signal();
+        while (m_currentContext != nullptr && m_currentContext->done == false)
+            m_cond.wait( m_mutex );
     }
 }


=====================================
modules/misc/medialibrary/medialibrary.h
=====================================
@@ -34,6 +34,7 @@
 #include <vlc_input.h>
 #include <vlc_media_library.h>
 #include <vlc_cxx_helpers.hpp>
+#include <vlc_preparser.h>
 
 #include <cstdarg>
 #include <type_traits>
@@ -120,14 +121,10 @@ class Thumbnailer : public medialibrary::IThumbnailer
 {
     struct ThumbnailerCtx
     {
-        ~ThumbnailerCtx()
-        {
-            if ( thumbnail != nullptr )
-                picture_Release( thumbnail );
-        }
         Thumbnailer* thumbnailer;
         bool done;
-        picture_t* thumbnail;
+        bool error;
+        vlc_preparser_req_id id;
     };
 public:
     Thumbnailer(vlc_medialibrary_module_t* ml);
@@ -137,7 +134,9 @@ public:
     void stop() override;
 
 private:
-    static void onThumbnailComplete( input_item_t *, int, picture_t* thumbnail, void *data );
+    static void onThumbnailToFilesComplete(input_item_t *item, int status,
+                                           const bool *result_array,
+                                           size_t result_count, void *data);
 
 private:
     vlc_medialibrary_module_t* m_ml;



View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/6bf07c64aa262cfb8a11a29ea70794546853c36c...a878e9d651b496b29fb9462216a0884f4e1326f9

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/6bf07c64aa262cfb8a11a29ea70794546853c36c...a878e9d651b496b29fb9462216a0884f4e1326f9
You're receiving this email because of your account on code.videolan.org.


VideoLAN code repository instance


More information about the vlc-commits mailing list