]> git.sesse.net Git - casparcg/blob - core/producer/frame/basic_frame.cpp
2.0.0.2: - Refactored frame layer tagging.
[casparcg] / core / producer / frame / basic_frame.cpp
1 #include "../../stdafx.h"\r
2 \r
3 #include "basic_frame.h"\r
4 \r
5 #include "image_transform.h"\r
6 #include "audio_transform.h"\r
7 #include "pixel_format.h"\r
8 #include "../../video_format.h"\r
9 \r
10 #include <boost/range/algorithm.hpp>\r
11 \r
12 namespace caspar { namespace core {\r
13                                                                                                                                                                                                                                                                                                                 \r
14 struct basic_frame::implementation\r
15 {               \r
16         std::vector<safe_ptr<basic_frame>> frames_;\r
17 \r
18         image_transform image_transform_;       \r
19         audio_transform audio_transform_;\r
20         \r
21 public:\r
22         implementation(const std::vector<safe_ptr<basic_frame>>& frames) \r
23                 : frames_(frames) {}\r
24         implementation(std::vector<safe_ptr<basic_frame>>&& frames) \r
25                 : frames_(std::move(frames)){}\r
26         \r
27         void accept(const basic_frame& self, frame_visitor& visitor)\r
28         {\r
29                 visitor.begin(self);\r
30                 BOOST_FOREACH(auto frame, frames_)\r
31                         frame->accept(visitor);\r
32                 visitor.end();\r
33         }       \r
34 };\r
35         \r
36 basic_frame::basic_frame() : impl_(new implementation(std::vector<safe_ptr<basic_frame>>())){}\r
37 basic_frame::basic_frame(const std::vector<safe_ptr<basic_frame>>& frames) : impl_(new implementation(frames)){}\r
38 basic_frame::basic_frame(std::vector<safe_ptr<basic_frame>>&& frames) : impl_(new implementation(std::move(frames))){}\r
39 basic_frame::basic_frame(const basic_frame& other) : impl_(new implementation(*other.impl_)){}\r
40 basic_frame::basic_frame(const safe_ptr<basic_frame>& frame)\r
41 {\r
42         std::vector<safe_ptr<basic_frame>> frames;\r
43         frames.push_back(frame);\r
44         impl_.reset(new implementation(std::move(frames)));\r
45 }\r
46 basic_frame::basic_frame(safe_ptr<basic_frame>&& frame)\r
47 {\r
48         std::vector<safe_ptr<basic_frame>> frames;\r
49         frames.push_back(std::move(frame));\r
50         impl_.reset(new implementation(std::move(frames)));\r
51 }\r
52 basic_frame::basic_frame(const safe_ptr<basic_frame>& frame1, const safe_ptr<basic_frame>& frame2)\r
53 {\r
54         std::vector<safe_ptr<basic_frame>> frames;\r
55         frames.push_back(frame1);\r
56         frames.push_back(frame2);\r
57         impl_.reset(new implementation(std::move(frames)));\r
58 }\r
59 basic_frame::basic_frame(safe_ptr<basic_frame>&& frame1, safe_ptr<basic_frame>&& frame2)\r
60 {\r
61         std::vector<safe_ptr<basic_frame>> frames;\r
62         frames.push_back(std::move(frame1));\r
63         frames.push_back(std::move(frame2));\r
64         impl_.reset(new implementation(std::move(frames)));\r
65 }\r
66 \r
67 void basic_frame::swap(basic_frame& other){impl_.swap(other.impl_);}\r
68 basic_frame& basic_frame::operator=(const basic_frame& other)\r
69 {\r
70         basic_frame temp(other);\r
71         temp.swap(*this);\r
72         return *this;\r
73 }\r
74 basic_frame::basic_frame(basic_frame&& other) : impl_(std::move(other.impl_)){}\r
75 basic_frame& basic_frame::operator=(basic_frame&& other)\r
76 {\r
77         basic_frame temp(std::move(other));\r
78         temp.swap(*this);\r
79         return *this;\r
80 }\r
81 void basic_frame::accept(frame_visitor& visitor){impl_->accept(*this, visitor);}\r
82 \r
83 const image_transform& basic_frame::get_image_transform() const { return impl_->image_transform_;}\r
84 image_transform& basic_frame::get_image_transform() { return impl_->image_transform_;}\r
85 const audio_transform& basic_frame::get_audio_transform() const { return impl_->audio_transform_;}\r
86 audio_transform& basic_frame::get_audio_transform() { return impl_->audio_transform_;}\r
87 \r
88 safe_ptr<basic_frame> basic_frame::interlace(const safe_ptr<basic_frame>& frame1, const safe_ptr<basic_frame>& frame2, video_mode::type mode)\r
89 {                       \r
90         if(frame1 == frame2 || mode == video_mode::progressive)\r
91                 return frame2;\r
92 \r
93         auto my_frame1 = make_safe<basic_frame>(frame1);\r
94         auto my_frame2 = make_safe<basic_frame>(frame2);\r
95         if(mode == video_mode::upper)\r
96         {\r
97                 my_frame1->get_image_transform().set_mode(video_mode::upper);   \r
98                 my_frame2->get_image_transform().set_mode(video_mode::lower);   \r
99         }                                                                                        \r
100         else                                                                             \r
101         {                                                                                        \r
102                 my_frame1->get_image_transform().set_mode(video_mode::lower);   \r
103                 my_frame2->get_image_transform().set_mode(video_mode::upper);   \r
104         }\r
105 \r
106         std::vector<safe_ptr<basic_frame>> frames;\r
107         frames.push_back(my_frame1);\r
108         frames.push_back(my_frame2);\r
109         return make_safe<basic_frame>(frames);\r
110 }\r
111         \r
112 }}