13 #include "AgoraBase.h"
14 #include "api2/NGIAgoraAudioDeviceManager.h"
15 #include "api2/NGIAgoraExtensionProvider.h"
16 #include "IAgoraRtcEngineEx.h"
17 #include "rtc/rtc_event.h"
18 #include "utils/thread/thread_pool.h"
21 extern HINSTANCE GetCurrentModuleInstance();
22 #elif defined(__ANDROID__) || defined(__linux__)
29 struct network_info_t;
34 struct VideoNetOptions;
36 struct CmdInjectStreamConfig;
39 enum INTERFACE_ID_EX_TYPE {
40 AGORA_IID_RTC_ENGINE_EX = 0xacbd,
43 enum SCREEN_SHARING_MODE { SCREEN_SHARING_NORMAL = 0, SCREEN_SHARING_MOVIE = 1 };
45 #ifdef INTERNAL_ENGINE_STATUS
46 struct InternalEngineStatus {
49 int audio_send_frame_rate;
50 int audio_send_packet_rate;
51 int audio_recv_packet_rate;
52 int nearin_signal_level;
53 int nearout_signal_level;
54 int farin_signal_level;
56 #endif // INTERNAL_ENGINE_STATUS
58 enum class RecordingEventType : unsigned {
59 RECORDING_EVENT_UNKNOWN,
60 RECORDING_EVENT_START,
61 RECORDING_EVENT_JOIN = RECORDING_EVENT_START,
62 RECORDING_EVENT_LEAVE,
64 RECORDING_EVENT_END = RECORDING_EVENT_LEAVE,
67 enum RecordingEventKeyIndex {
69 RECORDING_JOIN_EVT_START = 1,
70 RECORDING_JOIN_EVT_MIXMODE = RECORDING_JOIN_EVT_START,
71 RECORDING_JOIN_EVT_MIXEDVIDEOAUDIOMODE = 2,
72 RECORDING_JOIN_EVT_MIXHIGH = 3,
73 RECORDING_JOIN_EVT_MIXLOW = 4,
74 RECORDING_JOIN_EVT_MIXFPS = 5,
75 RECORDING_JOIN_EVT_MIXKBPS = 6,
76 RECORDING_JOIN_EVT_MINUDPPORT = 7,
77 RECORDING_JOIN_EVT_MAXUDPPORT = 8,
78 RECORDING_JOIN_EVT_DECODEAUDIOTYPE = 9,
79 RECORDING_JOIN_EVT_DECODEVIDEOTYPE = 10,
80 RECORDING_JOIN_EVT_LIVEMODE = 11,
81 RECORDING_JOIN_EVT_IDLE = 12,
82 RECORDING_JOIN_EVT_AUDIOONLY = 13,
83 RECORDING_JOIN_EVT_VIDEOONLY = 14,
84 RECORDING_JOIN_EVT_SYSLOGFACILITY = 15,
85 RECORDING_JOIN_EVT_STREAMTYPE = 16,
86 RECORDING_JOIN_EVT_TRIGGERMODE = 17,
87 RECORDING_JOIN_EVT_LANGUAGE = 18,
88 RECORDING_JOIN_EVT_RESERVE1 = 19,
92 MAX_RECORDING_JOIN_EVT_RESERVE15 = RECORDING_JOIN_EVT_RESERVE1 + 14,
93 RECORDING_JOIN_EVT_MAX = MAX_RECORDING_JOIN_EVT_RESERVE15,
96 RECORDING_LEAVE_EVT_START = 101,
97 RECORDING_LEAVE_EVT_LEAVEPATHCODE = RECORDING_LEAVE_EVT_START,
98 RECORDING_LEAVE_EVT_RESERVE1,
102 RECORDING_LEAVE_EVT_RESERVE5 = RECORDING_LEAVE_EVT_RESERVE1 + 4,
103 RECORDING_LEAVE_EVT_MAX = RECORDING_LEAVE_EVT_RESERVE5,
108 unsigned int frame_num;
109 unsigned int sent_ts;
116 unsigned int sent_ts;
140 bool forceAlternativeNetworkEngine;
141 conn_id_t connectionId;
142 int maxOutputBitrateKpbs;
145 std::vector<ExtensionInternal> extensions;
152 bool is_p2p_switch_enabled_;
159 forceAlternativeNetworkEngine(
true),
161 forceAlternativeNetworkEngine(
false),
164 maxOutputBitrateKpbs(30 * 1000),
165 extensionObserver(
nullptr),
166 #if defined(P2P_SWITCH_DEFAULT_VALUE)
167 is_p2p_switch_enabled_(P2P_SWITCH_DEFAULT_VALUE)
169 is_p2p_switch_enabled_(
false)
178 forceAlternativeNetworkEngine(
true),
180 forceAlternativeNetworkEngine(
false),
183 maxOutputBitrateKpbs(30 * 1000),
184 extensionObserver(
nullptr),
185 #if defined(P2P_SWITCH_DEFAULT_VALUE)
186 is_p2p_switch_enabled_(P2P_SWITCH_DEFAULT_VALUE)
188 is_p2p_switch_enabled_(
false)
197 int renderedFrameRate;
203 virtual bool onEvent(RTC_EVENT evt, std::string* payload) {
219 conn_id_t connectionId = DEFAULT_CONNECTION_ID) = 0;
222 conn_id_t connectionId = DEFAULT_CONNECTION_ID) = 0;
223 virtual int setProfile(
const char* profile,
bool merge) = 0;
224 virtual int getProfile(any_document_t& result) = 0;
225 virtual int notifyNetworkChange(agora::commons::network::network_info_t&& networkInfo) = 0;
226 virtual int getOptionsByVideoProfile(
int profile, VideoNetOptions& options) = 0;
228 virtual int setAudioOptionParams(
const char* params) = 0;
229 virtual int getAudioOptionParams(
char* params) = 0;
230 virtual int setAudioSessionParams(
const char* params) = 0;
231 virtual int getAudioSessionParams(
char* params) = 0;
232 virtual bool isMicrophoneOn() = 0;
241 #if (defined(__APPLE__) && TARGET_OS_MAC && !TARGET_OS_IOS)
242 virtual int monitorDeviceChange(
bool enabled) = 0;
243 #endif // __APPLE__ && !TARGET_OS_IOS && TARGET_OS_MAC
245 virtual int printLog(
int level,
const char* message) = 0;
246 virtual int runOnWorkerThread(std::function<
void(
void)>&& f) = 0;
247 virtual int reportArgusCounters(
int* counterId,
int* value,
int count, user_id_t userId) = 0;
249 virtual int reportRecordingArgusEvent(uint32_t* eventIds, int64_t* value,
int count,
250 RecordingEventType eventType) = 0;
251 virtual int addInjectStreamUrl2(
const char* url, protocol::CmdInjectStreamConfig& config) = 0;
252 virtual int enableYuvDumper(
bool enable) = 0;
256 virtual int setVideoConfigParam(
const char* params) = 0;
258 virtual int getVideoConfigParam(
char* params,
size_t size) = 0;
264 virtual void SetScreenCaptureSource(
bool allow_magnification_api,
bool allow_directx_capturer) = 0;
265 virtual int GetScreenCaptureType() = 0;
268 virtual int setLogLevelEx(
unsigned int filter) = 0;
270 virtual int simulateOnSetParameters(
const std::string& parameters) = 0;
272 virtual int setCameraDevice(
const char dev_id[MAX_DEVICE_ID_LENGTH]) = 0;
275 #if defined(FEATURE_ENABLE_UT_SUPPORT)
277 virtual int soundPositionChannel(uid_t uid, conn_id_t connectionId = DEFAULT_CONNECTION_ID) = 0;
282 typedef const char*(AGORA_CALL* PFN_GetAgoraRtcEngineVersion)(
int* build);
283 typedef IRtcEngine*(AGORA_CALL* PFN_CreateAgoraRtcEngine)();
284 typedef void(AGORA_CALL* PFN_ShutdownAgoraRtcEngineService)();
287 typedef HINSTANCE lib_handle_t;
288 static HINSTANCE MyLoadLibrary(
const char* dllname) {
290 GetModuleFileNameA(GetCurrentModuleInstance(), path, MAX_PATH);
291 auto p = strrchr(path,
'\\');
292 strcpy(p + 1, dllname);
293 HINSTANCE hDll = LoadLibraryA(path);
294 if (hDll)
return hDll;
296 hDll = LoadLibraryA(dllname);
300 typedef void* lib_handle_t;
308 m_pfnCreateAgoraRtcEngine(
nullptr),
309 m_pfnGetAgoraRtcEngineVersion(
nullptr) {}
316 if (m_dllName.empty()) {
322 m_lib = MyLoadLibrary(m_dllName.c_str());
324 m_pfnCreateAgoraRtcEngine =
325 (PFN_CreateAgoraRtcEngine)GetProcAddress(m_lib,
"createAgoraRtcEngine");
326 m_pfnGetAgoraRtcEngineVersion =
327 (PFN_GetAgoraRtcEngineVersion)GetProcAddress(m_lib,
"getAgoraRtcEngineVersion");
329 #elif defined(__ANDROID__) || defined(__linux__)
330 m_lib = dlopen(m_dllName.c_str(), RTLD_LAZY);
332 m_pfnCreateAgoraRtcEngine = (PFN_CreateAgoraRtcEngine)dlsym(m_lib,
"createAgoraRtcEngine");
333 m_pfnGetAgoraRtcEngineVersion =
334 (PFN_GetAgoraRtcEngineVersion)dlsym(m_lib,
"getAgoraRtcEngineVersion");
341 void deinitialize() {
345 #elif defined(__ANDROID__) || defined(__linux__)
352 m_pfnCreateAgoraRtcEngine =
nullptr;
353 m_pfnGetAgoraRtcEngineVersion =
nullptr;
358 bool isValid() {
return m_pfnCreateAgoraRtcEngine != NULL; }
361 return m_pfnCreateAgoraRtcEngine ? m_pfnCreateAgoraRtcEngine() : NULL;
364 const char* getVersion(
int* build) {
365 return m_pfnGetAgoraRtcEngineVersion ? m_pfnGetAgoraRtcEngineVersion(build) :
nullptr;
371 std::string m_dllName;
372 PFN_CreateAgoraRtcEngine m_pfnCreateAgoraRtcEngine;
373 PFN_GetAgoraRtcEngineVersion m_pfnGetAgoraRtcEngineVersion;
398 #define NUM_OF_LAYOUT_REGIONS 17
404 unsigned int region_count;
408 AGORA_API
bool AGORA_CALL decode_sei_layout(
const void* data,
unsigned size,
layout_info* layout);