<div dir="ltr"><div>I use rtpbin to send rtp data in my project. But I met some problem in using rtpbin.</div><div><br></div><div>When the program exits, I find there is memory leak.</div><div><br></div><div>Finally, I find that, when I call gst_element_get_request_pad (rtpbin, "send_rtp_sink_0"), the rtpbin created two sockets, but when the rtpbin is released, the two sockets fd are not returned to the OS.</div><div><br></div><div>My code is as below. Is there anybody giving me some help?</div><div><br></div><div><br></div><div>Thanks very much. I will appreciate your any suggestions.</div><div><br></div><div><br></div><div><br></div><div>TEST(PlayAnnounce, RtpBinEncodeTest)</div><div>{</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">    </span>GstElement *rtpbin;</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">    </span>GstPad *rtp_sink, *rtp_src, *rtcp_src;</div><div><span class="gmail-Apple-tab-span" style="white-space:pre"> </span>GObject *session;</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">      </span>gint count = 1;</div><div><br></div><div><span class="gmail-Apple-tab-span" style="white-space:pre">       </span>wait_msg("####start#####...");</div><div><br></div><div><span class="gmail-Apple-tab-span" style="white-space:pre">      </span>rtpbin = gst_element_factory_make ("rtpbin", "rtpbin");</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">    </span>wait_msg("create rtpbin done....");</div><div><br></div><div><span class="gmail-Apple-tab-span" style="white-space:pre"> </span>while (count--) {</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">              </span>/* request session 0 */</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                </span>rtp_sink = gst_element_get_request_pad (rtpbin, "send_rtp_sink_0");</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">          </span>fail_unless (rtp_sink != NULL);</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                </span>ASSERT_OBJECT_REFCOUNT (rtp_sink, "rtp_sink", 2);</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">            </span>wait_msg("get send_rtp_sink_0 done....");</div><div><br></div><div><span class="gmail-Apple-tab-span" style="white-space:pre">           </span>/* this static pad should be created automatically now */</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">              </span>rtp_src = gst_element_get_static_pad (rtpbin, "send_rtp_src_0");</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">             </span>fail_unless (rtp_src != NULL);</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">         </span>ASSERT_OBJECT_REFCOUNT (rtp_src, "rtp_src", 2);</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">              </span>wait_msg("get send_rtp_src_0 done....");</div><div><br></div><div><span class="gmail-Apple-tab-span" style="white-space:pre">            </span>/* we should be able to get an internal session 0 now */</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">               </span>g_signal_emit_by_name (rtpbin, "get-internal-session", 0, &session);</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">             </span>fail_unless (session != NULL);</div><div><br></div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                </span>wait_msg("get get-internal-session done....");</div><div><br></div><div><span class="gmail-Apple-tab-span" style="white-space:pre">              </span>g_object_unref (session);</div><div><br></div><div><br></div><div><span class="gmail-Apple-tab-span" style="white-space:pre">            </span>/* get the send RTCP pad too */</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                </span>rtcp_src = gst_element_get_request_pad (rtpbin, "send_rtcp_src_0");</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">          </span>fail_unless (rtcp_src != NULL);</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                </span>ASSERT_OBJECT_REFCOUNT (rtcp_src, "rtcp_src", 2);</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">            </span>wait_msg("get send_rtcp_src_0 done....");</div><div><br></div><div><span class="gmail-Apple-tab-span" style="white-space:pre">           </span>gst_element_release_request_pad (rtpbin, rtp_sink);</div><div><br></div><div><span class="gmail-Apple-tab-span" style="white-space:pre">           </span>wait_msg("release rtp_sink done....");</div><div><br></div><div><span class="gmail-Apple-tab-span" style="white-space:pre">              </span>/* we should only have our refs to the pads now */</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">             </span>ASSERT_OBJECT_REFCOUNT (rtp_sink, "rtp_sink", 1);</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">            </span>ASSERT_OBJECT_REFCOUNT (rtp_src, "rtp_src", 1);</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">              </span>ASSERT_OBJECT_REFCOUNT (rtcp_src, "rtp_src", 2);</div><div><br></div><div><span class="gmail-Apple-tab-span" style="white-space:pre">            </span>/* the other pad should be gone now */</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">         </span>fail_unless (gst_element_get_static_pad (rtpbin, "send_rtp_src_0") == NULL);</div><div><br></div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                </span>/* internal session should still be there */</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">           </span>g_signal_emit_by_name (rtpbin, "get-internal-session", 0, &session);</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">             </span>fail_unless (session != NULL);</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">         </span>g_object_unref (session);</div><div><br></div><div><span class="gmail-Apple-tab-span" style="white-space:pre">             </span>/* release the RTCP pad */</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">             </span>gst_element_release_request_pad (rtpbin, rtcp_src);</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">            </span>wait_msg("release rtcp_src done....");</div><div><br></div><div><span class="gmail-Apple-tab-span" style="white-space:pre">              </span>/* we should only have our refs to the pads now */</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">             </span>ASSERT_OBJECT_REFCOUNT (rtp_sink, "rtp_sink", 1);</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">            </span>ASSERT_OBJECT_REFCOUNT (rtp_src, "rtp_src", 1);</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">              </span>ASSERT_OBJECT_REFCOUNT (rtcp_src, "rtp_src", 1);</div><div><br></div><div><span class="gmail-Apple-tab-span" style="white-space:pre">            </span>/* the session should be gone now */</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">           </span>g_signal_emit_by_name (rtpbin, "get-internal-session", 0, &session);</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">             </span>fail_unless (session == NULL);</div><div><br></div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                </span>/* unref the request pad and the static pad */</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">         </span>gst_object_unref (rtp_sink);</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">           </span>gst_object_unref (rtp_src);</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">            </span>gst_object_unref (rtcp_src);</div><div><br></div><div><span class="gmail-Apple-tab-span" style="white-space:pre">          </span>wait_msg("release pad done....");</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">    </span>}</div><div><br></div><div><span class="gmail-Apple-tab-span" style="white-space:pre">     </span>gst_object_unref (rtpbin);</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">     </span>wait_msg("release rtpbin done....");</div><div>}</div><div><br></div><div><br></div><div>When the program run to "release rtpbin done....". But I find that socket file handle not released. like this:</div><div><br></div><div>[root@ms2 ~]# </div><div>[root@ms2 ~]# ll /proc/30263/fd</div><div>total 0</div><div>lrwx------ 1 root root 64 Sep  1 14:40 0 -> /dev/pts/3</div><div>lrwx------ 1 root root 64 Sep  1 14:40 1 -> /dev/pts/3</div><div>lrwx------ 1 root root 64 Sep  1 14:40 2 -> /dev/pts/3</div><div>lrwx------ 1 root root 64 Sep  1 14:41 3 -> socket:[11628779]</div><div>lrwx------ 1 root root 64 Sep  1 14:41 4 -> socket:[11628780]</div></div>