プログラミングインタフェース

SDP セッション構造体の作成

新しい SDP セッション構造体を作成するには、最初に sdp_new_session() 関数を呼び出して新しい構造体用のメモリーを割り当てます。この関数は新しいセッション構造体へのポインタを返します。この節に示すほかの関数は、このポインタを使用して新しいセッション構造体を作成します。新しいセッション構造体を作成したら、sdp_session_to_str() 関数を使用してセッション構造体を文字列表現に変換します。

新しい SDP セッション構造体の作成

sdp_session_t *sdp_new_session();

sdp_new_session() 関数は、session パラメータで指定された新しい SDP セッション構造体用のメモリーを割り当て、新しい構造体にバージョン番号を割り当てます。セッション構造体に割り当てられたメモリーは、sdp_free_session() 関数を呼び出すことで解放できます。

戻り値: sdp_new_session() 関数は、関数が正常に完了したときに、新しく割り当てられた SDP セッション構造体を返します。エラー発生時には NULL を返します。

SDP セッション構造体への発信元フィールドの追加

int sdp_add_origin(sdp_session_t *session, const char *name, uint64_t id, uint64_t ver, const char *nettype, const char *addrtype, const char *address);

sdp_add_origin() 関数は、nameidvernettypeaddrtypeaddress の各パラメータを使用して、session パラメータの値で指定されたセッション構造体 (sdp_session_t) に Origin (o=) SDP フィールドを追加します。

戻り値: sdp_add_origin() 関数は、関数が正常に完了したときに 0 を返します。必須のパラメータがなかった場合は、EINVAL を返します。メモリーの割り当てに失敗した場合は、ENOMEM を返します。errno の値は、エラーが発生した場合でも変化しません。

SDP セッション構造体への名前フィールドの追加

int sdp_add_name(sdp_session_t *session, const char *name);

sdp_add_name() 関数は、name パラメータを使用して、session パラメータの値で指定されたセッション構造体 (sdp_session_t) に SessionName (s=) SDP フィールドを追加します。

戻り値: sdp_add_name() 関数は、関数が正常に完了したときに 0 を返します。必須のパラメータがなかった場合は、EINVAL を返します。メモリーの割り当てに失敗した場合は、ENOMEM を返します。errno の値は、エラーが発生した場合でも変化しません。

SDP セッション構造体への情報フィールドの追加

int sdp_add_information(char **information, const char *value);

sdp_add_information() 関数は、value パラメータを使用して、セッション構造体 (sdp_session_t) またはメディア構造体 (sdp_media_t) に Info (i=) SDP フィールドを追加します。このフィールドは、SDP 記述のメディアセクションまたはセッションセクションに格納されます。最初の引数として &session->s_info または &media->m_info を渡すことにより、セクションを指定する必要があります。

戻り値: sdp_add_information() 関数は、関数が正常に完了したときに 0 を返します。必須のパラメータがなかった場合は、EINVAL を返します。メモリーの割り当てに失敗した場合は、ENOMEM を返します。errno の値は、エラーが発生した場合でも変化しません。

SDP セッション構造体への URI フィールドの追加

int sdp_add_uri(sdp_session_t *session, const char *uri);

sdp_add_uri() 関数は、uri パラメータを使用して、session パラメータの値で指定されたセッション構造体 (sdp_session_t) に URI (u=) SDP フィールドを追加します。

戻り値: sdp_add_uri() 関数は、関数が正常に完了したときに 0 を返します。必須のパラメータがなかった場合は、EINVAL を返します。メモリーの割り当てに失敗した場合は、ENOMEM を返します。errno の値は、エラーが発生した場合でも変化しません。

SDP セッション構造体への電子メールフィールドの追加

int sdp_add_email(sdp_session_t *session, const char *email);

sdp_add_email() 関数は、email パラメータを使用して、session パラメータの値で指定されたセッション構造体 (sdp_session_t) に Email (e=) SDP フィールドを追加します。

戻り値: sdp_add_email() 関数は、関数が正常に完了したときに 0 を返します。必須のパラメータがなかった場合は、EINVAL を返します。メモリーの割り当てに失敗した場合は、ENOMEM を返します。errno の値は、エラーが発生した場合でも変化しません。

