Transcoding, or maybe not?


Hi all

I am using Asterisk 16.0.0 / PJSIP in a setup where internal phones support and prefer G.722 over G.711 A/U which they also support. Support for G.722 from/to my ITSP trunk varies from call to call and is therefore not known in advance. This usually leads to asterisk doing unnecessary transcoding G.722 <-> G711A when placing an outbound call from an internal phone to my ITSP trunk.

In order to eliminate this unnecessary transcoding, I implemented a small pre-bridge-handler that is executed after the outbound call leg to my ITSP has been established and the codec in use on othe outbound call leg is known. It then adjusts the codec on the inbound call leg to use the same codec, which should eliminate the need for transcoding.


exten => s,1,Set(LOCAL(cl)=${MASTER_CHANNEL(CHANNEL(audionativeformat)):1:-1})
 same => n,Set(LOCAL(cib)=${CUT(cl,|,1)})
 same => n,Set(LOCAL(cl)=${CHANNEL(audionativeformat):1:-1})
 same => n,Set(LOCAL(cob)=${CUT(cl,|,1)})
 same => n,GotoIf($["${LOCAL(cob)}" = "${LOCAL(cib)}"]?equal)
 same => n,Set(MASTER_CHANNEL(PJSIP_MEDIA_OFFER(audio))=!all,${LOCAL(cob)})
 same => n(equal),Return()

Basically it seems to do what it’s supposed to. Using the CLI, ‘pjsip show channelstats’ reports both channels as using alaw, also ‘bridge show XXXX’ reports that the bridge is using ‘native_rtp’ technology:

 BridgeId ChannelId ........ UpTime.. Codec.   Count    Lost Pct  Jitter   Count    Lost Pct  Jitter RTT....

 198308fe 604-00000027       00:00:09 alaw      328       0    0   0.000    340       0    0   0.000   0.000
 198308fe 608-00000028       00:00:09 alaw      340       0    0   0.000    328       0    0   0.001   0.000

Id: 198308fe-95d9-44db-802c-013d4f197523
Type: basic
Technology: native_rtp
Num-Channels: 2
Channel: PJSIP/604-00000027
Channel: PJSIP/608-00000028

However, looking at the individual channels using ‘core show channel PJSIP/XXXXX’ seems to give some rather odd information.

For the inbound call leg’s channel I get:

  NativeFormats: (alaw)
    WriteFormat: alaw
     ReadFormat: alaw
 WriteTranscode: Yes (slin@16000)->(slin@8000)->(alaw@8000)
  ReadTranscode: Yes (slin@16000)->(slin@8000)->(alaw@8000)

And for the outbound call leg’s channel:

  NativeFormats: (alaw)
    WriteFormat: slin16
     ReadFormat: slin16
 WriteTranscode: Yes (slin@16000)->(slin@8000)->(alaw@8000)
  ReadTranscode: Yes (alaw@8000)->(slin@8000)->(slin@16000)

Something here just doesn’t seem to add up. Is asterisk actually doing any transcoding or not?