Freeswitch codec negotiation

From 탱이의 잡동사니
Jump to: navigation, search

Overview

Freeswitch 에서 사용되는 Codec negotiation 내용 정리

Negotiation

freeswitch 에서는 두가지 codec negotiation 방식을 지원한다. 바로 early negotiation 과 late negotiation 이다. 이는 sofia.xml 파일의 파라미터 값으로 설정된다.

early negotiation

Freeswitch 로 콜이 넘어올 때, SIP profile 에 설정된 inbound-codec-prefs 옵션을 확인하여 codec 을 설정하는 방식이다. 만약, 설정된 codec 중에서 사용가능한 codec 이 없다면, 콜은 실패한다. 마찬가지의 이유로, codec 선정시의 우선순위는 inbound-codec-prefs 에 설정된 순서대로 우선순위가 부여된다. 또한 Freeswitch 가 해당 profile(context) 에서 콜을 발신하는 경우에도 여기에 설정된 codec 목록과 우선순위를 사용하게 된다. 만약 B 로 발신을 했는데, B 의 사용가능한 codec 목록에 freeswitch 에서 사용가능한 codec 내용이 없다면, 당연하겠지만, 콜은 실패하게 된다.

즉, 다음과 같이 B로 코덱 협상을 제시할 때, 우선순위가 바뀌게 된다.

A -------- GSM/PCMA/G729 --------> FS (allowing G729/PCMA/PCMU) -------- PCMA/G729/PCMU --------> B

- FS는 G729, PCMA, PCMU 의 코덱을 지원한다고 가정한다.
- A 는 FS로 (GSM/PCMA/G729)의 우선순위 순서로 코덱 협상을 제시한다.
- 하지만 FS가 B로 코덱 협상을 제시할 때는, inbound-codec-prefs 옵션에 설정된 순서(PCMA/G729/PCMU)대로 우선순위를 설정하여 제시한다.

late negotiation

Freeswitch 에서 제공하는 모드이다. 원칙적으로는 SIP 프로토콜의 SDP 교환 방식을 벗어나지는 않지만, freeswitch 내부적으로 SDP 교환이 이루어지는 시점에 차이가 있다.

late negotiation 모드 설정시, 다음의 이점이 있다.

- codec 의 협상전에 dialplan 을 적용할 수 있다.
- 협상 내용은 A 쪽에서 Answer 할 때, 변경될 수 있다.
- 이 기능은 dialplan 에서 호출되는 스크립트에서 SDP 내용을 확인하고 사용 가능한 codec 내용을 지정할 수 있도록 해준다. 
- "codec_string" channel variable 에서 현재 진행중인 SDP codec 내용을 확인할 수 있다.

하지만, late negotiation 기능을 사용하게 되면, 상대적으로 SDP 협상이 늦어지게 되어, 예상치 못한 문제가 발생할 수도 있다. 예를 들어, 아직 SDP codec 협상이 끝나지도 않은 상황에서 dialplan 스크립트를 실행하게 되면 아무런 RTP 가 없는 상황에서 RTP 와 관련된 처리(DTMF, Silence 감지, Tone 감지)를 하게 되면 정상작동이 안될 가능성이 커진다. 따라서 사용에 주의가 필요하다.

late negotiation 을 사용하기 위해서는 다음의 옵션 설정이 필요하다.

<param name="inbound-late-negotiation" value="true"/>

See also