sora-sdk 2024.4.0.dev4__tar.gz → 2024.4.0.dev6__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.
Files changed (28) hide show
  1. {sora_sdk-2024.4.0.dev4/src/sora_sdk.egg-info → sora_sdk-2024.4.0.dev6}/PKG-INFO +9 -11
  2. {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev6}/README.md +8 -10
  3. {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev6}/buildbase.py +15 -10
  4. {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev6}/pyproject.toml +1 -1
  5. {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev6}/run.py +35 -3
  6. {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev6}/setup.py +4 -0
  7. {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev6}/src/sora_sdk/sora_sdk_ext.cpython-310-darwin.so +0 -0
  8. {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev6/src/sora_sdk.egg-info}/PKG-INFO +9 -11
  9. {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev6}/src/sora_sdk.egg-info/SOURCES.txt +1 -0
  10. sora_sdk-2024.4.0.dev6/tests/test_ca_cert.py +107 -0
  11. {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev6}/tests/test_macos.py +9 -40
  12. {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev6}/tests/test_openh264.py +9 -11
  13. {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev6}/tests/test_signaling_message.py +7 -11
  14. {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev6}/tests/test_simulcast.py +7 -11
  15. {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev6}/LICENSE +0 -0
  16. {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev6}/MANIFEST.in +0 -0
  17. {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev6}/NOTICE.md +0 -0
  18. {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev6}/pypath.py +0 -0
  19. {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev6}/setup.cfg +0 -0
  20. {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev6}/src/sora_sdk/__init__.py +0 -0
  21. {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev6}/src/sora_sdk/py.typed +0 -0
  22. {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev6}/src/sora_sdk/sora_sdk_ext.pyi +0 -0
  23. {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev6}/src/sora_sdk.egg-info/dependency_links.txt +0 -0
  24. {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev6}/src/sora_sdk.egg-info/top_level.txt +0 -0
  25. {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev6}/tests/test_messaging.py +0 -0
  26. {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev6}/tests/test_re_offer_re_answer_sdp.py +0 -0
  27. {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev6}/tests/test_sendonly_recvonly.py +0 -0
  28. {sora_sdk-2024.4.0.dev4 → sora_sdk-2024.4.0.dev6}/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.dev4
3
+ Version: 2024.4.0.dev6
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
- runtime_link = "static" if target_os == "windows" else "shared"
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(platform: str, source_dir: str, install_dir: str):
866
- version = read_version_file("VERSION")
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": version["BOOST_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": version["SORA_CPP_SDK_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": version["SORA_CPP_SDK_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 == "x86_64")
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
- self._check(build.osver == target.osver)
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")
@@ -1,7 +1,7 @@
1
1
  [project]
2
2
  name = "sora_sdk"
3
3
  authors = [{ name = "Shiguredo Inc.", email = "contact+pypi@shiguredo.jp" }]
4
- version = "2024.4.0.dev4"
4
+ version = "2024.4.0.dev6"
5
5
  description = "WebRTC SFU Sora Python SDK"
6
6
  readme = "README.md"
7
7
  license = { file = "LICENSE" }
@@ -49,7 +49,11 @@ def install_deps(
49
49
  version = read_version_file("VERSION")
50
50
 
51
51
  # multistrap を使った sysroot の構築
52
- if platform.target.os == "jetson":
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(platform.target.package_name, source_dir, install_dir)
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:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sora_sdk
3
- Version: 2024.4.0.dev4
3
+ Version: 2024.4.0.dev6
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>
@@ -15,6 +15,7 @@ src/sora_sdk.egg-info/PKG-INFO
15
15
  src/sora_sdk.egg-info/SOURCES.txt
16
16
  src/sora_sdk.egg-info/dependency_links.txt
17
17
  src/sora_sdk.egg-info/top_level.txt
18
+ tests/test_ca_cert.py
18
19
  tests/test_macos.py
19
20
  tests/test_messaging.py
20
21
  tests/test_openh264.py
@@ -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
- def test_macos_h264_sendonly(setup):
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="H264",
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"] == "H264"
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/H265"
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.fixture(
69
- params=[
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 video_codec_params(request):
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=video_codec,
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/{video_codec}"
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 test_random_signaling_message(setup):
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=selected_audio,
23
- video=selected_video,
18
+ audio=True,
19
+ video=True,
24
20
  metadata=metadata,
25
21
  )
26
- sendonly.connect(fake_audio=selected_audio, fake_video=selected_video)
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"] is channel_id
38
- assert sendonly.connect_message["audio"] is selected_audio
39
- assert sendonly.connect_message["video"] is selected_video
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.fixture(
10
- params=[
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 video_codec_params(request):
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=video_codec,
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/{video_codec}"
51
+ assert sendonly_codec_stats["mimeType"] == f"video/{video_codec_type}"
56
52
 
57
53
  # 複数のoutbound-rtp統計情報を取得
58
54
  outbound_rtp_stats = [