Skip to content

Commit c23271c

Browse files
committed
refactor: DesktopCapturer initialization
1 parent 255c2a3 commit c23271c

18 files changed

Lines changed: 292 additions & 142 deletions

File tree

webrtc-jni/pom.xml

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -146,12 +146,6 @@
146146
</profile>
147147
<profile>
148148
<id>windows-clang</id>
149-
<activation>
150-
<os>
151-
<family>windows</family>
152-
<arch>amd64</arch>
153-
</os>
154-
</activation>
155149
<properties>
156150
<cmake.clang>-T ClangCL</cmake.clang>
157151
</properties>

webrtc-jni/src/main/cpp/include/JNI_DesktopCapturer.h

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

webrtc-jni/src/main/cpp/include/media/video/desktop/DesktopCapturer.h

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,36 +14,41 @@
1414
* limitations under the License.
1515
*/
1616

17-
#ifndef JNI_WEBRTC_MEDIA_DESKTOP_CAPTURER_H_
18-
#define JNI_WEBRTC_MEDIA_DESKTOP_CAPTURER_H_
17+
#ifndef JNI_WEBRTC_MEDIA_VIDEO_DESKTOP_CAPTURER_H_
18+
#define JNI_WEBRTC_MEDIA_VIDEO_DESKTOP_CAPTURER_H_
1919

2020
#if defined(WEBRTC_WIN)
2121
#include "platform/windows/ComInitializer.h"
2222
#endif
2323

2424
#include "modules/desktop_capture/desktop_capturer.h"
25+
#include "modules/desktop_capture/desktop_and_cursor_composer.h"
2526

2627
#include <jni.h>
2728
#include <memory>
2829

