-/*\r
-* Copyright (c) 2011 Sveriges Television AB <info@casparcg.com>\r
-*\r
-* This file is part of CasparCG (www.casparcg.com).\r
-*\r
-* CasparCG is free software: you can redistribute it and/or modify\r
-* it under the terms of the GNU General Public License as published by\r
-* the Free Software Foundation, either version 3 of the License, or\r
-* (at your option) any later version.\r
-*\r
-* CasparCG is distributed in the hope that it will be useful,\r
-* but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
-* GNU General Public License for more details.\r
-*\r
-* You should have received a copy of the GNU General Public License\r
-* along with CasparCG. If not, see <http://www.gnu.org/licenses/>.\r
-*\r
-* Author: Robert Nagy, ronag89@gmail.com\r
-*/\r
-\r
-#pragma once\r
-\r
-#include <vector>\r
-#include <string>\r
-\r
-namespace caspar { namespace core {\r
- \r
-struct video_format \r
-{ \r
- enum type\r
- {\r
- pal = 0,\r
- ntsc,\r
- x576p2500,\r
- x720p2500,\r
- x720p5000,\r
- x720p5994,\r
- x720p6000,\r
- x1080p2397,\r
- x1080p2400,\r
- x1080i5000,\r
- x1080i5994,\r
- x1080i6000,\r
- x1080p2500,\r
- x1080p2997,\r
- x1080p3000,\r
- x1080p5000,\r
- invalid,\r
- count\r
- };\r
-};\r
-\r
-struct field_mode \r
-{ \r
- enum type\r
- {\r
- empty = 0,\r
- lower = 1,\r
- upper = 2,\r
- progressive = 3 // NOTE: progressive == lower | upper;\r
- };\r
-\r
- static std::wstring print(field_mode::type value)\r
- {\r
- switch(value)\r
- {\r
- case progressive:\r
- return L"progressive"; \r
- case lower:\r
- return L"lower";\r
- case upper:\r
- return L"upper";\r
- default:\r
- return L"invalid";\r
- }\r
- }\r
-};\r
-\r
-struct video_format_desc\r
-{\r
- video_format::type format; // video output format\r
-\r
- int width; // output frame width\r
- int height; // output frame height\r
- int square_width;\r
- int square_height;\r
- field_mode::type field_mode; // progressive, interlaced upper field first, interlaced lower field first\r
- double fps; // actual framerate, e.g. i50 = 25 fps, p50 = 50 fps\r
- int time_scale;\r
- int duration;\r
- int field_count;\r
- int size; // output frame size in bytes \r
- std::wstring name; // name of output format\r
-\r
- int audio_sample_rate;\r
- int audio_channels;\r
- std::vector<int> audio_cadence;\r
-\r
- static const video_format_desc& get(video_format::type format);\r
- static const video_format_desc& get(const std::wstring& name);\r
- \r
- bool operator==(const video_format_desc& lhs)\r
- {\r
- return format == lhs.format;\r
- }\r
-\r
- bool operator!=(const video_format_desc& lhs)\r
- {\r
- return !(*this == lhs);\r
- }\r
-};\r
-\r
-inline std::wostream& operator<<(std::wostream& out, const video_format_desc& format_desc)\r
-{\r
- out << format_desc.name.c_str();\r
- return out;\r
-}\r
-\r
-}}
\ No newline at end of file
+/*
+* Copyright (c) 2011 Sveriges Television AB <info@casparcg.com>
+*
+* This file is part of CasparCG (www.casparcg.com).
+*
+* CasparCG is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* CasparCG is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with CasparCG. If not, see <http://www.gnu.org/licenses/>.
+*
+* Author: Robert Nagy, ronag89@gmail.com
+*/
+
+#pragma once
+
+#include <vector>
+#include <string>
+#include <cstddef>
+
+#include <common/enum_class.h>
+
+#include <boost/rational.hpp>
+
+namespace caspar { namespace core {
+
+enum class video_format
+{
+ pal,
+ ntsc,
+ x576p2500,
+ x720p2500,
+ x720p5000,
+ x720p2398,
+ x720p2400,
+ x720p2997,
+ x720p5994,
+ x720p3000,
+ x720p6000,
+ x1080p2398,
+ x1080p2400,
+ x1080i5000,
+ x1080i5994,
+ x1080i6000,
+ x1080p2500,
+ x1080p2997,
+ x1080p3000,
+ x1080p5000,
+ x1080p5994,
+ x1080p6000,
+ x1556p2398,
+ x1556p2400,
+ x1556p2500,
+ dci1080p2398,
+ dci1080p2400,
+ dci1080p2500,
+ x2160p2398,
+ x2160p2400,
+ x2160p2500,
+ x2160p2997,
+ x2160p3000,
+ dci2160p2398,
+ dci2160p2400,
+ dci2160p2500,
+ invalid,
+ count
+};
+
+enum class field_mode
+{
+ empty = 0,
+ lower = 1,
+ upper = 2,
+ progressive = 3 // NOTE: progressive == lower | upper;
+};
+ENUM_ENABLE_BITWISE(field_mode);
+//static_assert((field_mode::lower | field_mode::upper) == field_mode::progressive, "");
+
+struct video_format_desc final
+{
+ video_format format;
+
+ int width;
+ int height;
+ int square_width;
+ int square_height;
+ core::field_mode field_mode; // progressive, interlaced upper field first, interlaced lower field first
+ double fps; // actual framerate = duration/time_scale, e.g. i50 = 25 fps, p50 = 50 fps
+ boost::rational<int> framerate;
+ int time_scale;
+ int duration;
+ int field_count;
+ std::size_t size; // frame size in bytes
+ std::wstring name; // name of output format
+
+ int audio_sample_rate;
+ std::vector<int> audio_cadence; // rotating optimal number of samples per frame
+
+ video_format_desc(video_format format,
+ int width,
+ int height,
+ int square_width,
+ int square_height,
+ core::field_mode field_mode,
+ int time_scale,
+ int duration,
+ const std::wstring& name,
+ const std::vector<int>& audio_cadence);
+
+ video_format_desc(video_format format = video_format::invalid);
+ video_format_desc(const std::wstring& name);
+};
+
+bool operator==(const video_format_desc& rhs, const video_format_desc& lhs);
+bool operator!=(const video_format_desc& rhs, const video_format_desc& lhs);
+
+std::wostream& operator<<(std::wostream& out, const video_format_desc& format_desc);
+
+}}