]> git.sesse.net Git - casparcg/blob - modules/ffmpeg/producer/format/flv.cpp
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches...
[casparcg] / modules / ffmpeg / producer / format / flv.cpp
1 #include "../../stdafx.h"\r
2 \r
3 #include "flv.h"\r
4 \r
5 #include <common/exception/exceptions.h>\r
6 \r
7 #include <boost/filesystem.hpp>\r
8 \r
9 #include <iostream>\r
10 \r
11 #include <unordered_map>\r
12 \r
13 namespace caspar {\r
14         \r
15 double next_double(std::fstream& fileStream)\r
16 {\r
17         std::vector<char> bytes(8);\r
18     fileStream.read(bytes.data(), bytes.size());\r
19         fileStream.seekg(1, std::ios::cur);\r
20 \r
21         std::reverse(bytes.begin(), bytes.end());\r
22         double* tmp = (double*)bytes.data();\r
23 \r
24     return *tmp;\r
25\r
26 \r
27 bool next_bool(std::fstream& fileStream)\r
28 {\r
29         std::vector<char> bytes(1);\r
30     fileStream.read(bytes.data(), bytes.size());\r
31         fileStream.seekg(1, std::ios::cur);\r
32     return bytes[0] != 0;\r
33 }\r
34 \r
35 std::string next_string(std::fstream& fileStream)\r
36 {\r
37         std::vector<char> bytes(256, 0);\r
38         fileStream.seekg(2, std::ios::cur);\r
39     fileStream.getline(bytes.data(), bytes.size(), 0);\r
40     return std::string(bytes.begin(), bytes.end());\r
41 }\r
42 \r
43 std::map<std::string, std::string> read_flv_meta_info(const std::string& filename)\r
44 {\r
45         std::map<std::string, std::string>  values;\r
46 \r
47         if(boost::filesystem2::path(filename).extension() != ".flv")\r
48                 return values;\r
49         \r
50         try\r
51         {\r
52                 if(!boost::filesystem2::exists(filename))\r
53                         BOOST_THROW_EXCEPTION(caspar_exception());\r
54         \r
55                 std::fstream fileStream = std::fstream(filename, std::fstream::in);\r
56                 fileStream.seekg(27, std::ios::beg);\r
57         \r
58                 std::vector<char> bytes(10);\r
59                 fileStream.read(bytes.data(), bytes.size());\r
60                 \r
61                 if(std::string(bytes.begin(), bytes.end()) == "onMetaData")\r
62                 {\r
63                         fileStream.seekg(6, std::ios::cur);\r
64 \r
65                         for(int n = 0; n < 16; ++n)\r
66                         {\r
67                                 char name_size = 0;\r
68                                 fileStream.read(&name_size, 1);\r
69 \r
70                                 if(name_size == 0)\r
71                                         break;\r
72 \r
73                                 std::vector<char> name(name_size);\r
74                                 fileStream.read(name.data(), name.size());\r
75                                 auto name_str = std::string(name.begin(), name.end());\r
76 \r
77                                 char data_type = 0;\r
78                                 fileStream.read(&data_type, 1);\r
79 \r
80                                 switch(data_type)\r
81                                 {\r
82                                 case 0:\r
83                                         values[name_str] = boost::lexical_cast<std::string>(next_double(fileStream));\r
84                                         break;\r
85                                 case 1:\r
86                                         values[name_str] = boost::lexical_cast<std::string>(next_bool(fileStream));\r
87                                         break;\r
88                                 case 2:\r
89                                         values[name_str] = next_string(fileStream);\r
90                                         break;\r
91                                 }\r
92                         }\r
93                 }\r
94         }\r
95         catch(...)\r
96         {\r
97                 CASPAR_LOG_CURRENT_EXCEPTION();\r
98         }\r
99 \r
100     return values;\r
101 }\r
102 \r
103 }