Hello,<br>I&#39;m a student and beginner with the live555 library.<br>I have been writing some simple test programs for handling rtsp streaming.<br>Now I&#39;m trying take only videowidth,videoheight,fps and buffer from streaming.<br>

I&#39;m make use of mplayer source code. But mplayer using demux_t class for handling buffer.<br>This is too complex for me.<br>What is the simply way for taking (videowidth,videoheight,fps and buffer) this data? Thanks.<br>
<br>Here source codes<br>
#include &quot;rtspdene.h&quot;<br>#include &quot;BasicUsageEnvironment.hh&quot;<br>#include &quot;GroupsockHelper.hh&quot;<br>#include &lt;stdio.h&gt;<br><br>int rtspStreamOverTCP = 0;<br>char* network_username;<br>
char* network_password;<br><br><br>static char* openURL_rtsp(RTSPClient* client, char const* url) {<br>&nbsp; // If we were given a user name (and optional password), then use them: <br>&nbsp; if (network_username != NULL) {<br>&nbsp;&nbsp;&nbsp; char const* password = network_password == NULL ? &quot;&quot; : network_password;<br>


&nbsp;&nbsp;&nbsp; return client-&gt;describeWithPassword<div id="1f5g" class="ArwC7c ckChnd">(url, network_username, password);<br>&nbsp; } else {<br>&nbsp;&nbsp;&nbsp; return client-&gt;describeURL(url);<br>&nbsp; }<br>}<br><br>int main()<br>{<br>&nbsp;&nbsp;&nbsp; char const* url = &quot;rtsp://<a href="http://192.168.2.200:554/" target="_blank">192.168.2.200:554</a>&quot;;<br>


&nbsp;&nbsp;&nbsp; Boolean success = False;<br>&nbsp;&nbsp;&nbsp; do {<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; TaskScheduler* scheduler = BasicTaskScheduler::createNew();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (scheduler == NULL)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf(&quot;BasicTaskScheduler::createNew hata&quot;);<br>


&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; UsageEnvironment* env = BasicUsageEnvironment::createNew(*scheduler);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (env == NULL)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf(&quot;BasicUsageEnvironment::createNew hata&quot;);<br>


&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; RTSPClient* rtspClient = NULL;<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; rtspClient = RTSPClient::createNew(*env, 1, &quot;MRT&quot;);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (rtspClient == NULL)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; { printf(&quot;Failed to create RTSP client&quot;); }<br>


<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; char* sdpDescription = NULL;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; sdpDescription = openURL_rtsp(rtspClient,url);<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (sdpDescription == NULL) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf( &quot;Failed to get a SDP description from URL \&quot;%s\&quot;: %s\n&quot;, url, env-&gt;getResultMsg());<br>


&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Now that we have a SDP description, create a MediaSession from it:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; MediaSession* mediaSession = MediaSession::createNew(*env, sdpDescription);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (mediaSession == NULL) {<br>


&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf(&quot;Failed to create mediaSession&quot;);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int audiofound = 0;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Create RTP receivers (sources) for each subsession:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; MediaSubsessionIterator iter(*mediaSession);<br>


&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; MediaSubsession* subsession;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned desiredReceiveBufferSize;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while ((subsession = iter.next()) != NULL)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Ignore any subsession that&#39;s not audio or video:<br>


&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (strcmp(subsession-&gt;mediumName(), &quot;audio&quot;) == 0) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (audiofound) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf(&quot;Additional subsession \&quot;audio/%s\&quot; skipped\n&quot;, subsession-&gt;codecName());<br>


&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; continue;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; desiredReceiveBufferSize = 100000;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } else if (strcmp(subsession-&gt;mediumName(), &quot;video&quot;) == 0) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; desiredReceiveBufferSize = 2000000;<br>


&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } else {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; continue;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (!subsession-&gt;initiate()) {<br>&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf( &quot;Failed to initiate \&quot;%s/%s\&quot; RTP subsession:
%s\n&quot;, subsession-&gt;mediumName(), subsession-&gt;codecName(),
env-&gt;getResultMsg());<br>

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } else {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
printf( &quot;Initiated \&quot;%s/%s\&quot; RTP subsession on port %d\n&quot;,
subsession-&gt;mediumName(), subsession-&gt;codecName(),
subsession-&gt;clientPortNum());<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Set the OS&#39;s socket receive buffer sufficiently large to avoid<br>

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // incoming packets getting dropped between successive reads from this<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // subsession&#39;s demuxer.&nbsp; Depending on the bitrate(s) that you expect,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // you may wish to tweak the &quot;desiredReceiveBufferSize&quot; values above.<br>


&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int rtpSocketNum = subsession-&gt;rtpSource()-&gt;RTPgs()-&gt;socketNum();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int receiveBufferSize = increaseReceiveBufferTo(*env, rtpSocketNum,desiredReceiveBufferSize);<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf(&quot;Increased %s socket receive buffer to %d bytes \n&quot;, subsession-&gt;mediumName(), receiveBufferSize);<br>


<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (rtspClient != NULL) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Issue a RTSP &quot;SETUP&quot; command on the chosen subsession:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (!rtspClient-&gt;setupMediaSubsession(*subsession, False, rtspStreamOverTCP)) break;<br>


&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (!strcmp(subsession-&gt;mediumName(), &quot;audio&quot;))<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; audiofound = 1;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (rtspClient != NULL) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Issue a RTSP aggregate &quot;PLAY&quot; command on the whole session:<br>


&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (!rtspClient-&gt;playMediaSession(*mediaSession)) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf( &quot;playMediaSession hata&quot;);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Now that the session is ready to be read, do additional<br>

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // MPlayer codec-specific initialization on each subsession:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; iter.reset();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while ((subsession = iter.next()) != NULL) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (subsession-&gt;readSource() == NULL) continue; // not reading this<br>

<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned flags = 0;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (strcmp(subsession-&gt;mediumName(), &quot;audio&quot;) == 0) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ???????<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } else if (strcmp(subsession-&gt;mediumName(), &quot;video&quot;) == 0) {<br>

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; ???????<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; success = True;<br><br><br>
&nbsp;&nbsp;&nbsp; } while (0);<br><br>&nbsp;&nbsp;&nbsp;&nbsp; ???????<br><br>&nbsp;&nbsp;&nbsp; return 0;<br>}</div>