<div dir="ltr">Hi,<div>I am developing a pipeline to ingest a video stream from RTSP and create dynamic ABR ladders that would mux audio and video and mux to hlssink.</div><div><br></div><div>I have a create_bin function that creates an Bin element containing</div><div>queue->videorate->capsfilter->encoder->hlssink2</div><div><br></div><div>the queue sink is set as ghost pad like below</div><div>```</div><div>let video_ghost_pad = gst::GhostPad::with_target(Some("video"), &video_sink_pad).unwrap();<br>video_ghost_pad.set_active(true).unwrap();<br>enc_bin.add_pad(&video_ghost_pad).unwrap();<br></div><div>```</div><div><br></div><div>Then I add the Bin to the pipeline</div><div> `pipe_bin.add(&enc_bin).unwrap();`</div><div><br></div><div>I then add a probe to block downstream video from the video tee so that I can link the video_tee src and ghost sink</div><div>```</div><div>let tee_video_pad = video_tee.request_pad_simple("src_%u").unwrap();<br><br>let video_block = tee_video_pad.add_probe(gst::PadProbeType::BLOCK_DOWNSTREAM, |_pad, _info| {<br>    gst::PadProbeReturn::Ok<br>}).unwrap();<br></div><div>```</div><div>I then link the src->sink between video-tee and my Bin</div><div>```</div><div>let video_sink_pad = enc_bin.static_pad("video").unwrap();<br>        tee_video_pad.link(&video_sink_pad).unwrap();<br></div><div>```</div><div>I then call the call_async method on my Bin to sync state with parent.</div><div><br></div><div>```</div><div>enc_bin.call_async(move |bin| {<br>                if bin.sync_state_with_parent().is_err() {<br>                    log::error!("could not set the enc_bin_{} to playing", width);<br>                }<br>                tee_video_pad.remove_probe(video_block);<br>            });</div><div>```</div><div><br></div><div>Everything works fine until now. ( I see that the memory increases by about 100MB depending on the resolution).</div><div><br></div><div>When I call to remove this Bin from the pipeline, </div><div>I call pipeline.call_async a closure that contains code to block the video_tee sink pad</div><div>```</div><div>let video_block = video_tee_sink_pad.add_probe(gst::PadProbeType::BLOCK_DOWNSTREAM, |_pad, _info| {<br>                 gst::PadProbeReturn::Ok<br>             }).unwrap();<br></div><div>```</div><div>I then release the request src pad and remove probe</div><div>```</div><div>video_tee.release_request_pad(&video_src_pad);<br></div><div>video_tee_sink_pad.remove_probe(video_block);<br></div><div>```</div><div>I then call unlink, remove and set the Bin I created to null</div><div><br></div><div>```</div><div>pipeline.unlink(&enc_bin);<br>let res = pipeline.remove(&enc_bin);<br></div><div>// I compare the result here</div><div><br></div><div>let state_res = enc_bin.set_state(gst::State::Null);<br></div><div>```</div><div><br></div><div>Removing seems to work fine as well. However the memory that was allocated during the creation of the ABR never gets released. I see that it keeps increasing slowly.</div><div><br></div><div>Generating the debug_dump_dot file after removal shows that the bin and the src pads dont exists anymore.</div><div><br></div><div>But everytime I create a new Bin, the memory increases and never releases.</div><div><br></div><div>FYI, I am using vaapi encoders for this.</div><div><br></div><div>I appreciate any help in this regard. It would be really helpful if you could even provide any other tools that might help me with this!</div><div><br></div><div>Best Regards,</div><div>Guru</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div></div>