翻譯-pjsip開發者指南(十一)SDP協商框架

 Chapter 11:SDP Offer/Answer Framework
SDP offer/answer框架是基於 RFC 3264 “An Offer/Answer Model with the Session Descriptor Protocol (SDP)”。主要的作用是加速本地和遠端的媒體協商,並且在一方的邀請會話中協商一組媒體。
注意儘管這個通常用於邀請會話,這個框架本省是基於通用的SDP協商框架(pjmedia_sdp_neg),所以這個框架也可以用於其他類型的應用。對話邀請會話提供了SDP offer/answer和SIP協議的集成;它能正確地解釋了相關消息中的消息體(例如INVITE、ACK、PRACK、UPDATE),並將它們轉換爲SDP offer/answer協商。
本章描述了低級別的SDP協商框架,它在頭文件<pjmedia/sdp_neg.h>中聲明。
 11.1 SDP Negotiator Structure
pjmedia_sdp_neg結構體表示一般的SDP offer/answer會話,用於協商本地和遠端的SDP。

pjmedia_sdp_neg結構體存有三個SDP結構體:
   initial_sdp:初始化本地endpoint的能力。這個SDP是在創建的時候傳遞給協商者的,在整個會話期間內容都不會改變(即使是在協商後)。當收到遠端新的請求(而不是從遠端收到更新的SDP),協商者使用該SDP去協商。
 active_local_sdp:和遠端協商後包含本地的SDP。對話必須使用這個SDP來啓動本地媒體而不是初始的SDP。
 active_remote_sdp:包含遠端的當前SDP。
協商者有另外兩個SDP變量,僅用於協商處理期間,叫做neg_local_sdp和neg_remote_sdp。這些都是臨時的SDP描述,應用不能引用這些變量。
 11.2 SDP Negotiator Session
下面的圖表展示了一版的SDP offer/answer會話的狀態流轉。


協商會話從PJMEDIA_SDP_NEG_STATE_NULL開始。如果對話本地的媒體描述已經準備好了,並且希望傳送到遠端(通常對話是作爲UAC的情形下),通過傳遞本地SDP到函數 pjmedia_sdp_neg_create_w_local_offer()來創建SDP協商者。該函數將會設置本地endpoint的初始能力,並且設置協商會話的狀態到 PJMEDIA_SDP_NEG_STATE_LOCAL_OFFER。之後初始的DAP就可以在傳出的INVITE請求中發到遠端。一旦對話收到遠端的SDP,就必須調用 pjmedia_sdp_neg_rx_remote_answer()函數來提供遠端SDP。之後協商的函數可以被調用。
如果對話已經有遠端媒體描述了(通常對話是UAS的情形),它可以通過傳遞遠端和本地SDP到 pjmedia_sdp_neg_create_w_remote_offer()來創建SDP協商者會話。這之後,協商函數可以被調用。
會話建立之後,本地和遠端都必須更改會話。協商者可以處理以下兩種情形:
       #對話收到遠端的SDP。這種情形下,對話必須調用 pjmedia_sdp_neg_rx_remote_offer(),並傳送遠端的SDP到這個函數。協商函數的返回值取決於本地媒體是否需要變更。
      #本地想傳送SDP到遠端。對話選擇下列的行爲:
             #如果只是想傳送無變更的當前活躍的SDP,可以調用 pjmedia_sdp_neg_tx_local_offer()來獲取本地活躍的SDP,發送SDP,然後等待遠端的應答。
            #想要修改當前活躍的本地媒體(比如修改流向,活躍的編碼等),必須使用函數 pjmedia_sdp_neg_get_local()來獲取當前活躍媒體,更新,調用函數 pjmedia_sdp_neg_modify_local_offer()來更新請求,發送本地SDP然後等待遠端的響應。
     #對話可能會想完全的修改本地媒體(比如修改ip地址,修改編碼集,增加新的媒體列表)。這個和上面描述的更改當前媒體不同,因爲將會改變 initial_sdp,所以之後的協商會基於這個新的SDP。如果對話想要這麼做,用新的本地SDP調用函數 pjmedia_sdp_neg_reinit_local_offer(,發送SDP,並等待遠端應答。
對話向遠端發送offer後,必須從遠端收到響應。對話必須向協商者提供遠端SDP,這樣纔可以調用協商函數。對話提供遠端的應答通過調用pjsip_sdp_neg_rx_remote_answer()。
如果遠端拒絕了本地的offer(488 不支持),對話必須調用 pjsip_sdp_neg_rx_remote_answer()來提供空的遠端SDP參數,調用協商函數,協商者會話才能夠恢復到之前活躍的會話描述,如果有的話。
 11.3 SDP Negotiation Function
對話調用函數 pjmedia_sdp_neg_negotiate()來協商offer和應答,在提供了協商需要的本地和遠端SDP後(也就是說協商者狀態爲 PJMEDIA_SDP_NEG_STATE_WAIT_NEGO)。這個函數可以返回以下的結果:
      #PJ_SUCCESS( zero),如果成功建立一個本地和遠端SDP的協商。這種情形下,本地和遠端的活躍SDP將會保存在會話中作 爲之後的引用,應用可以查詢這些活躍的SDP來啓動本地媒體。
     #PJMEDIA_ESDPNOCHANGE,如果本地和遠端無法達成一致,這種情形下,會話將保持之前的協商過的SDP,這些SDP將不會被修改。如果對話在會話中作爲UAS,就必須針對這個請求迴應488響應。
     #PJMEDIA_ESDPNOOFFER,如果協商者沒有發送或收到任何offer
     #PJMEDIA_ESDPNOANSWER,如果協商者沒有收到遠端的應答或者有其他指示錯誤的值。
這些情況下,協商函數可以設置協商狀態爲 PJMEDIA_SDP_NEG_STATE_DONE.
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章