]> git.sesse.net Git - casparcg/blobdiff - modules/ffmpeg/producer/util.cpp
2.0. Updated namespaces.
[casparcg] / modules / ffmpeg / producer / util.cpp
index 5336aca50630a1741d8fb350f686ae23e854461e..79fae01a8cbb9bcae4b8ed949ff3fe1a8dae64dc 100644 (file)
@@ -7,7 +7,7 @@
 #include <tbb/concurrent_unordered_map.h>\r
 #include <tbb/concurrent_queue.h>\r
 \r
-#include <core/producer/frame/image_transform.h>\r
+#include <core/producer/frame/frame_transform.h>\r
 #include <core/producer/frame/frame_factory.h>\r
 #include <core/producer/frame_producer.h>\r
 #include <core/mixer/write_frame.h>\r
@@ -33,7 +33,7 @@ extern "C"
 #pragma warning (pop)\r
 #endif\r
 \r
-namespace caspar {\r
+namespace caspar { namespace ffmpeg {\r
 \r
 core::field_mode::type get_mode(AVFrame& frame)\r
 {\r
@@ -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
@@ -272,4 +287,4 @@ void fix_meta_data(AVFormatContext& context)
        video_context.time_base.den = static_cast<int>(closest_fps*1000000.0);\r
 }\r
 \r
-}
\ No newline at end of file
+}}
\ No newline at end of file