]> git.sesse.net Git - casparcg/blob - core/frame/gpu_frame.h
c362d7066873015de3d80df4058f5dadcc807d4c
[casparcg] / core / frame / gpu_frame.h
1 #pragma once\r
2 \r
3 #include <memory>\r
4 \r
5 #include <Glee.h>\r
6 \r
7 namespace caspar {\r
8         \r
9 class gpu_frame\r
10 {\r
11 public:\r
12         gpu_frame(size_t width, size_t height);\r
13 \r
14         virtual void write_lock();\r
15         virtual bool write_unlock();\r
16         virtual void read_lock(GLenum mode);\r
17         virtual bool read_unlock();\r
18         virtual void draw();\r
19                 \r
20         virtual unsigned char* data();\r
21         virtual size_t size() const;\r
22         virtual size_t width() const;\r
23         virtual size_t height() const;\r
24         \r
25         virtual void reset();\r
26                         \r
27         virtual const std::vector<short>& audio_data() const;   \r
28         virtual std::vector<short>& audio_data();\r
29 \r
30         virtual float alpha() const;\r
31         virtual void alpha(float value);\r
32 \r
33         virtual float x() const;\r
34         virtual float y() const;\r
35         virtual void translate(float x, float y);\r
36 \r
37         static std::shared_ptr<gpu_frame> null()\r
38         {\r
39                 static auto my_null_frame = std::make_shared<gpu_frame>(0,0);\r
40                 return my_null_frame;\r
41         }\r
42                 \r
43 private:\r
44         struct implementation;\r
45         std::shared_ptr<implementation> impl_;\r
46 };\r
47 typedef std::shared_ptr<gpu_frame> gpu_frame_ptr;\r
48         \r
49 inline void mix_audio_safe(std::vector<short>& frame1, const std::vector<short>& frame2)\r
50 {\r
51         if(frame1.empty())\r
52                 frame1 = std::move(frame2);\r
53         else if(!frame2.empty())\r
54         {\r
55                 for(size_t n = 0; n < frame1.size(); ++n)\r
56                         frame1[n] = static_cast<short>(static_cast<int>(frame1[n]) + static_cast<int>(frame2[n]) & 0xFFFF);                             \r
57         }\r
58 }\r
59 \r
60 template<typename frame_ptr_type>\r
61 frame_ptr_type& mix_audio_safe(frame_ptr_type& frame1, const gpu_frame_ptr& frame2)\r
62 {\r
63         mix_audio_safe(frame1->audio_data(), frame2->audio_data());\r
64         return frame1;\r
65 }\r
66 \r
67 }