]> git.sesse.net Git - casparcg/commitdiff
Decode audio and video in parallel just like in 2.0
authorHelge Norberg <helge.norberg@svt.se>
Mon, 23 Nov 2015 19:19:16 +0000 (20:19 +0100)
committerHelge Norberg <helge.norberg@svt.se>
Mon, 23 Nov 2015 19:19:16 +0000 (20:19 +0100)
modules/ffmpeg/producer/ffmpeg_producer.cpp

index 7370a5b495c1f6f5a739c11d66e825a70888bcc4..a6b41e07aa5f493012a30c026542b6768a12c9a7 100644 (file)
@@ -485,10 +485,25 @@ public:
        {
                for(int n = 0; n < 32 && muxer_->empty(); ++n)
                {
-                       if(!muxer_->video_ready())
-                               muxer_->push_video(video_decoder_ ? (*video_decoder_)() : create_frame());
-                       if(!muxer_->audio_ready())
-                               muxer_->push_audio(audio_decoder_ ? (*audio_decoder_)() : create_frame());
+                       std::shared_ptr<AVFrame> video;
+                       std::shared_ptr<AVFrame> audio;
+                       bool needs_video = !muxer_->video_ready();
+                       bool needs_audio = !muxer_->audio_ready();
+
+                       tbb::parallel_invoke(
+                                       [&]
+                                       {
+                                               if (needs_video)
+                                                       video = video_decoder_ ? (*video_decoder_)() : create_frame();
+                                       },
+                                       [&]
+                                       {
+                                               if (needs_audio)
+                                                       audio = audio_decoder_ ? (*audio_decoder_)() : create_frame();
+                                       });
+
+                       muxer_->push_video(video);
+                       muxer_->push_audio(audio);
                }
 
                graph_->set_text(print());