Agora Java API Reference for Android
NGIAgoraExtensionScreenSource.h
1 //
2 // Agora SDK
3 //
4 // Copyright (c) 2021 Agora.io. All rights reserved.
5 //
6 
7 #pragma once // NOLINT(build/header_guard)
8 
9 #include "AgoraBase.h"
10 #include "IAgoraLog.h"
11 #include "AgoraRefPtr.h"
12 #include "NGIAgoraVideoFrame.h"
13 #include "AgoraMediaBase.h"
14 #if defined(WEBRTC_IOS)
15 #include <coreVideo/CVPixelBuffer.h>
16 #endif
17 namespace agora {
18 namespace rtc {
19 
21  int capture_type;
22  uint32_t captured_frame_width;
23  uint32_t captured_frame_height;
24  uint32_t total_captured_frames;
25  uint64_t per_frame_cap_time_ms;
26  uint64_t per_capture_cpu_cycles;
27  bool capture_mouse_cursor;
28  uint32_t target_fps;
29  uint32_t real_capture_fps;
30  uint32_t capture_out_fps;
31  uint32_t drop_fps;
32 
34  : capture_type(-1), captured_frame_width(0), captured_frame_height(0),
35  total_captured_frames(0), per_frame_cap_time_ms(0),
36  per_capture_cpu_cycles(0), capture_mouse_cursor(true),
37  target_fps(0), real_capture_fps(0),
38  capture_out_fps(0), drop_fps(0) {}
39 };
40 
42  public:
43  class Control : public RefCountInterface {
44  public:
45  virtual int postEvent(const char* key, const char* value) = 0;
46  virtual void printLog(commons::LOG_LEVEL level, const char* format, ...) = 0;
47  virtual void printLog(commons::LOG_LEVEL level, const char* fromat, va_list) = 0;
48  virtual int pushAudioFrame(const media::IAudioFrameObserver::AudioFrame& captured_frame) = 0;
49  virtual bool timeToPushVideo() = 0;
50  virtual int pushVideoFrame(const agora::agora_refptr<IVideoFrame>& captured_frame) = 0;
51  virtual agora::agora_refptr<IVideoFrameMemoryPool> getMemoryPool() = 0;
52 #if defined(WEBRTC_IOS)
53  virtual int pushVideoFrame(CVPixelBufferRef pixelBuffer, int64_t timestamp_ms, uint32_t rotation) = 0;
54 #endif
55 #if defined(WEBRTC_WIN)
56  virtual void recycleVideoCache() = 0;
57 #endif
58  };
59 
61  uint32_t volume;
62  int sample_rate_hz;
63  int num_channels;
64  AudioCaptureConfig() : volume(0), sample_rate_hz(0), num_channels(0) {}
65  };
66 
67 #if defined (__ANDROID__) || (defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE) || defined(__OHOS__)
68  struct VideoCaptureConfig {
69  agora::rtc::VideoDimensions dimensions;
70  int frameRate;
72  : dimensions(640, 360), frameRate(15) {}
73  };
74 #else
76  #if !defined(__linux__)
77  enum class CapturerMode {
78  kUnspecified = 0,
79  // Mac only
80  kScreenCaptureKit = 10,
81  kCoreGraphic = 11,
82  kAVFoundation = 12,
83  };
84  #endif
85 
86  enum CaptureType {
87  CaptureWindow,
88  CaptureScreen,
89  };
90  CaptureType type;
91  Rectangle screen_rect;
92  Rectangle region_offset;
93  int64_t display_id;
94  view_t window_id;
95 
96  bool window_focused;
97 
98  // Mac only
99  bool disable_avf;
100  bool disable_frame_transparent_check;
101 #if !defined(__linux__)
102  CapturerMode capturerMode = CapturerMode::kUnspecified;
103 
104  bool captureAudio = false;
105  int audio_channel_count = 2;
106  int audio_sample_rate = 48000;
107  bool excludeCurrentProcessAudio = true;
108 #endif
109 
111  : type(CaptureScreen), screen_rect(), region_offset(), display_id(0), window_id(NULL), window_focused(false), disable_avf(false), disable_frame_transparent_check(false) { }
112  };
113 #endif
114 
116  int thumb_width;
117  int thumb_height;
118  int icon_width;
119  int icon_height;
120  bool include_screen;
121  bool unfiltered;
122  bool unskip_system_window;
123  bool ignore_unresponsive;
124 
125 #if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
126  enum class ApiType {
127  kUnspecified = 0,
128  kCGDisplay = 1,
129  kNSScreen = 2
130  };
131  ApiType api_type = ApiType::kUnspecified;
132 #endif
133  };
134 
135  enum CaptureMode {
136  kPull, // SDK needs to poll the captured frame actively
137  kPush // Capture source pushes the captured frame to sdk
138  };
139 
140 
141  virtual ~IScreenCaptureSource() {}
142 
143  virtual int initializeCapture(const agora_refptr<Control>& control) = 0;
144 
145  virtual int initVideo(const VideoCaptureConfig& config) = 0;
146  // Start video capture interface for desktop capturing
147  virtual int startVideoCapture(const VideoCaptureConfig& config) = 0;
148  virtual int stopVideoCapture() = 0;
149  virtual int stopVideoCaptureAsync() = 0;
150 
151  virtual CaptureMode getVideoCaptureMode() = 0;
152 
153  // Implementation of the following interfaces are not mandatory
154  virtual bool isAudioCaptureSupported() {
155  return false;
156  }
157  virtual int startAudioCapture(const AudioCaptureConfig& config) {
158  return -ERR_NOT_SUPPORTED;
159  }
160  virtual int stopAudioCapture() {
161  return -ERR_NOT_SUPPORTED;
162  }
163  virtual int setAudioVolume(uint32_t volume) {
164  return -ERR_NOT_SUPPORTED;
165  }
166  virtual int setFrameRate(int fps) {
167  return -ERR_NOT_SUPPORTED;
168  }
169 
170  virtual int setScreenCaptureDimensions(const agora::rtc::VideoDimensions& dimensions) {
171  return -ERR_NOT_SUPPORTED;
172  }
173  virtual int updateCaptureRegion(const agora::rtc::Rectangle& captureRegion) {
174  return -ERR_NOT_SUPPORTED;
175  }
176  virtual int setExcludeWindowList(void* const * handles, int count) {
177  return -ERR_NOT_SUPPORTED;
178  }
179  virtual int captureMouseCursor(bool capture) {
180  return -ERR_NOT_SUPPORTED;
181  }
182  virtual int capture(agora::agora_refptr<IVideoFrame>& frame) {
183  return -ERR_NOT_SUPPORTED;
184  }
185  virtual int getProfilingStats(ScreenCaptureProfilingStatistics& stats) {
186  return -ERR_NOT_SUPPORTED;
187  }
188  virtual int getScreenDimensions(int& width, int& height) {
189  return ERR_NOT_SUPPORTED;
190  }
191  virtual int setProperty(const char* key, const char* json_value) {
192  return -ERR_NOT_SUPPORTED;
193  }
194  virtual int setCustomContext(const char* key, const void* context) {
195  return -ERR_NOT_SUPPORTED;
196  }
197  virtual int getProperty(const char* key, char* json_value, int& length) {
198  return -ERR_NOT_SUPPORTED;
199  }
200  virtual int setHighLight(bool isHighLight, unsigned int color, int width) {
201  return -ERR_NOT_SUPPORTED;
202  }
203  virtual int setContentType(int contentType) {
204  return -ERR_NOT_SUPPORTED;
205  }
206  virtual void* getCustomContext(const char* key) {
207  return NULL;
208  }
209  virtual void* getScreenCaptureSources(const ScreenSourceListOption& option) {
210  return NULL;
211  }
212  virtual void setFrameCopy(bool frameCopy) {};
213 #if defined(WEBRTC_ANDROID) && !defined(RTC_EXCLUDE_JAVA)
214  virtual void setSmoothCapture(bool smoothCapture) {};
215  virtual void setResetVitualDisplay(bool reset) {};
216 #endif
217 #if defined(WEBRTC_ANDROID)
218  virtual int setExternalMediaProjection(void* mediaProjection) {
219  return -ERR_NOT_SUPPORTED;
220  }
221 #endif
222 };
223 
224 } // namespace rtc
225 } // namespace agora
agora::rtc::ScreenCaptureProfilingStatistics
Definition: NGIAgoraExtensionScreenSource.h:20
agora::agora_refptr
Definition: AgoraRefPtr.h:44
agora::rtc::Rectangle
The location of the target area relative to the screen or window. If you do not set this parameter,...
Definition: AgoraBase.h:2342
agora::media::IAudioFrameObserverBase::AudioFrame
Raw audio data.
Definition: AgoraMediaBase.h:1429
agora::rtc::IScreenCaptureSource::ScreenSourceListOption
Definition: NGIAgoraExtensionScreenSource.h:115
agora::rtc::IScreenCaptureSource::AudioCaptureConfig
Definition: NGIAgoraExtensionScreenSource.h:60
agora::rtc::IScreenCaptureSource::Control
Definition: NGIAgoraExtensionScreenSource.h:43
agora::rtc::IScreenCaptureSource
Definition: NGIAgoraExtensionScreenSource.h:41
agora::RefCountInterface
Definition: AgoraRefPtr.h:31
agora::rtc::VideoDimensions
The video dimension.
Definition: AgoraBase.h:1166
agora::rtc::IScreenCaptureSource::VideoCaptureConfig
Definition: NGIAgoraExtensionScreenSource.h:75