<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class="">I'm implementing statistics on our software (<a href="https://github.com/ua-i2cat/liveMediaStreamer" class="">liveMediaStreamer framework</a>) and I'd like to have access to the RTPTransmissionStatsDB. But, I do not see how to get the RTPSink object (which has the RTPTransmissionStatsDB and its stats).<br class=""><br class=""></div><div class="">Which should be the proper way to get the RTPSink object related to my OnDemandServerMediaSubsession childs? I've seen that OnDemandServerMediaSubsession has a friend classe StreamState which has the RTPSink associated but, anyway, I'm not able to have access to it.<br class=""></div></div></div></blockquote><div><br class=""></div><div>First of all, note that while a “OnDemandServerMediaSubsession” object refers to a track of streamable media, a “RTPSink” object refers to a receiving client (or possibly multiple clients if “reuseFirstSource” is True).  So there’s (in general) a one-to-many relationship between “OnDemandServerMediaSubsession” and “RTPSink”.  Thus, it doesn’t make sense to talk about *the* RTPSink object for your “OnDemandServerMediaSubsession”.</div><div><br class=""></div><div>However…</div><div>There are at least two possible ways to get access to the “RTPSink” objects:</div><div><br class=""></div><div>1/ Note the pure virtual function “createNewRTPSink()” that you have implemented in your “OnDemandServerMediaSubsession” subclass.  You can use your implementation of this function to get access to the “RTPTransmissionStatsDB” for the new “RTPSink”, after you’ve created it.</div><div>The drawback of this approach, though, is that you don’t know when the “RTPSink” object later gets deleted, so - if you’re not careful - you may end up holding a reference or pointer to a “RTPTransmissionStatsDB” that has been deleted.</div><div><br class=""></div><div>2/ Define a subclass “myRTCPInstance” of the “RTCPInstance” class.  Then, in your "OnDemandServerMediaSubsession” subclass, reimplement the</div><div><span class="Apple-tab-span" style="white-space:pre">      </span>"createRTCP()” virtual function to create a “myRTCPInstance” object, rather than a “RTCPInstance” object.  Note that “createRTCP()” contains a “sink” parameter, pointing to a “RTPSink”, from which you can get the “RTPTransmissionStatsDB”.</div><div>The advantage of this approach over approach 1/ is that - by defining a subclass of “RTCPInstance”, you can learn when the “RTPInstance” object gets deleted, and thus when the “RTPSink” object gets deleted.  (The “RTCPInstance” object always gets deleted immediately before the “RTPSink” object.)  Thus, you can use your “myRTCPInstance” destructor to figure out when the “RTPTransmissionStatsDB” should no longer be used.</div></div><br class=""><div apple-content-edited="true" class="">
<span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px;"><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;  ">Ross Finlayson<br class="">Live Networks, Inc.<br class=""><a href="http://www.live555.com/" class="">http://www.live555.com/</a></span></span>
</div>
<br class=""></body></html>