sora-sdk 2025.4.0.dev3__tar.gz → 2025.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.
Potentially problematic release.
This version of sora-sdk might be problematic. Click here for more details.
- {sora_sdk-2025.4.0.dev3/src/sora_sdk.egg-info → sora_sdk-2025.4.0.dev6}/PKG-INFO +1 -1
- sora_sdk-2025.4.0.dev6/VERSION +1 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/pyproject.toml +8 -7
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/run.py +117 -32
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/src/sora_sdk/__init__.py +5 -1
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/src/sora_sdk/sora_sdk_ext.cpython-311-darwin.so +0 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/src/sora_sdk/sora_sdk_ext.pyi +16 -15
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6/src/sora_sdk.egg-info}/PKG-INFO +1 -1
- sora_sdk-2025.4.0.dev6/tests/test_capability.py +50 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_intel_vpl.py +6 -4
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_openh264.py +1 -1
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_openh264_simulcast.py +1 -1
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_version.py +3 -3
- sora_sdk-2025.4.0.dev3/VERSION +0 -1
- sora_sdk-2025.4.0.dev3/tests/test_capability.py +0 -52
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/LICENSE +0 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/MANIFEST.in +0 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/README.md +0 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/buildbase.py +0 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/pypath.py +0 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/setup.cfg +0 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/setup.py +0 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/src/sora_sdk/py.typed +0 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/src/sora_sdk.egg-info/SOURCES.txt +0 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/src/sora_sdk.egg-info/dependency_links.txt +0 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/src/sora_sdk.egg-info/top_level.txt +0 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_amd_amf.py +0 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_apple_video_toolbox.py +0 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_authz.py +0 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_authz_simulcast.py +0 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_ca_cert.py +0 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_degradation_preference.py +0 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_encoded_transform.py +0 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_key_frame_request.py +0 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_messaging.py +0 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_messaging_header.py +0 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_nvidia_video_codec_sdk.py +0 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_opus.py +0 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_re_offer_re_answer_sdp.py +0 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_sendonly_recvonly.py +0 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_signaling.py +0 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_signaling_message.py +0 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_signaling_notify.py +0 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_simulcast.py +0 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_sora_disconnect.py +0 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_type_disconnect.py +0 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_type_switched.py +0 -0
- {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_vad.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2025.4.0.dev6
|
|
@@ -26,16 +26,15 @@ build-backend = "setuptools.build_meta"
|
|
|
26
26
|
[tool.uv]
|
|
27
27
|
python-preference = "only-managed"
|
|
28
28
|
dev-dependencies = [
|
|
29
|
-
"nanobind==2.
|
|
30
|
-
"setuptools==80.9",
|
|
31
|
-
"
|
|
32
|
-
"
|
|
29
|
+
"nanobind==2.9.2",
|
|
30
|
+
"setuptools==80.9.0",
|
|
31
|
+
"pytest",
|
|
32
|
+
"pytest-repeat",
|
|
33
|
+
"pytest-xdist",
|
|
33
34
|
"numpy",
|
|
34
35
|
"httpx",
|
|
35
|
-
"pytest",
|
|
36
|
-
"ruff",
|
|
37
36
|
"pyjwt",
|
|
38
|
-
"
|
|
37
|
+
"ruff",
|
|
39
38
|
"ty",
|
|
40
39
|
]
|
|
41
40
|
|
|
@@ -43,6 +42,8 @@ dev-dependencies = [
|
|
|
43
42
|
target-version = "py311"
|
|
44
43
|
line-length = 100
|
|
45
44
|
|
|
45
|
+
[tool.ty.src]
|
|
46
|
+
include = ["src", "tests"]
|
|
46
47
|
|
|
47
48
|
[tool.pytest.ini_options]
|
|
48
49
|
xfail_strict = true
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import argparse
|
|
2
|
+
import glob
|
|
2
3
|
import hashlib
|
|
3
4
|
import importlib.metadata
|
|
4
5
|
import multiprocessing
|
|
@@ -180,35 +181,48 @@ AVAILABLE_TARGETS = [
|
|
|
180
181
|
]
|
|
181
182
|
|
|
182
183
|
|
|
183
|
-
def
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
parser.add_argument("target", choices=AVAILABLE_TARGETS)
|
|
184
|
+
def _find_clang_binary(name: str) -> Optional[str]:
|
|
185
|
+
if shutil.which(name) is not None:
|
|
186
|
+
return name
|
|
187
|
+
else:
|
|
188
|
+
for n in range(50, 14, -1):
|
|
189
|
+
if shutil.which(f"{name}-{n}") is not None:
|
|
190
|
+
return f"{name}-{n}"
|
|
191
|
+
return None
|
|
192
192
|
|
|
193
|
-
|
|
194
|
-
|
|
193
|
+
|
|
194
|
+
def _get_platform(target: str) -> Platform:
|
|
195
|
+
if target == "windows_x86_64":
|
|
195
196
|
platform = Platform("windows", get_windows_osver(), "x86_64")
|
|
196
|
-
elif
|
|
197
|
+
elif target == "macos_x86_64":
|
|
197
198
|
platform = Platform("macos", get_macos_osver(), "x86_64")
|
|
198
|
-
elif
|
|
199
|
+
elif target == "macos_arm64":
|
|
199
200
|
platform = Platform("macos", get_macos_osver(), "arm64")
|
|
200
|
-
elif
|
|
201
|
+
elif target == "ubuntu-22.04_x86_64":
|
|
201
202
|
platform = Platform("ubuntu", "22.04", "x86_64")
|
|
202
|
-
elif
|
|
203
|
+
elif target == "ubuntu-24.04_x86_64":
|
|
203
204
|
platform = Platform("ubuntu", "24.04", "x86_64")
|
|
204
|
-
elif
|
|
205
|
+
elif target == "ubuntu-22.04_armv8":
|
|
205
206
|
platform = Platform("ubuntu", "22.04", "armv8")
|
|
206
|
-
elif
|
|
207
|
+
elif target == "ubuntu-24.04_armv8":
|
|
207
208
|
platform = Platform("ubuntu", "24.04", "armv8")
|
|
208
|
-
elif
|
|
209
|
+
elif target == "ubuntu-22.04_armv8_jetson":
|
|
209
210
|
platform = Platform("jetson", None, "armv8", "ubuntu-22.04")
|
|
210
211
|
else:
|
|
211
|
-
raise Exception(f"Unknown target {
|
|
212
|
+
raise Exception(f"Unknown target {target}")
|
|
213
|
+
return platform
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
def _build(
|
|
217
|
+
target: str,
|
|
218
|
+
debug: bool,
|
|
219
|
+
relwithdebinfo: bool,
|
|
220
|
+
local_webrtc_build_dir: Optional[str],
|
|
221
|
+
local_webrtc_build_args: List[str],
|
|
222
|
+
local_sora_cpp_sdk_dir: Optional[str],
|
|
223
|
+
local_sora_cpp_sdk_args: List[str],
|
|
224
|
+
):
|
|
225
|
+
platform = _get_platform(target)
|
|
212
226
|
|
|
213
227
|
source_dir = os.path.join(BASE_DIR, "_source", platform.target.package_name)
|
|
214
228
|
build_dir = os.path.join(BASE_DIR, "_build", platform.target.package_name)
|
|
@@ -223,27 +237,23 @@ def main():
|
|
|
223
237
|
source_dir,
|
|
224
238
|
build_dir,
|
|
225
239
|
install_dir,
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
240
|
+
debug,
|
|
241
|
+
local_webrtc_build_dir,
|
|
242
|
+
local_webrtc_build_args,
|
|
243
|
+
local_sora_cpp_sdk_dir,
|
|
244
|
+
local_sora_cpp_sdk_args,
|
|
231
245
|
)
|
|
232
246
|
|
|
233
247
|
configuration = "Release"
|
|
234
|
-
if
|
|
248
|
+
if debug:
|
|
235
249
|
configuration = "Debug"
|
|
236
|
-
if
|
|
250
|
+
if relwithdebinfo:
|
|
237
251
|
configuration = "RelWithDebInfo"
|
|
238
252
|
|
|
239
253
|
webrtc_platform = get_webrtc_platform(platform)
|
|
240
|
-
webrtc_info = get_webrtc_info(
|
|
241
|
-
webrtc_platform, args.local_webrtc_build_dir, install_dir, args.debug
|
|
242
|
-
)
|
|
254
|
+
webrtc_info = get_webrtc_info(webrtc_platform, local_webrtc_build_dir, install_dir, debug)
|
|
243
255
|
|
|
244
|
-
sora_info = get_sora_info(
|
|
245
|
-
webrtc_platform, args.local_sora_cpp_sdk_dir, install_dir, args.debug
|
|
246
|
-
)
|
|
256
|
+
sora_info = get_sora_info(webrtc_platform, local_sora_cpp_sdk_dir, install_dir, debug)
|
|
247
257
|
|
|
248
258
|
cmake_args = []
|
|
249
259
|
cmake_args.append(f"-DCMAKE_BUILD_TYPE={configuration}")
|
|
@@ -373,5 +383,80 @@ def main():
|
|
|
373
383
|
)
|
|
374
384
|
|
|
375
385
|
|
|
386
|
+
def _format(
|
|
387
|
+
clang_format_path: Optional[str] = None,
|
|
388
|
+
skip_clang_format: bool = False,
|
|
389
|
+
skip_ruff: bool = False,
|
|
390
|
+
):
|
|
391
|
+
# C++ ファイルのフォーマット
|
|
392
|
+
if not skip_clang_format:
|
|
393
|
+
if clang_format_path is None:
|
|
394
|
+
clang_format_path = _find_clang_binary("clang-format")
|
|
395
|
+
if clang_format_path is None:
|
|
396
|
+
print("Warning: clang-format not found. Skipping C++ formatting.")
|
|
397
|
+
else:
|
|
398
|
+
patterns = [
|
|
399
|
+
"src/**/*.h",
|
|
400
|
+
"src/**/*.cpp",
|
|
401
|
+
]
|
|
402
|
+
target_files = []
|
|
403
|
+
for pattern in patterns:
|
|
404
|
+
files = glob.glob(pattern, recursive=True)
|
|
405
|
+
target_files.extend(files)
|
|
406
|
+
if target_files:
|
|
407
|
+
print(f"Formatting {len(target_files)} C++ files...")
|
|
408
|
+
cmd([clang_format_path, "-i"] + target_files)
|
|
409
|
+
|
|
410
|
+
# Python ファイルのフォーマット
|
|
411
|
+
if not skip_ruff:
|
|
412
|
+
print("Running Python formatting with ruff...")
|
|
413
|
+
try:
|
|
414
|
+
cmd(["uv", "run", "ruff", "format"])
|
|
415
|
+
except Exception as e:
|
|
416
|
+
print(f"Formatting failed: {e}")
|
|
417
|
+
|
|
418
|
+
|
|
419
|
+
def main():
|
|
420
|
+
parser = argparse.ArgumentParser()
|
|
421
|
+
sp = parser.add_subparsers(dest="command", required=True)
|
|
422
|
+
|
|
423
|
+
# build サブコマンド
|
|
424
|
+
bp = sp.add_parser("build")
|
|
425
|
+
bp.add_argument("target", choices=AVAILABLE_TARGETS)
|
|
426
|
+
bp.add_argument("--debug", action="store_true")
|
|
427
|
+
bp.add_argument("--relwithdebinfo", action="store_true")
|
|
428
|
+
bp.add_argument("--local-webrtc-build-dir", type=os.path.abspath)
|
|
429
|
+
bp.add_argument("--local-webrtc-build-args", default="", type=shlex.split)
|
|
430
|
+
bp.add_argument("--local-sora-cpp-sdk-dir", type=os.path.abspath)
|
|
431
|
+
bp.add_argument("--local-sora-cpp-sdk-args", default="", type=shlex.split)
|
|
432
|
+
|
|
433
|
+
# format サブコマンド
|
|
434
|
+
fp = sp.add_parser("format")
|
|
435
|
+
fp.add_argument("--clang-format-path", type=str, default=None)
|
|
436
|
+
fp.add_argument(
|
|
437
|
+
"--skip-clang-format", action="store_true", help="Skip C++ formatting with clang-format"
|
|
438
|
+
)
|
|
439
|
+
fp.add_argument("--skip-ruff", action="store_true", help="Skip Python formatting with ruff")
|
|
440
|
+
|
|
441
|
+
args = parser.parse_args()
|
|
442
|
+
|
|
443
|
+
if args.command == "build":
|
|
444
|
+
_build(
|
|
445
|
+
target=args.target,
|
|
446
|
+
debug=args.debug,
|
|
447
|
+
relwithdebinfo=args.relwithdebinfo,
|
|
448
|
+
local_webrtc_build_dir=args.local_webrtc_build_dir,
|
|
449
|
+
local_webrtc_build_args=args.local_webrtc_build_args,
|
|
450
|
+
local_sora_cpp_sdk_dir=args.local_sora_cpp_sdk_dir,
|
|
451
|
+
local_sora_cpp_sdk_args=args.local_sora_cpp_sdk_args,
|
|
452
|
+
)
|
|
453
|
+
elif args.command == "format":
|
|
454
|
+
_format(
|
|
455
|
+
clang_format_path=args.clang_format_path,
|
|
456
|
+
skip_clang_format=args.skip_clang_format,
|
|
457
|
+
skip_ruff=args.skip_ruff,
|
|
458
|
+
)
|
|
459
|
+
|
|
460
|
+
|
|
376
461
|
if __name__ == "__main__":
|
|
377
462
|
main()
|
|
@@ -4,12 +4,16 @@ from .sora_sdk_ext import * # noqa: F401,F403
|
|
|
4
4
|
# 開発環境の場合は VERSION ファイルから取得
|
|
5
5
|
try:
|
|
6
6
|
from importlib.metadata import version, PackageNotFoundError
|
|
7
|
+
|
|
7
8
|
try:
|
|
8
9
|
__version__ = version("sora_sdk")
|
|
9
10
|
except PackageNotFoundError:
|
|
10
11
|
# パッケージがインストールされていない場合(開発環境)
|
|
11
12
|
import os
|
|
12
|
-
|
|
13
|
+
|
|
14
|
+
_version_file = os.path.join(
|
|
15
|
+
os.path.dirname(os.path.dirname(os.path.dirname(__file__))), "VERSION"
|
|
16
|
+
)
|
|
13
17
|
if os.path.exists(_version_file):
|
|
14
18
|
with open(_version_file, "r") as f:
|
|
15
19
|
__version__ = f.read().strip()
|
{sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/src/sora_sdk/sora_sdk_ext.cpython-311-darwin.so
RENAMED
|
Binary file
|
|
@@ -2,7 +2,8 @@ from collections.abc import Callable, Sequence
|
|
|
2
2
|
import enum
|
|
3
3
|
from typing import Annotated, overload
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
import numpy
|
|
6
|
+
from numpy.typing import NDArray
|
|
6
7
|
|
|
7
8
|
|
|
8
9
|
class SoraSignalingErrorCode(enum.IntEnum):
|
|
@@ -92,20 +93,20 @@ class SoraAudioSource(SoraTrackInterface):
|
|
|
92
93
|
def on_data(self, data: int, samples_per_channel: int) -> None: ...
|
|
93
94
|
|
|
94
95
|
@overload
|
|
95
|
-
def on_data(self, ndarray: Annotated[
|
|
96
|
+
def on_data(self, ndarray: Annotated[NDArray[numpy.int16], dict(shape=(None, None), order='C', device='cpu')], timestamp: float) -> None: ...
|
|
96
97
|
|
|
97
98
|
@overload
|
|
98
|
-
def on_data(self, ndarray: Annotated[
|
|
99
|
+
def on_data(self, ndarray: Annotated[NDArray[numpy.int16], dict(shape=(None, None), order='C', device='cpu')]) -> None: ...
|
|
99
100
|
|
|
100
101
|
class SoraVideoSource(SoraTrackInterface):
|
|
101
102
|
@overload
|
|
102
|
-
def on_captured(self, ndarray: Annotated[
|
|
103
|
+
def on_captured(self, ndarray: Annotated[NDArray[numpy.uint8], dict(shape=(None, None, 3), order='C', device='cpu')]) -> None: ...
|
|
103
104
|
|
|
104
105
|
@overload
|
|
105
|
-
def on_captured(self, ndarray: Annotated[
|
|
106
|
+
def on_captured(self, ndarray: Annotated[NDArray[numpy.uint8], dict(shape=(None, None, 3), order='C', device='cpu')], timestamp: float) -> None: ...
|
|
106
107
|
|
|
107
108
|
@overload
|
|
108
|
-
def on_captured(self, ndarray: Annotated[
|
|
109
|
+
def on_captured(self, ndarray: Annotated[NDArray[numpy.uint8], dict(shape=(None, None, 3), order='C', device='cpu')], timestamp_us: int) -> None: ...
|
|
109
110
|
|
|
110
111
|
class SoraAudioSinkImpl:
|
|
111
112
|
def __init__(self, track: SoraTrackInterface, output_frequency: int = -1, output_channels: int = 0) -> None: ...
|
|
@@ -115,10 +116,10 @@ class SoraAudioSinkImpl:
|
|
|
115
116
|
def read(self, frames: int = 0, timeout: float = 1) -> tuple: ...
|
|
116
117
|
|
|
117
118
|
@property
|
|
118
|
-
def on_data(self) -> Callable[[Annotated[
|
|
119
|
+
def on_data(self) -> Callable[[Annotated[NDArray[numpy.int16], dict(shape=(None, None))]], None]: ...
|
|
119
120
|
|
|
120
121
|
@on_data.setter
|
|
121
|
-
def on_data(self, arg: Callable[[Annotated[
|
|
122
|
+
def on_data(self, arg: Callable[[Annotated[NDArray[numpy.int16], dict(shape=(None, None))]], None], /) -> None: ...
|
|
122
123
|
|
|
123
124
|
@property
|
|
124
125
|
def on_format(self) -> Callable[[int, int], None]: ...
|
|
@@ -143,7 +144,7 @@ class SoraAudioFrame:
|
|
|
143
144
|
@property
|
|
144
145
|
def absolute_capture_timestamp_ms(self) -> int | None: ...
|
|
145
146
|
|
|
146
|
-
def data(self) -> Annotated[
|
|
147
|
+
def data(self) -> Annotated[NDArray[numpy.int16], dict(shape=(None, None))]: ...
|
|
147
148
|
|
|
148
149
|
class SoraAudioStreamSinkImpl:
|
|
149
150
|
def __init__(self, track: SoraTrackInterface, output_frequency: int = -1, output_channels: int = 0) -> None: ...
|
|
@@ -162,7 +163,7 @@ class SoraVAD:
|
|
|
162
163
|
def analyze(self, frame: SoraAudioFrame) -> float: ...
|
|
163
164
|
|
|
164
165
|
class SoraVideoFrame:
|
|
165
|
-
def data(self) -> Annotated[
|
|
166
|
+
def data(self) -> Annotated[NDArray[numpy.uint8], dict(shape=(None, None, 3))]: ...
|
|
166
167
|
|
|
167
168
|
class SoraVideoSinkImpl:
|
|
168
169
|
def __init__(self, arg: SoraTrackInterface, /) -> None: ...
|
|
@@ -258,9 +259,9 @@ class SoraTransformableFrameDirection(enum.IntEnum):
|
|
|
258
259
|
SENDER = 2
|
|
259
260
|
|
|
260
261
|
class SoraTransformableFrame:
|
|
261
|
-
def get_data(self) -> Annotated[
|
|
262
|
+
def get_data(self) -> Annotated[NDArray[numpy.uint8], dict(shape=(None,), writable=False)]: ...
|
|
262
263
|
|
|
263
|
-
def set_data(self, arg: Annotated[
|
|
264
|
+
def set_data(self, arg: Annotated[NDArray[numpy.uint8], dict(shape=(None,), order='C', device='cpu', writable=False)], /) -> None: ...
|
|
264
265
|
|
|
265
266
|
@property
|
|
266
267
|
def payload_type(self) -> int: ...
|
|
@@ -289,7 +290,7 @@ class SoraTransformableAudioFrameType(enum.IntEnum):
|
|
|
289
290
|
|
|
290
291
|
class SoraTransformableAudioFrame(SoraTransformableFrame):
|
|
291
292
|
@property
|
|
292
|
-
def contributing_sources(self) -> Annotated[
|
|
293
|
+
def contributing_sources(self) -> Annotated[NDArray[numpy.uint32], dict(shape=(None,), writable=False)]: ...
|
|
293
294
|
|
|
294
295
|
@property
|
|
295
296
|
def sequence_number(self) -> int | None: ...
|
|
@@ -314,7 +315,7 @@ class SoraTransformableVideoFrame(SoraTransformableFrame):
|
|
|
314
315
|
def frame_id(self) -> int | None: ...
|
|
315
316
|
|
|
316
317
|
@property
|
|
317
|
-
def frame_dependencies(self) -> Annotated[
|
|
318
|
+
def frame_dependencies(self) -> Annotated[NDArray[numpy.int64], dict(shape=(None,), writable=False)]: ...
|
|
318
319
|
|
|
319
320
|
@property
|
|
320
321
|
def width(self) -> int: ...
|
|
@@ -329,7 +330,7 @@ class SoraTransformableVideoFrame(SoraTransformableFrame):
|
|
|
329
330
|
def temporal_index(self) -> int: ...
|
|
330
331
|
|
|
331
332
|
@property
|
|
332
|
-
def contributing_sources(self) -> Annotated[
|
|
333
|
+
def contributing_sources(self) -> Annotated[NDArray[numpy.uint32], dict(shape=(None,), writable=False)]: ...
|
|
333
334
|
|
|
334
335
|
class SoraFrameTransformer:
|
|
335
336
|
def enqueue(self, arg: SoraTransformableFrame, /) -> None: ...
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import time
|
|
2
|
+
|
|
3
|
+
from client import SoraClient, SoraRole
|
|
4
|
+
|
|
5
|
+
from sora_sdk import (
|
|
6
|
+
SoraVideoCodecImplementation,
|
|
7
|
+
SoraVideoCodecPreference,
|
|
8
|
+
SoraVideoCodecType,
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
# def test_preference_invalid(settings):
|
|
12
|
+
# # opneh264 のパスを設定してないのに H264 エンコーダを使おうとしているので Sora 生成時にエラーになる
|
|
13
|
+
# with pytest.raises(RuntimeError):
|
|
14
|
+
# SoraClient(
|
|
15
|
+
# settings,
|
|
16
|
+
# SoraRole.SENDONLY,
|
|
17
|
+
# audio=False,
|
|
18
|
+
# video=True,
|
|
19
|
+
# video_codec_type="H264",
|
|
20
|
+
# video_codec_preference=SoraVideoCodecPreference(
|
|
21
|
+
# codecs=[
|
|
22
|
+
# SoraVideoCodecPreference.Codec(
|
|
23
|
+
# type=SoraVideoCodecType.H264,
|
|
24
|
+
# encoder=SoraVideoCodecImplementation.CISCO_OPENH264,
|
|
25
|
+
# )
|
|
26
|
+
# ]
|
|
27
|
+
# ),
|
|
28
|
+
# )
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def test_preference_vp8(settings):
|
|
32
|
+
sendonly = SoraClient(
|
|
33
|
+
settings,
|
|
34
|
+
SoraRole.SENDONLY,
|
|
35
|
+
audio=False,
|
|
36
|
+
video=True,
|
|
37
|
+
video_codec_type="VP8",
|
|
38
|
+
video_codec_preference=SoraVideoCodecPreference(
|
|
39
|
+
codecs=[
|
|
40
|
+
SoraVideoCodecPreference.Codec(
|
|
41
|
+
type=SoraVideoCodecType.VP8, encoder=SoraVideoCodecImplementation.INTERNAL
|
|
42
|
+
)
|
|
43
|
+
]
|
|
44
|
+
),
|
|
45
|
+
)
|
|
46
|
+
sendonly.connect(fake_video=True)
|
|
47
|
+
|
|
48
|
+
time.sleep(5)
|
|
49
|
+
|
|
50
|
+
sendonly.disconnect()
|
|
@@ -19,7 +19,9 @@ from sora_sdk import (
|
|
|
19
19
|
get_video_codec_capability,
|
|
20
20
|
)
|
|
21
21
|
|
|
22
|
-
pytestmark = pytest.mark.skipif(
|
|
22
|
+
pytestmark = pytest.mark.skipif(
|
|
23
|
+
os.environ.get("INTEL_VPL") is None, reason="Intel VPL でのみ実行する"
|
|
24
|
+
)
|
|
23
25
|
|
|
24
26
|
|
|
25
27
|
def test_intel_vpl_available():
|
|
@@ -600,6 +602,6 @@ def test_intel_vpl_av1_rtp_hdr_ext(settings):
|
|
|
600
602
|
sendonly.disconnect()
|
|
601
603
|
|
|
602
604
|
# AV1 の RTP ヘッダー拡張が送られてきていることを確認
|
|
603
|
-
assert
|
|
604
|
-
"
|
|
605
|
-
)
|
|
605
|
+
assert (
|
|
606
|
+
stats["rtp_hdrext"]["total_received_rtp_hdrext_av1_rtp_sepc"] > 0
|
|
607
|
+
), "Dependency Descriptor RTP Header Extension が Python SDK から送られてきていません"
|
|
@@ -7,11 +7,11 @@ def test_version():
|
|
|
7
7
|
assert hasattr(sora_sdk, "__version__")
|
|
8
8
|
assert isinstance(sora_sdk.__version__, str)
|
|
9
9
|
assert sora_sdk.__version__ != "unknown"
|
|
10
|
-
|
|
10
|
+
|
|
11
11
|
# VERSION ファイルの内容と一致することを確認
|
|
12
12
|
version_file = os.path.join(os.path.dirname(os.path.dirname(__file__)), "VERSION")
|
|
13
13
|
with open(version_file, "r") as f:
|
|
14
14
|
expected_version = f.read().strip()
|
|
15
|
-
|
|
15
|
+
|
|
16
16
|
assert sora_sdk.__version__ == expected_version
|
|
17
|
-
print(f"sora_sdk.__version__ = {sora_sdk.__version__}")
|
|
17
|
+
print(f"sora_sdk.__version__ = {sora_sdk.__version__}")
|
sora_sdk-2025.4.0.dev3/VERSION
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
2025.4.0.dev3
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import time
|
|
2
|
-
|
|
3
|
-
import pytest
|
|
4
|
-
from client import SoraClient, SoraRole
|
|
5
|
-
|
|
6
|
-
from sora_sdk import (
|
|
7
|
-
SoraVideoCodecImplementation,
|
|
8
|
-
SoraVideoCodecPreference,
|
|
9
|
-
SoraVideoCodecType,
|
|
10
|
-
)
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
def test_preference_invalid(settings):
|
|
14
|
-
# opneh264 のパスを設定してないのに H264 エンコーダを使おうとしているので Sora 生成時にエラーになる
|
|
15
|
-
with pytest.raises(RuntimeError):
|
|
16
|
-
SoraClient(
|
|
17
|
-
settings,
|
|
18
|
-
SoraRole.SENDONLY,
|
|
19
|
-
audio=False,
|
|
20
|
-
video=True,
|
|
21
|
-
video_codec_type="H264",
|
|
22
|
-
video_codec_preference=SoraVideoCodecPreference(
|
|
23
|
-
codecs=[
|
|
24
|
-
SoraVideoCodecPreference.Codec(
|
|
25
|
-
type=SoraVideoCodecType.H264,
|
|
26
|
-
encoder=SoraVideoCodecImplementation.CISCO_OPENH264,
|
|
27
|
-
)
|
|
28
|
-
]
|
|
29
|
-
),
|
|
30
|
-
)
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
def test_preference_vp8(settings):
|
|
34
|
-
sendonly = SoraClient(
|
|
35
|
-
settings,
|
|
36
|
-
SoraRole.SENDONLY,
|
|
37
|
-
audio=False,
|
|
38
|
-
video=True,
|
|
39
|
-
video_codec_type="VP8",
|
|
40
|
-
video_codec_preference=SoraVideoCodecPreference(
|
|
41
|
-
codecs=[
|
|
42
|
-
SoraVideoCodecPreference.Codec(
|
|
43
|
-
type=SoraVideoCodecType.VP8, encoder=SoraVideoCodecImplementation.INTERNAL
|
|
44
|
-
)
|
|
45
|
-
]
|
|
46
|
-
),
|
|
47
|
-
)
|
|
48
|
-
sendonly.connect(fake_video=True)
|
|
49
|
-
|
|
50
|
-
time.sleep(5)
|
|
51
|
-
|
|
52
|
-
sendonly.disconnect()
|
|
File without changes
|
|
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-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|