]> git.sesse.net Git - casparcg/commitdiff
FFMPEG Producer: Remove audio_decoder_ if it cannot decode frames from the audio...
authorThomas Kaltz <tomkaltz@gmail.com>
Sun, 19 Jan 2014 19:42:24 +0000 (14:42 -0500)
committerThomas Kaltz <tomkaltz@gmail.com>
Sun, 19 Jan 2014 19:42:24 +0000 (14:42 -0500)
Some encoders/converters will create an audio stream but not write packets to it.

modules/ffmpeg/producer/ffmpeg_producer.cpp

index d571307dbd5ccf8c264fc38432431e4828aa63e9..5fcb8671395559afbc33dfc421073206ef80da4e 100644 (file)
@@ -119,6 +119,8 @@ struct ffmpeg_producer : public core::frame_producer
 \r
        int64_t                                                                                                         frame_number_;\r
        uint32_t                                                                                                        file_frame_number_;\r
+\r
+       uint32_t                                                                                                        audio_poll_tries_;\r
                \r
 public:\r
        explicit ffmpeg_producer(const safe_ptr<core::frame_factory>& frame_factory, const std::wstring& filename, FFMPEG_Resource resource_type, const std::wstring& filter, bool loop, uint32_t start, uint32_t length, bool thumbnail_mode, const std::wstring& custom_channel_order, const ffmpeg_producer_params& vid_params)\r
@@ -135,6 +137,7 @@ public:
                , thumbnail_mode_(thumbnail_mode)\r
                , last_frame_(core::basic_frame::empty())\r
                , frame_number_(0)\r
+               , audio_poll_tries_(0)\r
        {\r
                graph_->set_color("frame-time", diagnostics::color(0.1f, 1.0f, 0.1f));\r
                graph_->set_color("underflow", diagnostics::color(0.6f, 0.3f, 0.9f));   \r
@@ -459,10 +462,20 @@ public:
                },\r
                [&]\r
                {               \r
-                       if(!muxer_->audio_ready() && audio_decoder_)            \r
-                               audio = audio_decoder_->poll();         \r
+                       if(!muxer_->audio_ready() && audio_decoder_)\r
+                       {\r
+                               audio = audio_decoder_->poll();\r
+                               if(audio == nullptr)\r
+                                       audio_poll_tries_++;\r
+                       }\r
                });\r
                \r
+               if(audio_decoder_ && audio_poll_tries_ > 7)\r
+               {\r
+                       CASPAR_LOG(warning) << print() << "Failed to get valid packets from audio stream. Removing audio decoder.";\r
+                       audio_decoder_.reset(nullptr);\r
+               }\r
+               \r
                muxer_->push(video, hints);\r
                muxer_->push(audio);\r
 \r