[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