Skip to content
This repository was archived by the owner on Oct 25, 2024. It is now read-only.

Commit 0490093

Browse files
committed
Add some API for C++/JavaScript interop.
1 parent ed8781b commit 0490093

File tree

11 files changed

+246
-47
lines changed

11 files changed

+246
-47
lines changed

talk/owt/BUILD.gn

Lines changed: 43 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,17 @@ import("//testing/test.gni")
99
# Introduced for using libvpx config files. We only enable libvpx rate
1010
# controller for VP9 on Windows.
1111
if (is_win) {
12-
13-
if (current_cpu == "x86") {
14-
cpu_arch_full = "ia32"
15-
} else if (current_cpu == "x64") {
16-
cpu_arch_full = "x64"
17-
} else if (current_cpu == "arm") {
18-
if (arm_use_neon) {
19-
cpu_arch_full = "arm-neon"
20-
} else {
21-
cpu_arch_full = "arm"
22-
}
23-
}
12+
if (current_cpu == "x86") {
13+
cpu_arch_full = "ia32"
14+
} else if (current_cpu == "x64") {
15+
cpu_arch_full = "x64"
16+
} else if (current_cpu == "arm") {
17+
if (arm_use_neon) {
18+
cpu_arch_full = "arm-neon"
19+
} else {
20+
cpu_arch_full = "arm"
21+
}
22+
}
2423
}
2524