2930
namespace jni
3031
{
31-
class DesktopCapturer : public webrtc::DesktopCapturer
32+
class DesktopCapturer
3233
{
3334
public:
34-
explicit DesktopCapturer(bool screenCapturer);
35-
~DesktopCapturer() override;
35+
DesktopCapturer(webrtc::DesktopCapturer * capturer);
36+
~DesktopCapturer();
37+
38+
DesktopCapturer(const DesktopCapturer &) = delete;
39+
DesktopCapturer & operator=(const DesktopCapturer &) = delete;
3640

3741
// webrtc::DesktopCapturer implementations.
38-
void Start(Callback * callback) override;
39-
void SetSharedMemoryFactory(std::unique_ptr<webrtc::SharedMemoryFactory> factory) override;
40-
void CaptureFrame() override;
41-
void SetExcludedWindow(webrtc::WindowId window) override;
42-
bool GetSourceList(SourceList * sources) override;
43-
bool SelectSource(SourceId id) override;
44-
bool FocusOnSelectedSource() override;
42+
void Start(webrtc::DesktopCapturer::Callback * callback);
43+
void SetSharedMemoryFactory(std::unique_ptr<webrtc::SharedMemoryFactory> factory);
44+
void SetMaxFrameRate(uint32_t max_frame_rate);
45+
void CaptureFrame();
46+
void SetExcludedWindow(webrtc::WindowId window);
47+
bool GetSourceList(webrtc::DesktopCapturer::SourceList * sources);
48+
bool SelectSource(webrtc::DesktopCapturer::SourceId id);
49+
bool FocusOnSelectedSource();
4550
void setFocusSelectedSource(bool focus);
46-
bool IsOccluded(const webrtc::DesktopVector & pos) override;
51+
bool IsOccluded(const webrtc::DesktopVector & pos);
4752

4853
protected:
4954
std::unique_ptr<webrtc::DesktopCapturer> capturer;

webrtc-jni/src/main/cpp/src/JNI_DesktopCapturer.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,15 @@ JNIEXPORT void JNICALL Java_dev_onvoid_webrtc_media_video_desktop_DesktopCapture
8585
capturer->setFocusSelectedSource(focus);
8686
}
8787

88+
JNIEXPORT void JNICALL Java_dev_onvoid_webrtc_media_video_desktop_DesktopCapturer_setMaxFrameRate
89+
(JNIEnv * env, jobject caller, jint maxFrameRate)
90+
{
91+
jni::DesktopCapturer * capturer = GetHandle<jni::DesktopCapturer>(env, caller);
92+
CHECK_HANDLE(capturer);
93+
94+
capturer->setMaxFrameRate(maxFrameRate);
95+
}
96+
8897
JNIEXPORT void JNICALL Java_dev_onvoid_webrtc_media_video_desktop_DesktopCapturer_start
8998
(JNIEnv * env, jobject caller, jobject jcallback)
9099
{

webrtc-jni/src/main/cpp/src/JNI_RefCountedObject.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ JNIEXPORT void JNICALL Java_dev_onvoid_webrtc_internal_RefCountedObject_release
3434
webrtc::RefCountInterface * ref = GetHandle<webrtc::RefCountInterface>(env, caller);
3535
CHECK_HANDLE(ref);
3636

37-
const auto status = ref->Release();
37+
const webrtc::RefCountReleaseStatus status = ref->Release();
3838

3939
if (status == webrtc::RefCountReleaseStatus::kDroppedLastRef) {
4040
SetHandle<std::nullptr_t>(env, caller, nullptr);

webrtc-jni/src/main/cpp/src/JNI_ScreenCapturer.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,24 @@
1818
#include "JavaUtils.h"
1919
#include "media/video/desktop/DesktopCapturer.h"
2020

21+
#include "modules/desktop_capture/desktop_capturer.h"
22+
#include "modules/desktop_capture/desktop_capture_options.h"
23+
#include "modules/desktop_capture/desktop_and_cursor_composer.h"
24+
2125
JNIEXPORT void JNICALL Java_dev_onvoid_webrtc_media_video_desktop_ScreenCapturer_initialize
2226
(JNIEnv * env, jobject caller)
2327
{
24-
SetHandle(env, caller, new jni::DesktopCapturer(true));
28+
auto options = webrtc::DesktopCaptureOptions::CreateDefault();
29+
// Enable desktop effects.
30+
options.set_disable_effects(false);
31+
32+
#if defined(WEBRTC_WIN)
33+
options.set_allow_directx_capturer(true);
34+
#endif
35+
36+
auto capturer = new webrtc::DesktopAndCursorComposer(
37+
webrtc::DesktopCapturer::CreateScreenCapturer(options),
38+
options);
39+
40+
SetHandle(env, caller, new jni::DesktopCapturer(capturer));
2541
}

webrtc-jni/src/main/cpp/src/JNI_WindowCapturer.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,24 @@
1818
#include "JavaUtils.h"
1919
#include "media/video/desktop/DesktopCapturer.h"
2020

21+
#include "modules/desktop_capture/desktop_capturer.h"
22+
#include "modules/desktop_capture/desktop_capture_options.h"
23+
#include "modules/desktop_capture/desktop_and_cursor_composer.h"
24+
2125
JNIEXPORT void JNICALL Java_dev_onvoid_webrtc_media_video_desktop_WindowCapturer_initialize
2226
(JNIEnv * env, jobject caller)
2327
{
24-
SetHandle(env, caller, new jni::DesktopCapturer(false));
28+
auto options = webrtc::DesktopCaptureOptions::CreateDefault();
29+
// Enable desktop effects.
30+
options.set_disable_effects(false);
31+
32+
#if defined(WEBRTC_WIN)
33+
options.set_allow_directx_capturer(true);
34+
#endif
35+
36+
auto capturer = new webrtc::DesktopAndCursorComposer(
37+
webrtc::DesktopCapturer::CreateWindowCapturer(options),
38+
options);
39+
40+
SetHandle(env, caller, new jni::DesktopCapturer(capturer));
2541
}

webrtc-jni/src/main/cpp/src/api/VideoFrame.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ namespace jni
2727
{
2828
webrtc::VideoFrame toNative(JNIEnv * env, const JavaRef<jobject> & javaFrame)
2929
{
30-
const auto javaClass = JavaClasses::get<JavaVideoFrameClass>(env);
30+
const std::shared_ptr<JavaVideoFrameClass> javaClass = JavaClasses::get<JavaVideoFrameClass>(env);
3131
JavaObject obj(env, javaFrame);
3232

3333
int rotation = obj.getInt(javaClass->rotation);
Lines changed: 88 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -1,100 +1,89 @@
1-
/*
2-
* Copyright 2019 Alex Andres
3-
*
4-
* Licensed under the Apache License, Version 2.0 (the "License");
5-
* you may not use this file except in compliance with the License.
6-
* You may obtain a copy of the License at
7-
*
8-
* http://www.apache.org/licenses/LICENSE-2.0
9-
*
10-
* Unless required by applicable law or agreed to in writing, software
11-
* distributed under the License is distributed on an "AS IS" BASIS,
12-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13-
* See the License for the specific language governing permissions and
14-
* limitations under the License.
15-
*/
16-
17-
#include "media/video/desktop/DesktopCapturer.h"
18-
19-
#include "modules/desktop_capture/desktop_capturer.h"
20-
#include "modules/desktop_capture/desktop_capture_options.h"
21-
#include "modules/desktop_capture/desktop_and_cursor_composer.h"
22-
23-
namespace jni
24-
{
25-
DesktopCapturer::DesktopCapturer(bool screenCapturer) :
26-
focusSelectedSource(false)
27-
{
28-
auto options = webrtc::DesktopCaptureOptions::CreateDefault();
29-
// Enable desktop effects.
30-
options.set_disable_effects(false);
31-
32-
#if defined(WEBRTC_WIN)
33-
options.set_allow_directx_capturer(true);
34-
#endif
35-
36-
if (screenCapturer) {
37-
capturer.reset(new webrtc::DesktopAndCursorComposer(
38-
webrtc::DesktopCapturer::CreateScreenCapturer(options),
39-
options));
40-
}
41-
else {
42-
capturer = std::make_unique<webrtc::DesktopAndCursorComposer>(
43-
webrtc::DesktopCapturer::CreateWindowCapturer(options), options);
44-
}
45-
}
46-
47-
DesktopCapturer::~DesktopCapturer()
48-
{
49-
capturer.reset();
50-
}
51-
52-
void DesktopCapturer::Start(Callback * callback)
53-
{
54-
capturer->Start(callback);
55-
56-
if (focusSelectedSource) {
57-
capturer->FocusOnSelectedSource();
58-
}
59-
}
60-
61-
void DesktopCapturer::SetSharedMemoryFactory(std::unique_ptr<webrtc::SharedMemoryFactory> factory)
62-
{
63-
capturer->SetSharedMemoryFactory(std::move(factory));
64-
}
65-
66-
void DesktopCapturer::CaptureFrame()
67-
{
68-
capturer->CaptureFrame();
69-
}
70-
71-
void DesktopCapturer::SetExcludedWindow(webrtc::WindowId window)
72-
{
73-
capturer->SetExcludedWindow(window);
74-
}
75-
76-
bool DesktopCapturer::GetSourceList(SourceList * sources)
77-
{
78-
return capturer->GetSourceList(sources);
79-
}
80-
81-
bool DesktopCapturer::SelectSource(SourceId id)
82-
{
83-
return capturer->SelectSource(id);
84-
}
85-
86-
bool DesktopCapturer::FocusOnSelectedSource()
87-
{
88-
return capturer->FocusOnSelectedSource();
89-
}
90-
91-
void DesktopCapturer::setFocusSelectedSource(bool focus)
92-
{
93-
this->focusSelectedSource = focus;
94-
}
95-
96-
bool DesktopCapturer::IsOccluded(const webrtc::DesktopVector & pos)
97-
{
98-
return capturer->IsOccluded(pos);
99-
}
1+
/*
2+
* Copyright 2019 Alex Andres
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
#include "media/video/desktop/DesktopCapturer.h"
18+
19+
#include "modules/desktop_capture/desktop_capturer.h"
20+
#include "modules/desktop_capture/desktop_capture_options.h"
21+
#include "modules/desktop_capture/desktop_and_cursor_composer.h"
22+
23+
namespace jni
24+
{
25+
DesktopCapturer::DesktopCapturer(webrtc::DesktopCapturer * capturer) :
26+
focusSelectedSource(false)
27+
{
28+
this->capturer.reset(capturer);
29+
}
30+
31+
DesktopCapturer::~DesktopCapturer()
32+
{
33+
capturer.reset();
34+
}
35+
36+
void DesktopCapturer::Start(webrtc::DesktopCapturer::Callback * callback)
37+
{
38+
capturer->Start(callback);
39+
40+
if (focusSelectedSource) {
41+
capturer->FocusOnSelectedSource();
42+
}
43+
}
44+
45+
void DesktopCapturer::SetSharedMemoryFactory(std::unique_ptr<webrtc::SharedMemoryFactory> factory)
46+
{
47+
capturer->SetSharedMemoryFactory(std::move(factory));
48+
}
49+
50+
void DesktopCapturer::SetMaxFrameRate(uint32_t max_frame_rate)
51+
{
52+
capturer->SetMaxFrameRate(max_frame_rate);
53+
}
54+
55+
void DesktopCapturer::CaptureFrame()
56+
{
57+
capturer->CaptureFrame();
58+
}
59+
60+
void DesktopCapturer::SetExcludedWindow(webrtc::WindowId window)
61+
{
62+
capturer->SetExcludedWindow(window);
63+
}
64+
65+
bool DesktopCapturer::GetSourceList(webrtc::DesktopCapturer::SourceList * sources)
66+
{
67+
return capturer->GetSourceList(sources);
68+
}
69+
70+
bool DesktopCapturer::SelectSource(webrtc::DesktopCapturer::SourceId id)
71+
{
72+
return capturer->SelectSource(id);
73+
}
74+
75+
bool DesktopCapturer::FocusOnSelectedSource()
76+
{
77+
return capturer->FocusOnSelectedSource();
78+
}
79+
80+
void DesktopCapturer::setFocusSelectedSource(bool focus)
81+
{
82+
this->focusSelectedSource = focus;
83+
}
84+
85+
bool DesktopCapturer::IsOccluded(const webrtc::DesktopVector & pos)
86+
{
87+
return capturer->IsOccluded(pos);
88+
}
10089
}

webrtc-jni/src/main/cpp/src/media/video/desktop/DesktopSource.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ namespace jni
2626
{
2727
JavaLocalRef<jobject> toJava(JNIEnv * env, const webrtc::DesktopCapturer::Source & source)
2828
{
29-
const auto javaClass = JavaClasses::get<JavaDesktopSourceClass>(env);
29+
const std::shared_ptr<JavaDesktopSourceClass> javaClass = JavaClasses::get<JavaDesktopSourceClass>(env);
3030

3131
jobject obj = env->NewObject(javaClass->cls, javaClass->ctor,
3232
JavaString::toJava(env, source.title).get(),
@@ -37,7 +37,7 @@ namespace jni
3737

3838
webrtc::DesktopCapturer::Source toNative(JNIEnv * env, const JavaRef<jobject> & javaType)
3939
{
40-
const auto javaClass = JavaClasses::get<JavaDesktopSourceClass>(env);
40+
const std::shared_ptr<JavaDesktopSourceClass> javaClass = JavaClasses::get<JavaDesktopSourceClass>(env);
4141

4242
JavaObject obj(env, javaType);
4343

0 commit comments

Comments
 (0)