X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fffmpeg%2Fffmpeg.cpp;h=287288775b4cab5d240937177464dafc7c633db8;hb=fafb9e5b9be8d2a3d4179a0808d36991a6a1b436;hp=c11babbd1c6371bbd610f83e96bab675268a9c14;hpb=809873a475bccfc056f835569099a4590da895aa;p=casparcg diff --git a/modules/ffmpeg/ffmpeg.cpp b/modules/ffmpeg/ffmpeg.cpp index c11babbd1..287288775 100644 --- a/modules/ffmpeg/ffmpeg.cpp +++ b/modules/ffmpeg/ffmpeg.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2011 Sveriges Television AB +* Copyright 2013 Sveriges Television AB http://casparcg.com/ * * This file is part of CasparCG (www.casparcg.com). * @@ -22,15 +22,23 @@ #include "StdAfx.h" #include "consumer/ffmpeg_consumer.h" +#include "consumer/streaming_consumer.h" #include "producer/ffmpeg_producer.h" +#include "producer/util/util.h" #include +#include +#include #include #include +#include +#include #include +#include + #if defined(_MSC_VER) #pragma warning (disable : 4244) #pragma warning (disable : 4603) @@ -45,12 +53,14 @@ extern "C" #include #include #include + #include } namespace caspar { namespace ffmpeg { int ffmpeg_lock_callback(void **mutex, enum AVLockOp op) { + win32_exception::ensure_handler_installed_for_thread("ffmpeg-thread"); if(!mutex) return 0; @@ -156,6 +166,44 @@ void log_callback(void* ptr, int level, const char* fmt, va_list vl) //colored_fputs(av_clip(level>>3, 0, 6), line); } +boost::thread_specific_ptr& get_disable_logging_for_thread() +{ + static boost::thread_specific_ptr disable_logging_for_thread; + + return disable_logging_for_thread; +} + +void disable_logging_for_thread() +{ + if (get_disable_logging_for_thread().get() == nullptr) + get_disable_logging_for_thread().reset(new bool); // bool value does not matter +} + +bool is_logging_already_disabled_for_thread() +{ + return get_disable_logging_for_thread().get() != nullptr; +} + +std::shared_ptr temporary_disable_logging_for_thread(bool disable) +{ + if (!disable || is_logging_already_disabled_for_thread()) + return std::shared_ptr(); + + disable_logging_for_thread(); + + return std::shared_ptr(nullptr, [] (void*) + { + get_disable_logging_for_thread().release(); // Only works correctly if destructed in same thread as original caller. + }); +} + +void log_for_thread(void* ptr, int level, const char* fmt, va_list vl) +{ + win32_exception::ensure_handler_installed_for_thread("ffmpeg-thread"); + if (get_disable_logging_for_thread().get() == nullptr) // It does not matter what the value of the bool is + log_callback(ptr, level, fmt, vl); +} + //static int query_yadif_formats(AVFilterContext *ctx) //{ // static const int pix_fmts[] = { @@ -195,20 +243,29 @@ void log_callback(void* ptr, int level, const char* fmt, va_list vl) //} //#pragma warning (pop) -void init() +void init(const safe_ptr& media_info_repo) { av_lockmgr_register(ffmpeg_lock_callback); - av_log_set_callback(log_callback); - + av_log_set_callback(log_for_thread); + + avcodec_register_all(); + avdevice_register_all(); avfilter_register_all(); - //fix_yadif_filter_format_query(); - av_register_all(); + av_register_all(); avformat_network_init(); - avcodec_init(); - avcodec_register_all(); - core::register_consumer_factory([](const std::vector& params){return create_consumer(params);}); + core::register_consumer_factory([](const core::parameters& params){return ffmpeg::create_consumer(params);}); + core::register_consumer_factory([](const core::parameters& params){return ffmpeg::create_streaming_consumer(params);}); core::register_producer_factory(create_producer); + core::register_thumbnail_producer_factory(create_thumbnail_producer); + + media_info_repo->register_extractor( + [](const std::wstring& file, core::media_info& info) -> bool + { + auto disable_logging = temporary_disable_logging_for_thread(true); + + return is_valid_file(file) && try_get_duration(file, info.duration, info.time_base); + }); } void uninit()