2625
if (is_android) {
@@ -182,10 +181,10 @@ static_library("owt_sdk_base") {
182181
sources += [
183182
"sdk/base/win/base_allocator.cc",
184183
"sdk/base/win/base_allocator.h",
185-
"sdk/base/win/d3d_allocator.cc",
186-
"sdk/base/win/d3d_allocator.h",
187184
"sdk/base/win/d3d11_allocator.cc",
188185
"sdk/base/win/d3d11_allocator.h",
186+
"sdk/base/win/d3d_allocator.cc",
187+
"sdk/base/win/d3d_allocator.h",
189188
"sdk/base/win/d3dnativeframe.h",
190189
"sdk/base/win/mediacapabilities.cc",
191190
"sdk/base/win/mediacapabilities.h",
@@ -201,9 +200,9 @@ static_library("owt_sdk_base") {
201200
"sdk/base/win/msdkvideoencoderfactory.h",
202201
"sdk/base/win/sysmem_allocator.cc",
203202
"sdk/base/win/sysmem_allocator.h",
204-
"sdk/base/win/vpedefs.h",
205203
"sdk/base/win/vp9ratecontrol.cc",
206204
"sdk/base/win/vp9ratecontrol.h",
205+
"sdk/base/win/vpedefs.h",
207206
]
208207
public_deps += [ "//third_party/libvpx" ]
209208
include_dirs += [
@@ -225,7 +224,7 @@ static_library("owt_sdk_base") {
225224
} else {
226225
defines += [ "OWT_USE_H265" ]
227226
}
228-
227+
229228
if (owt_use_quic) {
230229
defines += [ "OWT_ENABLE_QUIC" ]
231230
if (owt_quic_header_root != "") {
@@ -243,39 +242,38 @@ static_library("owt_sdk_base") {
243242
sources += [
244243
"sdk/base/desktopcapturer.cc",
245244
"sdk/base/desktopcapturer.h",
246-
"sdk/base/win/videorendererwin.cc",
247-
"sdk/base/win/videorendererwin.h",
248-
"sdk/base/win/videorendererd3d11.cc",
249-
"sdk/base/win/videorendererd3d11.h",
250245
"sdk/base/win/d3d11_manager.h",
251-
"sdk/base/win/device_info_mf.h",
252246
"sdk/base/win/device_info_mf.cc",
253-
"sdk/base/win/video_capture_mf.h",
247+
"sdk/base/win/device_info_mf.h",
254248
"sdk/base/win/video_capture_mf.cc",
249+
"sdk/base/win/video_capture_mf.h",
250+
"sdk/base/win/videorendererd3d11.cc",
251+
"sdk/base/win/videorendererd3d11.h",
252+
"sdk/base/win/videorendererwin.cc",
253+
"sdk/base/win/videorendererwin.h",
255254
]
256255
public_deps += [ "//third_party/webrtc/modules/audio_device:audio_device_module_from_input_and_output" ]
257-
258256
}
259257
if (is_linux) {
260258
if (owt_msdk_header_root != "") {
261259
include_dirs += [ owt_msdk_header_root ]
262260
defines += [ "OWT_USE_MSDK" ]
263261
sources += [
264-
"sdk/base/linux/displayutils.cc",
265-
"sdk/base/linux/displayutils.h",
266262
"sdk/base/linux/base_allocator.cc",
267263
"sdk/base/linux/base_allocator.h",
268-
"sdk/base/linux/vaapi_allocator.cc",
269-
"sdk/base/linux/vaapi_allocator.h",
270-
"sdk/base/linux/msdkvideosession.cc",
271-
"sdk/base/linux/msdkvideosession.h",
272-
"sdk/base/linux/msdkvideodecoderfactory.cc",
273-
"sdk/base/linux/msdkvideodecoderfactory.h",
264+
"sdk/base/linux/displayutils.cc",
265+
"sdk/base/linux/displayutils.h",
274266
"sdk/base/linux/msdkvideodecoder.cc",
275267
"sdk/base/linux/msdkvideodecoder.h",
276-
"sdk/base/linux/xwindownativeframe.h",
268+
"sdk/base/linux/msdkvideodecoderfactory.cc",
269+
"sdk/base/linux/msdkvideodecoderfactory.h",
270+
"sdk/base/linux/msdkvideosession.cc",
271+
"sdk/base/linux/msdkvideosession.h",
272+
"sdk/base/linux/vaapi_allocator.cc",
273+
"sdk/base/linux/vaapi_allocator.h",
277274
"sdk/base/linux/videorenderlinux.cc",
278275
"sdk/base/linux/videorenderlinux.h",
276+
"sdk/base/linux/xwindownativeframe.h",
279277
]
280278
}
281279
}
@@ -287,7 +285,7 @@ static_library("owt_sdk_base") {
287285
"sdk/base/customizedvideodecoderproxy.h",
288286
]
289287
}
290-
if ((is_win || is_linux)) {
288+
if (is_win || is_linux) {
291289
sources += [
292290
"sdk/base/customizedaudiocapturer.cc",
293291
"sdk/base/customizedaudiocapturer.h",
@@ -338,11 +336,21 @@ if (is_wasm) {
338336
wasm_lib("owt_wasm") {
339337
name = "owt"
340338
deps = [
339+
"//third_party/boringssl",
340+
"//third_party/webrtc/call",
341341
"//third_party/webrtc/modules/rtp_rtcp:rtp_rtcp",
342342
"//third_party/webrtc/rtc_base:rtc_json",
343-
"//third_party/boringssl",
344343
]
345-
sources = [ "sdk/wasm/main.cc" ]
344+
sources = [
345+
"sdk/wasm/binding.h",
346+
"sdk/wasm/main.cc",
347+
"sdk/wasm/media_session.cc",
348+
"sdk/wasm/media_session.h",
349+
"sdk/wasm/rtp_video_receiver.cc",
350+
"sdk/wasm/rtp_video_receiver.h",
351+
"sdk/wasm/web_transport_session.cc",
352+
"sdk/wasm/web_transport_session.h",
353+
]
346354
}
347355
}
348356

talk/owt/sdk/wasm/binding.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// Copyright (C) <2021> Intel Corporation
2+
//
3+
// SPDX-License-Identifier: Apache-2.0
4+
5+
#ifndef OWT_WASM_BINDING_H_
6+
#define OWT_WASM_BINDING_H_
7+
8+
#include <emscripten/bind.h>
9+
#include "talk/owt/sdk/wasm/media_session.h"
10+
#include "talk/owt/sdk/wasm/rtp_video_receiver.h"
11+
12+
namespace owt {
13+
namespace wasm {
14+
15+
EMSCRIPTEN_BINDINGS(Owt) {
16+
emscripten::class_<MediaSession>("MediaSession").constructor<>();
17+
emscripten::class_<RtpVideoReceiver>("RtpVideoReceiver")
18+
.function("onRtpPacket", &RtpVideoReceiver::OnRtpPacket);
19+
}
20+
21+
} // namespace wasm
22+
} // namespace owt
23+
24+
#endif

talk/owt/sdk/wasm/gn/BUILD.gn

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,23 +65,23 @@ template("gcc_like_toolchain") {
6565

6666
tool("cc") {
6767
depfile = "{{output}}.d"
68-
command = "$cc_wrapper $cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -fno-stack-protector ${external_cflags} -c {{source}} -o {{output}}"
68+
command = "$cc_wrapper $cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -DEMSCRIPTEN_HAS_UNBOUND_TYPE_NAMES=0 --bind -fno-stack-protector ${external_cflags} -c {{source}} -o {{output}}"
6969
depsformat = "gcc"
7070
outputs = [ "$object_subdir/{{source_name_part}}.o" ]
7171
description = "compile {{source}}"
7272
}
7373

7474
tool("cxx") {
7575
depfile = "{{output}}.d"
76-
command = "$cc_wrapper $cxx -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} -fno-stack-protector ${external_cflags} ${external_cxxflags} -c {{source}} -o {{output}}"
76+
command = "$cc_wrapper $cxx -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} -DEMSCRIPTEN_HAS_UNBOUND_TYPE_NAMES=0 --bind -fno-stack-protector ${external_cflags} ${external_cxxflags} -c {{source}} -o {{output}}"
7777
depsformat = "gcc"
7878
outputs = [ "$object_subdir/{{source_name_part}}.o" ]
7979
description = "compile {{source}}"
8080
}
8181

8282
tool("asm") {
8383
depfile = "{{output}}.d"
84-
command = "$cc_wrapper $cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{asmflags}} -fno-stack-protector -c {{source}} -o {{output}}"
84+
command = "$cc_wrapper $cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{asmflags}} -DEMSCRIPTEN_HAS_UNBOUND_TYPE_NAMES=0 --bind -fno-stack-protector -c {{source}} -o {{output}}"
8585
depsformat = "gcc"
8686
outputs = [ "$object_subdir/{{source_name_part}}.o" ]
8787
description = "assemble {{source}}"
@@ -175,6 +175,6 @@ gcc_like_toolchain("wasm") {
175175
os = host_os
176176
ar = "$emsdk_dir/emscripten/emar --em-config $em_config"
177177
cc = "$emsdk_dir/emscripten/emcc --em-config $em_config"
178-
cxx = "$emsdk_dir/emscripten/em++ --em-config $em_config"
178+
cxx = "$emsdk_dir/emscripten/em++ --em-config $em_config --bind -s USE_PTHREADS=1"
179179
strip = ""
180180
}

talk/owt/sdk/wasm/gn/wasm.gni

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,14 @@ template("wasm_lib") {
4949
"-s",
5050
"INITIAL_MEMORY=33554432",
5151
"-s",
52-
"ALLOW_MEMORY_GROWTH=1",
53-
"-s",
5452
"ALLOW_TABLE_GROWTH=1",
5553
"-s",
5654
"WASM_ASYNC_COMPILATION=0",
5755
"-s",
56+
"USE_PTHREADS=1",
57+
"-s",
58+
"LLD_REPORT_UNDEFINED",
59+
"-s",
5860
"EXTRA_EXPORTED_RUNTIME_METHODS=" + _exports,
5961

6062
# This forces the MEMFS filesystem library to always use typed arrays
@@ -75,6 +77,8 @@ template("wasm_lib") {
7577
"EXPORT_NAME=${target_name}",
7678

7779
"-lworkerfs.js", # For FS.filesystems.WORKERFS
80+
81+
"--bind",
7882
]
7983
if (is_debug) {
8084
_target_ldflags += [
@@ -84,7 +88,7 @@ template("wasm_lib") {
8488
"SAFE_HEAP=1",
8589
"-s",
8690
"STACK_OVERFLOW_CHECK=1",
87-
"-g4",
91+
"-gsource-map",
8892
"-O0",
8993
]
9094
} else {
@@ -103,9 +107,12 @@ template("wasm_lib") {
103107
]
104108
}
105109

106-
_target_cflags = ["-fno-stack-protector"]
107-
if(defined(invoker.cflags)){
108-
_target_cflags+=invoker.cflags
110+
_target_cflags = [
111+
"-fno-stack-protector",
112+
"-pthread",
113+
]
114+
if (defined(invoker.cflags)) {
115+
_target_cflags += invoker.cflags
109116
}
110117

111118
_vars_to_forward = [
@@ -122,6 +129,7 @@ template("wasm_lib") {
122129

123130
executable("${_lib_name}.js") {
124131
forward_variables_from(invoker, _vars_to_forward)
132+
125133
# Fix ldflags.
126134
ldflags = _target_ldflags
127135
cflags = _target_cflags
@@ -153,4 +161,4 @@ template("wasm_lib") {
153161
":${_lib_name}.wasm($wasm_toolchain)",
154162
]
155163
}
156-
} # template
164+
} # template

talk/owt/sdk/wasm/main.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,16 @@
22
//
33
// SPDX-License-Identifier: Apache-2.0
44

5+
#include <emscripten/bind.h>
56
#include <iostream>
67
#include "third_party/webrtc/rtc_base/strings/json.h"
8+
#include "talk/owt/sdk/wasm/binding.h"
79

810
int main(int argc, char** argv) {
911
Json::Value in_s("foo");
1012
std::string out;
1113
rtc::GetStringFromJson(in_s, &out);
12-
std::cout<<out<<std::endl;
14+
std::cout << out << std::endl;
1315

1416
printf("WASM main.\n");
1517
return 0;

talk/owt/sdk/wasm/media_session.cc

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// Copyright (C) <2021> Intel Corporation
2+
//
3+
// SPDX-License-Identifier: Apache-2.0
4+
5+
#include "talk/owt/sdk/wasm/media_session.h"
6+
7+
namespace owt {
8+
namespace wasm {
9+
MediaSession::MediaSession()
10+
: call_(std::unique_ptr<webrtc::Call>(
11+
webrtc::Call::Create(webrtc::Call::Config(nullptr)))),
12+
video_receiver_(nullptr) {}
13+
14+
MediaSession::~MediaSession() {}
15+
16+
RtpVideoReceiver* MediaSession::CreateRtpVideoReceiver() {
17+
webrtc::VideoReceiveStream::Config config(web_transport_session_.get());
18+
webrtc::TaskQueueBase* task_queue = webrtc::TaskQueueBase::Current();
19+
if (!task_queue) {
20+
task_queue = rtc::ThreadManager::Instance()->CurrentThread();
21+
}
22+
std::unique_ptr<webrtc::RtpVideoStreamReceiver2> receiver =
23+
std::make_unique<webrtc::RtpVideoStreamReceiver2>(
24+
task_queue, webrtc::Clock::GetRealTimeClock(),
25+
web_transport_session_.get(), nullptr, nullptr, &config, nullptr,
26+
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
27+
nullptr);
28+
video_receiver_ = std::make_unique<RtpVideoReceiver>(std::move(receiver));
29+
return video_receiver_.get();
30+
}
31+
} // namespace wasm
32+
} // namespace owt

talk/owt/sdk/wasm/media_session.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// Copyright (C) <2021> Intel Corporation
2+
//
3+
// SPDX-License-Identifier: Apache-2.0
4+
5+
#ifndef OWT_WASM_MEDIASESSION_H_
6+
#define OWT_WASM_MEDIASESSION_H_
7+
8+
#include "call/call.h"
9+
#include "talk/owt/sdk/wasm/rtp_video_receiver.h"
10+
#include "talk/owt/sdk/wasm/web_transport_session.h"
11+
12+
namespace owt {
13+
namespace wasm {
14+
// Manages a media session between a web client and OWT server QUIC agent.
15+
class MediaSession {
16+
public:
17+
explicit MediaSession();
18+
virtual ~MediaSession();
19+
RtpVideoReceiver* CreateRtpVideoReceiver();
20+
21+
private:
22+
std::unique_ptr<WebTransportSession> web_transport_session_;
23+
std::unique_ptr<webrtc::Call> call_;
24+
std::unique_ptr<RtpVideoReceiver> video_receiver_;
25+
};
26+
27+
} // namespace wasm
28+
} // namespace owt
29+
30+
#endif
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// Copyright (C) <2021> Intel Corporation
2+
//
3+
// SPDX-License-Identifier: Apache-2.0
4+
5+
#include "talk/owt/sdk/wasm/rtp_video_receiver.h"
6+
#include <cstdint>
7+
#include "third_party/webrtc/rtc_base/logging.h"
8+
9+
namespace owt {
10+
namespace wasm {
11+
RtpVideoReceiver::RtpVideoReceiver(
12+
std::unique_ptr<webrtc::RtpVideoStreamReceiver2> receiver)
13+
: receiver_(std::move(receiver)) {}
14+
15+
bool RtpVideoReceiver::OnRtpPacket(std::vector<uint8_t> packet) {
16+
RTC_LOG(LS_INFO) << "On RTP packet, size " << packet.size();
17+
// TODO: Create `rtp_packet_received` from `packet`.
18+
webrtc::RtpPacketReceived rtp_packet_received;
19+
receiver_->OnRtpPacket(rtp_packet_received);
20+
return false;
21+
}
22+
} // namespace wasm
23+
} // namespace owt

0 commit comments

Comments
 (0)