]> git.sesse.net Git - casparcg/blobdiff - modules/ffmpeg/producer/util.cpp
2.0. Fixed rendering stalls caused by ogl frame allocation delays.
[casparcg] / modules / ffmpeg / producer / util.cpp
index 6d67bfaf200441a3f73e699ba33f95c89ebdb737..2a2595680536ea0097dcf1aa7c3a40291f229087 100644 (file)
@@ -140,7 +140,7 @@ safe_ptr<core::write_frame> make_write_frame(const void* tag, const safe_ptr<AVF
        {\r
                auto pix_fmt = static_cast<PixelFormat>(decoded_frame->format);\r
 \r
-               auto write = frame_factory->create_frame(tag, desc.pix_fmt != core::pixel_format::invalid ? desc : get_pixel_format_desc(PIX_FMT_BGRA, width, height));\r
+               auto write = frame_factory->create_frame(tag, get_pixel_format_desc(PIX_FMT_BGRA, width, height));\r
                write->set_type(get_mode(*decoded_frame));\r
 \r
                std::shared_ptr<SwsContext> sws_context;\r
@@ -252,6 +252,21 @@ void fix_meta_data(AVFormatContext& context)
                                video_context.time_base.den = static_cast<int>(video_stream.nb_frames*100000);\r
                        }\r
                }\r
+\r
+               if(audio_index > -1) // Check for invalid double frame-rate\r
+               {\r
+                       auto& audio_context = *context.streams[audio_index]->codec;\r
+                       auto& audio_stream  = *context.streams[audio_index];\r
+\r
+                       double duration_sec = audio_stream.duration / static_cast<double>(audio_context.sample_rate);\r
+                       double fps = static_cast<double>(video_context.time_base.den) / static_cast<double>(video_context.time_base.num);\r
+\r
+                       double fps_nb_frames    = static_cast<double>(duration_sec*fps);\r
+                       double stream_nb_frames =  static_cast<double>(video_stream.nb_frames);\r
+                       double diff = std::abs(fps_nb_frames - stream_nb_frames*2.0);\r
+                       if(diff < fps_nb_frames*0.05)\r
+                               video_context.time_base.num *= 2;\r
+               }\r
        }\r
 \r
        double fps = static_cast<double>(video_context.time_base.den) / static_cast<double>(video_context.time_base.num);\r