Yes, from what I’ve seen in the logs there are multiple branches happening. One between Teams and Kamailio and one between Kamailio and Asterisk.
That's just one branch; the incoming call doesn't count. "Real"
additional branches are created by calling functions like
"append_branch".
You should definitely ensure (by adding appropriate logging calls) that "rtpengine_manage" is called exactly once per outgoing application/sdp message, with all requisite arguments(*). Anything else is a recipe for confusion. In my experience that's sufficient(**) to get it all working quite nicely.
(*) "trust-address replace-origin replace-session-connection", plus either RTP/AVP or RTP/SAVP
(**) unless the opposite end is broken. Right now, for instance,
talking to Zoom Europe requires a heap of
"SDES-no-RANDOM_CRYPTO_ALGORITHM" arguments, for both incoming and
outgoing calls. Discovering that fix was decidedly nontrivial.
-- -- regards -- -- Matthias Urlichs