]> git.sesse.net Git - casparcg/blob - modules/ffmpeg/producer/muxer/display_mode.h
2.0.2: Updated file info headers.
[casparcg] / modules / ffmpeg / producer / muxer / display_mode.h
1 /*\r
2 * Copyright (c) 2011 Sveriges Television AB <info@casparcg.com>\r
3 *\r
4 * This file is part of CasparCG (www.casparcg.com).\r
5 *\r
6 * CasparCG is free software: you can redistribute it and/or modify\r
7 * it under the terms of the GNU General Public License as published by\r
8 * the Free Software Foundation, either version 3 of the License, or\r
9 * (at your option) any later version.\r
10 *\r
11 * CasparCG is distributed in the hope that it will be useful,\r
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14 * GNU General Public License for more details.\r
15 *\r
16 * You should have received a copy of the GNU General Public License\r
17 * along with CasparCG. If not, see <http://www.gnu.org/licenses/>.\r
18 *\r
19 * Author: Robert Nagy, ronag89@gmail.com\r
20 */\r
21 \r
22 #pragma once\r
23 \r
24 #include <core/video_format.h>\r
25 \r
26 namespace caspar { namespace ffmpeg {\r
27         \r
28 struct display_mode\r
29 {\r
30         enum type\r
31         {\r
32                 simple,\r
33                 duplicate,\r
34                 half,\r
35                 interlace,\r
36                 deinterlace_bob,\r
37                 deinterlace_bob_reinterlace,\r
38                 deinterlace,\r
39                 count,\r
40                 invalid\r
41         };\r
42 \r
43         static std::wstring print(display_mode::type value)\r
44         {\r
45                 switch(value)\r
46                 {\r
47                         case simple:                                            return L"simple";\r
48                         case duplicate:                                         return L"duplicate";\r
49                         case half:                                                      return L"half";\r
50                         case interlace:                                         return L"interlace";\r
51                         case deinterlace_bob:                           return L"deinterlace_bob";\r
52                         case deinterlace_bob_reinterlace:       return L"deinterlace_bob_reinterlace";\r
53                         case deinterlace:                                       return L"deinterlace";\r
54                         default:                                                        return L"invalid";\r
55                 }\r
56         }\r
57 };\r
58 \r
59 display_mode::type get_display_mode(const core::field_mode::type in_mode, double in_fps, const core::field_mode::type out_mode, double out_fps)\r
60 {               \r
61         static const auto epsilon = 2.0;\r
62 \r
63         if(in_fps < 20.0 || in_fps > 80.0)\r
64         {\r
65                 //if(out_mode != core::field_mode::progressive && in_mode == core::field_mode::progressive)\r
66                 //      return display_mode::interlace;\r
67                 \r
68                 if(out_mode == core::field_mode::progressive && in_mode != core::field_mode::progressive)\r
69                 {\r
70                         if(in_fps < 35.0)\r
71                                 return display_mode::deinterlace;\r
72                         else\r
73                                 return display_mode::deinterlace_bob;\r
74                 }\r
75         }\r
76 \r
77         if(std::abs(in_fps - out_fps) < epsilon)\r
78         {\r
79                 if(in_mode != core::field_mode::progressive && out_mode == core::field_mode::progressive)\r
80                         return display_mode::deinterlace;\r
81                 //else if(in_mode == core::field_mode::progressive && out_mode != core::field_mode::progressive)\r
82                 //      simple(); // interlace_duplicate();\r
83                 else\r
84                         return display_mode::simple;\r
85         }\r
86         else if(std::abs(in_fps/2.0 - out_fps) < epsilon)\r
87         {\r
88                 if(in_mode != core::field_mode::progressive)\r
89                         return display_mode::invalid;\r
90 \r
91                 if(out_mode != core::field_mode::progressive)\r
92                         return display_mode::interlace;\r
93                 else\r
94                         return display_mode::half;\r
95         }\r
96         else if(std::abs(in_fps - out_fps/2.0) < epsilon)\r
97         {\r
98                 if(out_mode != core::field_mode::progressive)\r
99                         return display_mode::invalid;\r
100 \r
101                 if(in_mode != core::field_mode::progressive)\r
102                         return display_mode::deinterlace_bob;\r
103                 else\r
104                         return display_mode::duplicate;\r
105         }\r
106 \r
107         return display_mode::invalid;\r
108 }\r
109 \r
110 }}