Asterisk RTPエンジン


Asteriskカーネル(以下、カーネルと略称する)は、一連のRTP関連API関数を提供する.異なるRTPスタックを使用する場合、これらのAPIは、RTP使用モジュールに統一的なアクセス方法を提供する.これらのAPIがカプセル化された後、RTPを使用するモジュールは、レイヤスタックの違いを実感しない.モジュールを使用する場合、各RTPスタックの動作は同じです.
        カーネルは、1つのRTPセッションをRTPインスタンスと呼び、1つのインスタンスは、符号化(codec)情報、RTPエンジン、RTP属性情報、アドレス情報のいくつかの部分から構成される.使用するRTPスタックは、エンジン名で明示的に指定できますが、指定されていない場合はデフォルトのスタックが使用されます.呼び出し元は、RTPで使用されるアドレスを提供できますが、最下位のRTPエンジンは、自身の構成に基づいて適切なアドレスを選択する場合があります.
        RTPエンジン(通常はresource分類に属するモジュール)は、カーネルとRTPスタックの間の層である.カーネルは、オーディオ出力などの異なるトランザクションを完了するために一連のコールバックインタフェースを提供し、RTPエンジンは、これらのインタフェース、すなわちRTPスタックをカプセル化する必要がある.
Glueは、RTPインスタンスとチャネル間でバインドされたコンテンツである.リモートブリッジまたはローカルブリッジを実行する場合、またはチャネルドライバがリモートにRTPストリームの宛先を変更するように通知する必要がある場合、RTPインスタンスを取得するために使用されます.
        RTPインスタンスの統計データ、ast_を呼び出すことができますrtp_instance_get_statsというAPIで検索します.これは、要求された統計値を運ぶために、使用中のRTPエンジンにデータ構造を埋め込む必要がある.RTPエンジンがすべての統計項目をサポートする必要はありません.
        呼び出し元は、RTPエンジンとコアの動作を変更することができ、RTPプロパティを設定する必要があります.例えば、ASTという名前があります.RTP_PROPERTY_NATのプロパティは、対称RTPがサポートされている場合に有効にするRTPエンジンに伝えます.カーネルは、RTPエンジンがすべてのプロパティをサポートする必要はありません.
         コーデック情報は、追加、削除、または情報取得のための独自のAPIを有する独立したデータ構造に格納される.これらのモジュールを使用して、RTPインスタンスの作成後にこれらのAPIを呼び出すと、荷重情報がRTPエンジンに表示されます.
 
データ構造
ast_rtp_Instanceは、RTPSessionのデータ構造を記述する.
00048 /*! Structure that represents an RTP session (instance) */
00049 struct ast_rtp_instance {
00050    /*! Engine that is handling this RTP instance */
00051    struct ast_rtp_engine *engine;
00052    /*! Data unique to the RTP engine */
00053    void *data;
00054    /*! RTP properties that have been set and their value */
00055    int properties[AST_RTP_PROPERTY_MAX];
00056    /*! Address that we are expecting RTP to come in to */
00057    struct ast_sockaddr local_address;
           ........
 };

 
 
ast_rtp_mime_type,rtp_Engine.cでは、MIMEメディアタイプを記述する配列を直接定義します.
00086 /*! The following array defines the MIME Media type (and subtype) for each
00087    of our codecs, or RTP-specific data type. */
00088 static struct ast_rtp_mime_type {
00089    struct ast_rtp_payload_type payload_type;
00090    char *type;
00091    char *subtype;
00092    unsigned int sample_rate;
00093 } ast_rtp_mime_types[]; 

 
 
        ast_rtp_Engineは、カーネルがRTPスタックと対話する一連のインタフェース定義を提供する特定のRTPスタックのデータ構造を記述する.具体的なRTPエンジン実装は,いずれも中身をインスタンス化する.
00313 /*! Structure that represents an RTP stack (engine) */
00314 struct ast_rtp_engine {
00315    /*! Name of the RTP engine, used when explicitly requested */
00316    const char *name;
00317    /*! Module this RTP engine came from, used for reference counting */
00318    struct ast_module *mod;
00319    /*! Callback for setting up a new RTP instance */
00320    int (*new)(struct ast_rtp_instance *instance, struct ast_sched_context *sched, struct ast_sockaddr *sa, void *data);
00321    /*! Callback for destroying an RTP instance */
00322    int (*destroy)(struct ast_rtp_instance *instance);
00323    /*! Callback for writing out a frame */
00324    int (*write)(struct ast_rtp_instance *instance, struct ast_frame *frame);
00325    /*! Callback for stopping the RTP instance */
00326    void (*stop)(struct ast_rtp_instance *instance);
          .......
};

 
 
        ast_rtp_glueは、RTPインスタンスと特定のチャネル間でバインドされたデータ内容、カーネルとRTP使用モジュール間のインタフェース定義を記述し、RTPの周辺モジュールに使用するには、関連するインタフェースを独自に実現する必要がある.
00396 /*! Structure that represents the glue that binds an RTP instance to a channel */
00397 struct ast_rtp_glue {
00398    /*! Name of the channel driver that this glue is responsible for */
00399    const char *type;
00400    /*! Module that the RTP glue came from */
00401    struct ast_module *mod;
00402    /*!
00403     * \brief Callback for retrieving the RTP instance carrying audio
00404     * 
ote This function increases the reference count on the returned RTP instance.
00405     */
00406    enum ast_rtp_glue_result (*get_rtp_info)(struct ast_channel *chan, struct ast_rtp_instance **instance);
00407    /*!
00408     * \brief Callback for retrieving the RTP instance carrying video
00409     * 
ote This function increases the reference count on the returned RTP instance.
00410     */
00411    enum ast_rtp_glue_result (*get_vrtp_info)(struct ast_channel *chan, struct ast_rtp_instance **instance);
00412    /*!
00413     * \brief Callback for retrieving the RTP instance carrying text
00414     * 
ote This function increases the reference count on the returned RTP instance.
00415     */
00416    enum ast_rtp_glue_result (*get_trtp_info)(struct ast_channel *chan, struct ast_rtp_instance **instance);
00417    /*! Callback for updating the destination that the remote side should send RTP to */
00418    int (*update_peer)(struct ast_channel *chan, struct ast_rtp_instance *instance, struct ast_rtp_instance *vinstance, struct ast_rtp_instance *tinstance, const struct ast_format_cap *cap, int nat_active);
00419    /*! Callback for retrieving codecs that the channel can do.  Result returned in result_cap*/
00420    void (*get_codec)(struct ast_channel *chan, struct ast_format_cap *result_cap);
00421    /*! Linked list information */
00422    AST_RWLIST_ENTRY(ast_rtp_glue) entry;
00423 };

 
 
        カーネルは、RTPengineとRTP glueを管理する2つのチェーンテーブルを定義します.
00080 /*! List of RTP engines that are currently registered */
00081 static AST_RWLIST_HEAD_STATIC(engines, ast_rtp_engine);
00082 
00083 /*! List of RTP glues */
00084 static AST_RWLIST_HEAD_STATIC(glues, ast_rtp_glue);

 
        カーネルは抽象的な管理と呼び出しインタフェースを提供し、具体的なRTPアプリケーションモジュールは、カーネルAPIと対話し、カーネルはast_を通過する.rtp_Engineで定義されたインタフェースはFTPスタックとインタラクティブであり,新しいRTPスタックを導入するにはスタックとカーネル間のエンジンモジュールを実現し,これらのインタフェースのパッケージを実現する.1.8バージョンでは、asteriskは2つのエンジンモジュールを実装します:res_rtp_asteriskとres_rtp_Multicastモジュール.