]> git.sesse.net Git - casparcg/blob - core/video_format.h
Added boost::rational framerate in video_format_desc for convenience.
[casparcg] / core / video_format.h
1 /*
2 * Copyright (c) 2011 Sveriges Television AB <info@casparcg.com>
3 *
4 * This file is part of CasparCG (www.casparcg.com).
5 *
6 * CasparCG is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * CasparCG is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with CasparCG. If not, see <http://www.gnu.org/licenses/>.
18 *
19 * Author: Robert Nagy, ronag89@gmail.com
20 */
21
22 #pragma once
23
24 #include <vector>
25 #include <string>
26 #include <cstddef>
27
28 #include <common/enum_class.h>
29
30 #include <boost/rational.hpp>
31
32 namespace caspar { namespace core {
33         
34 enum class video_format
35
36         pal,            
37         ntsc,           
38         x576p2500,      
39         x720p2500,      
40         x720p5000,
41         x720p2398,
42         x720p2400,
43         x720p2997,
44         x720p5994,
45         x720p3000,
46         x720p6000,
47         x1080p2398,
48         x1080p2400,     
49         x1080i5000,     
50         x1080i5994,     
51         x1080i6000,     
52         x1080p2500,     
53         x1080p2997,     
54         x1080p3000,     
55         x1080p5000,
56         x1080p5994,
57         x1080p6000,
58         x1556p2398,
59         x1556p2400,
60         x1556p2500,
61         dci1080p2398,
62         dci1080p2400,
63         dci1080p2500,
64         x2160p2398,
65         x2160p2400,
66         x2160p2500,
67         x2160p2997,
68         x2160p3000,
69         dci2160p2398,
70         dci2160p2400,
71         dci2160p2500,
72         invalid,
73         count
74 };
75
76 enum class field_mode
77 {
78         empty           = 0,
79         lower           = 1,
80         upper           = 2,
81         progressive = 3 // NOTE: progressive == lower | upper;
82 };
83 ENUM_ENABLE_BITWISE(field_mode);
84 //static_assert((field_mode::lower | field_mode::upper) == field_mode::progressive, "");
85
86 struct video_format_desc final
87 {
88         video_format                    format;         
89
90         int                                             width;          
91         int                                             height;         
92         int                                             square_width;
93         int                                             square_height;
94         core::field_mode                field_mode;     // progressive, interlaced upper field first, interlaced lower field first
95         double                                  fps;            // actual framerate = duration/time_scale, e.g. i50 = 25 fps, p50 = 50 fps
96         boost::rational<int>    framerate;
97         int                                             time_scale;
98         int                                             duration;
99         int                                             field_count;
100         std::size_t                             size;           // frame size in bytes 
101         std::wstring                    name;           // name of output format
102
103         int                                             audio_sample_rate;
104         std::vector<int>                audio_cadence;  // rotating optimal number of samples per frame
105
106         video_format_desc(video_format format,
107                                           int width,
108                                           int height,
109                                           int square_width,
110                                           int square_height,
111                                           core::field_mode field_mode,
112                                           int time_scale,
113                                           int duration,
114                                           const std::wstring& name,
115                                           const std::vector<int>& audio_cadence);
116                 
117         video_format_desc(video_format format = video_format::invalid);
118         video_format_desc(const std::wstring& name);
119 };
120
121 bool operator==(const video_format_desc& rhs, const video_format_desc& lhs);
122 bool operator!=(const video_format_desc& rhs, const video_format_desc& lhs);
123
124 std::wostream& operator<<(std::wostream& out, const video_format_desc& format_desc);
125
126 }}