]> git.sesse.net Git - casparcg/blob - modules/ffmpeg/producer/muxer/display_mode.h
2.0.2: MAYOR CHANGES => needs testing
[casparcg] / modules / ffmpeg / producer / muxer / display_mode.h
1 #pragma once\r
2 \r
3 #include <core/video_format.h>\r
4 \r
5 namespace caspar { namespace ffmpeg {\r
6         \r
7 struct display_mode\r
8 {\r
9         enum type\r
10         {\r
11                 simple,\r
12                 duplicate,\r
13                 half,\r
14                 interlace,\r
15                 deinterlace_bob,\r
16                 deinterlace_bob_reinterlace,\r
17                 deinterlace,\r
18                 count,\r
19                 invalid\r
20         };\r
21 \r
22         static std::wstring print(display_mode::type value)\r
23         {\r
24                 switch(value)\r
25                 {\r
26                         case simple:                                            return L"simple";\r
27                         case duplicate:                                         return L"duplicate";\r
28                         case half:                                                      return L"half";\r
29                         case interlace:                                         return L"interlace";\r
30                         case deinterlace_bob:                           return L"deinterlace_bob";\r
31                         case deinterlace_bob_reinterlace:       return L"deinterlace_bob_reinterlace";\r
32                         case deinterlace:                                       return L"deinterlace";\r
33                         default:                                                        return L"invalid";\r
34                 }\r
35         }\r
36 };\r
37 \r
38 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
39 {               \r
40         static const auto epsilon = 2.0;\r
41 \r
42         if(in_fps < 20.0 || in_fps > 80.0)\r
43         {\r
44                 //if(out_mode != core::field_mode::progressive && in_mode == core::field_mode::progressive)\r
45                 //      return display_mode::interlace;\r
46                 \r
47                 if(out_mode == core::field_mode::progressive && in_mode != core::field_mode::progressive)\r
48                 {\r
49                         if(in_fps < 35.0)\r
50                                 return display_mode::deinterlace;\r
51                         else\r
52                                 return display_mode::deinterlace_bob;\r
53                 }\r
54         }\r
55 \r
56         if(std::abs(in_fps - out_fps) < epsilon)\r
57         {\r
58                 if(in_mode != core::field_mode::progressive && out_mode == core::field_mode::progressive)\r
59                         return display_mode::deinterlace;\r
60                 //else if(in_mode == core::field_mode::progressive && out_mode != core::field_mode::progressive)\r
61                 //      simple(); // interlace_duplicate();\r
62                 else\r
63                         return display_mode::simple;\r
64         }\r
65         else if(std::abs(in_fps/2.0 - out_fps) < epsilon)\r
66         {\r
67                 if(in_mode != core::field_mode::progressive)\r
68                         return display_mode::invalid;\r
69 \r
70                 if(out_mode != core::field_mode::progressive)\r
71                         return display_mode::interlace;\r
72                 else\r
73                         return display_mode::half;\r
74         }\r
75         else if(std::abs(in_fps - out_fps/2.0) < epsilon)\r
76         {\r
77                 if(out_mode != core::field_mode::progressive)\r
78                         return display_mode::invalid;\r
79 \r
80                 if(in_mode != core::field_mode::progressive)\r
81                         return display_mode::deinterlace_bob;\r
82                 else\r
83                         return display_mode::duplicate;\r
84         }\r
85 \r
86         return display_mode::invalid;\r
87 }\r
88 \r
89 }}