]> git.sesse.net Git - casparcg/blob - core/video_format.h
90ff1f806ecd640a55ade16b7dc0796206e603bc
[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 namespace caspar { namespace core {
31         
32 enum class video_format
33
34         pal,            
35         ntsc,           
36         x576p2500,      
37         x720p2500,      
38         x720p5000,
39         x720p2398,
40         x720p2400,
41         x720p2997,
42         x720p5994,
43         x720p3000,
44         x720p6000,
45         x1080p2398,
46         x1080p2400,     
47         x1080i5000,     
48         x1080i5994,     
49         x1080i6000,     
50         x1080p2500,     
51         x1080p2997,     
52         x1080p3000,     
53         x1080p5000,
54         x1080p5994,
55         x1080p6000,
56         x1556p2398,
57         x1556p2400,
58         x1556p2500,
59         dci1080p2398,
60         dci1080p2400,
61         dci1080p2500,
62         x2160p2398,
63         x2160p2400,
64         x2160p2500,
65         x2160p2997,
66         x2160p3000,
67         dci2160p2398,
68         dci2160p2400,
69         dci2160p2500,
70         invalid,
71         count
72 };
73
74 enum class field_mode
75 {
76         empty           = 0,
77         lower           = 1,
78         upper           = 2,
79         progressive = 3 // NOTE: progressive == lower | upper;
80 };
81 ENUM_ENABLE_BITWISE(field_mode);
82 //static_assert((field_mode::lower | field_mode::upper) == field_mode::progressive, "");
83
84 struct video_format_desc final
85 {
86         video_format            format;         
87
88         int                                     width;          
89         int                                     height;         
90         int                                     square_width;
91         int                                     square_height;
92         core::field_mode        field_mode;     // progressive, interlaced upper field first, interlaced lower field first
93         double                          fps;            // actual framerate = duration/time_scale, e.g. i50 = 25 fps, p50 = 50 fps
94         int                                     time_scale;
95         int                                     duration;
96         int                                     field_count;
97         std::size_t                     size;           // frame size in bytes 
98         std::wstring            name;           // name of output format
99
100         int                                     audio_sample_rate;
101         std::vector<int>        audio_cadence;  // rotating optimal number of samples per frame
102
103         video_format_desc(video_format format,
104                                           int width,
105                                           int height,
106                                           int square_width,
107                                           int square_height,
108                                           core::field_mode field_mode,
109                                           int time_scale,
110                                           int duration,
111                                           const std::wstring& name,
112                                           const std::vector<int>& audio_cadence);
113                 
114         video_format_desc(video_format format = video_format::invalid);
115         video_format_desc(const std::wstring& name);
116 };
117
118 bool operator==(const video_format_desc& rhs, const video_format_desc& lhs);
119 bool operator!=(const video_format_desc& rhs, const video_format_desc& lhs);
120
121 std::wostream& operator<<(std::wostream& out, const video_format_desc& format_desc);
122
123 }}