]> git.sesse.net Git - casparcg/blobdiff - modules/ffmpeg/producer/video/video_decoder.cpp
2.0. ffmpeg_producer: Added fix for reading FLV meta-data. FFMPEG reads it incorrectly.
[casparcg] / modules / ffmpeg / producer / video / video_decoder.cpp
index d78361f678db523817fdbb35578c523be52c463f..4b3e2bcd4229525abedc79820886973ee53e5356 100644 (file)
@@ -21,6 +21,7 @@
 \r
 #include "video_decoder.h"\r
 \r
+#include "../format/flv.h"\r
 #include "../util.h"\r
 #include "../filter/filter.h"\r
 \r
@@ -31,6 +32,7 @@
 #include <core/producer/frame/frame_factory.h>\r
 \r
 #include <boost/range/algorithm_ext/push_back.hpp>\r
+#include <boost/filesystem.hpp>\r
 \r
 #include <queue>\r
 \r
@@ -88,12 +90,25 @@ public:
                        // Some files give an invalid time_base numerator, try to fix it.\r
                        if(codec_context_ && codec_context_->time_base.num == 1)\r
                                codec_context_->time_base.num = static_cast<int>(std::pow(10.0, static_cast<int>(std::log10(static_cast<float>(codec_context_->time_base.den)))-1));    \r
-               \r
-                       nb_frames_ = context->streams[index_]->nb_frames;\r
-                       if(nb_frames_ == 0)\r
-                               nb_frames_ = context->streams[index_]->duration;// * context->streams[index_]->time_base.den;\r
+                                       \r
+                       if(boost::filesystem2::path(context->filename).extension() == ".flv")\r
+                       {\r
+                               try\r
+                               {\r
+                                       auto meta = read_flv_meta_info(context->filename);\r
+                                       fps_ = boost::lexical_cast<double>(meta["framerate"]);\r
+                                       nb_frames_ = static_cast<int64_t>(boost::lexical_cast<double>(meta["duration"])*fps_);\r
+                               }\r
+                               catch(...){}\r
+                       }\r
+                       else\r
+                       {\r
+                               fps_ = static_cast<double>(codec_context_->time_base.den) / static_cast<double>(codec_context_->time_base.num);\r
+                               nb_frames_ = context->streams[index_]->nb_frames;\r
+                               if(nb_frames_ == 0)\r
+                                       nb_frames_ = context->streams[index_]->duration;// * context->streams[index_]->time_base.den;\r
+                       }\r
 \r
-                       fps_ = static_cast<double>(codec_context_->time_base.den) / static_cast<double>(codec_context_->time_base.num);\r
                        if(double_rate(filter))\r
                                fps_ *= 2;\r
 \r