SDP セッション構造体への電話フィールドの追加

int sdp_add_phone(sdp_session_t *session, const char *email);

sdp_add_phone() 関数は、phone パラメータを使用して、session パラメータの値で指定されたセッション構造体 (sdp_session_t) に Phone (p=) SDP フィールドを追加します。

戻り値: sdp_add_phone() 関数は、関数が正常に完了したときに 0 を返します。必須のパラメータがなかった場合は、EINVAL を返します。メモリーの割り当てに失敗した場合は、ENOMEM を返します。errno の値は、エラーが発生した場合でも変化しません。

SDP セッション構造体への接続フィールドの追加

int sdp_add_connection(sdp_conn_t **conn, const char *nettype, const char *addrtype, const char *address, uint8_t ttl, int addrcount);

sdp_add_connection() 関数は、nettypeaddrtypeaddressttladdrcount の各パラメータを使用して、セッション構造体 (sdp_session_t) またはメディア構造体 (sdp_media_t) に Connection (c=) SDP フィールドを追加します。IPv4 または IPv6 のユニキャストアドレスの場合は、ttl パラメータと addrcount パラメータの値をゼロに設定します。マルチキャストアドレスの場合は、ttl パラメータの値を 0 - 255 の範囲に設定します。マルチキャストアドレスの場合は、addrcount パラメータの値をゼロに設定できません。

このフィールドは、SDP 記述のメディアセクションまたはセッションセクションに格納されます。最初の引数として &session->s_info または &media->m_info を渡すことにより、セクションを指定する必要があります。

戻り値: sdp_add_connection() 関数は、関数が正常に完了したときに 0 を返します。必須のパラメータがなかった場合は、EINVAL を返します。メモリーの割り当てに失敗した場合は、ENOMEM を返します。errno の値は、エラーが発生した場合でも変化しません。

SDP セッション構造体への帯域幅フィールドの追加

int sdp_add_bandwidth(sdp_bandwidth_t **bw, const char *type, uint64_t value);

sdp_add_bandwidth() 関数は、type パラメータと value パラメータを使用して、セッション構造体 (sdp_session_t) またはメディア構造体 (sdp_media_t) に Bandwidth (b=) SDP フィールドを追加します。

このフィールドは、SDP 記述のメディアセクションまたはセッションセクションに格納されます。最初の引数として &session->s_info または &media->m_info を渡すことにより、セクションを指定する必要があります。

戻り値: sdp_add_bandwidth() 関数は、関数が正常に完了したときに 0 を返します。必須のパラメータがなかった場合は、EINVAL を返します。メモリーの割り当てに失敗した場合は、ENOMEM を返します。errno の値は、エラーが発生した場合でも変化しません。

SDP セッション構造体への時間フィールドの追加

int sdp_add_time(sdp_session_t *session, uint64_t starttime, uint64_t stoptime, sdp_time_t **time);

sdp_add_time() 関数は、starttime パラメータと stoptime パラメータの値を使用して、セッション構造体に Time (t=) SDP フィールドを追加します。この関数は、新しい時間構造体を作成し、time パラメータにその構造体へのポインタを返します。

戻り値: sdp_add_time() 関数は、関数が正常に完了したときに 0 を返します。必須のパラメータがなかった場合は、EINVAL を返します。メモリーの割り当てに失敗した場合は、ENOMEM を返します。errno の値は、エラーが発生した場合でも変化しません。

SDP セッション構造体への繰り返しフィールドの追加

int sdp_add_repeat(sdp_time_t *time, uint64_t interval, uint64_t duration, const char *offset);

sdp_add_repeat() 関数は、intervaldurationoffset の各パラメータの値を使用して、セッション構造体に RepeatTime (r=) SDP フィールドを追加します。offset パラメータの値は、1 つ以上のオフセット値を保持する文字列 (6060 1d 3h など) です。time パラメータの値は、sdp_add_time() 関数が作成する時間構造体へのポインタです。

