From f488fb61c318535ea62540a1429616c08f2a3df3 Mon Sep 17 00:00:00 2001 From: Helge Norberg Date: Mon, 10 Apr 2017 17:28:02 +0200 Subject: [PATCH] [logging] Made FFmpeg logging callback thread-safe by using thread-local storage for state that is carried between multiple calls --- modules/ffmpeg/ffmpeg.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/modules/ffmpeg/ffmpeg.cpp b/modules/ffmpeg/ffmpeg.cpp index cece1f6bf..ea7f73741 100644 --- a/modules/ffmpeg/ffmpeg.cpp +++ b/modules/ffmpeg/ffmpeg.cpp @@ -109,7 +109,15 @@ static void sanitize(uint8_t *line) void log_callback(void* ptr, int level, const char* fmt, va_list vl) { - static int print_prefix=1; + static boost::thread_specific_ptr print_prefix_tss; + auto print_prefix = print_prefix_tss.get(); + + if (!print_prefix) + { + print_prefix = new bool(true); + print_prefix_tss.reset(print_prefix); + } + char line[1024]; AVClass* avc= ptr ? *(AVClass**)ptr : NULL; if (level > AV_LOG_DEBUG) @@ -117,7 +125,7 @@ void log_callback(void* ptr, int level, const char* fmt, va_list vl) line[0]=0; #undef fprintf - if(print_prefix && avc) + if(*print_prefix && avc) { if (avc->parent_log_context_offset) { @@ -130,7 +138,7 @@ void log_callback(void* ptr, int level, const char* fmt, va_list vl) std::vsnprintf(line + strlen(line), sizeof(line) - strlen(line), fmt, vl); - print_prefix = strlen(line) && line[strlen(line)-1] == '\n'; + *print_prefix = strlen(line) && line[strlen(line)-1] == '\n'; sanitize((uint8_t*)line); -- 2.39.2