Re: How to obey the ptime-value in SDP-Answer for RTP-stream?
EiSl 1972 <eisl1972 <at> gmail.com>
2010-09-15 09:38:40 GMT
Hello all,
A short update:
I've introduced a patch which seems to work OK for me. Any "ptime" attribute in the remote SDP is now applied to the stream encoder. To have a good 30ms payload (and other payloads), the media_cfg.audio_frame_ptime should be set to 10. Using the default of 20 will give an unstable packet time (when using null-audio device)
One comment...
While I was investigating, I got the feeling that the "ptime" is just ignored. It is parsed from the SDP and stored, but it seems never been applied. What IS applied is the more exotical "maxptime".
Is there a reason why "ptime" is ignored? Did I overlooked something?
I've introduced my patch at the same location as where the "maxptime" is applied to the encoder settings.
The patch (applied on 1.5.5 release)
<at> session.c (pjmedia-tree ) pjmedia_stream_info_from_sdp(...) around line 530
...
...
/* Get local fmtp for our decoder. */
parse_fmtp(pool, local_m, si->fmt.pt,
&si->param->setting.dec_fmtp);
+
+ /* Get the remote ptime for our
encoder. */
+ attr =
pjmedia_sdp_attr_find2(rem_m->attr_count, rem_m->attr,
+
"ptime", NULL);
+
if (attr) {
+
pj_str_t tmp_val = attr->value;
+
+
pj_strltrim(&tmp_val);
+
si->param->setting.frm_per_pkt = (pj_uint8_t)(pj_strtoul(&tmp_val) /
si->param->info.frm_ptime);
+
+
if (
si->param->setting.frm_per_pkt == 0 )
+ {
+
si->param->setting.frm_per_pkt = 1;
+ }
+
}
/* Get
remote maxptime for our encoder. */
attr =
pjmedia_sdp_attr_find2(rem_m->attr_count, rem_m->attr,
"maxptime", NULL);
...
...
With regards,
Eize
<div>
<p>Hello all,<br><br>A short update: <br>I've introduced a patch which seems to work OK for me. Any "ptime" attribute in the remote SDP is now applied to the stream encoder. To have a good 30ms payload (and other payloads), the media_cfg.audio_frame_ptime should be set to 10. Using the default of 20 will give an unstable packet time (when using null-audio device)<br><br>One comment...<br>While I was investigating, I got the feeling that the "ptime" is just ignored. It is parsed from the SDP and stored, but it seems never been applied. What IS applied is the more exotical "maxptime".<br>
Is there a reason why "ptime" is ignored? Did I overlooked something?<br>I've introduced my patch at the same location as where the "maxptime" is applied to the encoder settings.<br><br>The patch (applied on 1.5.5 release)<br><br> <at> session.c (pjmedia-tree ) pjmedia_stream_info_from_sdp(...) around line 530<br></p>
<p class="MsoNormal"><span lang="NL"> </span><span> <span>...</span></span></p>
<p class="MsoNormal"><span><span> ...<br></span></span></p>
<p class="MsoNormal"><span><span> /* Get local fmtp for our decoder. </span></span><span lang="NL">*/</span></p>
<p class="MsoNormal"><span lang="NL">
parse_fmtp(pool, local_m, si-><a href="http://fmt.pt">fmt.pt</a>,
&si->param->setting.dec_fmtp);</span></p>
<p class="MsoNormal"><span lang="NL">+ <br></span></p>
<p class="MsoNormal"><span>+ <span>/* Get the remote ptime for our
encoder. </span></span><span lang="NL">*/</span></p>
<p class="MsoNormal"><span lang="NL">+ </span><span>attr =
pjmedia_sdp_attr_find2(rem_m->attr_count, rem_m->attr,</span></p>
<p class="MsoNormal"><span lang="NL">+</span><span>
<span>"ptime"</span>, NULL);</span></p>
<p class="MsoNormal"><span lang="NL">+</span><span>
<span>if</span> (attr) {</span></p>
<p class="MsoNormal"><span lang="NL">+</span><span>
pj_str_t tmp_val = attr->value;</span></p>
<p class="MsoNormal"><span lang="NL">+</span><span> <br></span></p>
<p class="MsoNormal"><span lang="NL">+</span><span>
pj_strltrim(&tmp_val);</span></p>
<p class="MsoNormal"><span lang="NL">+</span><span>
si->param->setting.frm_per_pkt = (pj_uint8_t)(pj_strtoul(&tmp_val) /
si->param->info.frm_ptime);</span></p>
<p class="MsoNormal"><span lang="NL">+</span><span> <br></span></p>
<p class="MsoNormal"><span lang="NL">+</span><span>
</span><span lang="IT">if</span><span lang="IT"> (
si->param->setting.frm_per_pkt == 0 )</span></p>
<p class="MsoNormal"><span lang="NL">+</span><span lang="IT"> {</span></p>
<p class="MsoNormal"><span lang="NL">+</span><span lang="IT">
si->param->setting.frm_per_pkt = 1;</span></p>
<p class="MsoNormal"><span lang="NL">+</span><span lang="IT"> </span><span>}</span></p>
<p class="MsoNormal"><span lang="NL">+</span><span>
}</span><span></span></p>
<p class="MsoNormal"><span> </span></p>
<p class="MsoNormal"><span> <span>/* Get
remote maxptime for our encoder. */</span></span></p>
<p class="MsoNormal"><span> attr =
pjmedia_sdp_attr_find2(rem_m->attr_count, rem_m->attr,</span></p>
<p class="MsoNormal"><span>
<span>"maxptime"</span>, NULL);</span></p>
<p class="MsoNormal"><span> ...</span></p>
<p class="MsoNormal">
<span> ...<br></span></p>
<br>With regards,<br>Eize<br><br>
</div>