Hello all!<br><br>In my network there are a lot of hardware VoIP
gateways and softphones and I have to make then work. Most of all
hardware VoIP gateways support G.711, G.723 and G.729 codecs and the
softphones support G.711, GSM, iLBC etc codecs. All endpoints are SIP
peers. All traffic should pass through my asterisk server(s). In
&quot;vanilla&quot; asterisk there is a limitation - it is unable to select a
common codec for 2 peers using some algorithm (less bandwidth etc) or
if jointcapability = 0 select codecs for both endpoints that could be
transcoded &quot;for free&quot;.<br>
<br><b>1st example</b>:<br><br>sip.conf<br><br>[210]<br>disallow=all<br>allow=alaw,ulaw,g723,g729<br>...<br><br>[220]<br>
disallow=all<br>
allow=alaw,ulaw,g723,g729<br>
...<br><br>[255]<br>
disallow=all<br>
allow=gsm<br>
...<br><br>210 calls 220:<br>sip show channels<br>Peer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User/ANR&nbsp;&nbsp;&nbsp; Call ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Seq (Tx/Rx)&nbsp; Format&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hold&nbsp;&nbsp;&nbsp;&nbsp; Last Message<br>10.xx.xx.xx &nbsp;&nbsp;&nbsp; 220&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10aa3d3754b&nbsp; 00102/00000&nbsp; 0x8 (alaw)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; No&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Init: INVITE<br>

10.xx.xx.xx &nbsp;&nbsp;&nbsp; 210&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a983a543-52&nbsp; 00101/00939&nbsp; 0x8 (alaw)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; No&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Rx: INVITE<br><br>Works, but alaw is a high-bandwidth codec!<br><br>210 calls 255:<br>sip show channels<br>Peer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User/ANR&nbsp;&nbsp;&nbsp; Call ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Seq (Tx/Rx)&nbsp; Format&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hold&nbsp;&nbsp;&nbsp;&nbsp; Last Message<br>

10.xx.xx.xx &nbsp;&nbsp; 255&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 504c907f5b7&nbsp; 00102/00000&nbsp; 0x2 (gsm)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; No&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Init: INVITE<br>10.xx.xx.xx &nbsp;&nbsp;&nbsp; 210&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5f84a543-9c&nbsp; 00101/00943&nbsp; 0x8 (alaw)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; No&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Rx: INVITE<br><br>Works here...<br><br><b>2nd example</b>:<br>

<br>sip.conf<br>
<br>
[210]<br>
disallow=all<br>
allow=g729,alaw,ulaw,g723<br>
...<br>
<br>
[220]<br>

disallow=all<br>

allow=g729,alaw,ulaw,g723<br>

...<br>
<br>
[255]<br>

disallow=all<br>

allow=gsm<br>

...<br><br>210 calls 220:<br>sip show channels<br>Peer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User/ANR&nbsp;&nbsp;&nbsp; Call ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Seq (Tx/Rx)&nbsp; Format&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hold&nbsp;&nbsp;&nbsp;&nbsp; Last Message<br>10.xx.xx.xx &nbsp;&nbsp;&nbsp; 220&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 572052d8348&nbsp; 00102/00000&nbsp; 0x100 (g729)&nbsp;&nbsp;&nbsp;&nbsp; No&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Tx: ACK<br>

10.xx.xx.xx &nbsp;&nbsp;&nbsp; 210&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0486a543-2e&nbsp; 00101/00946&nbsp; 0x100 (g729)&nbsp;&nbsp;&nbsp;&nbsp; No&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Rx: ACK<br><br>Good work - g729 pass-through!<br><br>210 calls 255:<br>WARNING[8424]: chan_sip.c:3001 sip_call: No audio format found to offer. Cancelling call to 255<br>

<br>All codecs are same, but their order was changed.<br><br>It&#39;s a simple example, just to point a problem.<br><br>I&#39;m not a professional C/C++ programmer, but the feature was necessary so I created a small patch (for asterisk 1.4.17).<br>

<br>In brief:<br>1) set sip_pvt-&gt;prefcodec = 0!<br>2) Thanks to 1) asterisk continues execution and calls ast_channel_make_compatible function.<br>3) In &quot;ast_channel_make_compatible&quot; we recalculate peers&#39; codec capabilities and sip_pvt-&gt;prefs.<br>

<br>Result - the order of the codecs in &quot;allow=&quot; parameter does not
matter anymore. Asterisk will select most efficient codec for
pass-through and if jointcapability = 0 will select free and ecomonic
codec for transcoding.<br>
<br>My patch is not excellent (maybe even awful, but i&#39;m not a
programmer and it works for me fine!) but if anybody get an idea, you
can make it better. Also it would be nice to implement that feature as
configuration parameter.<br>
<br>Please see patch in attachment! Thanks!