#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
\r
namespace caspar {\r
\r
-core::video_mode::type get_mode(AVFrame& frame)\r
+core::field_mode::type get_mode(AVFrame& frame)\r
{\r
if(!frame.interlaced_frame)\r
- return core::video_mode::progressive;\r
+ return core::field_mode::progressive;\r
\r
- return frame.top_field_first ? core::video_mode::upper : core::video_mode::lower;\r
+ return frame.top_field_first ? core::field_mode::upper : core::field_mode::lower;\r
}\r
\r
core::pixel_format::type get_pixel_format(PixelFormat pix_fmt)\r
{\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
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