<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:#0563C1;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:#954F72;
text-decoration:underline;}
span.EmailStyle17
{mso-style-type:personal-compose;
font-family:"Calibri",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-family:"Calibri",sans-serif;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link="#0563C1" vlink="#954F72"><div class=WordSection1><p class=MsoNormal>This is a follow up on my previous post about memory leaks that I have observed using gst-launch-1.0.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>System:<o:p></o:p></p><p class=MsoNormal>Ubuntu 16.04<o:p></o:p></p><p class=MsoNormal>Asrock Q1900DC-ITX mother board<o:p></o:p></p><p class=MsoNormal>alsa src and sink are from/to onboard audio codec ALC892 via rear panel jacks<o:p></o:p></p><p class=MsoNormal>Gstreamer version: 1.8.3<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Purpose of pipeline:<o:p></o:p></p><p class=MsoNormal>test how to incorporate LADSPA plugins (plugins require channels=1,format=F32LE data)<o:p></o:p></p><p class=MsoNormal>test how to assign channels via channel-mask<o:p></o:p></p><p class=MsoNormal>test using deinterleave, tee, and interleave for LADSPA processing<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Intended behavior of this test pipeline:<o:p></o:p></p><p class=MsoNormal>2 (stereo audio) input channels are reassigned to some other channels in the 8 channel output stream<o:p></o:p></p><p class=MsoNormal>the other channels should be silent<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Observed behavior:<o:p></o:p></p><p class=MsoNormal>At first I used audiotestsrc wave=silence to create silent channels. After I discovered the memory leak I instead tried the volume element with mute=true but this also produced a memory leak. As a workaround I used a LADSPA plugin that I wrote with the gain level set to -90dB and this did not leak. Needless to say, the memory leaks with audiotestsrc and volume should not be happening. Since leaking occurs without when there are no LADSPA plugins in the pipeline it does not seem to be related to these elements.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Example pipelines are provided below.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>(1) THIS PIPELINE RESULTS IN MEMORY LEAK, LEAKRATE ~ 1MB/sec<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>gst-launch-1.0 -v \<o:p></o:p></p><p class=MsoNormal>alsasrc device="hw:1,0" ! audio/x-raw,format=S32LE,rate=44100 ! deinterleave name=d \<o:p></o:p></p><p class=MsoNormal>d.src_0 ! tee name=t0 \<o:p></o:p></p><p class=MsoNormal>d.src_1 ! tee name=t1 \<o:p></o:p></p><p class=MsoNormal>audiotestsrc wave=silence ! audio/x-raw,channels=1,format=S32LE,rate=44100 ! tee name=audio_silence \<o:p></o:p></p><p class=MsoNormal>audio_silence. ! queue ! audioconvert ! ladspa-acdf-so-acdf type=0 gain=-90 ! "audio/x-raw,channel-mask=(bitmask)0x4" ! i.sink_0 \<o:p></o:p></p><p class=MsoNormal>audio_silence. ! queue ! audioconvert ! ladspa-acdf-so-acdf type=0 gain=-90 ! "audio/x-raw,channel-mask=(bitmask)0x8" ! i.sink_1 \<o:p></o:p></p><p class=MsoNormal>audio_silence. ! queue ! audioconvert ! ladspa-acdf-so-acdf type=0 gain=-90 ! "audio/x-raw,channel-mask=(bitmask)0x1" ! i.sink_2 \<o:p></o:p></p><p class=MsoNormal>audio_silence. ! queue ! audioconvert ! ladspa-acdf-so-acdf type=0 gain=-90 ! "audio/x-raw,channel-mask=(bitmask)0x2" ! i.sink_3 \<o:p></o:p></p><p class=MsoNormal>t0. ! queue ! audioconvert ! ladspa-acdf-so-acdf type=0 gain=-20 ! ladspa-acdf-so-acdf type=0 gain=10 ! "audio/x-raw,channel-mask=(bitmask)0x400" ! i.sink_4 \<o:p></o:p></p><p class=MsoNormal>t1. ! queue ! audioconvert ! ladspa-acdf-so-acdf type=0 gain=-20 ! ladspa-acdf-so-acdf type=0 gain=10 ! "audio/x-raw,channel-mask=(bitmask)0x800" ! i.sink_5 \<o:p></o:p></p><p class=MsoNormal>audio_silence. ! queue ! audioconvert ! ladspa-acdf-so-acdf type=0 gain=-90 ! "audio/x-raw,channel-mask=(bitmask)0x10" ! i.sink_6 \<o:p></o:p></p><p class=MsoNormal>audio_silence. ! queue ! audioconvert ! ladspa-acdf-so-acdf type=0 gain=-90 ! "audio/x-raw,channel-mask=(bitmask)0x20" ! i.sink_7 \<o:p></o:p></p><p class=MsoNormal>interleave name=i ! audioconvert ! audio/x-raw,format=S32LE ! alsasink device="hw:1,0"<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>(2) THIS PIPELINE WITH LADSPA PLUGINS REMOVED ALSO RESULTS IN MEMORY LEAK, LEAKRATE ~ 1MB/sec<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>gst-launch-1.0 -v \<o:p></o:p></p><p class=MsoNormal>alsasrc device="hw:1,0" ! audio/x-raw,format=S32LE,rate=44100 ! deinterleave name=d \<o:p></o:p></p><p class=MsoNormal>d.src_0 ! tee name=t0 \<o:p></o:p></p><p class=MsoNormal>d.src_1 ! tee name=t1 \<o:p></o:p></p><p class=MsoNormal>audiotestsrc wave=silence ! audio/x-raw,channels=1,format=S32LE,rate=44100 ! tee name=audio_silence \<o:p></o:p></p><p class=MsoNormal>audio_silence. ! queue ! audioconvert ! "audio/x-raw,channel-mask=(bitmask)0x4" ! i.sink_0 \<o:p></o:p></p><p class=MsoNormal>audio_silence. ! queue ! audioconvert ! "audio/x-raw,channel-mask=(bitmask)0x8" ! i.sink_1 \<o:p></o:p></p><p class=MsoNormal>audio_silence. ! queue ! audioconvert ! "audio/x-raw,channel-mask=(bitmask)0x1" ! i.sink_2 \<o:p></o:p></p><p class=MsoNormal>audio_silence. ! queue ! audioconvert ! "audio/x-raw,channel-mask=(bitmask)0x2" ! i.sink_3 \<o:p></o:p></p><p class=MsoNormal>t0. ! queue ! audioconvert ! "audio/x-raw,channel-mask=(bitmask)0x400" ! i.sink_4 \<o:p></o:p></p><p class=MsoNormal>t1. ! queue ! audioconvert ! "audio/x-raw,channel-mask=(bitmask)0x800" ! i.sink_5 \<o:p></o:p></p><p class=MsoNormal>audio_silence. ! queue ! audioconvert ! "audio/x-raw,channel-mask=(bitmask)0x10" ! i.sink_6 \<o:p></o:p></p><p class=MsoNormal>audio_silence. ! queue ! audioconvert ! "audio/x-raw,channel-mask=(bitmask)0x20" ! i.sink_7 \<o:p></o:p></p><p class=MsoNormal>interleave name=i ! audioconvert ! audio/x-raw,format=S32LE ! alsasink device="hw:1,0"<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>(3) THIS WORKS WITHOUT MEMORY LEAK:<o:p></o:p></p><p class=MsoNormal>The only difference from the first example is that I replaced the audiotestsrc with a teed input channel<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>gst-launch-1.0 -v \<o:p></o:p></p><p class=MsoNormal>alsasrc device="hw:1,0" ! audio/x-raw,format=S32LE,rate=44100 ! deinterleave name=d \<o:p></o:p></p><p class=MsoNormal>d.src_0 ! tee name=t0 \<o:p></o:p></p><p class=MsoNormal>d.src_1 ! tee name=t1 \<o:p></o:p></p><p class=MsoNormal>t0. ! tee name=audio_silence \<o:p></o:p></p><p class=MsoNormal>audio_silence. ! queue ! audioconvert ! ladspa-acdf-so-acdf type=0 gain=-90 ! "audio/x-raw,channel-mask=(bitmask)0x4" ! i.sink_0 \<o:p></o:p></p><p class=MsoNormal>audio_silence. ! queue ! audioconvert ! ladspa-acdf-so-acdf type=0 gain=-90 ! "audio/x-raw,channel-mask=(bitmask)0x8" ! i.sink_1 \<o:p></o:p></p><p class=MsoNormal>audio_silence. ! queue ! audioconvert ! ladspa-acdf-so-acdf type=0 gain=-90 ! "audio/x-raw,channel-mask=(bitmask)0x1" ! i.sink_2 \<o:p></o:p></p><p class=MsoNormal>audio_silence. ! queue ! audioconvert ! ladspa-acdf-so-acdf type=0 gain=-90 ! "audio/x-raw,channel-mask=(bitmask)0x2" ! i.sink_3 \<o:p></o:p></p><p class=MsoNormal>t0. ! queue ! audioconvert ! ladspa-acdf-so-acdf type=0 gain=-20 ! ladspa-acdf-so-acdf type=0 gain=10 ! "audio/x-raw,channel-mask=(bitmask)0x400" ! i.sink_4 \<o:p></o:p></p><p class=MsoNormal>t1. ! queue ! audioconvert ! ladspa-acdf-so-acdf type=0 gain=-20 ! ladspa-acdf-so-acdf type=0 gain=10 ! "audio/x-raw,channel-mask=(bitmask)0x800" ! i.sink_5 \<o:p></o:p></p><p class=MsoNormal>audio_silence. ! queue ! audioconvert ! ladspa-acdf-so-acdf type=0 gain=-90 ! "audio/x-raw,channel-mask=(bitmask)0x10" ! i.sink_6 \<o:p></o:p></p><p class=MsoNormal>audio_silence. ! queue ! audioconvert ! ladspa-acdf-so-acdf type=0 gain=-90 ! "audio/x-raw,channel-mask=(bitmask)0x20" ! i.sink_7 \<o:p></o:p></p><p class=MsoNormal>interleave name=i ! audioconvert ! audio/x-raw,format=S32LE ! alsasink device="hw:1,0"<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>(4) USING VOLUME ELEMENT ALSO CREATES MEMORY LEAK, LEAKRATE ~ 1MB/sec<o:p></o:p></p><p class=MsoNormal>I took pipeline (3) above and inserted the volume element<o:p></o:p></p><p class=MsoNormal>Pipeline runs but leaks at same rate<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>gst-launch-1.0 -v \<o:p></o:p></p><p class=MsoNormal>alsasrc device="hw:1,0" ! audio/x-raw,format=S32LE,rate=44100 ! deinterleave name=d \<o:p></o:p></p><p class=MsoNormal>d.src_0 ! tee name=t0 \<o:p></o:p></p><p class=MsoNormal>d.src_1 ! tee name=t1 \<o:p></o:p></p><p class=MsoNormal>t0. ! volume mute=true ! tee name=audio_silence \<o:p></o:p></p><p class=MsoNormal>audio_silence. ! queue ! audioconvert ! ladspa-acdf-so-acdf type=0 gain=-90 ! "audio/x-raw,channel-mask=(bitmask)0x4" ! i.sink_0 \<o:p></o:p></p><p class=MsoNormal>audio_silence. ! queue ! audioconvert ! ladspa-acdf-so-acdf type=0 gain=-90 ! "audio/x-raw,channel-mask=(bitmask)0x8" ! i.sink_1 \<o:p></o:p></p><p class=MsoNormal>audio_silence. ! queue ! audioconvert ! ladspa-acdf-so-acdf type=0 gain=-90 ! "audio/x-raw,channel-mask=(bitmask)0x1" ! i.sink_2 \<o:p></o:p></p><p class=MsoNormal>audio_silence. ! queue ! audioconvert ! ladspa-acdf-so-acdf type=0 gain=-90 ! "audio/x-raw,channel-mask=(bitmask)0x2" ! i.sink_3 \<o:p></o:p></p><p class=MsoNormal>t0. ! queue ! audioconvert ! ladspa-acdf-so-acdf type=0 gain=-20 ! ladspa-acdf-so-acdf type=0 gain=10 ! "audio/x-raw,channel-mask=(bitmask)0x400" ! i.sink_4 \<o:p></o:p></p><p class=MsoNormal>t1. ! queue ! audioconvert ! ladspa-acdf-so-acdf type=0 gain=-20 ! ladspa-acdf-so-acdf type=0 gain=10 ! "audio/x-raw,channel-mask=(bitmask)0x800" ! i.sink_5 \<o:p></o:p></p><p class=MsoNormal>audio_silence. ! queue ! audioconvert ! ladspa-acdf-so-acdf type=0 gain=-90 ! "audio/x-raw,channel-mask=(bitmask)0x10" ! i.sink_6 \<o:p></o:p></p><p class=MsoNormal>audio_silence. ! queue ! audioconvert ! ladspa-acdf-so-acdf type=0 gain=-90 ! "audio/x-raw,channel-mask=(bitmask)0x20" ! i.sink_7 \<o:p></o:p></p><p class=MsoNormal>interleave name=i ! audioconvert ! audio/x-raw,format=S32LE ! alsasink device="hw:1,0"<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p></div></body></html>