]> git.sesse.net Git - casparcg/commitdiff
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches...
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Thu, 18 Aug 2011 11:17:06 +0000 (11:17 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Thu, 18 Aug 2011 11:17:06 +0000 (11:17 +0000)
modules/ffmpeg/producer/format/flv.cpp [new file with mode: 0644]
modules/ffmpeg/producer/format/flv.h [new file with mode: 0644]

diff --git a/modules/ffmpeg/producer/format/flv.cpp b/modules/ffmpeg/producer/format/flv.cpp
new file mode 100644 (file)
index 0000000..3ebcc8e
--- /dev/null
@@ -0,0 +1,70 @@
+#include "../../stdafx.h"\r
+\r
+#include "flv.h"\r
+\r
+#include <common/exception/exceptions.h>\r
+\r
+#include <boost/filesystem.hpp>\r
+\r
+#include <iostream>\r
+\r
+namespace caspar {\r
+       \r
+double to_double(std::vector<char> bytes, bool readInReverse)\r
+{\r
+    if(bytes.size() != 8)\r
+               BOOST_THROW_EXCEPTION(caspar_exception());\r
+\r
+    if (readInReverse)\r
+               std::reverse(bytes.begin(), bytes.end());\r
+       \r
+       static_assert(sizeof(double) == 8, "");\r
+\r
+       double* tmp = (double*)bytes.data();\r
+       \r
+       double val = *tmp;\r
+    return val;\r
+}\r
+\r
+double next_double(std::fstream& fileStream, int offset, int length)\r
+{\r
+    fileStream.seekg(offset, std::ios::cur);\r
+       std::vector<char> bytes(length);\r
+    fileStream.read(bytes.data(), length);\r
+    return to_double(bytes, true);\r
+}\r
+\r
+flv_meta_info read_flv_meta_info(const std::wstring& filename)\r
+{\r
+       if(!boost::filesystem::exists(filename))\r
+               BOOST_THROW_EXCEPTION(caspar_exception());\r
+\r
+       flv_meta_info meta_info;\r
+\r
+    std::fstream fileStream = std::fstream(narrow(filename), std::fstream::in);\r
+       fileStream.seekg(27, std::ios::beg);\r
+       \r
+    std::array<char, 10> bytes;\r
+    fileStream.read(bytes.data(), bytes.size());\r
+\r
+       auto on_meta_data = std::string(bytes.begin(), bytes.end());   \r
+       if (on_meta_data == "onMetaData")\r
+    {\r
+        //// 16 bytes past "onMetaData" is the data for "duration" \r
+        meta_info.duration = next_double(fileStream, 16, 8);\r
+        //// 8 bytes past "duration" is the data for "width"\r
+        meta_info.width = next_double(fileStream, 8, 8);\r
+        //// 9 bytes past "width" is the data for "height"\r
+        meta_info.height = next_double(fileStream, 9, 8);\r
+        //// 16 bytes past "height" is the data for "videoDataRate"\r
+        meta_info.video_data_rate = next_double(fileStream, 16, 8);\r
+        //// 16 bytes past "videoDataRate" is the data for "audioDataRate"\r
+        meta_info.audio_data_rate = next_double(fileStream, 16, 8);\r
+        //// 12 bytes past "audioDataRate" is the data for "frameRate"\r
+        meta_info.frame_rate = next_double(fileStream, 12, 8);\r
+    }\r
+    \r
+    return meta_info;\r
+}\r
+\r
+}
\ No newline at end of file
diff --git a/modules/ffmpeg/producer/format/flv.h b/modules/ffmpeg/producer/format/flv.h
new file mode 100644 (file)
index 0000000..8ec2265
--- /dev/null
@@ -0,0 +1,26 @@
+#pragma once\r
+\r
+namespace caspar {\r
+          \r
+struct flv_meta_info\r
+{\r
+   double duration;\r
+   double width;\r
+   double height;\r
+   double frame_rate;\r
+   double video_data_rate;\r
+   double audio_data_rate;\r
+\r
+   flv_meta_info()\r
+          : duration(0.0)\r
+          , width(0.0)\r
+          , height(0.0)\r
+          , frame_rate(0.0)\r
+          , video_data_rate(0.0)\r
+          , audio_data_rate(0.0)\r
+   {}\r
+};\r
+\r
+flv_meta_info read_flv_meta_info(const std::wstring& filename);\r
+\r
+}
\ No newline at end of file