]> git.sesse.net Git - casparcg/blob - modules/ffmpeg/producer/format/flv.cpp
2.0. Updated namespaces.
[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 { namespace ffmpeg {\r
14         \r
15 std::map<std::string, std::string> read_flv_meta_info(const std::string& filename)\r
16 {\r
17         std::map<std::string, std::string>  values;\r
18 \r
19         if(boost::filesystem2::path(filename).extension() != ".flv")\r
20                 return values;\r
21         \r
22         try\r
23         {\r
24                 if(!boost::filesystem2::exists(filename))\r
25                         BOOST_THROW_EXCEPTION(caspar_exception());\r
26         \r
27                 std::fstream fileStream = std::fstream(filename, std::fstream::in);\r
28                 \r
29                 std::vector<char> bytes2(256);\r
30                 fileStream.read(bytes2.data(), bytes2.size());\r
31 \r
32                 auto ptr = bytes2.data();\r
33                 \r
34                 ptr += 27;\r
35                                                 \r
36                 if(std::string(ptr, ptr+10) == "onMetaData")\r
37                 {\r
38                         ptr += 16;\r
39 \r
40                         for(int n = 0; n < 16; ++n)\r
41                         {\r
42                                 char name_size = *ptr++;\r
43 \r
44                                 if(name_size == 0)\r
45                                         break;\r
46 \r
47                                 auto name = std::string(ptr, ptr + name_size);\r
48                                 ptr += name_size;\r
49 \r
50                                 char data_type = *ptr++;\r
51                                 switch(data_type)\r
52                                 {\r
53                                 case 0: // double\r
54                                         {\r
55                                                 static_assert(sizeof(double) == 8, "");\r
56                                                 std::reverse(ptr, ptr+8);\r
57                                                 values[name] = boost::lexical_cast<std::string>(*(double*)(ptr));\r
58                                                 ptr += 9;\r
59 \r
60                                                 break;\r
61                                         }\r
62                                 case 1: // bool\r
63                                         {\r
64                                                 values[name] = boost::lexical_cast<std::string>(*ptr != 0);\r
65                                                 ptr += 2;\r
66 \r
67                                                 break;\r
68                                         }\r
69                                 }\r
70                         }\r
71                 }\r
72         }\r
73         catch(...)\r
74         {\r
75                 CASPAR_LOG_CURRENT_EXCEPTION();\r
76         }\r
77 \r
78     return values;\r
79 }\r
80 \r
81 }}