\r
#include <unordered_map>\r
\r
-namespace caspar {\r
+namespace caspar { namespace ffmpeg {\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)\r
-{\r
- std::vector<char> bytes(8);\r
- fileStream.read(bytes.data(), bytes.size());\r
- fileStream.seekg(1, std::ios::cur);\r
- return to_double(bytes, true);\r
-} \r
-\r
-bool next_bool(std::fstream& fileStream)\r
-{\r
- std::vector<char> bytes(1);\r
- fileStream.read(bytes.data(), bytes.size());\r
- fileStream.seekg(1, std::ios::cur);\r
- return bytes[0] != 0;\r
-}\r
-\r
-std::string next_string(std::fstream& fileStream)\r
-{\r
- std::vector<char> bytes(256, 0);\r
- fileStream.seekg(2, std::ios::cur);\r
- fileStream.getline(bytes.data(), bytes.size(), 0);\r
- return std::string(bytes.begin(), bytes.end());\r
-}\r
-\r
std::map<std::string, std::string> read_flv_meta_info(const std::string& filename)\r
{\r
std::map<std::string, std::string> values;\r
BOOST_THROW_EXCEPTION(caspar_exception());\r
\r
std::fstream fileStream = std::fstream(filename, std::fstream::in);\r
- fileStream.seekg(27, std::ios::beg);\r
- \r
- std::vector<char> bytes(10);\r
- fileStream.read(bytes.data(), bytes.size());\r
\r
- if(std::string(bytes.begin(), bytes.end()) == "onMetaData")\r
+ std::vector<char> bytes2(256);\r
+ fileStream.read(bytes2.data(), bytes2.size());\r
+\r
+ auto ptr = bytes2.data();\r
+ \r
+ ptr += 27;\r
+ \r
+ if(std::string(ptr, ptr+10) == "onMetaData")\r
{\r
- fileStream.seekg(6, std::ios::cur);\r
+ ptr += 16;\r
\r
for(int n = 0; n < 16; ++n)\r
{\r
- char name_size = 0;\r
- fileStream.read(&name_size, 1);\r
+ char name_size = *ptr++;\r
\r
if(name_size == 0)\r
break;\r
\r
- std::vector<char> name(name_size);\r
- fileStream.read(name.data(), name.size());\r
- auto name_str = std::string(name.begin(), name.end());\r
-\r
- char data_type = 0;\r
- fileStream.read(&data_type, 1);\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:\r
- values[name_str] = boost::lexical_cast<std::string>(next_double(fileStream));\r
- break;\r
- case 1:\r
- values[name_str] = boost::lexical_cast<std::string>(next_bool(fileStream));\r
- break;\r
- case 2:\r
- values[name_str] = next_string(fileStream);\r
- break;\r
+ case 0: // double\r
+ {\r
+ static_assert(sizeof(double) == 8, "");\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
return values;\r
}\r
\r
-}
\ No newline at end of file
+}}
\ No newline at end of file