<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 12pt;
font-family:Calibri
}
--></style></head>
<body class='hmmessage'><div dir='ltr'><br><div>

<style><!--
.ExternalClass .ecxhmmessage P {
padding:0px;
}

.ExternalClass body.ecxhmmessage {
font-size:12pt;
font-family:Calibri;
}

--></style>
<div dir="ltr"><font style="" face="Courier New"><br></font><font style="" face="Courier New">Code base : live.2013.04.30.tar.gz</font><font style="" face="Courier New"><br></font><font style="" face="Courier New"><br><br>Question1:<br>    RtspServer: An OPTIONS with a proper "Session: XYZ" does not seem to trigger RTSPClientSession::noteLiveness().<br>    Is that a wanted behavior ?<br>    If yes, apart from sending RTCP, what would be the best keep-alive from the client? requesting GET_PARAMETER ?<br>    If no, could it trigger 'handleCmd_withinSession()' the same way <br>      </font><font style="" face="Courier New"><font style="" face="Courier New">that </font>TEARDOWN/PLAY/PAUSE/GET_PARAMETER/SET_PARAMETER do, so it could 'touch' the session liveness?<br><br></font><font style="" face="Courier New"><br></font><font style="" face="Courier New">Question2/Request : </font><font style="" face="Courier New"><br></font><font style="" face="Courier New"><br></font><font style="" face="Courier New">    In </font><font style="" face="Courier New"><br></font><font style="" face="Courier New">        void RTSPServer::RTSPClientSession</font><font style="" face="Courier New"><br></font><font style="" face="Courier New">        ::handleCmd_SETUP(RTSPServer::RTSPClientConnection* ourClientConnection,</font><font style="" face="Courier New"><br></font><font style="" face="Courier New">         char const* urlPreSuffix, char const* urlSuffix, char const* fullRequestStr) </font><font style="" face="Courier New"><br></font><font style="" face="Courier New"><br></font><font style="" face="Courier New">    would it be possible to change the many</font><font style="" face="Courier New"><br></font><font style="" face="Courier New"><br></font><font style="" face="Courier New">          snprintf((char*)ourClientConnection->fResponseBuffer, sizeof ourClientConnection->fResponseBuffer,</font><font style="" face="Courier New"><br></font><font style="" face="Courier New">               "RTSP/1.0 200 OK\r\n"</font><font style="" face="Courier New"><br></font><font style="" face="Courier New">               "CSeq: %s\r\n"</font><font style="" face="Courier New"><br></font><font style="" face="Courier New">               "%s"</font><font style="" face="Courier New"><br></font><font style="" face="Courier New">               "Transport: blablabla \r\n"</font><font style="" face="Courier New"><br></font><font style="" face="Courier New">               "Session: %08X\r\n\r\n",</font><font style="" face="Courier New"><br></font><font style="" face="Courier New">               </font><font style="" face="Courier New"><br></font><font style="" face="Courier New">    to use</font><font style="" face="Courier New"><br></font><font style="" face="Courier New"><br></font><font style="" face="Courier New">        "Session: %08X;timeout=%u\r\n\r\n",  ...,  fOurSessionId, fReclamationTestSeconds);</font><font style="" face="Courier New"><br></font><font style="" face="Courier New">        </font><font style="" face="Courier New"><br></font><font style="" face="Courier New">    instead, so the clients can be aware of custom timeouts, and 'ping' OPTIONS & RTCP accordingly ?</font><font style="" face="Courier New"><br></font><font style="" face="Courier New">    (if I am mistaken on the usage of 'fReclamationTestSeconds', any suitable value instead ?)</font><font style="" face="Courier New"><br></font><font style="" face="Courier New">    </font><font style="" face="Courier New"><br></font><font style="" face="Courier New">    Searching the net/list, I found : </font><font style="" face="Courier New"><br></font><font style="" face="Courier New">        http://lists.live555.com/pipermail/live-devel/2009-August/011129.html</font><font style="" face="Courier New"><br></font><font style="" face="Courier New">        http://lists.live555.com/pipermail/live-devel/2007-August/007292.html</font><font style="" face="Courier New"><br></font><font style="" face="Courier New">    It looks like people agreed on it, but 5 years later, it still absent ?    </font><font style="" face="Courier New"><br></font><font style="" face="Courier New">    </font><font style="" face="Courier New"><br></font><font style="" face="Courier New">    Sorry if this has been already discussed and ruled out for a specific reason.</font><font style="" face="Courier New"><br></font><font style="" face="Courier New"><br></font><font style="" face="Courier New"><br></font><font style="" face="Courier New">Bug:</font><font style="" face="Courier New"><br></font><font style="" face="Courier New">In following code, if "if (NumBytesInNALunit > maxSize) return;" occurs, 'nalUnitCopySize' is not set to 0, 'seiSize' is unset/random, and it will most likely crash in the while loop.</font><font style="" face="Courier New"><br></font><font style="" face="Courier New">Solution : </font><font style="" face="Courier New"><br></font><font style="" face="Courier New"> 1: Put 'nalUnitCopySize = 0;' before the return in H264VideoStreamParser::removeEmulationBytes</font><font style="" face="Courier New"><br></font><font style="" face="Courier New"> 2: unsigned seiSize = 0;</font><font style="" face="Courier New"><br></font><font style="" face="Courier New"> </font><font style="" face="Courier New"><br></font><font style="" face="Courier New"> </font><font style="" face="Courier New"><br></font><font style="" face="Courier New"> Code:</font><font style="" face="Courier New"><br></font><font style="" face="Courier New">    void H264VideoStreamParser::analyze_sei_data() {</font><font style="" face="Courier New"><br></font><font style="" face="Courier New">      // Begin by making a copy of the NAL unit data, removing any 'emulation prevention' bytes:</font><font style="" face="Courier New"><br></font><font style="" face="Courier New">      u_int8_t sei[SEI_MAX_SIZE];</font><font style="" face="Courier New"><br></font><font style="" face="Courier New">      unsigned seiSize;</font><font style="" face="Courier New"><br></font><font style="" face="Courier New">      removeEmulationBytes(sei, sizeof sei, seiSize);</font><font style="" face="Courier New"><br></font><font style="" face="Courier New">      </font><font style="" face="Courier New"><br></font><font style="" face="Courier New">      unsigned j = 1; // skip the initial byte (forbidden_zero_bit; nal_ref_idc; nal_unit_type); we've already seen it </font><font style="" face="Courier New"><br></font><font style="" face="Courier New">      while (j < seiSize) {</font><font style="" face="Courier New"><br></font><font style="" face="Courier New">        unsigned payloadType = 0;</font><font style="" face="Courier New"><br></font><font style="" face="Courier New">        do {</font><font style="" face="Courier New"><br></font><font style="" face="Courier New">          payloadType += sei[j];      </font><font style="" face="Courier New"><br></font><font style="" face="Courier New">      ...</font><font style="" face="Courier New"><br></font><font style="" face="Courier New">    }</font><font style="" face="Courier New"><br></font><font style="" face="Courier New"><br></font><font style="" face="Courier New">    void H264VideoStreamParser::removeEmulationBytes(u_int8_t* nalUnitCopy, unsigned maxSize, unsigned& nalUnitCopySize) {</font><font style="" face="Courier New"><br></font><font style="" face="Courier New">      u_int8_t* nalUnitOrig = fStartOfFrame + fOutputStartCodeSize;</font><font style="" face="Courier New"><br></font><font style="" face="Courier New">      unsigned const NumBytesInNALunit = fTo - nalUnitOrig;</font><font style="" face="Courier New"><br></font><font style="" face="Courier New">      if (NumBytesInNALunit > maxSize) return;</font><font style="" face="Courier New"><br></font><font style="" face="Courier New">      nalUnitCopySize = 0;</font><font style="" face="Courier New"><br></font><font style="" face="Courier New">       ...</font><font style="" face="Courier New"><br></font><font style="" face="Courier New">    }     </font><font style="" face="Courier New"><br></font><font style="" face="Courier New">    </font><font style="" face="Courier New"><br><br>Regards,<br><br>Julien<br></font>                                           </div></div>                                        </div></body>
</html>