From 40b1c93f4c71a47716548104ada18a7b52ea354b Mon Sep 17 00:00:00 2001 From: Goffi Date: Thu, 6 Nov 2025 22:15:47 +0100 Subject: [PATCH] frontends (tools/webrtc): Fix PIP merging. --- libervia/frontends/tools/webrtc.py | 56 +++++++++++++++++++----------- 1 file changed, 36 insertions(+), 20 deletions(-) diff --git a/libervia/frontends/tools/webrtc.py b/libervia/frontends/tools/webrtc.py index 2ce30f5c..ba05207f 100644 --- a/libervia/frontends/tools/webrtc.py +++ b/libervia/frontends/tools/webrtc.py @@ -979,6 +979,7 @@ class WebRTC: f'Unhandled "sinks_data" value: {self.sinks_data!r}' ) + if adjust_resolution: log.debug("Applying adjust resolution pipeline.") videoscale = Gst.ElementFactory.make("videoscale") @@ -988,9 +989,37 @@ class WebRTC: capsfilter = Gst.ElementFactory.make("capsfilter") capsfilter.set_property("caps", adjusted_caps) - self.pipeline.add(queue, convert, videoscale, capsfilter) + # Add elements to pipeline + if self.merge_pip: + self.pipeline.add(queue, convert, videoscale, capsfilter) + else: + self.pipeline.add(queue, convert, videoscale, capsfilter, remote_video_sink) - self.pipeline.sync_children_states() + ret = pad.link(queue.get_static_pad("sink")) + if ret != Gst.PadLinkReturn.OK: + log.error(f"Error linking pad to queue: {ret}") + return + + if not Gst.Element.link_many(queue, convert, videoscale, capsfilter): + log.error("Failed to link adjustment pipeline chain") + return + + if not self.link_element_or_pad(capsfilter, remote_video_sink): + log.error("Failed to link capsfilter to sink") + return + + queue.sync_state_with_parent() + convert.sync_state_with_parent() + videoscale.sync_state_with_parent() + capsfilter.sync_state_with_parent() + if not self.merge_pip: + remote_video_sink.sync_state_with_parent() + + else: + if self.merge_pip: + self.pipeline.add(queue, convert) + else: + self.pipeline.add(queue, convert, remote_video_sink) ret = pad.link(queue.get_static_pad("sink")) if ret != Gst.PadLinkReturn.OK: @@ -998,30 +1027,17 @@ class WebRTC: return if not queue.link(convert): - log.error("Failed to link queue to videoconvert") + log.error("Failed to link queue to convert") return - if not convert.link(videoscale): - log.error("Failed to link videoconvert to videoscale") + if not self.link_element_or_pad(convert, remote_video_sink): + log.error("Failed to link convert to sink") return - if not videoscale.link(capsfilter): - log.error("Failed to link videoscale to capsfilter") - return - - if not self.link_element_or_pad(capsfilter.link, remote_video_sink): - log.error("Failed to link capsfilter to sink") - return - - else: - self.pipeline.add(queue, convert, remote_video_sink) - - pad.link(queue.get_static_pad("sink")) - Gst.Element.link_many(queue, convert, remote_video_sink) - queue.sync_state_with_parent() convert.sync_state_with_parent() - remote_video_sink.sync_state_with_parent() + if not self.merge_pip: + remote_video_sink.sync_state_with_parent() log.info("Successfully linked remote video stream.")