// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "media/base/media.h" #include "base/files/file_path.h" #include "base/lazy_instance.h" #include "base/path_service.h" #include "base/synchronization/lock.h" #include "build/build_config.h" #include "media/base/sinc_resampler.h" #include "media/base/vector_math.h" #include "media/base/yuv_convert.h" namespace media { namespace internal { // Platform specific initialization method. extern bool InitializeMediaLibraryInternal(const base::FilePath& module_dir); } // namespace internal // Media must only be initialized once, so use a LazyInstance to ensure this. class MediaInitializer { public: bool Initialize(const base::FilePath& module_dir) { base::AutoLock auto_lock(lock_); if (!tried_initialize_) { tried_initialize_ = true; initialized_ = internal::InitializeMediaLibraryInternal(module_dir); } return initialized_; } bool IsInitialized() { base::AutoLock auto_lock(lock_); return initialized_; } private: friend struct base::DefaultLazyInstanceTraits; MediaInitializer() : initialized_(false), tried_initialize_(false) { // Perform initialization of libraries which require runtime CPU detection. // TODO(dalecurtis): Add initialization of YUV, SincResampler. vector_math::Initialize(); SincResampler::InitializeCPUSpecificFeatures(); InitializeCPUSpecificYUVConversions(); } ~MediaInitializer() { NOTREACHED() << "MediaInitializer should be leaky!"; } base::Lock lock_; bool initialized_; bool tried_initialize_; DISALLOW_COPY_AND_ASSIGN(MediaInitializer); }; static base::LazyInstance::Leaky g_media_library = LAZY_INSTANCE_INITIALIZER; bool InitializeMediaLibrary(const base::FilePath& module_dir) { return g_media_library.Get().Initialize(module_dir); } void InitializeMediaLibraryForTesting() { base::FilePath module_dir; CHECK(PathService::Get(base::DIR_EXE, &module_dir)); CHECK(g_media_library.Get().Initialize(module_dir)); } bool IsMediaLibraryInitialized() { return g_media_library.Get().IsInitialized(); } void InitializeCPUSpecificMediaFeatures() { // Force initialization of the media initializer, but don't call Initialize(). g_media_library.Get(); } } // namespace media