戻り値: sdp_add_repeat() 関数は、関数が正常に完了したときに 0 を返します。必須のパラメータがなかった場合は、EINVAL を返します。メモリーの割り当てに失敗した場合は、ENOMEM を返します。errno の値は、エラーが発生した場合でも変化しません。

SDP セッション構造体へのゾーンフィールドの追加

int sdp_add_zone(sdp_session_t *session, uint64_t time, const char *offset);

sdp_add_zone() 関数は、time パラメータと offset パラメータを使用して、session パラメータの値で指定されたセッション構造体 (sdp_session_t) に TimeZoneAdjustment (z=) SDP フィールドを追加します。1 つのゾーンフィールドに対して複数の時間およびオフセットの値を追加するには、時間/オフセットのペアごとにこの関数を呼び出します。

戻り値: sdp_add_zone() 関数は、関数が正常に完了したときに 0 を返します。必須のパラメータがなかった場合は、EINVAL を返します。メモリーの割り当てに失敗した場合は、ENOMEM を返します。errno の値は、エラーが発生した場合でも変化しません。

SDP セッション構造体へのキーフィールドの追加

int sdp_add_key(sdp_key_t **key, const char *method, const char *enckey);

sdp_add_key() 関数は、method パラメータと enckey パラメータを使用して、セッション構造体 (sdp_session_t) またはメディア構造体 (sdp_media_t) に Key (k=) SDP フィールドを追加します。このフィールドは、SDP 記述のメディアセクションまたはセッションセクションに格納されます。最初の引数として &session->s_info または &media->m_info を渡すことにより、セクションを指定する必要があります。

戻り値: sdp_add_key() 関数は、関数が正常に完了したときに 0 を返します。必須のパラメータがなかった場合は、EINVAL を返します。メモリーの割り当てに失敗した場合は、ENOMEM を返します。errno の値は、エラーが発生した場合でも変化しません。

SDP セッション構造体への属性フィールドの追加

int sdp_add_attribute(sdp_attr_t **attr, const char *name, const char *value);

sdp_add_attribute() 関数は、name パラメータと value パラメータを使用して、セッション構造体 (sdp_session_t) またはメディア構造体 (sdp_media_t) に Attribute (a=) SDP フィールドを追加します。このフィールドは、SDP 記述のメディアセクションまたはセッションセクションに格納されます。最初の引数として &session->s_info または &media->m_info を渡すことにより、セクションを指定する必要があります。

戻り値: sdp_add_attribute() 関数は、関数が正常に完了したときに 0 を返します。必須のパラメータがなかった場合は、EINVAL を返します。メモリーの割り当てに失敗した場合は、ENOMEM を返します。errno の値は、エラーが発生した場合でも変化しません。

SDP セッション構造体へのメディアフィールドの追加

int sdp_add_media(sdp_session_t *session, const char *name, uint_t port, int portcount, const char *protocol, const char *format, sdp_media_t **media);

sdp_add_media() 関数は、nameportportcountprotocolformat の各パラメータの値を使用して、session パラメータの値で指定されたセッション構造体 (sdp_session_t) に Media (m=) SDP フィールドを追加します。format パラメータは、1 つ以上の値を保持する文字列 (0 32 97 など) です。

この関数は、新しいメディア構造体を作成し、media パラメータにその構造体へのポインタを返します。メディア構造体に SDP フィールドを追加する関数は、このポインタを使用します。

戻り値: sdp_add_media() 関数は、関数が正常に完了したときに 0 を返します。必須のパラメータがなかった場合は、EINVAL を返します。メモリーの割り当てに失敗した場合は、ENOMEM を返します。errno の値は、エラーが発生した場合でも変化しません。

コード例: SDP セッション構造体の作成

この例では、この節に示した関数を使用して、新しい SDP セッション構造体を作成し、構造体にフィールドを追加し、完成した構造体を文字列表現に変換します。この例では、最後にプログラムから sdp_free_session() 関数を呼び出して、セッションを解放します。


例 3–1 SDP セッション構造体の作成

