sora-sdk 2024.4.0.dev4__tar.gz → 2024.4.0.dev5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {sora_sdk-2024.4.0.dev4/src/sora_sdk.egg-info → sora_sdk-2024.4.0.dev5}/PKG-INFO +9 -11
- {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev5}/README.md +8 -10
- {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev5}/buildbase.py +15 -10
- {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev5}/pyproject.toml +1 -1
- {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev5}/run.py +35 -3
- {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev5}/setup.py +4 -0
- {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev5}/src/sora_sdk/sora_sdk_ext.cpython-310-darwin.so +0 -0
- {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev5/src/sora_sdk.egg-info}/PKG-INFO +9 -11
- {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev5}/src/sora_sdk.egg-info/SOURCES.txt +1 -0
- sora_sdk-2024.4.0.dev5/tests/test_ca_cert.py +107 -0
- {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev5}/tests/test_macos.py +9 -40
- {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev5}/tests/test_openh264.py +9 -11
- {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev5}/tests/test_signaling_message.py +7 -11
- {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev5}/tests/test_simulcast.py +7 -11
- {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev5}/LICENSE +0 -0
- {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev5}/MANIFEST.in +0 -0
- {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev5}/NOTICE.md +0 -0
- {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev5}/pypath.py +0 -0
- {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev5}/setup.cfg +0 -0
- {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev5}/src/sora_sdk/__init__.py +0 -0
- {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev5}/src/sora_sdk/py.typed +0 -0
- {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev5}/src/sora_sdk/sora_sdk_ext.pyi +0 -0
- {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev5}/src/sora_sdk.egg-info/dependency_links.txt +0 -0
- {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev5}/src/sora_sdk.egg-info/top_level.txt +0 -0
- {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev5}/tests/test_messaging.py +0 -0
- {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev5}/tests/test_re_offer_re_answer_sdp.py +0 -0
- {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev5}/tests/test_sendonly_recvonly.py +0 -0
- {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev5}/tests/test_vad.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: sora_sdk
|
|
3
|
-
Version: 2024.4.0.
|
|
3
|
+
Version: 2024.4.0.dev5
|
|
4
4
|
Summary: WebRTC SFU Sora Python SDK
|
|
5
5
|
Home-page: https://github.com/shiguredo/sora-python-sdk
|
|
6
6
|
Author-email: "Shiguredo Inc." <contact+pypi@shiguredo.jp>
|
|
@@ -251,18 +251,12 @@ Please read <https://github.com/shiguredo/oss/blob/master/README.en.md> before u
|
|
|
251
251
|
|
|
252
252
|
[Sora Python SDK](https://sora-python-sdk.shiguredo.jp/)
|
|
253
253
|
|
|
254
|
-
##
|
|
254
|
+
## 例
|
|
255
255
|
|
|
256
|
-
[examples](examples)
|
|
256
|
+
[shiguredo/sora-python-sdk-examples](https://github.com/shiguredo/sora-python-sdk-examples)
|
|
257
257
|
|
|
258
258
|
## sora_sdk パッケージの追加
|
|
259
259
|
|
|
260
|
-
### pip
|
|
261
|
-
|
|
262
|
-
```bash
|
|
263
|
-
pip install sora_sdk
|
|
264
|
-
```
|
|
265
|
-
|
|
266
260
|
### uv
|
|
267
261
|
|
|
268
262
|
[uv](https://docs.astral.sh/uv/)
|
|
@@ -272,6 +266,12 @@ uv add sora_sdk
|
|
|
272
266
|
uv sync
|
|
273
267
|
```
|
|
274
268
|
|
|
269
|
+
### pip
|
|
270
|
+
|
|
271
|
+
```bash
|
|
272
|
+
pip install sora_sdk
|
|
273
|
+
```
|
|
274
|
+
|
|
275
275
|
### NVIDIA Jetson 向けパッケージ
|
|
276
276
|
|
|
277
277
|
PyPI 経由ではインストールできません。
|
|
@@ -354,8 +354,6 @@ See the License for the specific language governing permissions and
|
|
|
354
354
|
limitations under the License.
|
|
355
355
|
```
|
|
356
356
|
|
|
357
|
-
このリポジトリに含まれる `shiguremaru.png` ファイルのライセンスは [CC BY-NC-ND 4.0](https://creativecommons.org/licenses/by-nc-nd/4.0/deed.ja) です。
|
|
358
|
-
|
|
359
357
|
## OpenH264
|
|
360
358
|
|
|
361
359
|
<https://www.openh264.org/BINARY_LICENSE.txt>
|
|
@@ -54,18 +54,12 @@ Please read <https://github.com/shiguredo/oss/blob/master/README.en.md> before u
|
|
|
54
54
|
|
|
55
55
|
[Sora Python SDK](https://sora-python-sdk.shiguredo.jp/)
|
|
56
56
|
|
|
57
|
-
##
|
|
57
|
+
## 例
|
|
58
58
|
|
|
59
|
-
[examples](examples)
|
|
59
|
+
[shiguredo/sora-python-sdk-examples](https://github.com/shiguredo/sora-python-sdk-examples)
|
|
60
60
|
|
|
61
61
|
## sora_sdk パッケージの追加
|
|
62
62
|
|
|
63
|
-
### pip
|
|
64
|
-
|
|
65
|
-
```bash
|
|
66
|
-
pip install sora_sdk
|
|
67
|
-
```
|
|
68
|
-
|
|
69
63
|
### uv
|
|
70
64
|
|
|
71
65
|
[uv](https://docs.astral.sh/uv/)
|
|
@@ -75,6 +69,12 @@ uv add sora_sdk
|
|
|
75
69
|
uv sync
|
|
76
70
|
```
|
|
77
71
|
|
|
72
|
+
### pip
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
pip install sora_sdk
|
|
76
|
+
```
|
|
77
|
+
|
|
78
78
|
### NVIDIA Jetson 向けパッケージ
|
|
79
79
|
|
|
80
80
|
PyPI 経由ではインストールできません。
|
|
@@ -157,8 +157,6 @@ See the License for the specific language governing permissions and
|
|
|
157
157
|
limitations under the License.
|
|
158
158
|
```
|
|
159
159
|
|
|
160
|
-
このリポジトリに含まれる `shiguremaru.png` ファイルのライセンスは [CC BY-NC-ND 4.0](https://creativecommons.org/licenses/by-nc-nd/4.0/deed.ja) です。
|
|
161
|
-
|
|
162
160
|
## OpenH264
|
|
163
161
|
|
|
164
162
|
<https://www.openh264.org/BINARY_LICENSE.txt>
|
|
@@ -687,6 +687,7 @@ def build_and_install_boost(
|
|
|
687
687
|
android_ndk,
|
|
688
688
|
native_api_level,
|
|
689
689
|
address_model="64",
|
|
690
|
+
runtime_link=None,
|
|
690
691
|
):
|
|
691
692
|
version_underscore = version.replace(".", "_")
|
|
692
693
|
archive = download(
|
|
@@ -697,7 +698,8 @@ def build_and_install_boost(
|
|
|
697
698
|
with cd(os.path.join(build_dir, "boost")):
|
|
698
699
|
bootstrap = ".\\bootstrap.bat" if target_os == "windows" else "./bootstrap.sh"
|
|
699
700
|
b2 = "b2" if target_os == "windows" else "./b2"
|
|
700
|
-
|
|
701
|
+
if runtime_link is None:
|
|
702
|
+
runtime_link = "static" if target_os == "windows" else "shared"
|
|
701
703
|
|
|
702
704
|
# Windows かつ Boost 1.85.0 の場合はパッチを当てる
|
|
703
705
|
if target_os == "windows" and version == "1.85.0":
|
|
@@ -862,23 +864,23 @@ def install_sora(version, source_dir, install_dir, platform: str):
|
|
|
862
864
|
extract(archive, output_dir=install_dir, output_dirname="sora")
|
|
863
865
|
|
|
864
866
|
|
|
865
|
-
def install_sora_and_deps(
|
|
866
|
-
|
|
867
|
-
|
|
867
|
+
def install_sora_and_deps(
|
|
868
|
+
sora_version: str, boost_version: str, platform: str, source_dir: str, install_dir: str
|
|
869
|
+
):
|
|
868
870
|
# Boost
|
|
869
871
|
install_boost_args = {
|
|
870
|
-
"version":
|
|
872
|
+
"version": boost_version,
|
|
871
873
|
"version_file": os.path.join(install_dir, "boost.version"),
|
|
872
874
|
"source_dir": source_dir,
|
|
873
875
|
"install_dir": install_dir,
|
|
874
|
-
"sora_version":
|
|
876
|
+
"sora_version": sora_version,
|
|
875
877
|
"platform": platform,
|
|
876
878
|
}
|
|
877
879
|
install_boost(**install_boost_args)
|
|
878
880
|
|
|
879
881
|
# Sora C++ SDK
|
|
880
882
|
install_sora_args = {
|
|
881
|
-
"version":
|
|
883
|
+
"version": sora_version,
|
|
882
884
|
"version_file": os.path.join(install_dir, "sora.version"),
|
|
883
885
|
"source_dir": source_dir,
|
|
884
886
|
"install_dir": install_dir,
|
|
@@ -1768,8 +1770,10 @@ class Platform(object):
|
|
|
1768
1770
|
self._check(p.arch == "armv8")
|
|
1769
1771
|
elif p.os in ("ios", "android"):
|
|
1770
1772
|
self._check(p.arch is None)
|
|
1773
|
+
elif p.os == "ubuntu":
|
|
1774
|
+
self._check(p.arch in ("x86_64", "armv8"))
|
|
1771
1775
|
else:
|
|
1772
|
-
self._check(p.arch in ("x86_64", "arm64"))
|
|
1776
|
+
self._check(p.arch in ("x86_64", "arm64", "hololens2"))
|
|
1773
1777
|
|
|
1774
1778
|
def __init__(self, target_os, target_osver, target_arch, target_extra=None):
|
|
1775
1779
|
build = get_build_platform()
|
|
@@ -1779,7 +1783,7 @@ class Platform(object):
|
|
|
1779
1783
|
self._check_platform_target(target)
|
|
1780
1784
|
|
|
1781
1785
|
if target.os == "windows":
|
|
1782
|
-
self._check(target.arch
|
|
1786
|
+
self._check(target.arch in ("x86_64", "arm64", "hololens2"))
|
|
1783
1787
|
self._check(build.os == "windows")
|
|
1784
1788
|
self._check(build.arch == "x86_64")
|
|
1785
1789
|
if target.os == "macos":
|
|
@@ -1797,7 +1801,8 @@ class Platform(object):
|
|
|
1797
1801
|
if target.os == "ubuntu":
|
|
1798
1802
|
self._check(build.os == "ubuntu")
|
|
1799
1803
|
self._check(build.arch == "x86_64")
|
|
1800
|
-
|
|
1804
|
+
if target.arch == "x86_64":
|
|
1805
|
+
self._check(build.osver == target.osver)
|
|
1801
1806
|
if target.os == "raspberry-pi-os":
|
|
1802
1807
|
self._check(build.os == "ubuntu")
|
|
1803
1808
|
self._check(build.arch == "x86_64")
|
|
@@ -49,7 +49,11 @@ def install_deps(
|
|
|
49
49
|
version = read_version_file("VERSION")
|
|
50
50
|
|
|
51
51
|
# multistrap を使った sysroot の構築
|
|
52
|
-
if
|
|
52
|
+
if (
|
|
53
|
+
platform.target.os == "jetson"
|
|
54
|
+
or platform.target.os == "ubuntu"
|
|
55
|
+
and platform.target.arch == "armv8"
|
|
56
|
+
):
|
|
53
57
|
conf = os.path.join("multistrap", f"{platform.target.package_name}.conf")
|
|
54
58
|
# conf ファイルのハッシュ値をバージョンとする
|
|
55
59
|
version_md5 = hashlib.md5(open(conf, "rb").read()).hexdigest()
|
|
@@ -131,7 +135,13 @@ def install_deps(
|
|
|
131
135
|
|
|
132
136
|
# Sora C++ SDK
|
|
133
137
|
if local_sora_cpp_sdk_dir is None:
|
|
134
|
-
install_sora_and_deps(
|
|
138
|
+
install_sora_and_deps(
|
|
139
|
+
version["SORA_CPP_SDK_VERSION"],
|
|
140
|
+
version["BOOST_VERSION"],
|
|
141
|
+
platform.target.package_name,
|
|
142
|
+
source_dir,
|
|
143
|
+
install_dir,
|
|
144
|
+
)
|
|
135
145
|
else:
|
|
136
146
|
build_sora(
|
|
137
147
|
platform.target.package_name,
|
|
@@ -163,6 +173,7 @@ AVAILABLE_TARGETS = [
|
|
|
163
173
|
"macos_arm64",
|
|
164
174
|
"ubuntu-22.04_x86_64",
|
|
165
175
|
"ubuntu-24.04_x86_64",
|
|
176
|
+
"ubuntu-24.04_armv8",
|
|
166
177
|
"ubuntu-22.04_armv8_jetson",
|
|
167
178
|
]
|
|
168
179
|
|
|
@@ -188,6 +199,8 @@ def main():
|
|
|
188
199
|
platform = Platform("ubuntu", "22.04", "x86_64")
|
|
189
200
|
elif args.target == "ubuntu-24.04_x86_64":
|
|
190
201
|
platform = Platform("ubuntu", "24.04", "x86_64")
|
|
202
|
+
elif args.target == "ubuntu-24.04_armv8":
|
|
203
|
+
platform = Platform("ubuntu", "24.04", "armv8")
|
|
191
204
|
elif args.target == "ubuntu-22.04_armv8_jetson":
|
|
192
205
|
platform = Platform("jetson", None, "armv8", "ubuntu-22.04")
|
|
193
206
|
else:
|
|
@@ -219,7 +232,7 @@ def main():
|
|
|
219
232
|
webrtc_info = get_webrtc_info(
|
|
220
233
|
webrtc_platform, args.local_webrtc_build_dir, install_dir, args.debug
|
|
221
234
|
)
|
|
222
|
-
|
|
235
|
+
|
|
223
236
|
sora_info = get_sora_info(
|
|
224
237
|
webrtc_platform, args.local_sora_cpp_sdk_dir, install_dir, args.debug
|
|
225
238
|
)
|
|
@@ -249,6 +262,25 @@ def main():
|
|
|
249
262
|
f"-DCMAKE_CXX_COMPILER={os.path.join(webrtc_info.clang_dir, 'bin', 'clang++')}",
|
|
250
263
|
f"-DLIBCXX_INCLUDE_DIR={cmake_path(os.path.join(webrtc_info.libcxx_dir, 'include'))}",
|
|
251
264
|
]
|
|
265
|
+
if platform.target.arch == "armv8":
|
|
266
|
+
sysroot = os.path.join(install_dir, "rootfs")
|
|
267
|
+
nb_cmake_dir = cmdcap(["uv", "run", "python", "-m", "nanobind", "--cmake_dir"])
|
|
268
|
+
cmake_args += [
|
|
269
|
+
"-DCMAKE_SYSTEM_NAME=Linux",
|
|
270
|
+
"-DCMAKE_SYSTEM_PROCESSOR=aarch64",
|
|
271
|
+
"-DCMAKE_C_COMPILER_TARGET=aarch64-linux-gnu",
|
|
272
|
+
"-DCMAKE_CXX_COMPILER_TARGET=aarch64-linux-gnu",
|
|
273
|
+
f"-DCMAKE_FIND_ROOT_PATH={sysroot}",
|
|
274
|
+
"-DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER",
|
|
275
|
+
"-DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=BOTH",
|
|
276
|
+
"-DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=BOTH",
|
|
277
|
+
"-DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=BOTH",
|
|
278
|
+
f"-DCMAKE_SYSROOT={sysroot}",
|
|
279
|
+
f"-DPython_ROOT_DIR={cmake_path(os.path.join(sysroot, 'usr', 'include', 'python3.12'))}",
|
|
280
|
+
f"-DCMAKE_SYSROOT={sysroot}",
|
|
281
|
+
f"-DNB_CMAKE_DIR={nb_cmake_dir}",
|
|
282
|
+
"-DNB_SUFFIX=.cpython-312-aarch64-linux-gnu.so",
|
|
283
|
+
]
|
|
252
284
|
elif platform.target.os == "macos":
|
|
253
285
|
sysroot = cmdcap(["xcrun", "--sdk", "macosx", "--show-sdk-path"])
|
|
254
286
|
cmake_args += [
|
|
@@ -16,6 +16,8 @@ def run_setup(build_platform, target_platform):
|
|
|
16
16
|
plat = None
|
|
17
17
|
if target_platform.os == "jetson":
|
|
18
18
|
plat = "manylinux_2_17_aarch64.manylinux2014_aarch64"
|
|
19
|
+
elif target_platform.os == "ubuntu" and target_platform.arch == "armv8":
|
|
20
|
+
plat = "manylinux_2_17_aarch64.manylinux2014_aarch64"
|
|
19
21
|
elif target_platform.os == "ubuntu" and target_platform.arch == "x86_64":
|
|
20
22
|
if target_platform.osver == "22.04":
|
|
21
23
|
plat = "manylinux_2_17_x86_64.manylinux2014_x86_64"
|
|
@@ -52,6 +54,8 @@ def main():
|
|
|
52
54
|
target = os.getenv("SORA_SDK_TARGET")
|
|
53
55
|
if target is None:
|
|
54
56
|
target_platform = build_platform
|
|
57
|
+
elif target == "ubuntu-24.04_armv8":
|
|
58
|
+
target_platform = PlatformTarget("ubuntu", "24.04", "armv8")
|
|
55
59
|
elif target == "ubuntu-22.04_armv8_jetson":
|
|
56
60
|
target_platform = PlatformTarget("jetson", None, "armv8", "ubuntu-22.04")
|
|
57
61
|
else:
|
{sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev5}/src/sora_sdk/sora_sdk_ext.cpython-310-darwin.so
RENAMED
|
Binary file
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: sora_sdk
|
|
3
|
-
Version: 2024.4.0.
|
|
3
|
+
Version: 2024.4.0.dev5
|
|
4
4
|
Summary: WebRTC SFU Sora Python SDK
|
|
5
5
|
Home-page: https://github.com/shiguredo/sora-python-sdk
|
|
6
6
|
Author-email: "Shiguredo Inc." <contact+pypi@shiguredo.jp>
|
|
@@ -251,18 +251,12 @@ Please read <https://github.com/shiguredo/oss/blob/master/README.en.md> before u
|
|
|
251
251
|
|
|
252
252
|
[Sora Python SDK](https://sora-python-sdk.shiguredo.jp/)
|
|
253
253
|
|
|
254
|
-
##
|
|
254
|
+
## 例
|
|
255
255
|
|
|
256
|
-
[examples](examples)
|
|
256
|
+
[shiguredo/sora-python-sdk-examples](https://github.com/shiguredo/sora-python-sdk-examples)
|
|
257
257
|
|
|
258
258
|
## sora_sdk パッケージの追加
|
|
259
259
|
|
|
260
|
-
### pip
|
|
261
|
-
|
|
262
|
-
```bash
|
|
263
|
-
pip install sora_sdk
|
|
264
|
-
```
|
|
265
|
-
|
|
266
260
|
### uv
|
|
267
261
|
|
|
268
262
|
[uv](https://docs.astral.sh/uv/)
|
|
@@ -272,6 +266,12 @@ uv add sora_sdk
|
|
|
272
266
|
uv sync
|
|
273
267
|
```
|
|
274
268
|
|
|
269
|
+
### pip
|
|
270
|
+
|
|
271
|
+
```bash
|
|
272
|
+
pip install sora_sdk
|
|
273
|
+
```
|
|
274
|
+
|
|
275
275
|
### NVIDIA Jetson 向けパッケージ
|
|
276
276
|
|
|
277
277
|
PyPI 経由ではインストールできません。
|
|
@@ -354,8 +354,6 @@ See the License for the specific language governing permissions and
|
|
|
354
354
|
limitations under the License.
|
|
355
355
|
```
|
|
356
356
|
|
|
357
|
-
このリポジトリに含まれる `shiguremaru.png` ファイルのライセンスは [CC BY-NC-ND 4.0](https://creativecommons.org/licenses/by-nc-nd/4.0/deed.ja) です。
|
|
358
|
-
|
|
359
357
|
## OpenH264
|
|
360
358
|
|
|
361
359
|
<https://www.openh264.org/BINARY_LICENSE.txt>
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import time
|
|
3
|
+
import uuid
|
|
4
|
+
|
|
5
|
+
import pytest
|
|
6
|
+
from client import Sendonly
|
|
7
|
+
|
|
8
|
+
"""
|
|
9
|
+
このテストは、Sora の CA 証明書が有効かどうかを確認するためのものです。
|
|
10
|
+
接続先の Sora が Let's Encrypt の CA 証明書を使用している前提のテストになっています。
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
# https://letsencrypt.org/certificates/
|
|
14
|
+
# ISRG Root X1
|
|
15
|
+
|
|
16
|
+
letsencrypt_org_ca_cert = """
|
|
17
|
+
-----BEGIN CERTIFICATE-----
|
|
18
|
+
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
|
|
47
|
+
-----END CERTIFICATE-----
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
# https://pki.goog/repository/
|
|
51
|
+
|
|
52
|
+
pki_goog_ca_cert = """
|
|
53
|
+
-----BEGIN CERTIFICATE-----
|
|
54
|
+
MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYD
|
|
55
|
+
VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG
|
|
56
|
+
A1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw
|
|
57
|
+
WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz
|
|
58
|
+
IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi
|
|
59
|
+
AATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzuhXyi
|
|
60
|
+
QHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvR
|
|
61
|
+
HYqjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
|
|
62
|
+
BBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D
|
|
63
|
+
9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/Cr8deVl5c1RxYIigL9zC2L7F8AjEA8GE8
|
|
64
|
+
p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh4rsUecrNIdSUtUlD
|
|
65
|
+
-----END CERTIFICATE-----
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def test_ca_cert(setup):
|
|
70
|
+
signaling_urls = setup.get("signaling_urls")
|
|
71
|
+
channel_id_prefix = setup.get("channel_id_prefix")
|
|
72
|
+
metadata = setup.get("metadata")
|
|
73
|
+
|
|
74
|
+
channel_id = f"{channel_id_prefix}_{__name__}_{sys._getframe().f_code.co_name}_{uuid.uuid4()}"
|
|
75
|
+
|
|
76
|
+
sendonly = Sendonly(
|
|
77
|
+
signaling_urls,
|
|
78
|
+
channel_id,
|
|
79
|
+
audio=True,
|
|
80
|
+
video=True,
|
|
81
|
+
metadata=metadata,
|
|
82
|
+
ca_cert=letsencrypt_org_ca_cert,
|
|
83
|
+
)
|
|
84
|
+
sendonly.connect(fake_audio=True, fake_video=True)
|
|
85
|
+
|
|
86
|
+
time.sleep(5)
|
|
87
|
+
|
|
88
|
+
sendonly.disconnect()
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
@pytest.mark.xfail(reason="Invalid CA certificate")
|
|
92
|
+
def test_ca_cert_invalid(setup):
|
|
93
|
+
signaling_urls = setup.get("signaling_urls")
|
|
94
|
+
channel_id_prefix = setup.get("channel_id_prefix")
|
|
95
|
+
metadata = setup.get("metadata")
|
|
96
|
+
|
|
97
|
+
channel_id = f"{channel_id_prefix}_{__name__}_{sys._getframe().f_code.co_name}_{uuid.uuid4()}"
|
|
98
|
+
|
|
99
|
+
sendonly = Sendonly(
|
|
100
|
+
signaling_urls,
|
|
101
|
+
channel_id,
|
|
102
|
+
audio=True,
|
|
103
|
+
video=True,
|
|
104
|
+
metadata=metadata,
|
|
105
|
+
ca_cert=pki_goog_ca_cert,
|
|
106
|
+
)
|
|
107
|
+
sendonly.connect(fake_audio=True, fake_video=True)
|
|
@@ -11,7 +11,12 @@ GitHub Actions で Video Toolbox を送受信で利用しようとするとエ
|
|
|
11
11
|
"""
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
@pytest.mark.skipif(sys.platform != "darwin", reason="macOS でのみ実行する")
|
|
15
|
+
@pytest.mark.parametrize(
|
|
16
|
+
"video_codec_type",
|
|
17
|
+
["H264", "H265"],
|
|
18
|
+
)
|
|
19
|
+
def test_macos_video_hwa_sendonly(setup, video_codec_type):
|
|
15
20
|
signaling_urls = setup.get("signaling_urls")
|
|
16
21
|
channel_id_prefix = setup.get("channel_id_prefix")
|
|
17
22
|
metadata = setup.get("metadata")
|
|
@@ -23,7 +28,7 @@ def test_macos_h264_sendonly(setup):
|
|
|
23
28
|
channel_id,
|
|
24
29
|
audio=False,
|
|
25
30
|
video=True,
|
|
26
|
-
video_codec_type=
|
|
31
|
+
video_codec_type=video_codec_type,
|
|
27
32
|
metadata=metadata,
|
|
28
33
|
use_hwa=True,
|
|
29
34
|
)
|
|
@@ -34,43 +39,7 @@ def test_macos_h264_sendonly(setup):
|
|
|
34
39
|
assert sendonly.connect_message is not None
|
|
35
40
|
assert sendonly.connect_message["channel_id"] == channel_id
|
|
36
41
|
assert "video" in sendonly.connect_message
|
|
37
|
-
assert sendonly.connect_message["video"]["codec_type"] ==
|
|
38
|
-
|
|
39
|
-
sendonly_stats = sendonly.get_stats()
|
|
40
|
-
|
|
41
|
-
sendonly.disconnect()
|
|
42
|
-
|
|
43
|
-
# codec が無かったら StopIteration 例外が上がる
|
|
44
|
-
codec_stats = next(s for s in sendonly_stats if s.get("type") == "codec")
|
|
45
|
-
# H.264 が採用されているかどうか確認する
|
|
46
|
-
assert codec_stats["mimeType"] == "video/H264"
|
|
47
|
-
|
|
48
|
-
# outbound-rtp が無かったら StopIteration 例外が上がる
|
|
49
|
-
outbound_rtp_stats = next(s for s in sendonly_stats if s.get("type") == "outbound-rtp")
|
|
50
|
-
assert outbound_rtp_stats["encoderImplementation"] == "VideoToolbox"
|
|
51
|
-
assert outbound_rtp_stats["bytesSent"] > 0
|
|
52
|
-
assert outbound_rtp_stats["packetsSent"] > 0
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
def test_macos_h265_sendonly(setup):
|
|
56
|
-
signaling_urls = setup.get("signaling_urls")
|
|
57
|
-
channel_id_prefix = setup.get("channel_id_prefix")
|
|
58
|
-
metadata = setup.get("metadata")
|
|
59
|
-
|
|
60
|
-
channel_id = f"{channel_id_prefix}_{__name__}_{sys._getframe().f_code.co_name}_{uuid.uuid4()}"
|
|
61
|
-
|
|
62
|
-
sendonly = Sendonly(
|
|
63
|
-
signaling_urls,
|
|
64
|
-
channel_id,
|
|
65
|
-
audio=False,
|
|
66
|
-
video=True,
|
|
67
|
-
video_codec_type="H265",
|
|
68
|
-
metadata=metadata,
|
|
69
|
-
use_hwa=True,
|
|
70
|
-
)
|
|
71
|
-
sendonly.connect(fake_video=True)
|
|
72
|
-
|
|
73
|
-
time.sleep(5)
|
|
42
|
+
assert sendonly.connect_message["video"]["codec_type"] == video_codec_type
|
|
74
43
|
|
|
75
44
|
sendonly_stats = sendonly.get_stats()
|
|
76
45
|
|
|
@@ -79,7 +48,7 @@ def test_macos_h265_sendonly(setup):
|
|
|
79
48
|
# codec が無かったら StopIteration 例外が上がる
|
|
80
49
|
codec_stats = next(s for s in sendonly_stats if s.get("type") == "codec")
|
|
81
50
|
# H.264 が採用されているかどうか確認する
|
|
82
|
-
assert codec_stats["mimeType"] == "video/
|
|
51
|
+
assert codec_stats["mimeType"] == f"video/{video_codec_type}"
|
|
83
52
|
|
|
84
53
|
# outbound-rtp が無かったら StopIteration 例外が上がる
|
|
85
54
|
outbound_rtp_stats = next(s for s in sendonly_stats if s.get("type") == "outbound-rtp")
|
|
@@ -6,6 +6,7 @@ import pytest
|
|
|
6
6
|
from client import Recvonly, Sendonly
|
|
7
7
|
|
|
8
8
|
|
|
9
|
+
@pytest.mark.skipif(sys.platform not in ["darwin", "linux"], reason="macOSとLinuxでのみ実行する")
|
|
9
10
|
def test_openh264_sendonly_recvonly(setup):
|
|
10
11
|
signaling_urls = setup.get("signaling_urls")
|
|
11
12
|
channel_id_prefix = setup.get("channel_id_prefix")
|
|
@@ -65,17 +66,14 @@ def test_openh264_sendonly_recvonly(setup):
|
|
|
65
66
|
assert inbound_rtp_stats["packetsReceived"] > 0
|
|
66
67
|
|
|
67
68
|
|
|
68
|
-
@pytest.
|
|
69
|
-
|
|
69
|
+
@pytest.mark.skipif(sys.platform not in ["darwin", "linux"], reason="macOSとLinuxでのみ実行する")
|
|
70
|
+
@pytest.mark.parametrize(
|
|
71
|
+
"video_codec_type,expected_implementation",
|
|
72
|
+
[
|
|
70
73
|
("H264", "SimulcastEncoderAdapter (OpenH264, OpenH264, OpenH264)"),
|
|
71
|
-
]
|
|
74
|
+
],
|
|
72
75
|
)
|
|
73
|
-
def
|
|
74
|
-
return request.param
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
def test_openh264_simulcast(setup, video_codec_params):
|
|
78
|
-
video_codec, expected_implementation = video_codec_params
|
|
76
|
+
def test_openh264_simulcast(setup, video_codec_type, expected_implementation):
|
|
79
77
|
signaling_urls = setup.get("signaling_urls")
|
|
80
78
|
channel_id_prefix = setup.get("channel_id_prefix")
|
|
81
79
|
metadata = setup.get("metadata")
|
|
@@ -90,7 +88,7 @@ def test_openh264_simulcast(setup, video_codec_params):
|
|
|
90
88
|
simulcast=True,
|
|
91
89
|
audio=False,
|
|
92
90
|
video=True,
|
|
93
|
-
video_codec_type=
|
|
91
|
+
video_codec_type=video_codec_type,
|
|
94
92
|
video_bit_rate=3000,
|
|
95
93
|
metadata=metadata,
|
|
96
94
|
video_width=1280,
|
|
@@ -108,7 +106,7 @@ def test_openh264_simulcast(setup, video_codec_params):
|
|
|
108
106
|
|
|
109
107
|
# codec が無かったら StopIteration 例外が上がる
|
|
110
108
|
sendonly_codec_stats = next(s for s in sendonly_stats if s.get("type") == "codec")
|
|
111
|
-
assert sendonly_codec_stats["mimeType"] == f"video/{
|
|
109
|
+
assert sendonly_codec_stats["mimeType"] == f"video/{video_codec_type}"
|
|
112
110
|
|
|
113
111
|
# 複数のoutbound-rtp統計情報を取得
|
|
114
112
|
outbound_rtp_stats = [
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import random
|
|
2
1
|
import sys
|
|
3
2
|
import time
|
|
4
3
|
import uuid
|
|
@@ -6,24 +5,21 @@ import uuid
|
|
|
6
5
|
from client import Sendonly
|
|
7
6
|
|
|
8
7
|
|
|
9
|
-
def
|
|
8
|
+
def test_signaling_message(setup):
|
|
10
9
|
signaling_urls = setup.get("signaling_urls")
|
|
11
10
|
channel_id_prefix = setup.get("channel_id_prefix")
|
|
12
11
|
metadata = setup.get("metadata")
|
|
13
12
|
|
|
14
13
|
channel_id = f"{channel_id_prefix}_{__name__}_{sys._getframe().f_code.co_name}_{uuid.uuid4()}"
|
|
15
14
|
|
|
16
|
-
selected_audio = random.choice([True, False])
|
|
17
|
-
selected_video = random.choice([True, False])
|
|
18
|
-
|
|
19
15
|
sendonly = Sendonly(
|
|
20
16
|
signaling_urls,
|
|
21
17
|
channel_id,
|
|
22
|
-
audio=
|
|
23
|
-
video=
|
|
18
|
+
audio=True,
|
|
19
|
+
video=True,
|
|
24
20
|
metadata=metadata,
|
|
25
21
|
)
|
|
26
|
-
sendonly.connect(fake_audio=
|
|
22
|
+
sendonly.connect(fake_audio=True, fake_video=True)
|
|
27
23
|
|
|
28
24
|
time.sleep(5)
|
|
29
25
|
|
|
@@ -34,7 +30,7 @@ def test_random_signaling_message(setup):
|
|
|
34
30
|
assert sendonly.answer_message is not None
|
|
35
31
|
|
|
36
32
|
assert sendonly.connect_message["role"] == "sendonly"
|
|
37
|
-
assert sendonly.connect_message["channel_id"]
|
|
38
|
-
assert sendonly.connect_message["audio"] is
|
|
39
|
-
assert sendonly.connect_message["video"] is
|
|
33
|
+
assert sendonly.connect_message["channel_id"] == channel_id
|
|
34
|
+
assert sendonly.connect_message["audio"] is True
|
|
35
|
+
assert sendonly.connect_message["video"] is True
|
|
40
36
|
assert sendonly.connect_message["metadata"] == metadata
|
|
@@ -6,19 +6,15 @@ import pytest
|
|
|
6
6
|
from client import Sendonly
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
@pytest.
|
|
10
|
-
|
|
9
|
+
@pytest.mark.parametrize(
|
|
10
|
+
("video_codec_type", "expected_implementation"),
|
|
11
|
+
[
|
|
11
12
|
("VP8", "SimulcastEncoderAdapter (libvpx, libvpx, libvpx)"),
|
|
12
13
|
("VP9", "SimulcastEncoderAdapter (libvpx, libvpx, libvpx)"),
|
|
13
14
|
("AV1", "SimulcastEncoderAdapter (libaom, libaom, libaom)"),
|
|
14
|
-
]
|
|
15
|
+
],
|
|
15
16
|
)
|
|
16
|
-
def
|
|
17
|
-
return request.param
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
def test_simulcast(setup, video_codec_params):
|
|
21
|
-
video_codec, expected_implementation = video_codec_params
|
|
17
|
+
def test_simulcast(setup, video_codec_type, expected_implementation):
|
|
22
18
|
signaling_urls = setup.get("signaling_urls")
|
|
23
19
|
channel_id_prefix = setup.get("channel_id_prefix")
|
|
24
20
|
metadata = setup.get("metadata")
|
|
@@ -31,7 +27,7 @@ def test_simulcast(setup, video_codec_params):
|
|
|
31
27
|
simulcast=True,
|
|
32
28
|
audio=False,
|
|
33
29
|
video=True,
|
|
34
|
-
video_codec_type=
|
|
30
|
+
video_codec_type=video_codec_type,
|
|
35
31
|
video_bit_rate=3000,
|
|
36
32
|
metadata=metadata,
|
|
37
33
|
video_width=1280,
|
|
@@ -52,7 +48,7 @@ def test_simulcast(setup, video_codec_params):
|
|
|
52
48
|
|
|
53
49
|
# codec が無かったら StopIteration 例外が上がる
|
|
54
50
|
sendonly_codec_stats = next(s for s in sendonly_stats if s.get("type") == "codec")
|
|
55
|
-
assert sendonly_codec_stats["mimeType"] == f"video/{
|
|
51
|
+
assert sendonly_codec_stats["mimeType"] == f"video/{video_codec_type}"
|
|
56
52
|
|
|
57
53
|
# 複数のoutbound-rtp統計情報を取得
|
|
58
54
|
outbound_rtp_stats = [
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev5}/src/sora_sdk.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|