]> git.sesse.net Git - casparcg/blob - core/video_format.h
Merged new video mode support from trunk
[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 <common/enum_class.h>
25
26 #include <vector>
27 #include <string>
28 #include <cstddef>
29
30 namespace caspar { namespace core {
31         
32 struct video_format_def 
33
34         enum type 
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                 invalid,
59                 count
60         };
61 };
62 typedef enum_class<video_format_def> video_format;
63
64 struct field_mode_def
65 {
66         enum type 
67         {
68                 empty           = 0,
69                 lower           = 1,
70                 upper           = 2,
71                 progressive = 3, // NOTE: progressive == lower | upper;
72         };
73         static_assert((lower | upper) == progressive, "");
74 };
75 typedef enum_class<field_mode_def> field_mode;
76
77 struct video_format_desc sealed
78 {
79         video_format            format;         
80
81         int                                     width;          
82         int                                     height;         
83         int                                     square_width;
84         int                                     square_height;
85         field_mode                      field_mode;     // progressive, interlaced upper field first, interlaced lower field first
86         double                          fps;            // actual framerate = duration/time_scale, e.g. i50 = 25 fps, p50 = 50 fps
87         int                                     time_scale;
88         int                                     duration;
89         int                                     field_count;
90         std::size_t                     size;           // frame size in bytes 
91         std::wstring            name;           // name of output format
92
93         int                                     audio_sample_rate;
94         int                                     audio_channels;
95         std::vector<int>        audio_cadence;
96
97         video_format_desc(video_format format,
98                                           int width,
99                                           int height,
100                                           int square_width,
101                                           int square_height,
102                                           core::field_mode field_mode,
103                                           int time_scale,
104                                           int duration,
105                                           const std::wstring& name,
106                                           const std::vector<int>& audio_cadence);
107                 
108         video_format_desc(video_format format = video_format::invalid);
109         video_format_desc(const std::wstring& name);
110 };
111
112 bool operator==(const video_format_desc& rhs, const video_format_desc& lhs);
113 bool operator!=(const video_format_desc& rhs, const video_format_desc& lhs);
114
115 std::wostream& operator<<(std::wostream& out, const video_format_desc& format_desc);
116
117 }}