<br><div class="gmail_quote"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
&gt;I use Live555 to stream H.264 from the embedded borad and find a bug:<br>
&gt;<br>
&gt;for my borad, user could change video&#39;s resolution,  at beginning<br>
&gt;user recive H.264 from the borad , it plays well, but if user<br>
&gt;disconnect then reconnect with different resolution, client player<br>
&gt;does not decode frames correctly because SPS and PPS are not the<br>
&gt;same as previous caused by fSPLines is not NULL (see below code) and<br>
&gt;media field of SDP doesn&#39;t be set again.<br>
<br>
Unfortunately, for most servers, the current behavior - setting up<br>
&quot;fSDPLines&quot; only once, when the first client connects - will be the<br>
desired behavior, because (for most servers) the stream&#39;s SDP<br>
parameters will not change from client to client.  Also, in some<br>
cases, it might be costly to figure out the SDP parameters (e.g., it<br>
might involve doing some reading/parsing of the input source), so we<br>
would not want to generate these more than once.  Therefore the<br>
current default behavior should remain.<br>
<br>
What you can do, however, is reimplement the &quot;sdpLines()&quot; virtual<br>
function in your &quot;OnDemandServerMediaSubsession&quot; subclass, as follows:<br>
<br>
char const* yourSubclass::sdpLines() {<br>
        delete[] fSDPLines; fSDPLines = NULL;<br>
<br>
        return OnDemandServerMediaSubsession::sdpLines();<br>
}<br>
  </blockquote><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Alternatively, you could just add<br>
        delete[] fSDPLines; fSDPLines = NULL;<br>
to your implementation of the &quot;createNewRTPSink()&quot; virtual function.<br>
<br></blockquote><div><br>For my need, I add a virtual const char* sdpLines(FramedSource*
inputSource) = 0 to SeverMediaSession.cpp and reimplament
myServerMediaSubsession<br><br>const char*<br>myServerMediaSubsession::sdpLines(FramedSource* inputSource)<br>{<br>    if (fSDPLines != NULL)<br>    {<br>        delete[] fSDPLines;<br>        fSDPLines = NULL;<br>    }<br>
<br>    if (fSDPLines == NULL)<br>   {<br>    ......  <br>    ......<br>    RTPSink* dummyRTPSink<br>      = createNewRTPSink(&amp;dummyGroupsock, rtpPayloadType, inputSource);<br>           <br>    setSDPLinesFromRTPSink(dummyRTPSink, inputSource);<br>
    Medium::close(dummyRTPSink);<br>  }<br>  return fSDPLines;<br>}<br><br><br><br> </div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
For either of these solutions to work, the definition of &quot;fSDPLines&quot;<br>
in &quot;liveMedia/include/OnDemandServerMediaSubsession.hh&quot; will need to<br>
be changed from &quot;private&quot; to protected&quot;.  (I&#39;ll make this change in<br>
the next release of the software.)<br>
 </blockquote><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
I&#39;m curious, though.  You talk about the user &quot;reconnect(ing) with a<br>
different resolution&quot;.  How are you doing this in the RTSP protocol?<br>
Because you must be creating your &quot;H264VideoRTPSink&quot; with a different<br>
&quot;sprop_parameter_sets_str&quot; parameter each time (in order for its SDP<br>
description to change), you must be making the<br>
&quot;sprop_parameter_sets_str&quot; parameter be somehow dependent upon the<br>
client-desired resolution.  How are you doing this?<br></blockquote><div><br> I add a H264VideoStreamFramer member (fStreamSource) into RTSPCilentSession, my H264VideoStreamFramer creates a thread to read stream from the board and write to FIFO. when server accept clinet&#39;s first request(DESCRIBE or OPTIONS), RTSPCilentSession checks if FIFO has data and make the &quot;sprop_parameter_sets_str&quot;<br>
   <br> envir().taskScheduler().turnOnBackgroundReadHandling(fStreamSource-&gt;getClientReadPipe(),<br>        (TaskScheduler::BackgroundHandlerProc*)&amp;incomingSPSAndPPSHandler, this);<br>
</div><div><br>If it gets &quot;sprop_parameter_sets_str&quot;, it will process commands continuously otherwise RTSPCilentSession will terminate because of time out.<br><br><br>orbit.<br><br><br><br><br><br></div></div>