]> git.sesse.net Git - casparcg/blob - modules/ffmpeg/producer/format/flv.cpp
2.0. ffmpeg_producer: Fixed FLV meta-data reading.
[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 \r
19         auto tmp2 = fileStream.tellg();\r
20         tmp2;\r
21 \r
22     fileStream.read(bytes.data(), 8);\r
23         \r
24         auto tmp3 = fileStream.gcount();\r
25         tmp3;\r
26 \r
27         tmp2 = fileStream.tellg();\r
28         tmp2;\r
29 \r
30         fileStream.seekg(1, std::ios::cur);\r
31         \r
32         tmp2 = fileStream.tellg();\r
33         tmp2;\r
34 \r
35         std::reverse(bytes.begin(), bytes.end());\r
36         double* tmp = (double*)bytes.data();\r
37         \r
38     return *tmp;\r
39\r
40 \r
41 bool next_bool(std::fstream& fileStream)\r
42 {\r
43         std::vector<char> bytes(1);\r
44     fileStream.read(bytes.data(), bytes.size());\r
45         fileStream.seekg(1, std::ios::cur);\r
46     return bytes[0] != 0;\r
47 }\r
48 \r
49 std::map<std::string, std::string> read_flv_meta_info(const std::string& filename)\r
50 {\r
51         std::map<std::string, std::string>  values;\r
52 \r
53         if(boost::filesystem2::path(filename).extension() != ".flv")\r
54                 return values;\r
55         \r
56         try\r
57         {\r
58                 if(!boost::filesystem2::exists(filename))\r
59                         BOOST_THROW_EXCEPTION(caspar_exception());\r
60         \r
61                 std::fstream fileStream = std::fstream(filename, std::fstream::in);\r
62                 \r
63                 std::vector<char> bytes2(256);\r
64                 fileStream.read(bytes2.data(), bytes2.size());\r
65 \r
66                 auto ptr = bytes2.data();\r
67                 \r
68                 ptr += 27;\r
69                                                 \r
70                 if(std::string(ptr, ptr+10) == "onMetaData")\r
71                 {\r
72                         ptr += 16;\r
73 \r
74                         for(int n = 0; n < 16; ++n)\r
75                         {\r
76                                 char name_size = *ptr++;\r
77 \r
78                                 if(name_size == 0)\r
79                                         break;\r
80 \r
81                                 auto name = std::string(ptr, ptr + name_size);\r
82                                 ptr += name_size;\r
83 \r
84                                 char data_type = *ptr++;\r
85                                 switch(data_type)\r
86                                 {\r
87                                 case 0:\r
88                                         {\r
89                                                 std::reverse(ptr, ptr+8);\r
90                                                 values[name] = boost::lexical_cast<std::string>(*(double*)(ptr));\r
91                                                 ptr += 9;\r
92 \r
93                                                 break;\r
94                                         }\r
95                                 case 1:\r
96                                         {\r
97                                                 values[name] = boost::lexical_cast<std::string>(*ptr != 0);\r
98                                                 ptr += 2;\r
99 \r
100                                                 break;\r
101                                         }\r
102                                 }\r
103                         }\r
104                 }\r
105         }\r
106         catch(...)\r
107         {\r
108                 CASPAR_LOG_CURRENT_EXCEPTION();\r
109         }\r
110 \r
111     return values;\r
112 }\r
113 \r
114 }