Index: webrtc/modules/video_coding/codecs/h264/h264_decoder_impl.cc |
diff --git a/webrtc/modules/video_coding/codecs/h264/h264_decoder_impl.cc b/webrtc/modules/video_coding/codecs/h264/h264_decoder_impl.cc |
index 75d2bfa73245a050aa9688e53b0f0fe1538884b0..ea96f25a1e40110750b769334f43bac3a06cf5f2 100644 |
--- a/webrtc/modules/video_coding/codecs/h264/h264_decoder_impl.cc |
+++ b/webrtc/modules/video_coding/codecs/h264/h264_decoder_impl.cc |
@@ -34,8 +34,9 @@ const size_t kYPlaneIndex = 0; |
const size_t kUPlaneIndex = 1; |
const size_t kVPlaneIndex = 2; |
-#if !defined(WEBRTC_CHROMIUM_BUILD) |
+#if defined(WEBRTC_INITIALIZE_FFMPEG) |
+rtc::CriticalSection ffmpeg_init_lock; |
bool ffmpeg_initialized = false; |
// Called by FFmpeg to do mutex operations if initialized using |
@@ -61,10 +62,8 @@ int LockManagerOperation(void** lock, AVLockOp op) |
return -1; |
} |
-// TODO(hbos): Assumed to be called on a single thread. Should DCHECK that |
-// InitializeFFmpeg is only called on one thread or make it thread safe. |
-// See https://bugs.chromium.org/p/webrtc/issues/detail?id=5427. |
void InitializeFFmpeg() { |
+ rtc::CritScope cs(&ffmpeg_init_lock); |
if (!ffmpeg_initialized) { |
if (av_lockmgr_register(LockManagerOperation) < 0) { |
RTC_NOTREACHED() << "av_lockmgr_register failed."; |
@@ -75,7 +74,7 @@ void InitializeFFmpeg() { |
} |
} |
-#endif // !defined(WEBRTC_CHROMIUM_BUILD) |
+#endif // defined(WEBRTC_INITIALIZE_FFMPEG) |
// Called by FFmpeg when it is done with a frame buffer, see AVGetBuffer2. |
void AVFreeBuffer2(void* opaque, uint8_t* data) { |
@@ -179,13 +178,15 @@ int32_t H264DecoderImpl::InitDecode(const VideoCodec* codec_settings, |
return WEBRTC_VIDEO_CODEC_ERR_PARAMETER; |
} |
- // In Chromium FFmpeg will be initialized outside of WebRTC and we should not |
- // attempt to do so ourselves or it will be initialized twice. |
- // TODO(hbos): Put behind a different flag in case non-chromium project wants |
- // to initialize externally. |
- // See https://bugs.chromium.org/p/webrtc/issues/detail?id=5427. |
-#if !defined(WEBRTC_CHROMIUM_BUILD) |
- // Make sure FFmpeg has been initialized. |
+ // FFmpeg must have been initialized (with |av_lockmgr_register| and |
+ // |av_register_all|) before we proceed. |InitializeFFmpeg| does this, which |
+ // makes sense for WebRTC standalone. In other cases, such as Chromium, FFmpeg |
+ // is initialized externally and calling |InitializeFFmpeg| would be |
+ // thread-unsafe and result in FFmpeg being initialized twice, which could |
+ // break other FFmpeg usage. See the |rtc_initialize_ffmpeg| flag. |
+#if defined(WEBRTC_INITIALIZE_FFMPEG) |
+ // Make sure FFmpeg has been initialized. Subsequent |InitializeFFmpeg| calls |
+ // do nothing. |
InitializeFFmpeg(); |
#endif |