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  virtual int GetScreenCaptureType() = 0;
266 #endif
267 
268  virtual int setLogLevelEx(unsigned int filter) = 0;
269 
270  virtual int simulateOnSetParameters(const std::string& parameters) = 0;
271 
272  virtual int setCameraDevice(const char dev_id[MAX_DEVICE_ID_LENGTH]) = 0;
273 
274  virtual agora_refptr<IMediaPlayer> getMediaPlayer(int sourceId) = 0;
275 #if defined(FEATURE_ENABLE_UT_SUPPORT)
276  // 0 is left channel, 1 is right channel, -1 is invalid
277  virtual int soundPositionChannel(uid_t uid, conn_id_t connectionId = DEFAULT_CONNECTION_ID) = 0;
278 #endif
279 };
280 
282  typedef const char*(AGORA_CALL* PFN_GetAgoraRtcEngineVersion)(int* build);
283  typedef IRtcEngine*(AGORA_CALL* PFN_CreateAgoraRtcEngine)();
284  typedef void(AGORA_CALL* PFN_ShutdownAgoraRtcEngineService)();
285 
286 #if defined(_WIN32)
287  typedef HINSTANCE lib_handle_t;
288  static HINSTANCE MyLoadLibrary(const char* dllname) {
289  char path[MAX_PATH];
290  GetModuleFileNameA(GetCurrentModuleInstance(), path, MAX_PATH);
291  auto p = strrchr(path, '\\');
292  strcpy(p + 1, dllname); // NOLINT
293  HINSTANCE hDll = LoadLibraryA(path);
294  if (hDll) return hDll;
295 
296  hDll = LoadLibraryA(dllname);
297  return hDll;
298  }
299 #else
300  typedef void* lib_handle_t;
301 #endif // _WIN32
302 
303  public:
304  RtcEngineLibHelper(const char* dllname)
305  : m_firstInit(true),
306  m_lib(NULL),
307  m_dllName(dllname),
308  m_pfnCreateAgoraRtcEngine(nullptr),
309  m_pfnGetAgoraRtcEngineVersion(nullptr) {}
310 
311  bool initialize() {
312  if (!m_firstInit) {
313  return isValid();
314  }
315 
316  if (m_dllName.empty()) {
317  return false;
318  }
319 
320  m_firstInit = false;
321 #if defined(_WIN32)
322  m_lib = MyLoadLibrary(m_dllName.c_str());
323  if (m_lib) {
324  m_pfnCreateAgoraRtcEngine =
325  (PFN_CreateAgoraRtcEngine)GetProcAddress(m_lib, "createAgoraRtcEngine");
326  m_pfnGetAgoraRtcEngineVersion =
327  (PFN_GetAgoraRtcEngineVersion)GetProcAddress(m_lib, "getAgoraRtcEngineVersion");
328  }
329 #elif defined(__ANDROID__) || defined(__linux__)
330  m_lib = dlopen(m_dllName.c_str(), RTLD_LAZY);
331  if (m_lib) {
332  m_pfnCreateAgoraRtcEngine = (PFN_CreateAgoraRtcEngine)dlsym(m_lib, "createAgoraRtcEngine");
333  m_pfnGetAgoraRtcEngineVersion =
334  (PFN_GetAgoraRtcEngineVersion)dlsym(m_lib, "getAgoraRtcEngineVersion");
335  }
336 #endif // _WIN32
337 
338  return isValid();
339  }
340 
341  void deinitialize() {
342  if (m_lib) {
343 #if defined(_WIN32)
344  FreeLibrary(m_lib);
345 #elif defined(__ANDROID__) || defined(__linux__)
346  dlclose(m_lib);
347 #endif // _WIN32
348 
349  m_lib = NULL;
350  }
351 
352  m_pfnCreateAgoraRtcEngine = nullptr;
353  m_pfnGetAgoraRtcEngineVersion = nullptr;
354  }
355 
356  ~RtcEngineLibHelper() { deinitialize(); }
357 
358  bool isValid() { return m_pfnCreateAgoraRtcEngine != NULL; }
359 
360  agora::rtc::IRtcEngine* createEngine() {
361  return m_pfnCreateAgoraRtcEngine ? m_pfnCreateAgoraRtcEngine() : NULL;
362  }
363 
364  const char* getVersion(int* build) {
365  return m_pfnGetAgoraRtcEngineVersion ? m_pfnGetAgoraRtcEngineVersion(build) : nullptr;
366  }
367 
368  private:
369  bool m_firstInit;
370  lib_handle_t m_lib;
371  std::string m_dllName;
372  PFN_CreateAgoraRtcEngine m_pfnCreateAgoraRtcEngine;
373  PFN_GetAgoraRtcEngineVersion m_pfnGetAgoraRtcEngineVersion;
374 };
375 
376 // A helper function for decoding out the SEI layout
377 
378 struct canvas_info {
379  int width;
380  int height;
381  int bgcolor;
382 };
383 
384 struct region_info {
385  unsigned id;
386 
387  double x;
388  double y;
389  double width;
390  double height;
391 
392  int alpha; // [0, 255]
393 
394  int render_mode; // 0, crop; 1, ZoomtoFit
395  int zorder; // [0, 100]
396 };
397 
398 #define NUM_OF_LAYOUT_REGIONS 17
399 
400 struct layout_info {
401  long long ms;
402  canvas_info canvas;
403  // At most 9 broadcasters: 1 host, 8 guests.
404  unsigned int region_count;
405  region_info regions[NUM_OF_LAYOUT_REGIONS];
406 };
407 
408 AGORA_API bool AGORA_CALL decode_sei_layout(const void* data, unsigned size, layout_info* layout);
409 
410 } // namespace rtc
411 } // namespace agora
agora::rtc::RtcEngineLibHelper
Definition: rtc_engine_i.h:281
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:44
agora::rtc::RtcEngineContextInternal
Definition: rtc_engine_i.h:137
agora::rtc::IRtcEngineEventHandlerEx
Definition: IAgoraRtcEngineEx.h:34
agora::rtc::VideoEncoderConfiguration
Definition: AgoraBase.h:1788
agora::rtc::IRtcEngineEventHandlerInternal
Definition: rtc_engine_i.h:201
agora::rtc::layout_info
Definition: rtc_engine_i.h:400
agora::rtc::IRtcAvTransportPacketInfoObserver
Definition: rtc_engine_i.h:119
agora::rtc::canvas_info
Definition: rtc_engine_i.h:378
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:1179
agora::rtc::region_info
Definition: rtc_engine_i.h:384
agora::base::IParameterEngine
Definition: AgoraBase.h:88
agora::rtc::RtcEngineContext
Definition: IAgoraRtcEngine.h:2488
agora::rtc::IRtcEngine
Definition: IAgoraRtcEngine.h:2773
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