sdp.h
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:8k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is MPEG4IP.
  13.  * 
  14.  * The Initial Developer of the Original Code is Cisco Systems Inc.
  15.  * Portions created by Cisco Systems Inc. are
  16.  * Copyright (C) Cisco Systems Inc. 2000, 2001.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  *              Bill May        wmay@cisco.com
  20.  */
  21. /*
  22.  * sdp.h - Session Description Protocol (RFC 2327) decoder/encoder
  23.  */
  24. #ifndef __SDP_H__
  25. #define __SDP_H__
  26. #include "systems.h"
  27. #include "sdp_error.h"
  28. #ifndef TRUE
  29. #define TRUE 1
  30. #define FALSE 0
  31. #endif
  32. #define NTP_TO_UNIX_TIME 2208988800UL
  33. #ifdef __cplusplus
  34. extern "C" {
  35. #endif
  36. typedef struct string_list_t {
  37.   struct string_list_t *next;
  38.   char *string_val;
  39. } string_list_t;
  40. typedef enum {
  41.   BANDWIDTH_MODIFIER_NONE = 0,
  42.   BANDWIDTH_MODIFIER_CT,
  43.   BANDWIDTH_MODIFIER_AS,
  44.   BANDWIDTH_MODIFIER_USER,
  45. } bandwidth_modifier_t;
  46. /*
  47.  * These next 2 set of defines are used in session_desc_t field conf_type
  48.  * and media_desc_t field orient_type.  They need to be in this order
  49.  * (0 for no value, user value at end), so the processing routine in
  50.  * sdp_decode.c can use an array lookup.  See type_values, orient_values
  51.  * static variables and the check_value_list_or_user() routine.
  52.  * If you want to add a value, add before the user value, in the #define
  53.  * and in the static variable.
  54.  */
  55. #define CONFERENCE_TYPE_NONE      0
  56. #define CONFERENCE_TYPE_BROADCAST 1
  57. #define CONFERENCE_TYPE_MEETING   2
  58. #define CONFERENCE_TYPE_MODERATED 3
  59. #define CONFERENCE_TYPE_TEST      4
  60. #define CONFERENCE_TYPE_H332      5
  61. #define CONFERENCE_TYPE_OTHER     6
  62. #define ORIENT_TYPE_NONE 0
  63. #define ORIENT_TYPE_PORTRAIT 1
  64. #define ORIENT_TYPE_LANDSCAPE 2
  65. #define ORIENT_TYPE_SEASCAPE 3
  66. #define ORIENT_TYPE_USER 4
  67. typedef struct bandwidth_t {
  68.   struct bandwidth_t *next;
  69.   bandwidth_modifier_t modifier;
  70.   unsigned long bandwidth;
  71.   char *user_band;
  72. } bandwidth_t;
  73. typedef struct category_list_t {
  74.   struct category_list_t *next;
  75.   uint64_t category;
  76. } category_list_t;
  77. typedef struct connect_desc_t {
  78.   char *conn_type;
  79.   char *conn_addr;
  80.   uint32_t ttl;
  81.   uint32_t num_addr;
  82.   int used;
  83. } connect_desc_t;
  84. typedef enum key_types_t {
  85.   KEY_TYPE_NONE = 0,
  86.   KEY_TYPE_PROMPT,
  87.   KEY_TYPE_CLEAR,
  88.   KEY_TYPE_BASE64,
  89.   KEY_TYPE_URI,
  90. } key_types_t;
  91. typedef struct key_desc_t {
  92.   key_types_t key_type;
  93.   char *key;
  94. } key_desc_t;
  95. typedef struct rtpmap_desc_t {
  96.   char *encode_name;
  97.   uint32_t clock_rate;
  98.   uint32_t encode_param;
  99. } rtpmap_desc_t;
  100. typedef struct format_list_t {
  101.   struct format_list_t *next;
  102.   struct media_desc_t *media;
  103.   char *fmt;
  104.   rtpmap_desc_t *rtpmap;
  105.   char *fmt_param;
  106. } format_list_t;
  107. /*
  108.  * Range information - either session or media ranges.
  109.  * have_range is set if rest is valid.
  110.  *
  111.  * if range_is_npt is set, range_start and range_end will have number
  112.  * of seconds.
  113.  *
  114.  * if range_is_npt is false, range_start and range_end will have number
  115.  * of frames, based on range_smpte_fps frames per second (range_smpte_fps
  116.  * is 0 for drop-30 format).
  117.  *
  118.  * if range_end_infinite is set, range_end is invalid
  119.  */
  120. typedef struct range_desc_t {
  121.   /* range information a=range: */
  122.   int have_range;
  123.   int range_is_npt;
  124.   double range_start;
  125.   double range_end;
  126.   uint16_t range_smpte_fps;
  127.   int range_end_infinite;
  128. } range_desc_t;
  129. /*
  130.  * basic structure for definition of a media.
  131.  */
  132. typedef struct media_desc_t {
  133.   struct media_desc_t *next;
  134.   struct session_desc_t *parent;
  135.   char *media;  // media name
  136.   char *proto;  // protocol used
  137.   char *sdplang;
  138.   char *lang;
  139.   char *media_desc;      // description string
  140.   char *control_string;  // rtsp control string
  141.   format_list_t *fmt;    // All possible formats for this media
  142.   string_list_t *unparsed_a_lines;  // Any unparsed lines
  143.   int recvonly, sendrecv, sendonly;
  144.   uint16_t port;       // ip port
  145.   uint16_t num_ports;   // number of ports
  146.   uint32_t ptime;       
  147.   int ptime_present;
  148.   uint32_t quality;
  149.   int quality_present;
  150.   double framerate;
  151.   int framerate_present;
  152.   connect_desc_t  media_connect;
  153.   range_desc_t    media_range;
  154.   bandwidth_t  *media_bandwidth;
  155.   int orient_type;
  156.   char *orient_user_type;
  157.   key_desc_t key;
  158.   void *USER;
  159. } media_desc_t;
  160. typedef struct time_adj_desc_t {
  161.   struct time_adj_desc_t *next;
  162.   time_t adj_time;
  163.   int32_t offset;
  164. } time_adj_desc_t;
  165. #define MAX_REPEAT_OFFSETS 16
  166. typedef struct time_repeat_desc_t {
  167.   struct time_repeat_desc_t *next;
  168.   uint32_t repeat_interval;
  169.   uint32_t active_duration;
  170.   uint32_t   offset_cnt;
  171.   uint32_t offsets[MAX_REPEAT_OFFSETS];
  172. } time_repeat_desc_t;
  173. typedef struct session_time_desc_t {
  174.   struct session_time_desc_t *next;
  175.   time_t start_time;
  176.   time_t end_time;
  177.   time_repeat_desc_t *repeat;
  178. } session_time_desc_t;
  179. /*
  180.  * session_desc_t describe a session.  It can have 1 or more media
  181.  */
  182. typedef struct session_desc_t {
  183.   struct session_desc_t *next;
  184.   /* o= fields */
  185.   char *orig_username;
  186.   uint64_t   session_id;
  187.   uint64_t   session_version;
  188.   char *create_addr_type;
  189.   char *create_addr;
  190.   category_list_t *category_list;
  191.   /* s= field */
  192.   char *session_name;
  193.   /* i= field */
  194.   char *session_desc;
  195.   /* u = field */
  196.   char *uri;
  197.   /* Administrator Information */
  198.   string_list_t *admin_phone;
  199.   string_list_t *admin_email;
  200.   /* connect info */
  201.   connect_desc_t session_connect;
  202.   range_desc_t   session_range;
  203.   bandwidth_t *session_bandwidth;
  204.   /* key type */
  205.   key_desc_t key;
  206.   char *keywds;
  207.   char *tool;
  208.   char *charset;
  209.   char *sdplang;
  210.   char *lang;
  211.   char *control_string;
  212.   char *etag;
  213.   /* start/end times, in an array form */
  214.   session_time_desc_t *time_desc;
  215.   time_adj_desc_t *time_adj_desc;
  216.   /* media descriptions */
  217.   media_desc_t *media;
  218.   /* unparsed lines */
  219.   string_list_t *unparsed_a_lines;
  220.   int conf_type;
  221.   char *conf_type_user;
  222.   int recvonly, sendrecv, sendonly;
  223.   /* For user use - nothing done internal */
  224.   void *USER;
  225. } session_desc_t;
  226. typedef struct sdp_decode_info_ sdp_decode_info_t;
  227. // for use in sdp_dump.c
  228. extern const char *type_values[];
  229. /*
  230.  * decode routines.  You want to first create a sdp_decode_info_t
  231.  * by calling either set_sdp_decode_from_memory or set_sdp_decode_from_filename
  232.  *
  233.  * Then call the sdp_decode routine to get the session_desc_t.  It will
  234.  * handle more than 1 session at a time.  That number will be stored in
  235.  * *translated.
  236.  */
  237. sdp_decode_info_t *set_sdp_decode_from_memory(const char *memptr);
  238. sdp_decode_info_t *set_sdp_decode_from_filename(const char *filename);
  239. void sdp_decode_info_free(sdp_decode_info_t *free);
  240. int sdp_decode(sdp_decode_info_t *decode,
  241.        session_desc_t **retval,
  242.        int *translated);
  243. void sdp_free_session_desc(session_desc_t *sptr);
  244. /*
  245.  * dump routines
  246.  */
  247. void session_dump_one(session_desc_t *sptr);
  248. void session_dump_list(session_desc_t *sptr);
  249. /*
  250.  * encode routines
  251.  */
  252. int sdp_encode_one_to_file(session_desc_t *sptr,
  253.    const char *filename,
  254.    int append);
  255. int sdp_encode_list_to_file(session_desc_t *sptr,
  256.     const char *filename,
  257.     int append);
  258. /*
  259.  * NOTE - sdp_encode_[one|list]_to_memory require freeing memory
  260.  */
  261. int sdp_encode_one_to_memory(session_desc_t *sptr, char **mem);
  262. int sdp_encode_list_to_memory (session_desc_t *sptr, char **mem, int *count);
  263. void sdp_set_loglevel(int loglevel);
  264. void sdp_set_error_func(error_msg_func_t func);
  265.   
  266.   
  267. /* utils */
  268. format_list_t *sdp_add_format_to_list(media_desc_t *mptr, char *val);
  269. void sdp_free_format_list (format_list_t **fptr);
  270. int sdp_add_string_to_list(string_list_t **list, char *val);
  271. void sdp_free_string_list (string_list_t **list);
  272. void sdp_time_offset_to_str(uint32_t val, char *buff, uint32_t buflen);
  273. format_list_t *sdp_find_format_in_line(format_list_t *head, char *lptr);
  274. void sdp_smpte_to_str(double value, uint16_t fps, char *buffer);
  275. #ifdef __cplusplus
  276. }
  277. #endif
  278. #endif /* ifdef __SDP_H__ */