summaryrefslogtreecommitdiffstats
path: root/media/base
diff options
context:
space:
mode:
authordalecurtis@chromium.org <dalecurtis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-06 22:55:21 +0000
committerdalecurtis@chromium.org <dalecurtis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-06 22:55:21 +0000
commit1dfde398066ef03904c0059ce0191b1b9a4aaeac (patch)
treef7ab8e2e84ee4cfa8e1286b240aa7c0b63904d0f /media/base
parent76ff1e3601252b13d0ad4b6521fbe64259fcf7fc (diff)
downloadchromium_src-1dfde398066ef03904c0059ce0191b1b9a4aaeac.zip
chromium_src-1dfde398066ef03904c0059ce0191b1b9a4aaeac.tar.gz
chromium_src-1dfde398066ef03904c0059ce0191b1b9a4aaeac.tar.bz2
Remove function level static initializers media library initialization.
Moves media library initialization into a lazy initializer and dedups a bunch of code. This will also be the eventual home for global media initialization routines (YUV and VectorMath). BUG=224662 TEST=compiles, media library works. Review URL: https://chromiumcodereview.appspot.com/14891002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@198559 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/base')
-rw-r--r--media/base/media.cc74
-rw-r--r--media/base/media.h2
-rw-r--r--media/base/media_android.cc25
-rw-r--r--media/base/media_posix.cc33
-rw-r--r--media/base/media_stub.cc25
-rw-r--r--media/base/media_win.cc42
-rw-r--r--media/base/run_all_unittests.cc13
7 files changed, 110 insertions, 104 deletions
diff --git a/media/base/media.cc b/media/base/media.cc
new file mode 100644
index 0000000..f70d7ca
--- /dev/null
+++ b/media/base/media.cc
@@ -0,0 +1,74 @@
+// 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"
+
+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>;
+
+ MediaInitializer()
+ : initialized_(false),
+ tried_initialize_(false) {
+ // TODO(dalecurtis): Add initialization of YUV and VectorMath libraries.
+ }
+
+ ~MediaInitializer() {
+ NOTREACHED() << "MediaInitializer should be leaky!";
+ }
+
+ base::Lock lock_;
+ bool initialized_;
+ bool tried_initialize_;
+
+ DISALLOW_COPY_AND_ASSIGN(MediaInitializer);
+};
+
+static base::LazyInstance<MediaInitializer>::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();
+}
+
+} // namespace media
diff --git a/media/base/media.h b/media/base/media.h
index 5518961..0eeb092 100644
--- a/media/base/media.h
+++ b/media/base/media.h
@@ -18,7 +18,7 @@ namespace media {
// Attempts to initialize the media library (loading DLLs, DSOs, etc.).
//
-// If |module_dir| is the emptry string, then the system default library paths
+// If |module_dir| is the empty string, then the system default library paths
// are searched for the dynamic libraries. If a |module_dir| is provided, then
// only the specified |module_dir| will be searched for the dynamic libraries.
//
diff --git a/media/base/media_android.cc b/media/base/media_android.cc
index 8008d48..090e73a 100644
--- a/media/base/media_android.cc
+++ b/media/base/media_android.cc
@@ -6,31 +6,16 @@
#include <cpu-features.h>
-#include "base/android/jni_android.h"
-#include "base/logging.h"
-#include "media/base/android/media_jni_registrar.h"
+#include "base/files/file_path.h"
namespace media {
+namespace internal {
-// Caches the result of the check for NEON support.
-static bool g_media_library_is_initialized = false;
-
-bool InitializeMediaLibrary(const base::FilePath& module_dir) {
+bool InitializeMediaLibraryInternal(const base::FilePath& module_dir) {
// No real initialization is necessary but we do need to check if
// Neon is supported because the FFT library requires Neon.
- g_media_library_is_initialized = (android_getCpuFeatures() &
- ANDROID_CPU_ARM_FEATURE_NEON) != 0;
- return g_media_library_is_initialized;
-}
-
-void InitializeMediaLibraryForTesting() {
- // Register JNI bindings for android.
- JNIEnv* env = base::android::AttachCurrentThread();
- RegisterJni(env);
-}
-
-bool IsMediaLibraryInitialized() {
- return g_media_library_is_initialized;
+ return (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) != 0;
}
+} // namespace internal
} // namespace media
diff --git a/media/base/media_posix.cc b/media/base/media_posix.cc
index 01d9e5f..243495a 100644
--- a/media/base/media_posix.cc
+++ b/media/base/media_posix.cc
@@ -22,6 +22,7 @@ using third_party_ffmpeg::StubPathMap;
#endif // !defined(USE_SYSTEM_FFMPEG)
namespace media {
+namespace internal {
// Handy to prevent shooting ourselves in the foot with macro wizardry.
#if !defined(LIBAVCODEC_VERSION_MAJOR) || \
@@ -47,18 +48,11 @@ static const base::FilePath::CharType kSumoLib[] =
#error "Do not know how to construct DSO name for this OS."
#endif
-// Use a global to indicate whether the library has been initialized or not. We
-// rely on function level static initialization in InitializeMediaLibrary() to
-// guarantee this is only set once in a thread safe manner.
-static bool g_media_library_is_initialized = false;
-
-static bool InitializeMediaLibraryInternal(const base::FilePath& module_dir) {
- DCHECK(!g_media_library_is_initialized);
-
+bool InitializeMediaLibraryInternal(const base::FilePath& module_dir) {
#if defined(USE_SYSTEM_FFMPEG)
// No initialization is necessary when using system ffmpeg,
// we just link directly with system ffmpeg libraries.
- g_media_library_is_initialized = true;
+ return true;
#else
StubPathMap paths;
@@ -74,26 +68,9 @@ static bool InitializeMediaLibraryInternal(const base::FilePath& module_dir) {
paths[kModuleFfmpegsumo].push_back(module_dir.Append(
FILE_PATH_LITERAL(DSO_NAME("avformat", AVFORMAT_VERSION))).value());
- g_media_library_is_initialized = InitializeStubs(paths);
+ return InitializeStubs(paths);
#endif // !defined(USE_SYSTEM_FFMPEG)
- return g_media_library_is_initialized;
-}
-
-bool InitializeMediaLibrary(const base::FilePath& base_path) {
- static const bool kMediaLibraryInitialized =
- InitializeMediaLibraryInternal(base_path);
- DCHECK_EQ(kMediaLibraryInitialized, g_media_library_is_initialized);
- return kMediaLibraryInitialized;
-}
-
-void InitializeMediaLibraryForTesting() {
- base::FilePath file_path;
- CHECK(PathService::Get(base::DIR_EXE, &file_path));
- CHECK(InitializeMediaLibrary(file_path));
-}
-
-bool IsMediaLibraryInitialized() {
- return g_media_library_is_initialized;
}
+} // namespace internal
} // namespace media
diff --git a/media/base/media_stub.cc b/media/base/media_stub.cc
index aadfbd1..9efb37e 100644
--- a/media/base/media_stub.cc
+++ b/media/base/media_stub.cc
@@ -4,31 +4,16 @@
#include "media/base/media.h"
-#include "base/logging.h"
-
-#if defined(OS_ANDROID)
-#include "base/android/jni_android.h"
-#include "media/base/android/media_jni_registrar.h"
-#endif
+#include "base/files/file_path.h"
// This file is intended for platforms that don't need to load any media
-// libraries (e.g., Android and iOS).
+// libraries (e.g., iOS).
namespace media {
+namespace internal {
-bool InitializeMediaLibrary(const base::FilePath& module_dir) {
- return true;
-}
-
-void InitializeMediaLibraryForTesting() {
-#if defined(OS_ANDROID)
- // Register JNI bindings for android.
- JNIEnv* env = base::android::AttachCurrentThread();
- RegisterJni(env);
-#endif
-}
-
-bool IsMediaLibraryInitialized() {
+bool InitializeMediaLibraryInternal(const base::FilePath& module_dir) {
return true;
}
+} // namespace internal
} // namespace media
diff --git a/media/base/media_win.cc b/media/base/media_win.cc
index b6602f9..43bf6a7 100644
--- a/media/base/media_win.cc
+++ b/media/base/media_win.cc
@@ -12,56 +12,28 @@
#include <delayimp.h>
#include "base/files/file_path.h"
-#include "base/logging.h"
-#include "base/native_library.h"
-#include "base/path_service.h"
#pragma comment(lib, "delayimp.lib")
namespace media {
+namespace internal {
-// FFmpeg library name.
-static const char kFFmpegDLL[] = "ffmpegsumo.dll";
-
-// Use a global to indicate whether the library has been initialized or not. We
-// rely on function level static initialization in InitializeMediaLibrary() to
-// guarantee this is only set once in a thread safe manner.
-static bool g_media_library_is_initialized = false;
-
-static bool InitializeMediaLibraryInternal(const base::FilePath& base_path) {
- DCHECK(!g_media_library_is_initialized);
-
+bool InitializeMediaLibraryInternal(const base::FilePath& module_dir) {
// LoadLibraryEx(..., LOAD_WITH_ALTERED_SEARCH_PATH) cannot handle
// relative path.
- if (!base_path.IsAbsolute())
+ if (!module_dir.IsAbsolute())
return false;
// Use alternate DLL search path so we don't load dependencies from the
// system path. Refer to http://crbug.com/35857
+ static const char kFFmpegDLL[] = "ffmpegsumo.dll";
HMODULE lib = ::LoadLibraryEx(
- base_path.AppendASCII(kFFmpegDLL).value().c_str(), NULL,
+ module_dir.AppendASCII(kFFmpegDLL).value().c_str(), NULL,
LOAD_WITH_ALTERED_SEARCH_PATH);
// Check that we loaded the library successfully.
- g_media_library_is_initialized = (lib != NULL);
- return g_media_library_is_initialized;
-}
-
-bool InitializeMediaLibrary(const base::FilePath& base_path) {
- static const bool kMediaLibraryInitialized =
- InitializeMediaLibraryInternal(base_path);
- DCHECK_EQ(kMediaLibraryInitialized, g_media_library_is_initialized);
- return kMediaLibraryInitialized;
-}
-
-void InitializeMediaLibraryForTesting() {
- base::FilePath file_path;
- CHECK(PathService::Get(base::DIR_EXE, &file_path));
- CHECK(InitializeMediaLibrary(file_path));
-}
-
-bool IsMediaLibraryInitialized() {
- return g_media_library_is_initialized;
+ return lib != NULL;
}
+} // namespace internal
} // namespace media
diff --git a/media/base/run_all_unittests.cc b/media/base/run_all_unittests.cc
index c413874..899172b 100644
--- a/media/base/run_all_unittests.cc
+++ b/media/base/run_all_unittests.cc
@@ -4,9 +4,15 @@
#include "base/command_line.h"
#include "base/test/test_suite.h"
+#include "build/build_config.h"
#include "media/base/media.h"
#include "media/base/media_switches.h"
+#if defined(OS_ANDROID)
+#include "base/android/jni_android.h"
+#include "media/base/android/media_jni_registrar.h"
+#endif
+
class TestSuiteNoAtExit : public base::TestSuite {
public:
TestSuiteNoAtExit(int argc, char** argv) : TestSuite(argc, argv) {}
@@ -18,6 +24,13 @@ class TestSuiteNoAtExit : public base::TestSuite {
void TestSuiteNoAtExit::Initialize() {
// Run TestSuite::Initialize first so that logging is initialized.
base::TestSuite::Initialize();
+
+#if defined(OS_ANDROID)
+ // Register JNI bindings for android.
+ JNIEnv* env = base::android::AttachCurrentThread();
+ media::RegisterJni(env);
+#endif
+
// Run this here instead of main() to ensure an AtExitManager is already
// present.
media::InitializeMediaLibraryForTesting();