| Index: media/filters/ffmpeg_glue.cc
|
| diff --git a/media/filters/ffmpeg_glue.cc b/media/filters/ffmpeg_glue.cc
|
| index 71e92b43ef3392a7cf6d994a86c60f2b5f648dfb..e3b227b2ac5140f74f9057090d0bafdb26429961 100644
|
| --- a/media/filters/ffmpeg_glue.cc
|
| +++ b/media/filters/ffmpeg_glue.cc
|
| @@ -4,6 +4,7 @@
|
|
|
| #include "media/filters/ffmpeg_glue.h"
|
|
|
| +#include "base/lazy_instance.h"
|
| #include "base/logging.h"
|
| #include "base/synchronization/lock.h"
|
| #include "media/ffmpeg/ffmpeg_common.h"
|
| @@ -83,23 +84,42 @@ static int LockManagerOperation(void** lock, enum AVLockOp op) {
|
| return 1;
|
| }
|
|
|
| -static bool InitializeFFmpegInternal() {
|
| - // Before doing anything disable logging as it interferes with layout tests.
|
| - av_log_set_level(AV_LOG_QUIET);
|
| +// FFmpeg must only be initialized once, so use a LazyInstance to ensure this.
|
| +class FFmpegInitializer {
|
| + public:
|
| + bool initialized() { return initialized_; }
|
|
|
| - // Register our protocol glue code with FFmpeg.
|
| - if (av_lockmgr_register(&LockManagerOperation) != 0)
|
| - return false;
|
| + private:
|
| + friend struct base::DefaultLazyInstanceTraits<FFmpegInitializer>;
|
|
|
| - // Now register the rest of FFmpeg.
|
| - av_register_all();
|
| - return true;
|
| -}
|
| + FFmpegInitializer()
|
| + : initialized_(false) {
|
| + // Before doing anything disable logging as it interferes with layout tests.
|
| + av_log_set_level(AV_LOG_QUIET);
|
| +
|
| + // Register our protocol glue code with FFmpeg.
|
| + if (av_lockmgr_register(&LockManagerOperation) != 0)
|
| + return;
|
| +
|
| + // Now register the rest of FFmpeg.
|
| + av_register_all();
|
| +
|
| + initialized_ = true;
|
| + }
|
| +
|
| + ~FFmpegInitializer() {
|
| + NOTREACHED() << "FFmpegInitializer should be leaky!";
|
| + }
|
| +
|
| + bool initialized_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(FFmpegInitializer);
|
| +};
|
|
|
| void FFmpegGlue::InitializeFFmpeg() {
|
| - // FFmpeg only needs to be initialized once.
|
| - static const bool kStatus = InitializeFFmpegInternal();
|
| - CHECK(kStatus);
|
| + static base::LazyInstance<FFmpegInitializer>::Leaky li =
|
| + LAZY_INSTANCE_INITIALIZER;
|
| + CHECK(li.Get().initialized());
|
| }
|
|
|
| FFmpegGlue::FFmpegGlue(FFmpegURLProtocol* protocol)
|
|
|