forked from obsproject/obs-browser
-
Notifications
You must be signed in to change notification settings - Fork 0
/
obs-browser-source.hpp
130 lines (107 loc) · 3.44 KB
/
obs-browser-source.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/******************************************************************************
Copyright (C) 2014 by John R. Bradley <[email protected]>
Copyright (C) 2018 by Hugh Bailey ("Jim") <[email protected]>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
#pragma once
#include <obs-module.h>
#include <obs.hpp>
#include "cef-headers.hpp"
#include "browser-config.h"
#include "browser-app.hpp"
#include <unordered_map>
#include <functional>
#include <vector>
#include <string>
#include <mutex>
#if EXPERIMENTAL_SHARED_TEXTURE_SUPPORT_ENABLED
extern bool hwaccel;
#endif
#if CHROME_VERSION_BUILD < 3507
#define ENABLE_FRAME_SIGNAL 1
#else
#define ENABLE_FRAME_SIGNAL 0
#endif
struct AudioStream {
OBSSource source;
speaker_layout speakers;
int channels;
int sample_rate;
};
struct BrowserSource {
BrowserSource **p_prev_next = nullptr;
BrowserSource *next = nullptr;
obs_source_t *source = nullptr;
bool tex_sharing_avail = false;
bool create_browser = false;
CefRefPtr<CefBrowser> cefBrowser;
std::string url;
std::string css;
gs_texture_t *texture = nullptr;
int width = 0;
int height = 0;
bool fps_custom = false;
int fps = 0;
#if !ENABLE_FRAME_SIGNAL
int obs_fps = 0;
#endif
bool restart = false;
bool shutdown_on_invisible = false;
bool is_local = false;
bool first_update = true;
#if EXPERIMENTAL_SHARED_TEXTURE_SUPPORT_ENABLED
bool reset_frame = false;
#endif
inline void DestroyTextures()
{
if (texture) {
obs_enter_graphics();
gs_texture_destroy(texture);
texture = nullptr;
obs_leave_graphics();
}
}
/* ---------------------------- */
bool CreateBrowser();
void DestroyBrowser(bool async = false);
void ClearAudioStreams();
void ExecuteOnBrowser(BrowserFunc func, bool async = false);
/* ---------------------------- */
BrowserSource(obs_data_t *settings, obs_source_t *source);
~BrowserSource();
void Update(obs_data_t *settings = nullptr);
#if !ENABLE_FRAME_SIGNAL
void CheckFPS();
#endif
void Tick();
void Render();
void EnumAudioStreams(obs_source_enum_proc_t cb, void *param);
bool AudioMix(uint64_t *ts_out, struct audio_output_data *audio_output,
size_t channels, size_t sample_rate);
void SendMouseClick(const struct obs_mouse_event *event, int32_t type,
bool mouse_up, uint32_t click_count);
void SendMouseMove(const struct obs_mouse_event *event,
bool mouse_leave);
void SendMouseWheel(const struct obs_mouse_event *event, int x_delta,
int y_delta);
void SendFocus(bool focus);
void SendKeyClick(const struct obs_key_event *event, bool key_up);
void SetShowing(bool showing);
void SetActive(bool active);
void Refresh();
#if EXPERIMENTAL_SHARED_TEXTURE_SUPPORT_ENABLED
inline void SignalBeginFrame();
#endif
std::mutex audio_sources_mutex;
std::vector<obs_source_t *> audio_sources;
std::unordered_map<int, AudioStream> audio_streams;
};