diff --git a/modules/videoio/src/cap_ffmpeg_impl.hpp b/modules/videoio/src/cap_ffmpeg_impl.hpp index 1f3e84d940..dfa272639d 100644 --- a/modules/videoio/src/cap_ffmpeg_impl.hpp +++ b/modules/videoio/src/cap_ffmpeg_impl.hpp @@ -373,42 +373,6 @@ inline double get_monotonic_time_diff_ms(timespec time1, timespec time2) } #endif // USE_AV_INTERRUPT_CALLBACK -static int get_number_of_cpus(void) -{ -#if defined _WIN32 - SYSTEM_INFO sysinfo; - GetSystemInfo( &sysinfo ); - - return (int)sysinfo.dwNumberOfProcessors; -#elif defined __linux__ || defined __HAIKU__ - return (int)sysconf( _SC_NPROCESSORS_ONLN ); -#elif defined __APPLE__ - int numCPU=0; - int mib[4]; - size_t len = sizeof(numCPU); - - // set the mib for hw.ncpu - mib[0] = CTL_HW; - mib[1] = HW_AVAILCPU; // alternatively, try HW_NCPU; - - // get the number of CPUs from the system - sysctl(mib, 2, &numCPU, &len, NULL, 0); - - if( numCPU < 1 ) - { - mib[1] = HW_NCPU; - sysctl( mib, 2, &numCPU, &len, NULL, 0 ); - - if( numCPU < 1 ) - numCPU = 1; - } - - return (int)numCPU; -#else - return 1; -#endif -} - struct Image_FFMPEG { @@ -998,12 +962,17 @@ public: inline void fill_codec_context(AVCodecContext * enc, AVDictionary * dict) { -//#ifdef FF_API_THREAD_INIT -// avcodec_thread_init(enc, get_number_of_cpus()); -//#else - const int nCpus = get_number_of_cpus(); - enc->thread_count = enc->thread_count ? enc->thread_count: nCpus; -//#endif + if (!enc->thread_count) + { + int nCpus = cv::getNumberOfCPUs(); + int requestedThreads = std::min(nCpus, 16); // [OPENCV:FFMPEG:24] Application has requested XX threads. Using a thread count greater than 16 is not recommended. + char* threads_option = getenv("OPENCV_FFMPEG_THREADS"); + if (threads_option != NULL) + { + requestedThreads = atoi(threads_option); + } + enc->thread_count = requestedThreads; + } AVDictionaryEntry* avdiscard_entry = av_dict_get(dict, "avdiscard", NULL, 0);