]> git.sesse.net Git - casparcg/blob - modules/ffmpeg/producer/muxer/display_mode.h
2.1.0: Some mayor refactoring.
[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:                                            o << L"simple";\r
49                 case duplicate:                                         o << L"duplicate";\r
50                 case half:                                                      o << L"half";\r
51                 case interlace:                                         o << L"interlace";\r
52                 case deinterlace_bob:                           o << L"deinterlace_bob";\r
53                 case deinterlace_bob_reinterlace:       o << L"deinterlace_bob_reinterlace";\r
54                 case deinterlace:                                       o << L"deinterlace";\r
55                 default:                                                        o << L"invalid";\r
56         }\r
57         return o;\r
58 }\r
59 \r
60 \r
61 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
62 {               \r
63         static const auto epsilon = 2.0;\r
64 \r
65         if(in_fps < 20.0 || in_fps > 80.0)\r
66         {\r
67                 //if(out_mode != core::field_mode::progressive && in_mode == core::field_mode::progressive)\r
68                 //      return display_mode::interlace;\r
69                 \r
70                 if(out_mode == core::field_mode::progressive && in_mode != core::field_mode::progressive)\r
71                 {\r
72                         if(in_fps < 35.0)\r
73                                 return display_mode::deinterlace;\r
74                         else\r
75                                 return display_mode::deinterlace_bob;\r
76                 }\r
77         }\r
78 \r
79         if(std::abs(in_fps - out_fps) < epsilon)\r
80         {\r
81                 if(in_mode != core::field_mode::progressive && out_mode == core::field_mode::progressive)\r
82                         return display_mode::deinterlace;\r
83                 //else if(in_mode == core::field_mode::progressive && out_mode != core::field_mode::progressive)\r
84                 //      simple(); // interlace_duplicate();\r
85                 else\r
86                         return display_mode::simple;\r
87         }\r
88         else if(std::abs(in_fps/2.0 - out_fps) < epsilon)\r
89         {\r
90                 if(in_mode != core::field_mode::progressive)\r
91                         return display_mode::invalid;\r
92 \r
93                 if(out_mode != core::field_mode::progressive)\r
94                         return display_mode::interlace;\r
95                 else\r
96                         return display_mode::half;\r
97         }\r
98         else if(std::abs(in_fps - out_fps/2.0) < epsilon)\r
99         {\r
100                 if(out_mode != core::field_mode::progressive)\r
101                         return display_mode::invalid;\r
102 \r
103                 if(in_mode != core::field_mode::progressive)\r
104                         return display_mode::deinterlace_bob;\r
105                 else\r
106                         return display_mode::duplicate;\r
107         }\r
108 \r
109         return display_mode::invalid;\r
110 }\r
111 \r
112 }}