Agora Java API Reference for Android
rtc_engine_i.h
1 //
2 // Agora Media SDK
3 //
4 // Created by Sting Feng in 2015-05.
5 // Copyright (c) 2015 Agora IO. All rights reserved.
6 //
7 #pragma once
8 
9 #include <functional>
10 #include <string>
11 #include <vector>
12 
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"
19 
20 #if defined(_WIN32)
21 extern HINSTANCE GetCurrentModuleInstance();
22 #elif defined(__ANDROID__) || defined(__linux__)
23 #include <dlfcn.h>
24 #endif // _WIN32
25 
26 namespace agora {
27 namespace commons {
28 namespace network {
29 struct network_info_t;
30 } // namespace network
31 } // namespace commons
32 
33 namespace rtc {
34 struct VideoNetOptions;
35 namespace protocol {
36 struct CmdInjectStreamConfig;
37 } // namespace protocol
38 
39 enum INTERFACE_ID_EX_TYPE {
40  AGORA_IID_RTC_ENGINE_EX = 0xacbd,
41 };
42 
43 enum SCREEN_SHARING_MODE { SCREEN_SHARING_NORMAL = 0, SCREEN_SHARING_MOVIE = 1 };
44 
45 #ifdef INTERNAL_ENGINE_STATUS
46 struct InternalEngineStatus {
47  int recfreq;
48  int playoutfreq;
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;
55 };
56 #endif // INTERNAL_ENGINE_STATUS
57 
58 enum class RecordingEventType : unsigned {
59  RECORDING_EVENT_UNKNOWN,
60  RECORDING_EVENT_START,
61  RECORDING_EVENT_JOIN = RECORDING_EVENT_START,
62  RECORDING_EVENT_LEAVE,
63 
64  RECORDING_EVENT_END = RECORDING_EVENT_LEAVE,
65 };
66 
67 enum RecordingEventKeyIndex {
68  // Join event
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, // NEW INSERT
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,
89 
90  // add new recording join event here ...
91 
92  MAX_RECORDING_JOIN_EVT_RESERVE15 = RECORDING_JOIN_EVT_RESERVE1 + 14,
93  RECORDING_JOIN_EVT_MAX = MAX_RECORDING_JOIN_EVT_RESERVE15,
94 
95  // Leave event
96  RECORDING_LEAVE_EVT_START = 101,
97  RECORDING_LEAVE_EVT_LEAVEPATHCODE = RECORDING_LEAVE_EVT_START,
98  RECORDING_LEAVE_EVT_RESERVE1,
99 
100  // add new recording leave event here ...
101 
102  RECORDING_LEAVE_EVT_RESERVE5 = RECORDING_LEAVE_EVT_RESERVE1 + 4,
103  RECORDING_LEAVE_EVT_MAX = RECORDING_LEAVE_EVT_RESERVE5,
104 };
105 
107  uid_t uid;
108  unsigned int frame_num;
109  unsigned int sent_ts;
110  unsigned int ts;
111 };
112 
114  uid_t uid;
115  unsigned int ts;
116  unsigned int sent_ts;
117 };
118 
120 public:
121  virtual ~IRtcAvTransportPacketInfoObserver() = default;
122 
123  virtual void onVideoTransportPacketInfo(const video_transport_packet_info& info) = 0;
124  virtual void onAudioTransportPacketInfo(const audio_transport_packet_info& info) = 0;
125 };
126 
127 
128 // internal representation of extension
130  std::string id;
132 
133  ExtensionInternal() : id(""), provider(nullptr) {}
134  ExtensionInternal(const char* i, const agora_refptr<IExtensionProvider> p) : id(i), provider(p) {}
135 };
136 
138  bool isExHandler;
139  bool useStringUid;
140  bool forceAlternativeNetworkEngine;
141  conn_id_t connectionId;
142  int maxOutputBitrateKpbs;
143 
144  // extensions
145  std::vector<ExtensionInternal> extensions;
146  // extension event observer
147  agora_refptr<IMediaExtensionObserver> extensionObserver;
148 
149  // 0 for AGORA_CC,
150  // 1 for REMB
151  // 2 for TRANSPORT_CC
152  bool is_p2p_switch_enabled_;
153 
155  : RtcEngineContext(),
156  isExHandler(false),
157  useStringUid(true),
158 #if defined(_WIN32)
159  forceAlternativeNetworkEngine(true),
160 #else
161  forceAlternativeNetworkEngine(false),
162 #endif
163  connectionId(0),
164  maxOutputBitrateKpbs(30 * 1000),
165  extensionObserver(nullptr),
166 #if defined(P2P_SWITCH_DEFAULT_VALUE)
167  is_p2p_switch_enabled_(P2P_SWITCH_DEFAULT_VALUE)
168 #else
169  is_p2p_switch_enabled_(false)
170 #endif
171  {}
172 
173  explicit RtcEngineContextInternal(const RtcEngineContext& ctx)
174  : RtcEngineContext(ctx),
175  isExHandler(false),
176  useStringUid(false), // flag for RtcEngine::initialize(const RtcEngineContext&)
177 #if defined(_WIN32)
178  forceAlternativeNetworkEngine(true),
179 #else
180  forceAlternativeNetworkEngine(false),
181 #endif
182  connectionId(0),
183  maxOutputBitrateKpbs(30 * 1000),
184  extensionObserver(nullptr),
185 #if defined(P2P_SWITCH_DEFAULT_VALUE)
186  is_p2p_switch_enabled_(P2P_SWITCH_DEFAULT_VALUE)
187 #else
188  is_p2p_switch_enabled_(false)
189 #endif
190  {}
191 };
192 
194  user_id_t userId;
195  int delay;
196  int sentFrameRate;
197  int renderedFrameRate;
198  int skippedFrames;
199 };
200 
202  public:
203  virtual bool onEvent(RTC_EVENT evt, std::string* payload) {
204  (void)evt;
205  (void)payload;
206 
207  /* return false to indicate this event is not handled */
208  return false;
209  }
210 };
211 
214  public:
215  virtual ~IRtcEngineInternal() {}
216  virtual int initializeEx(const RtcEngineContextInternal& context) = 0;
217 
218  virtual int muteRemoteAudioStream(uid_t userId, bool mute,
219  conn_id_t connectionId = DEFAULT_CONNECTION_ID) = 0;
220 
221  virtual int muteRemoteVideoStream(uid_t userId, bool mute,
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;
227 
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;
237  // virtual const char* getSourceVersion() const = 0;
238 
239  virtual int reportWebAgentVideoStats(const WebAgentVideoStats& stats) = 0;
240 
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
244 
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;
248 
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;
253 
254  // this function is only for expert of video codec,
255  // please do NOT call it if not knowing what's it about
256  virtual int setVideoConfigParam(const char* params) = 0;
257 
258  virtual int getVideoConfigParam(char* params, size_t size) = 0;
259 
260  virtual int setExternalVideoConfigEx(const VideoEncoderConfiguration& config, conn_id_t connectionId) = 0;
261 
262  // this function is only for switching screen capture source api on windows platform
263 #if defined(_WIN32)
264  virtual void SetScreenCaptureSource(bool allow_magnification_api, bool allow_directx_capturer) = 0;
265 #endif // _WIN32
266 
267  virtual int setLogLevelEx(unsigned int filter) = 0;
268 
269  virtual int simulateOnSetParameters(const std::string& parameters) = 0;
270 
271  virtual int setCameraDevice(const char dev_id[MAX_DEVICE_ID_LENGTH]) = 0;
272 
273  virtual agora_refptr<IMediaPlayer> getMediaPlayer(int sourceId) = 0;
274 };
275 
277  typedef const char*(AGORA_CALL* PFN_GetAgoraRtcEngineVersion)(int* build);
278  typedef IRtcEngine*(AGORA_CALL* PFN_CreateAgoraRtcEngine)();
279  typedef void(AGORA_CALL* PFN_ShutdownAgoraRtcEngineService)();
280 
281 #if defined(_WIN32)
282  typedef HINSTANCE lib_handle_t;
283  static HINSTANCE MyLoadLibrary(const char* dllname) {
284  char path[MAX_PATH];
285  GetModuleFileNameA(GetCurrentModuleInstance(), path, MAX_PATH);
286  auto p = strrchr(path, '\\');
287  strcpy(p + 1, dllname); // NOLINT
288  HINSTANCE hDll = LoadLibraryA(path);
289  if (hDll) return hDll;
290 
291  hDll = LoadLibraryA(dllname);
292  return hDll;
293  }
294 #else
295  typedef void* lib_handle_t;
296 #endif // _WIN32
297 
298  public:
299  RtcEngineLibHelper(const char* dllname)
300  : m_firstInit(true),
301  m_lib(NULL),
302  m_dllName(dllname),
303  m_pfnCreateAgoraRtcEngine(nullptr),
304  m_pfnGetAgoraRtcEngineVersion(nullptr) {}
305 
306  bool initialize() {
307  if (!m_firstInit) {
308  return isValid();
309  }
310 
311  if (m_dllName.empty()) {
312  return false;
313  }
314 
315  m_firstInit = false;
316 #if defined(_WIN32)
317  m_lib = MyLoadLibrary(m_dllName.c_str());
318  if (m_lib) {
319  m_pfnCreateAgoraRtcEngine =
320  (PFN_CreateAgoraRtcEngine)GetProcAddress(m_lib, "createAgoraRtcEngine");
321  m_pfnGetAgoraRtcEngineVersion =
322  (PFN_GetAgoraRtcEngineVersion)GetProcAddress(m_lib, "getAgoraRtcEngineVersion");
323  }
324 #elif defined(__ANDROID__) || defined(__linux__)
325  m_lib = dlopen(m_dllName.c_str(), RTLD_LAZY);
326  if (m_lib) {
327  m_pfnCreateAgoraRtcEngine = (PFN_CreateAgoraRtcEngine)dlsym(m_lib, "createAgoraRtcEngine");
328  m_pfnGetAgoraRtcEngineVersion =
329  (PFN_GetAgoraRtcEngineVersion)dlsym(m_lib, "getAgoraRtcEngineVersion");
330  }
331 #endif // _WIN32
332 
333  return isValid();
334  }
335 
336  void deinitialize() {
337  if (m_lib) {
338 #if defined(_WIN32)
339  FreeLibrary(m_lib);
340 #elif defined(__ANDROID__) || defined(__linux__)
341  dlclose(m_lib);
342 #endif // _WIN32
343 
344  m_lib = NULL;
345  }
346 
347  m_pfnCreateAgoraRtcEngine = nullptr;
348  m_pfnGetAgoraRtcEngineVersion = nullptr;
349  }
350 
351  ~RtcEngineLibHelper() { deinitialize(); }
352 
353  bool isValid() { return m_pfnCreateAgoraRtcEngine != NULL; }
354 
355  agora::rtc::IRtcEngine* createEngine() {
356  return m_pfnCreateAgoraRtcEngine ? m_pfnCreateAgoraRtcEngine() : NULL;
357  }
358 
359  const char* getVersion(int* build) {
360  return m_pfnGetAgoraRtcEngineVersion ? m_pfnGetAgoraRtcEngineVersion(build) : nullptr;
361  }
362 
363  private:
364  bool m_firstInit;
365  lib_handle_t m_lib;
366  std::string m_dllName;
367  PFN_CreateAgoraRtcEngine m_pfnCreateAgoraRtcEngine;
368  PFN_GetAgoraRtcEngineVersion m_pfnGetAgoraRtcEngineVersion;
369 };
370 
371 // A helper function for decoding out the SEI layout
372 
373 struct canvas_info {
374  int width;
375  int height;
376  int bgcolor;
377 };
378 
379 struct region_info {
380  unsigned id;
381 
382  double x;
383  double y;
384  double width;
385  double height;
386 
387  int alpha; // [0, 255]
388 
389  int render_mode; // 0, crop; 1, ZoomtoFit
390  int zorder; // [0, 100]
391 };
392 
393 #define NUM_OF_LAYOUT_REGIONS 17
394 
395 struct layout_info {
396  long long ms;
397  canvas_info canvas;
398  // At most 9 broadcasters: 1 host, 8 guests.
399  unsigned int region_count;
400  region_info regions[NUM_OF_LAYOUT_REGIONS];
401 };
402 
403 AGORA_API bool AGORA_CALL decode_sei_layout(const void* data, unsigned size, layout_info* layout);
404 
405 } // namespace rtc
406 } // namespace agora
agora::rtc::RtcEngineLibHelper
Definition: rtc_engine_i.h:276
agora::rtc::WebAgentVideoStats
Definition: rtc_engine_i.h:193
agora::rtc::video_transport_packet_info
Definition: rtc_engine_i.h:106
agora::agora_refptr
Definition: AgoraRefPtr.h:34
agora::rtc::RtcEngineContextInternal
Definition: rtc_engine_i.h:137
agora::rtc::IRtcEngineEventHandlerEx
Definition: IAgoraRtcEngineEx.h:18
agora::rtc::VideoEncoderConfiguration
Definition: AgoraBase.h:1703
agora::rtc::IRtcEngineEventHandlerInternal
Definition: rtc_engine_i.h:201
agora::rtc::layout_info
Definition: rtc_engine_i.h:395
agora::rtc::IRtcAvTransportPacketInfoObserver
Definition: rtc_engine_i.h:119
agora::rtc::canvas_info
Definition: rtc_engine_i.h:373
agora::rtc::IRtcEngineInternal::reportWebAgentVideoStats
virtual int reportWebAgentVideoStats(const WebAgentVideoStats &stats)=0
agora::rtc::IRtcEngineInternal
Definition: rtc_engine_i.h:213
agora::rtc::IRtcEngineEx
Definition: IAgoraRtcEngineEx.h:1163
agora::rtc::region_info
Definition: rtc_engine_i.h:379
agora::base::IParameterEngine
Definition: AgoraBase.h:69
agora::rtc::RtcEngineContext
Definition: IAgoraRtcEngine.h:2502
agora::rtc::IRtcEngine
Definition: IAgoraRtcEngine.h:2663
agora::rtc::IRtcEngineInternal::muteRemoteVideoStream
virtual int muteRemoteVideoStream(uid_t userId, bool mute, conn_id_t connectionId=DEFAULT_CONNECTION_ID)=0
agora::rtc::ExtensionInternal
Definition: rtc_engine_i.h:129
agora::rtc::audio_transport_packet_info
Definition: rtc_engine_i.h:113
agora::rtc::IRtcEngineInternal::muteRemoteAudioStream
virtual int muteRemoteAudioStream(uid_t userId, bool mute, conn_id_t connectionId=DEFAULT_CONNECTION_ID)=0