]> git.sesse.net Git - casparcg/blob - modules/ffmpeg/producer/muxer/display_mode.h
2.1.0: -display_mode: Fixed bug in operator<<. -frame_muxer: Fixed mispelling.
[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 #include <ostream>\r
27 \r
28 namespace caspar { namespace ffmpeg {\r
29         \r
30 enum display_mode\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 template< typename CharT, typename TraitsT >\r
44 std::basic_ostream< CharT, TraitsT >& operator<< (std::basic_ostream<CharT, TraitsT>& o, display_mode value)\r
45 {       \r
46         switch(value)\r
47         {\r
48                 case simple:                                            return o << L"simple";\r
49                 case duplicate:                                         return o << L"duplicate";\r
50                 case half:                                                      return o << L"half";\r
51                 case interlace:                                         return o << L"interlace";\r
52                 case deinterlace_bob:                           return o << L"deinterlace_bob";\r
53                 case deinterlace_bob_reinterlace:       return o << L"deinterlace_bob_reinterlace";\r
54                 case deinterlace:                                       return o << L"deinterlace";\r
55                 default:                                                        return o << L"invalid";\r
56         }\r
57 }\r
58 \r
59 static display_mode get_display_mode(const core::field_mode in_mode, double in_fps, const core::field_mode 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 }}