transports: deprecate TransportParams.camera_* in favor of video_*

This commit is contained in:
Aleix Conchillo Flaqué
2025-04-23 13:39:28 -07:00
parent de7185e8db
commit 420912dd4b
6 changed files with 47 additions and 18 deletions

View File

@@ -27,6 +27,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Deprecated ### Deprecated
- `TransportParams.camera_*` parameters are now deprecated, use
`TransportParams.video_*` instead.
- `TransportParams.vad_enabled` parameter is now deprecated, use - `TransportParams.vad_enabled` parameter is now deprecated, use
`TransportParams.audio_in_enabled` and `TransportParams.vad_analyzer` instead. `TransportParams.audio_in_enabled` and `TransportParams.vad_analyzer` instead.

View File

@@ -77,6 +77,24 @@ class BaseInputTransport(FrameProcessor):
) )
self._params.audio_in_passthrough = True self._params.audio_in_passthrough = True
if self._params.camera_in_enabled or self._params.camera_out_enabled:
import warnings
with warnings.catch_warnings():
warnings.simplefilter("always")
warnings.warn(
"Parameters 'camera_*' are deprecated, use 'video_*' instead.",
DeprecationWarning,
)
self._params.video_in_enabled = self._params.camera_in_enabled
self._params.video_out_enabled = self._params.camera_out_enabled
self._params.video_out_is_live = self._params.camera_out_is_live
self._params.video_out_width = self._params.camera_out_width
self._params.video_out_height = self._params.camera_out_height
self._params.video_out_bitrate = self._params.camera_out_bitrate
self._params.video_out_framerate = self._params.camera_out_framerate
self._params.video_out_color_format = self._params.camera_out_color_format
def enable_audio_in_stream_on_start(self, enabled: bool) -> None: def enable_audio_in_stream_on_start(self, enabled: bool) -> None:
logger.debug(f"Enabling audio on start. {enabled}") logger.debug(f"Enabling audio on start. {enabled}")
self._params.audio_in_stream_on_start = enabled self._params.audio_in_stream_on_start = enabled

View File

@@ -212,10 +212,10 @@ class BaseOutputTransport(FrameProcessor):
self._audio_buffer = self._audio_buffer[self._audio_chunk_size :] self._audio_buffer = self._audio_buffer[self._audio_chunk_size :]
async def _handle_image(self, frame: OutputImageRawFrame | SpriteFrame): async def _handle_image(self, frame: OutputImageRawFrame | SpriteFrame):
if not self._params.camera_out_enabled: if not self._params.video_out_enabled:
return return
if self._params.camera_out_is_live: if self._params.video_out_is_live:
await self._camera_out_queue.put(frame) await self._camera_out_queue.put(frame)
else: else:
await self._sink_queue.put(frame) await self._sink_queue.put(frame)
@@ -373,18 +373,18 @@ class BaseOutputTransport(FrameProcessor):
def _create_camera_task(self): def _create_camera_task(self):
# Create camera output queue and task if needed. # Create camera output queue and task if needed.
if not self._camera_out_task and self._params.camera_out_enabled: if not self._camera_out_task and self._params.video_out_enabled:
self._camera_out_queue = asyncio.Queue() self._camera_out_queue = asyncio.Queue()
self._camera_out_task = self.create_task(self._camera_out_task_handler()) self._camera_out_task = self.create_task(self._camera_out_task_handler())
async def _cancel_camera_task(self): async def _cancel_camera_task(self):
# Stop camera output task. # Stop camera output task.
if self._camera_out_task and self._params.camera_out_enabled: if self._camera_out_task and self._params.video_out_enabled:
await self.cancel_task(self._camera_out_task) await self.cancel_task(self._camera_out_task)
self._camera_out_task = None self._camera_out_task = None
async def _draw_image(self, frame: OutputImageRawFrame): async def _draw_image(self, frame: OutputImageRawFrame):
desired_size = (self._params.camera_out_width, self._params.camera_out_height) desired_size = (self._params.video_out_width, self._params.video_out_height)
# TODO: we should refactor in the future to support dynamic resolutions # TODO: we should refactor in the future to support dynamic resolutions
# which is kind of what happens in P2P connections. # which is kind of what happens in P2P connections.
@@ -408,10 +408,10 @@ class BaseOutputTransport(FrameProcessor):
async def _camera_out_task_handler(self): async def _camera_out_task_handler(self):
self._camera_out_start_time = None self._camera_out_start_time = None
self._camera_out_frame_index = 0 self._camera_out_frame_index = 0
self._camera_out_frame_duration = 1 / self._params.camera_out_framerate self._camera_out_frame_duration = 1 / self._params.video_out_framerate
self._camera_out_frame_reset = self._camera_out_frame_duration * 5 self._camera_out_frame_reset = self._camera_out_frame_duration * 5
while True: while True:
if self._params.camera_out_is_live: if self._params.video_out_is_live:
await self._camera_out_is_live_handler() await self._camera_out_is_live_handler()
elif self._camera_images: elif self._camera_images:
image = next(self._camera_images) image = next(self._camera_images)

