From e1cc2acdf917df97c1ecc7e4799b43b7c531d279 Mon Sep 17 00:00:00 2001 From: Rami Mosleh Date: Fri, 6 Mar 2020 19:59:57 +0200 Subject: [PATCH] Specify rtsp_transport for Onvif Camera (#31918) * specify rtsp_transport for onvif camera * remove used variable * Update homeassistant/components/stream/__init__.py Co-Authored-By: Paulus Schoutsen * change options to stream_options Co-authored-by: Paulus Schoutsen --- homeassistant/components/camera/__init__.py | 25 +++++++++++++++++---- homeassistant/components/onvif/camera.py | 6 +++++ homeassistant/components/stream/__init__.py | 13 +++++------ 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/homeassistant/components/camera/__init__.py b/homeassistant/components/camera/__init__.py index 45cfe96e11b..5d9bc99f945 100644 --- a/homeassistant/components/camera/__init__.py +++ b/homeassistant/components/camera/__init__.py @@ -136,7 +136,13 @@ async def async_request_stream(hass, entity_id, fmt): f"{camera.entity_id} does not support play stream service" ) - return request_stream(hass, source, fmt=fmt, keepalive=camera_prefs.preload_stream) + return request_stream( + hass, + source, + fmt=fmt, + keepalive=camera_prefs.preload_stream, + options=camera.options, + ) @bind_hass @@ -256,7 +262,7 @@ async def async_setup(hass, config): if not source: continue - request_stream(hass, source, keepalive=True) + request_stream(hass, source, keepalive=True, options=camera.stream_options) async_when_setup(hass, DOMAIN_STREAM, preload_stream) @@ -312,6 +318,7 @@ class Camera(Entity): def __init__(self): """Initialize a camera.""" self.is_streaming = False + self.stream_options = {} self.content_type = DEFAULT_CONTENT_TYPE self.access_tokens: collections.deque = collections.deque([], 2) self.async_update_token() @@ -581,7 +588,11 @@ async def ws_camera_stream(hass, connection, msg): fmt = msg["format"] url = request_stream( - hass, source, fmt=fmt, keepalive=camera_prefs.preload_stream + hass, + source, + fmt=fmt, + keepalive=camera_prefs.preload_stream, + options=camera.stream_options, ) connection.send_result(msg["id"], {"url": url}) except HomeAssistantError as ex: @@ -666,7 +677,13 @@ async def async_handle_play_stream_service(camera, service_call): fmt = service_call.data[ATTR_FORMAT] entity_ids = service_call.data[ATTR_MEDIA_PLAYER] - url = request_stream(hass, source, fmt=fmt, keepalive=camera_prefs.preload_stream) + url = request_stream( + hass, + source, + fmt=fmt, + keepalive=camera_prefs.preload_stream, + options=camera.stream_options, + ) data = { ATTR_ENTITY_ID: entity_ids, ATTR_MEDIA_CONTENT_ID: f"{hass.config.api.base_url}{url}", diff --git a/homeassistant/components/onvif/camera.py b/homeassistant/components/onvif/camera.py index 02c9d2e9544..614eb4e6556 100644 --- a/homeassistant/components/onvif/camera.py +++ b/homeassistant/components/onvif/camera.py @@ -43,6 +43,7 @@ DEFAULT_ARGUMENTS = "-pred 1" DEFAULT_PROFILE = 0 CONF_PROFILE = "profile" +CONF_RTSP_TRANSPORT = "rtsp_transport" ATTR_PAN = "pan" ATTR_TILT = "tilt" @@ -71,6 +72,7 @@ DOMAIN = "onvif" ONVIF_DATA = "onvif" ENTITIES = "entities" +RTSP_TRANS_PROTOCOLS = ["tcp", "udp", "udp_multicast", "http"] PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( { @@ -80,6 +82,9 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( vol.Optional(CONF_USERNAME, default=DEFAULT_USERNAME): cv.string, vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, vol.Optional(CONF_EXTRA_ARGUMENTS, default=DEFAULT_ARGUMENTS): cv.string, + vol.Optional(CONF_RTSP_TRANSPORT, default=RTSP_TRANS_PROTOCOLS[0]): vol.In( + RTSP_TRANS_PROTOCOLS + ), vol.Optional(CONF_PROFILE, default=DEFAULT_PROFILE): vol.All( vol.Coerce(int), vol.Range(min=0) ), @@ -161,6 +166,7 @@ class ONVIFHassCamera(Camera): self._profile_index = config.get(CONF_PROFILE) self._ptz_service = None self._input = None + self.stream_options[CONF_RTSP_TRANSPORT] = config.get(CONF_RTSP_TRANSPORT) self._mac = None _LOGGER.debug( diff --git a/homeassistant/components/stream/__init__.py b/homeassistant/components/stream/__init__.py index d88f90a83f8..ab80630cb33 100644 --- a/homeassistant/components/stream/__init__.py +++ b/homeassistant/components/stream/__init__.py @@ -50,13 +50,12 @@ def request_stream(hass, stream_source, *, fmt="hls", keepalive=False, options=N options = {} # For RTSP streams, prefer TCP - if ( - isinstance(stream_source, str) - and stream_source[:7] == "rtsp://" - and not options - ): - options["rtsp_flags"] = "prefer_tcp" - options["stimeout"] = "5000000" + if isinstance(stream_source, str) and stream_source[:7] == "rtsp://": + options = { + "rtsp_flags": "prefer_tcp", + "stimeout": "5000000", + **options, + } try: streams = hass.data[DOMAIN][ATTR_STREAMS]