frontends (tools/webrtc): Fix PIP merging.

This commit is contained in:
Goffi 2025-11-06 22:15:47 +01:00
commit 40b1c93f4c

View file

@ -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.")