2 * Copyright (c) 2011 Sveriges Television AB <info@casparcg.com>
\r
4 * This file is part of CasparCG (www.casparcg.com).
\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
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
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
19 * Author: Robert Nagy, ronag89@gmail.com
\r
24 #include <core/video_format.h>
\r
26 namespace caspar { namespace ffmpeg {
\r
37 deinterlace_bob_reinterlace,
\r
43 static std::string print(display_mode::type value)
\r
47 case simple: return "simple";
\r
48 case duplicate: return "duplicate";
\r
49 case half: return "half";
\r
50 case interlace: return "interlace";
\r
51 case deinterlace_bob: return "deinterlace_bob";
\r
52 case deinterlace_bob_reinterlace: return "deinterlace_bob_reinterlace";
\r
53 case deinterlace: return "deinterlace";
\r
54 default: return "invalid";
\r
59 static 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
61 static const auto epsilon = 2.0;
\r
63 if(in_fps < 20.0 || in_fps > 80.0)
\r
65 //if(out_mode != core::field_mode::progressive && in_mode == core::field_mode::progressive)
\r
66 // return display_mode::interlace;
\r
68 if(out_mode == core::field_mode::progressive && in_mode != core::field_mode::progressive)
\r
71 return display_mode::deinterlace;
\r
73 return display_mode::deinterlace_bob;
\r
77 if(std::abs(in_fps - out_fps) < epsilon)
\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
84 return display_mode::simple;
\r
86 else if(std::abs(in_fps/2.0 - out_fps) < epsilon)
\r
88 if(in_mode != core::field_mode::progressive)
\r
89 return display_mode::invalid;
\r
91 if(out_mode != core::field_mode::progressive)
\r
92 return display_mode::interlace;
\r
94 return display_mode::half;
\r
96 else if(std::abs(in_fps - out_fps/2.0) < epsilon)
\r
98 if(out_mode != core::field_mode::progressive)
\r
99 return display_mode::invalid;
\r
101 if(in_mode != core::field_mode::progressive)
\r
102 return display_mode::deinterlace_bob;
\r
104 return display_mode::duplicate;
\r
107 return display_mode::invalid;
\r