]> git.sesse.net Git - casparcg/blobdiff - modules/ffmpeg/producer/format/flv.cpp
2.0. ffmpeg_producer: Tweaked input buffer params.
[casparcg] / modules / ffmpeg / producer / format / flv.cpp
index 3ebcc8ec0f330f2764506357b5d96cf3e09b6045..21b917a6581c439a5fb82e09e3a67d7d87dfc7c7 100644 (file)
@@ -8,63 +8,73 @@
 \r
 #include <iostream>\r
 \r
+#include <unordered_map>\r
+\r
 namespace caspar {\r
        \r
-double to_double(std::vector<char> bytes, bool readInReverse)\r
+std::map<std::string, std::string> read_flv_meta_info(const std::string& filename)\r
 {\r
-    if(bytes.size() != 8)\r
-               BOOST_THROW_EXCEPTION(caspar_exception());\r
+       std::map<std::string, std::string>  values;\r
 \r
-    if (readInReverse)\r
-               std::reverse(bytes.begin(), bytes.end());\r
+       if(boost::filesystem2::path(filename).extension() != ".flv")\r
+               return values;\r
        \r
-       static_assert(sizeof(double) == 8, "");\r
-\r
-       double* tmp = (double*)bytes.data();\r
+       try\r
+       {\r
+               if(!boost::filesystem2::exists(filename))\r
+                       BOOST_THROW_EXCEPTION(caspar_exception());\r
        \r
-       double val = *tmp;\r
-    return val;\r
-}\r
+               std::fstream fileStream = std::fstream(filename, std::fstream::in);\r
+               \r
+               std::vector<char> bytes2(256);\r
+               fileStream.read(bytes2.data(), bytes2.size());\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
+               auto ptr = bytes2.data();\r
+               \r
+               ptr += 27;\r
+                                               \r
+               if(std::string(ptr, ptr+10) == "onMetaData")\r
+               {\r
+                       ptr += 16;\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
+                       for(int n = 0; n < 16; ++n)\r
+                       {\r
+                               char name_size = *ptr++;\r
 \r
-       flv_meta_info meta_info;\r
+                               if(name_size == 0)\r
+                                       break;\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
+                               auto name = std::string(ptr, ptr + name_size);\r
+                               ptr += name_size;\r
+\r
+                               char data_type = *ptr++;\r
+                               switch(data_type)\r
+                               {\r
+                               case 0: // double\r
+                                       {\r
+                                               std::reverse(ptr, ptr+8);\r
+                                               values[name] = boost::lexical_cast<std::string>(*(double*)(ptr));\r
+                                               ptr += 9;\r
+\r
+                                               break;\r
+                                       }\r
+                               case 1: // bool\r
+                                       {\r
+                                               values[name] = boost::lexical_cast<std::string>(*ptr != 0);\r
+                                               ptr += 2;\r
+\r
+                                               break;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+       catch(...)\r
+       {\r
+               CASPAR_LOG_CURRENT_EXCEPTION();\r
+       }\r
+\r
+    return values;\r
 }\r
 \r
 }
\ No newline at end of file