-
Notifications
You must be signed in to change notification settings - Fork 602
/
desktopcapturer.cpp
92 lines (74 loc) · 2.89 KB
/
desktopcapturer.cpp
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
/* ---------------------------------------------------------------------------
** This software is in the public domain, furnished "as is", without technical
** support, and with no warranty, express or implied, as to its usefulness for
** any purpose.
**
** screencapturer.cpp
**
** -------------------------------------------------------------------------*/
#ifdef USE_X11
#include "rtc_base/logging.h"
#include "desktopcapturer.h"
void DesktopCapturer::OnCaptureResult(webrtc::DesktopCapturer::Result result, std::unique_ptr<webrtc::DesktopFrame> frame) {
RTC_LOG(LS_INFO) << "DesktopCapturer:OnCaptureResult";
if (result == webrtc::DesktopCapturer::Result::SUCCESS) {
int width = frame->stride() / webrtc::DesktopFrame::kBytesPerPixel;
int height = frame->rect().height();
rtc::scoped_refptr<webrtc::I420Buffer> I420buffer = webrtc::I420Buffer::Create(width, height);
const int conversionResult = libyuv::ConvertToI420(frame->data(), 0,
I420buffer->MutableDataY(), I420buffer->StrideY(),
I420buffer->MutableDataU(), I420buffer->StrideU(),
I420buffer->MutableDataV(), I420buffer->StrideV(),
0, 0,
width, height,
I420buffer->width(), I420buffer->height(),
libyuv::kRotate0, ::libyuv::FOURCC_ARGB);
if (conversionResult >= 0) {
webrtc::VideoFrame videoFrame(I420buffer, webrtc::VideoRotation::kVideoRotation_0, rtc::TimeMicros());
if ( (m_height == 0) && (m_width == 0) ) {
m_broadcaster.OnFrame(videoFrame);
} else {
int height = m_height;
int width = m_width;
if (height == 0) {
height = (videoFrame.height() * width) / videoFrame.width();
}
else if (width == 0) {
width = (videoFrame.width() * height) / videoFrame.height();
}
int stride_y = width;
int stride_uv = (width + 1) / 2;
rtc::scoped_refptr<webrtc::I420Buffer> scaled_buffer = webrtc::I420Buffer::Create(width, height, stride_y, stride_uv, stride_uv);
scaled_buffer->ScaleFrom(*videoFrame.video_frame_buffer()->ToI420());
webrtc::VideoFrame frame = webrtc::VideoFrame::Builder()
.set_video_frame_buffer(scaled_buffer)
.set_rotation(webrtc::kVideoRotation_0)
.set_timestamp_us(rtc::TimeMicros())
.build();
m_broadcaster.OnFrame(frame);
}
} else {
RTC_LOG(LS_ERROR) << "DesktopCapturer:OnCaptureResult conversion error:" << conversionResult;
}
} else {
RTC_LOG(LS_ERROR) << "DesktopCapturer:OnCaptureResult capture error:" << (int)result;
}
}
void DesktopCapturer::CaptureThread() {
RTC_LOG(LS_INFO) << "DesktopCapturer:Run start";
while (IsRunning()) {
m_capturer->CaptureFrame();
}
RTC_LOG(LS_INFO) << "DesktopCapturer:Run exit";
}
bool DesktopCapturer::Start() {
m_isrunning = true;
m_capturethread = std::thread(&DesktopCapturer::CaptureThread, this);
m_capturer->Start(this);
return true;
}
void DesktopCapturer::Stop() {
m_isrunning = false;
m_capturethread.join();
}
#endif