\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