/* SDP Message we will be building
"v=0\r\n\
o=Alice 2890844526 2890842807 IN IP4 10.47.16.5\r\n\
s=-\r\n\
i=A Seminar on the session description protocol\r\n\
u=http://www.example.com/seminars/sdp.pdf\r\n\
e=alice@example.com (Alice Smith)\r\n\
p=+1 911-345-1160\r\n\
c=IN IP4 10.47.16.5\r\n\
b=CT:1024\r\n\
t=2854678930 2854679000\r\n\
r=604800 3600 0 90000\r\n\
z=2882844526 -1h 2898848070 0h\r\n\
a=recvonly\r\n\
m=audio 49170 RTP/AVP 0\r\n\
i=audio media\r\n\
b=CT:1000\r\n\
k=prompt\r\n\
m=video 51372 RTP/AVP 99 90\r\n\
i=video media\r\n\
a=rtpmap:99 h232-199/90000\r\n\
a=rtpmap:90 h263-1998/90000\r\n"
*/

#include stdio.h>
#include string.h>
#include errno.h>
#include sdp.h>

int main ()
{
   sdp_session_t  *my_sess;
   sdp_media_t    *my_media;
   sdp_time_t     *my_time;
   char *b_sdp;

   my_sess = sdp_new_session();
   if (my_sess == NULL) {
return (ENOMEM);
   }
   my_sess->version = 0;
   if (sdp_add_name(my_sess, "-") != 0)
goto err_ret;
   if (sdp_add_origin(my_sess, "Alice", 2890844526ULL, 2890842807ULL,
 "IN", "IP4", "10.47.16.5") != 0)
goto err_ret;
   if (sdp_add_information(&my_sess->s_info, "A Seminar on the session"
 "description protocol") != 0)
goto err_ret;
   if (sdp_add_uri (my_sess, "http://www.example.com/seminars/sdp.pdf")
 != 0)
goto err_ret;
   if (sdp_add_email(my_sess, "alice@example.com (Alice smith)") != 0)
goto err_ret;
   if (sdp_add_phone(my_sess, "+1 911-345-1160") != 0)
goto err_ret;
   if (sdp_add_connection(&my_sess->s_conn, "IN", "IP4", "10.47.16.5",
0, 0) != 0)
goto err_ret;
   if (sdp_add_bandwidth(&my_sess->s_bw, "CT", 1024) != 0)
goto err_ret;
   if (sdp_add_time(my_sess, 2854678930ULL, 2854679000ULL, &my_time)
!= 0)
goto err_ret;
   if (sdp_add_repeat(my_time, 604800ULL, 3600ULL, "0 90000") != 0)
goto err_ret;
   if (sdp_add_zone(my_sess, 2882844526ULL, "-1h") != 0)
goto err_ret;
   if (sdp_add_zone(my_sess, 2898848070ULL, "0h") != 0)
goto err_ret;
   if (sdp_add_attribute(&my_sess->s_attr, "sendrecv", NULL) != 0)
goto err_ret;
   if (sdp_add_media(my_sess, "audio", 49170, 1, "RTP/AVP",
"0", &my_media) != 0)
goto err_ret;
   if (sdp_add_information(&my_media->m_info, "audio media") != 0)
goto err_ret;
   if (sdp_add_bandwidth(&my_media->m_bw, "CT", 1000) != 0)
goto err_ret;
   if (sdp_add_key(&my_media->m_key, "prompt", NULL) != 0)
goto err_ret;
   if (sdp_add_media(my_sess, "video", 51732, 1, "RTP/AVP",
 "99 90", &my_media) != 0)
goto err_ret;
   if (sdp_add_information(&my_media->m_info, "video media") != 0)
goto err_ret;
   if (sdp_add_attribute(&my_media->m_attr, "rtpmap",
      "99 h232-199/90000") != 0)
goto err_ret;
   if (sdp_add_attribute(&my_media->m_attr, "rtpmap",
      "90 h263-1998/90000") != 0)
goto err_ret;
   b_sdp = sdp_session_to_str(my_sess, &error);

   /*
    * b_sdp is the string representation of my_sess structure
    */

   free(b_sdp);
   sdp_free_session(my_sess);
   return (0);
err_ret:
   free(b_sdp);
   sdp_free_session(my_sess);
   return (1);
}