More various bits.
[dcpomatic.git] / src / lib / ffmpeg_decoder.cc
index 3a185bd6af3e9d9aca23d8a5a3fa7868ffd64f8f..fdc5189a6370df5e61ec80c531be8c32a1d98e5a 100644 (file)
@@ -61,6 +61,8 @@ using boost::optional;
 using boost::dynamic_pointer_cast;
 using libdcp::Size;
 
+boost::mutex FFmpegDecoder::_mutex;
+
 FFmpegDecoder::FFmpegDecoder (shared_ptr<const Film> f, shared_ptr<const FFmpegContent> c, bool video, bool audio, bool subtitles, bool video_sync)
        : Decoder (f)
        , VideoDecoder (f)
@@ -92,10 +94,12 @@ FFmpegDecoder::FFmpegDecoder (shared_ptr<const Film> f, shared_ptr<const FFmpegC
 
 FFmpegDecoder::~FFmpegDecoder ()
 {
+       boost::mutex::scoped_lock lm (_mutex);
+       
        if (_audio_codec_context) {
                avcodec_close (_audio_codec_context);
        }
-       
+
        if (_video_codec_context) {
                avcodec_close (_video_codec_context);
        }
@@ -160,6 +164,8 @@ FFmpegDecoder::setup_general ()
 void
 FFmpegDecoder::setup_video ()
 {
+       boost::mutex::scoped_lock lm (_mutex);
+       
        _video_codec_context = _format_context->streams[_video_stream]->codec;
        _video_codec = avcodec_find_decoder (_video_codec_context->codec_id);
 
@@ -175,6 +181,8 @@ FFmpegDecoder::setup_video ()
 void
 FFmpegDecoder::setup_audio ()
 {
+       boost::mutex::scoped_lock lm (_mutex);
+       
        if (!_ffmpeg_content->audio_stream ()) {
                return;
        }
@@ -194,6 +202,8 @@ FFmpegDecoder::setup_audio ()
 void
 FFmpegDecoder::setup_subtitle ()
 {
+       boost::mutex::scoped_lock lm (_mutex);
+       
        if (!_ffmpeg_content->subtitle_stream() || _ffmpeg_content->subtitle_stream()->id >= int (_format_context->nb_streams)) {
                return;
        }