80 lines
2.6 KiB
Python
80 lines
2.6 KiB
Python
import asyncio
|
|
import os
|
|
|
|
import pytest
|
|
|
|
from iqpilot.system.webrtc.rtc import WebRTCOfferBuilder
|
|
from iqpilot.system.webrtc.rtc.stream import RTCSessionDescription
|
|
from iqpilot.system.webrtc.session import StreamSession
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_native_video_audio_and_data_channel():
|
|
if not os.environ.get("CI"):
|
|
return
|
|
|
|
answer_session = None
|
|
video_received = asyncio.Event()
|
|
audio_received = asyncio.Event()
|
|
|
|
async def connect(offer):
|
|
nonlocal answer_session
|
|
answer_session = StreamSession(offer.sdp, offer.video, [], [], [], debug_mode=True)
|
|
answer = await answer_session.get_answer()
|
|
answer_session.start()
|
|
return RTCSessionDescription(answer.sdp, answer.type)
|
|
|
|
builder = WebRTCOfferBuilder(connect, ice_servers=[])
|
|
builder.offer_to_receive_video_stream("road")
|
|
builder.offer_to_receive_audio_stream()
|
|
builder.add_messaging()
|
|
stream = builder.stream()
|
|
|
|
try:
|
|
await asyncio.wait_for(stream.start(), 10)
|
|
stream.get_incoming_video_track("road").on_frame(lambda *_: video_received.set())
|
|
stream.get_incoming_audio_track().on_frame(lambda *_: audio_received.set())
|
|
await asyncio.wait_for(stream.wait_for_connection(), 10)
|
|
await asyncio.wait_for(video_received.wait(), 10)
|
|
await asyncio.wait_for(audio_received.wait(), 10)
|
|
stream.get_messaging_channel().send('{"type":"timingSei","enabled":true}')
|
|
await asyncio.sleep(0.1)
|
|
assert answer_session is not None
|
|
assert answer_session.video_tracks[0].timing_sei_enabled
|
|
finally:
|
|
await stream.stop()
|
|
if answer_session is not None:
|
|
await answer_session.stop_async()
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_native_duplex_audio_negotiation():
|
|
if not os.environ.get("CI"):
|
|
return
|
|
|
|
answer_session = None
|
|
|
|
async def connect(offer):
|
|
nonlocal answer_session
|
|
sendrecv_offer = offer.sdp.replace("a=recvonly", "a=sendrecv", 1)
|
|
answer_session = StreamSession(sendrecv_offer, offer.video, [], [], [], debug_mode=True)
|
|
answer = await answer_session.get_answer()
|
|
answer_session.start()
|
|
return RTCSessionDescription(answer.sdp, answer.type)
|
|
|
|
builder = WebRTCOfferBuilder(connect, ice_servers=[])
|
|
builder.offer_to_receive_audio_stream()
|
|
stream = builder.stream()
|
|
|
|
try:
|
|
await asyncio.wait_for(stream.start(), 10)
|
|
await asyncio.wait_for(stream.wait_for_connection(), 10)
|
|
assert stream.has_incoming_audio_track()
|
|
assert answer_session is not None
|
|
assert answer_session.audio_recv_requested
|
|
assert answer_session.audio_output is not None
|
|
finally:
|
|
await stream.stop()
|
|
if answer_session is not None:
|
|
await answer_session.stop_async()
|