<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><blockquote type="cite"><div>Would I access the RTPTransmissionStatsDB in function RTSPServer::RTSPClientSession:noteLiveness() in RTSPServer.cpp?</div></blockquote><div><br></div>No; that function is used only by the RTCP implementation (when it receives an incoming "RR" packet).  It's not a function that you would call (or modify) yourself.</div><div><br></div><div><br><blockquote type="cite"><div>Alternatively, is there another (cleaner) way to do this without modifying core library code i.e. RTSPServer.cpp?</div></blockquote><div><br></div>Yes.  Note that each "RTPTransmissionStatsDB" object (a 'database of RTP transmission stats') is for a particular "RTPSink" object (and accessed using "RTPSink::transmissionStatsDB()"); therefore, you access these stats by first accessing a "RTPSink" object.</div><div><br></div><div>Note that a "RTPSink" object is used for a particular server->client (sub)session - i.e., for a particular media substream (audio or video) of a particular server->client stream.  Therefore, you access a "RTPSink" object via a "RTSPServer::RTSPClientSession" object.  So, you need to do the following:</div><div>1/ Subclass "RTSPServer::RTSPClientSession".</div><div>2/ Subclass "RTSPServer" (only to redefine the "createNewClientSession()" virtual function to create objects of your new "RTSPServer::RTSPClientSession" subclass, rather than just the "RTSPServer::RTSPClientSession" base class (the default behavior)).</div><div>3/ In your "RTSPServer::RTSPClientSession" subclass - whenever you wish to access the transmission stats (e.g., you might choose to do this periodically, using a timer) - you would do so using code like the following:</div><div><div>      for (unsigned i = 0; i < fNumStreamStates; ++i) {</div><div>        (StreamState*)streamState = (StreamState*)fStreamStates[i].streamToken;</div><div><div>          // we can do this cast because we know that we are using "OnDemandServerMediaSubsession"s</div><div>        RTPTransmissionStatsDB& transmissionStatesDB = streamState->rtpSink()->transmissionStatsDB();</div><div></div><div>      }</div></div></div><br><br><div apple-content-edited="true">
<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; font-size: medium; "><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; font-size: medium; ">Ross Finlayson<br>Live Networks, Inc.<br><a href="http://www.live555.com/">http://www.live555.com/</a></span></span>
</div>
<br></body></html>