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
28 namespace caspar { namespace ffmpeg {
\r
37 deinterlace_bob_reinterlace,
\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
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
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
63 static const auto epsilon = 2.0;
\r
65 if(in_fps < 20.0 || in_fps > 80.0)
\r
67 //if(out_mode != core::field_mode::progressive && in_mode == core::field_mode::progressive)
\r
68 // return display_mode::interlace;
\r
70 if(out_mode == core::field_mode::progressive && in_mode != core::field_mode::progressive)
\r
73 return display_mode::deinterlace;
\r
75 return display_mode::deinterlace_bob;
\r
79 if(std::abs(in_fps - out_fps) < epsilon)
\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
86 return display_mode::simple;
\r
88 else if(std::abs(in_fps/2.0 - out_fps) < epsilon)
\r
90 if(in_mode != core::field_mode::progressive)
\r
91 return display_mode::invalid;
\r
93 if(out_mode != core::field_mode::progressive)
\r
94 return display_mode::interlace;
\r
96 return display_mode::half;
\r
98 else if(std::abs(in_fps - out_fps/2.0) < epsilon)
\r
100 if(out_mode != core::field_mode::progressive)
\r
101 return display_mode::invalid;
\r
103 if(in_mode != core::field_mode::progressive)
\r
104 return display_mode::deinterlace_bob;
\r
106 return display_mode::duplicate;
\r
109 return display_mode::invalid;
\r