View File

@@ -40,6 +40,14 @@ class TransportParams(BaseModel):
audio_in_filter: Optional[BaseAudioFilter] = None audio_in_filter: Optional[BaseAudioFilter] = None
audio_in_stream_on_start: bool = True audio_in_stream_on_start: bool = True
audio_in_passthrough: bool = True audio_in_passthrough: bool = True
video_in_enabled: bool = False
video_out_enabled: bool = False
video_out_is_live: bool = False
video_out_width: int = 1024
video_out_height: int = 768
video_out_bitrate: int = 800000
video_out_framerate: int = 30
video_out_color_format: str = "RGB"
vad_enabled: bool = False vad_enabled: bool = False
vad_audio_passthrough: bool = False vad_audio_passthrough: bool = False
vad_analyzer: Optional[VADAnalyzer] = None vad_analyzer: Optional[VADAnalyzer] = None

View File

@@ -328,9 +328,9 @@ class SmallWebRTCClient:
self._audio_output_track = RawAudioTrack(sample_rate=self._out_sample_rate) self._audio_output_track = RawAudioTrack(sample_rate=self._out_sample_rate)
self._webrtc_connection.replace_audio_track(self._audio_output_track) self._webrtc_connection.replace_audio_track(self._audio_output_track)
if self._params.camera_out_enabled: if self._params.video_out_enabled:
self._video_output_track = RawVideoTrack( self._video_output_track = RawVideoTrack(
width=self._params.camera_out_width, height=self._params.camera_out_height width=self._params.video_out_width, height=self._params.video_out_height
) )
self._webrtc_connection.replace_video_track(self._video_output_track) self._webrtc_connection.replace_video_track(self._video_output_track)
@@ -391,7 +391,7 @@ class SmallWebRTCInputTransport(BaseInputTransport):
await self._client.connect() await self._client.connect()
if not self._receive_audio_task and self._params.audio_in_enabled: if not self._receive_audio_task and self._params.audio_in_enabled:
self._receive_audio_task = self.create_task(self._receive_audio()) self._receive_audio_task = self.create_task(self._receive_audio())
if not self._receive_video_task and self._params.camera_in_enabled: if not self._receive_video_task and self._params.video_in_enabled:
self._receive_video_task = self.create_task(self._receive_video()) self._receive_video_task = self.create_task(self._receive_video())
async def _stop_tasks(self): async def _stop_tasks(self):
@@ -465,7 +465,7 @@ class SmallWebRTCInputTransport(BaseInputTransport):
self._image_requests[request_id] = frame self._image_requests[request_id] = frame
# If we're not already receiving video, try to get a frame now # If we're not already receiving video, try to get a frame now
if not self._receive_video_task and self._params.camera_in_enabled: if not self._receive_video_task and self._params.video_in_enabled:
# Start video reception if it's not already running # Start video reception if it's not already running
self._receive_video_task = self.create_task(self._receive_video()) self._receive_video_task = self.create_task(self._receive_video())

View File

@@ -383,12 +383,12 @@ class DailyTransportClient(EventHandler):
self._in_sample_rate = self._params.audio_in_sample_rate or frame.audio_in_sample_rate self._in_sample_rate = self._params.audio_in_sample_rate or frame.audio_in_sample_rate
self._out_sample_rate = self._params.audio_out_sample_rate or frame.audio_out_sample_rate self._out_sample_rate = self._params.audio_out_sample_rate or frame.audio_out_sample_rate
if self._params.camera_out_enabled and not self._camera: if self._params.video_out_enabled and not self._camera:
self._camera = Daily.create_camera_device( self._camera = Daily.create_camera_device(
self._camera_name(), self._camera_name(),
width=self._params.camera_out_width, width=self._params.video_out_width,
height=self._params.camera_out_height, height=self._params.video_out_height,
color_format=self._params.camera_out_color_format, color_format=self._params.video_out_color_format,
) )
if self._params.audio_out_enabled and not self._mic: if self._params.audio_out_enabled and not self._mic:
@@ -487,7 +487,7 @@ class DailyTransportClient(EventHandler):
client_settings={ client_settings={
"inputs": { "inputs": {
"camera": { "camera": {
"isEnabled": self._params.camera_out_enabled, "isEnabled": self._params.video_out_enabled,
"settings": { "settings": {
"deviceId": self._camera_name(), "deviceId": self._camera_name(),
}, },
@@ -510,8 +510,8 @@ class DailyTransportClient(EventHandler):
"maxQuality": "low", "maxQuality": "low",
"encodings": { "encodings": {
"low": { "low": {
"maxBitrate": self._params.camera_out_bitrate, "maxBitrate": self._params.video_out_bitrate,
"maxFramerate": self._params.camera_out_framerate, "maxFramerate": self._params.video_out_framerate,
} }
}, },
} }