From 59b938c8aa7d903e849748b737d45ccd949ef419 Mon Sep 17 00:00:00 2001 From: wm4 Date: Wed, 1 Aug 2012 17:30:31 +0200 Subject: stream: remove native RTSP/RTP/PNM support There are still various other RTSP implementations available, such as libnemesi, live555, and libav. The mplayer native version was a huge chunk of old unmaintained code. --- Makefile | 20 - cfg-mplayer.h | 10 +- configure | 4 - stream/freesdp/common.c | 227 ----- stream/freesdp/common.h | 352 -------- stream/freesdp/errorlist.c | 72 -- stream/freesdp/parser.c | 1890 ----------------------------------------- stream/freesdp/parser.h | 728 ---------------- stream/freesdp/parserpriv.h | 118 --- stream/freesdp/priv.h | 272 ------ stream/librtsp/rtsp.c | 729 ---------------- stream/librtsp/rtsp.h | 135 --- stream/librtsp/rtsp_rtp.c | 700 --------------- stream/librtsp/rtsp_rtp.h | 42 - stream/librtsp/rtsp_session.c | 318 ------- stream/librtsp/rtsp_session.h | 45 - stream/pnm.c | 874 ------------------- stream/pnm.h | 37 - stream/realrtsp/asmrp.c | 690 --------------- stream/realrtsp/asmrp.h | 47 - stream/realrtsp/real.c | 653 -------------- stream/realrtsp/real.h | 60 -- stream/realrtsp/rmff.c | 876 ------------------- stream/realrtsp/rmff.h | 275 ------ stream/realrtsp/sdpplin.c | 388 --------- stream/realrtsp/sdpplin.h | 108 --- stream/realrtsp/xbuffer.c | 117 --- stream/realrtsp/xbuffer.h | 40 - stream/rtp.c | 255 ------ stream/rtp.h | 24 - stream/stream.c | 6 +- stream/stream_rtp.c | 118 --- stream/stream_rtsp.c | 182 ---- 33 files changed, 7 insertions(+), 10405 deletions(-) delete mode 100644 stream/freesdp/common.c delete mode 100644 stream/freesdp/common.h delete mode 100644 stream/freesdp/errorlist.c delete mode 100644 stream/freesdp/parser.c delete mode 100644 stream/freesdp/parser.h delete mode 100644 stream/freesdp/parserpriv.h delete mode 100644 stream/freesdp/priv.h delete mode 100644 stream/librtsp/rtsp.c delete mode 100644 stream/librtsp/rtsp.h delete mode 100644 stream/librtsp/rtsp_rtp.c delete mode 100644 stream/librtsp/rtsp_rtp.h delete mode 100644 stream/librtsp/rtsp_session.c delete mode 100644 stream/librtsp/rtsp_session.h delete mode 100644 stream/pnm.c delete mode 100644 stream/pnm.h delete mode 100644 stream/realrtsp/asmrp.c delete mode 100644 stream/realrtsp/asmrp.h delete mode 100644 stream/realrtsp/real.c delete mode 100644 stream/realrtsp/real.h delete mode 100644 stream/realrtsp/rmff.c delete mode 100644 stream/realrtsp/rmff.h delete mode 100644 stream/realrtsp/sdpplin.c delete mode 100644 stream/realrtsp/sdpplin.h delete mode 100644 stream/realrtsp/xbuffer.c delete mode 100644 stream/realrtsp/xbuffer.h delete mode 100644 stream/rtp.c delete mode 100644 stream/rtp.h delete mode 100644 stream/stream_rtp.c delete mode 100644 stream/stream_rtsp.c diff --git a/Makefile b/Makefile index af3fd72135..948bc98155 100644 --- a/Makefile +++ b/Makefile @@ -101,14 +101,6 @@ SRCS_COMMON-$(COCOA) += libvo/osx_common.c \ SRCS_COMMON-$(MNG) += libmpdemux/demux_mng.c SRCS_COMMON-$(MPG123) += libmpcodecs/ad_mpg123.c -SRCS_COMMON-$(NATIVE_RTSP) += stream/stream_rtsp.c \ - stream/freesdp/common.c \ - stream/freesdp/errorlist.c \ - stream/freesdp/parser.c \ - stream/librtsp/rtsp.c \ - stream/librtsp/rtsp_rtp.c \ - stream/librtsp/rtsp_session.c \ - SRCS_COMMON-$(NEED_GETTIMEOFDAY) += osdep/gettimeofday.c SRCS_COMMON-$(NEED_GLOB) += osdep/glob-win.c SRCS_COMMON-$(NEED_SETENV) += osdep/setenv.c @@ -122,18 +114,9 @@ SRCS_COMMON-$(NETWORKING) += stream/stream_netstream.c \ stream/cookies.c \ stream/http.c \ stream/network.c \ - stream/pnm.c \ - stream/rtp.c \ stream/udp.c \ stream/tcp.c \ - stream/stream_rtp.c \ stream/stream_udp.c \ - stream/librtsp/rtsp.c \ - stream/realrtsp/asmrp.c \ - stream/realrtsp/real.c \ - stream/realrtsp/rmff.c \ - stream/realrtsp/sdpplin.c \ - stream/realrtsp/xbuffer.c \ SRCS_COMMON-$(PNG) += libmpcodecs/vd_mpng.c SRCS_COMMON-$(PRIORITY) += osdep/priority.c @@ -490,9 +473,6 @@ DIRS = . \ loader/wine \ osdep \ stream \ - stream/freesdp \ - stream/librtsp \ - stream/realrtsp \ sub \ timeline \ diff --git a/cfg-mplayer.h b/cfg-mplayer.h index 6deea83634..ac5ac0c75a 100644 --- a/cfg-mplayer.h +++ b/cfg-mplayer.h @@ -184,11 +184,11 @@ const m_option_t pvropts_conf[]={ extern const m_option_t dvbin_opts_conf[]; extern const m_option_t lavfdopts_conf[]; -extern int rtsp_transport_tcp; -extern int rtsp_transport_http; -extern int rtsp_transport_sctp; -extern int rtsp_port; -extern char *rtsp_destination; +int rtsp_transport_tcp; +int rtsp_transport_http; +int rtsp_transport_sctp; +int rtsp_port; +char *rtsp_destination; extern int sws_chr_vshift; diff --git a/configure b/configure index 2fdab8cb63..5adcd71aab 100755 --- a/configure +++ b/configure @@ -500,7 +500,6 @@ _real=auto _live=no _nemesi=auto _lcms2=auto -_native_rtsp=yes _xinerama=auto _vm=auto _xf86keysym=auto @@ -3517,11 +3516,9 @@ if test "$_nemesi" = auto && test "$networking" = yes ; then fi fi if test "$_nemesi" = yes; then - _native_rtsp=no def_nemesi='#define CONFIG_LIBNEMESI 1' inputmodules="nemesi $inputmodules" else - _native_rtsp="$networking" _nemesi=no def_nemesi='#undef CONFIG_LIBNEMESI' noinputmodules="nemesi $noinputmodules" @@ -4168,7 +4165,6 @@ MACOSX_FINDER = $_macosx_finder MD5SUM = $_md5sum MNG = $_mng MPG123 = $_mpg123 -NATIVE_RTSP = $_native_rtsp NETWORKING = $networking OPENAL = $_openal OSS = $_ossaudio diff --git a/stream/freesdp/common.c b/stream/freesdp/common.c deleted file mode 100644 index 9382674c5f..0000000000 --- a/stream/freesdp/common.c +++ /dev/null @@ -1,227 +0,0 @@ -/* - This file is part of FreeSDP - Copyright (C) 2001,2002,2003 Federico Montesino Pouzols - - FreeSDP is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -/** - * @file common.c - * - * @short Implementation of routines common to parse and formatting - * modules . - * - * This file implements the routines that operate over data structures - * that are used in both the parse and formatting modules. - **/ - -#include "priv.h" -#include "common.h" - -static void -safe_free (void *ptr) -{ - if (ptr) - free (ptr); -} - -fsdp_description_t * -fsdp_description_new (void) -{ - fsdp_description_t *result = malloc (sizeof (fsdp_description_t)); - - result->version = 0; - result->o_username = result->o_session_id = - result->o_announcement_version = NULL; - result->o_network_type = FSDP_NETWORK_TYPE_UNDEFINED; - result->o_address_type = FSDP_ADDRESS_TYPE_UNDEFINED; - result->o_address = NULL; - result->s_name = NULL; - result->i_information = NULL; - result->u_uri = NULL; - result->emails = NULL; - result->emails_count = 0; - result->phones = NULL; - result->phones_count = 0; - /* At first, there is no session-level definition for these - parameters */ - result->c_network_type = FSDP_NETWORK_TYPE_UNDEFINED; - result->c_address_type = FSDP_ADDRESS_TYPE_UNDEFINED; - result->c_address.address = NULL; - /* there is no session-level definition for these parameters */ - result->bw_modifiers = NULL; - result->bw_modifiers_count = 0; - result->time_periods = NULL; - result->time_periods_count = 0; - result->timezone_adj = NULL; - result->k_encryption_method = FSDP_ENCRYPTION_METHOD_UNDEFINED; - result->k_encryption_content = NULL; - /* Default/undefined values for attributes */ - result->a_category = result->a_keywords = result->a_tool = NULL; - result->a_type = FSDP_SESSION_TYPE_UNDEFINED; - result->a_sendrecv_mode = FSDP_SENDRECV_UNDEFINED; - result->a_charset = NULL; - result->a_sdplangs = result->a_langs = NULL; - result->a_controls = NULL; - result->a_range = NULL; - result->a_rtpmaps = NULL; - result->a_rtpmaps_count = 0; - result->a_sdplangs_count = 0; - result->a_langs_count = 0; - result->a_controls_count = 0; - result->unidentified_attributes = NULL; - result->unidentified_attributes_count = 0; - result->media_announcements = NULL; - result->media_announcements_count = 0; - - return result; -} - -void -fsdp_description_delete (fsdp_description_t * dsc) -{ - fsdp_description_recycle (dsc); - safe_free (dsc); -} - -void -fsdp_description_recycle (fsdp_description_t * dsc) -{ - /* Recursively free all strings and arrays */ - unsigned int i, j; - - if (!dsc) - return; - - safe_free (dsc->o_username); - safe_free (dsc->o_session_id); - safe_free (dsc->o_announcement_version); - safe_free (dsc->o_address); - safe_free (dsc->s_name); - safe_free (dsc->i_information); - safe_free (dsc->u_uri); - - for (i = 0; i < dsc->emails_count; i++) - safe_free ((char *) dsc->emails[i]); - safe_free (dsc->emails); - - for (i = 0; i < dsc->phones_count; i++) - safe_free ((char *) dsc->phones[i]); - safe_free (dsc->phones); - - safe_free (dsc->c_address.address); - - for (i = 0; i < dsc->bw_modifiers_count; i++) - safe_free (dsc->bw_modifiers[i].b_unknown_bw_modt); - safe_free (dsc->bw_modifiers); - - for (i = 0; i < dsc->time_periods_count; i++) - { - for (j = 0; j < dsc->time_periods[i]->repeats_count; j++) - { - safe_free (dsc->time_periods[i]->repeats[j]->offsets); - safe_free (dsc->time_periods[i]->repeats[j]); - } - safe_free (dsc->time_periods[i]->repeats); - safe_free (dsc->time_periods[i]); - } - safe_free (dsc->time_periods); - - safe_free (dsc->timezone_adj); - safe_free (dsc->a_category); - safe_free (dsc->a_keywords); - safe_free (dsc->a_tool); - - for (i = 0; i < dsc->a_rtpmaps_count; i++) - safe_free (dsc->a_rtpmaps[i]); - safe_free (dsc->a_rtpmaps); - - safe_free (dsc->a_charset); - - for (i = 0; i < dsc->a_sdplangs_count; i++) - safe_free (dsc->a_sdplangs[i]); - safe_free (dsc->a_sdplangs); - - for (i = 0; i < dsc->a_langs_count; i++) - safe_free (dsc->a_langs[i]); - safe_free (dsc->a_langs); - - for (i = 0; i < dsc->a_controls_count; i++) - safe_free (dsc->a_controls[i]); - safe_free (dsc->a_controls); - - safe_free (dsc->a_range); - - for (i = 0; i < dsc->media_announcements_count; i++) - { - if (!dsc->media_announcements[i]) continue; - for (j = 0; j < dsc->media_announcements[i]->formats_count; j++) - safe_free (dsc->media_announcements[i]->formats[j]); - safe_free (dsc->media_announcements[i]->formats); - safe_free (dsc->media_announcements[i]->i_title); - - for (j = 0; j < dsc->media_announcements[i]->bw_modifiers_count; j++) - { - if (FSDP_BW_MOD_TYPE_UNKNOWN == - dsc->media_announcements[i]->bw_modifiers[j].b_mod_type) - safe_free (dsc->media_announcements[i]->bw_modifiers[j]. - b_unknown_bw_modt); - } - safe_free (dsc->media_announcements[i]->bw_modifiers); - - safe_free (dsc->media_announcements[i]->k_encryption_content); - - for (j = 0; j < dsc->media_announcements[i]->a_rtpmaps_count; j++) - { - safe_free (dsc->media_announcements[i]->a_rtpmaps[j]->pt); - safe_free (dsc->media_announcements[i]->a_rtpmaps[j]-> - encoding_name); - safe_free (dsc->media_announcements[i]->a_rtpmaps[j]->parameters); - safe_free (dsc->media_announcements[i]->a_rtpmaps[j]); - } - safe_free (dsc->media_announcements[i]->a_rtpmaps); - - for (j = 0; j < dsc->media_announcements[i]->a_sdplangs_count; j++) - safe_free (dsc->media_announcements[i]->a_sdplangs[j]); - safe_free (dsc->media_announcements[i]->a_sdplangs); - - for (j = 0; j < dsc->media_announcements[i]->a_langs_count; j++) - safe_free (dsc->media_announcements[i]->a_langs[j]); - safe_free (dsc->media_announcements[i]->a_langs); - - for (j = 0; j < dsc->media_announcements[i]->a_controls_count; j++) - safe_free (dsc->media_announcements[i]->a_controls[j]); - safe_free (dsc->media_announcements[i]->a_controls); - - for (j = 0; j < dsc->media_announcements[i]->a_fmtps_count; j++) - safe_free (dsc->media_announcements[i]->a_fmtps[j]); - safe_free (dsc->media_announcements[i]->a_fmtps); - - for (j = 0; - j < dsc->media_announcements[i]->unidentified_attributes_count; j++) - safe_free (dsc->media_announcements[i]->unidentified_attributes[j]); - safe_free (dsc->media_announcements[i]->unidentified_attributes); - safe_free (dsc->media_announcements[i]); - } - safe_free (dsc->media_announcements); - - /* This prevents the user to make the library crash when incorrectly - using recycled but not rebuilt descriptions */ - dsc->emails_count = 0; - dsc->phones_count = 0; - dsc->bw_modifiers_count = 0; - dsc->time_periods_count = 0; - dsc->media_announcements_count = 0; -} diff --git a/stream/freesdp/common.h b/stream/freesdp/common.h deleted file mode 100644 index bd051a57a7..0000000000 --- a/stream/freesdp/common.h +++ /dev/null @@ -1,352 +0,0 @@ -/* - This file is part of FreeSDP. - Copyright (C) 2001,2002,2003 Federico Montesino Pouzols - - FreeSDP is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -/** - * @file common.h - * @ingroup common - * @short Public header common for both parsing and formatting modules. - **/ - -#ifndef FSDP_COMMON_H -#define FSDP_COMMON_H - -/* Macros to avoid name mangling when compiling with a C++ compiler */ -#ifdef __cplusplus -# define BEGIN_C_DECLS extern "C" { -# define END_C_DECLS } -#else /* !__cplusplus */ -# define BEGIN_C_DECLS -# define END_C_DECLS -#endif /* __cplusplus */ - -#include -#include - -BEGIN_C_DECLS -/** - * @defgroup common FreeSDP Common Facilities - * - * Data types and routines common for both parsing and formatting - * modules. - **/ -/** @addtogroup common */ -/*@{*/ -/** - * @enum fsdp_error_t freesdp/common.h - * @short Error codes in the FreeSDP library. - * - * There is a FSDPE_MISSING_XXXX for each mandatory line, as - * FSDPE_MISSING_OWNER. This kind of error is reported when a - * mandatory description line, such as the owner line, is not found - * where it should be in the SDP description. There are also several - * error codes like FSDPE_INVALID_XXXX. These are returned when there - * is a recognized line in the parsed description that violates the - * SDP syntax or gives wrong parameters, for instance "c=foo bar", - * which would cause a FSDPE_INVALID_CONNECTION error code to be - * returned. - **/ -typedef enum -{ - FSDPE_OK = 0, - FSDPE_ILLEGAL_CHARACTER, /**< Misplaced '\r', '\n' or '\0' */ - FSDPE_MISSING_VERSION, /**< The first line is not like - v=... */ - FSDPE_INVALID_VERSION, /**< Parse error in version line, - perhaps, the version specified in - v=... is not valid for FreeSDP */ - FSDPE_MISSING_OWNER, /**< No owner line found in its - place */ - FSDPE_INVALID_OWNER, /**< Parse error in owner line */ - FSDPE_MISSING_NAME, /**< No session name found in its - place */ - FSDPE_EMPTY_NAME, /**< Empty session name line */ - - FSDPE_INVALID_CONNECTION, /**< Syntax error in connection - line */ - - FSDPE_INVALID_CONNECTION_ADDRTYPE, /**< Unrecognized address type in - connection line */ - FSDPE_INVALID_CONNECTION_NETTYPE, /**< Unrecognized network type in - connection line */ - FSDPE_INVALID_BANDWIDTH, /**< Parse error in bandwidth - line */ - FSDPE_MISSING_TIME, /**< No time period has been given - for the session */ - FSDPE_INVALID_TIME, /**< Parse error in time line */ - FSDPE_INVALID_REPEAT, /**< Parse error in repeat time - line */ - FSDPE_INVALID_TIMEZONE, /**< Parse error in timezone line */ - FSDPE_INVALID_ENCRYPTION_METHOD, /**< Unknown encryption method */ - FSDPE_INVALID_ATTRIBUTE, /**< Syntax error in an attribute - line */ - - FSDPE_INVALID_ATTRIBUTE_RTPMAP,/**< Parse error in a=rtpmap:... line */ - FSDPE_INVALID_SESSION_TYPE, /**< An unknown session type has been - specified in a `type:' - session-level attribute */ - - FSDPE_INVALID_MEDIA, /**< Parse error in media line */ - FSDPE_UNKNOWN_MEDIA_TYPE, /**< Unknown media type in media - line */ - - FSDPE_UNKNOWN_MEDIA_TRANSPORT, /**< A media transport has been - specified that is unknown */ - - FSDPE_OVERFILLED, /**< extra unknown lines are at the - end of the description */ - FSDPE_INVALID_LINE, /**< a line unknown to FreeSDP has been - found */ - FSDPE_MISSING_CONNECTION_INFO, /**< No connection information has - been provided for the whole - session nor one or more media */ - FSDPE_INVALID_INDEX, - /* FSDPE_MAXSIZE, description does not fit requested maximun size */ - FSDPE_INTERNAL_ERROR, - - FSDPE_INVALID_PARAMETER, /**< Some parameter of the called - FreeSDP routine has been given an - invalid value. This includes - cases such as NULL pointers. */ - FSDPE_BUFFER_OVERFLOW -} fsdp_error_t; - -/** - * @short Type of network - * - * Initially, SDP defines "Internet". New network types may be - * registered with IANA. However, the number of types is expected to - * be small and rarely extended. In addition, every new network type - * requires at least one new address type. - **/ -typedef enum -{ - FSDP_NETWORK_TYPE_UNDEFINED, /**< Not provided */ - FSDP_NETWORK_TYPE_INET /**< Internet */ -} fsdp_network_type_t; - -/** - * @short Type of address - * - * Initially, IPv4 and IPv6 are defined for the network type - * Internet. New address types may be registered with IANA. - **/ -typedef enum -{ - FSDP_ADDRESS_TYPE_UNDEFINED, /**< Not provided */ - FSDP_ADDRESS_TYPE_IPV4, /**< IP version 4 */ - FSDP_ADDRESS_TYPE_IPV6 /**< IP version 6 */ -} fsdp_address_type_t; - -/** - * @short Type of bandwith modifiers - * - * Bandwidth modifiers specify the meaning of the bandwidth - * value. Initially "Conference Total" and "Application Specific" are - * defined. Both use kilobits as bandwidth unit. "Conference Total" - * specifies that the bandwidth value is a proposed upper limit to the - * session bandwidth. "Application Specific" specifies thath the - * bandwidth value is the application concept of maximum bandwidth. - **/ -typedef enum -{ - FSDP_BW_MOD_TYPE_UNDEFINED, /**< Not provided */ - FSDP_BW_MOD_TYPE_UNKNOWN, /**< Unknown bandwidth - modifier (FreeSDP - ignores it) */ - FSDP_BW_MOD_TYPE_CONFERENCE_TOTAL, /**< "CT - Conference Total" */ - FSDP_BW_MOD_TYPE_APPLICATION_SPECIFIC, /**< "AS - Application specific" */ - FSDP_BW_MOD_TYPE_RTCP_SENDERS, /**< "RS - RTCP bandwidth for - senders */ - FSDP_BW_MOD_TYPE_RTCP_RECEIVERS, /**< "RR - RTCP bandwidth for - receivers */ -} fsdp_bw_modifier_type_t; - -/** - * @short encryption method - * - * The encryption method specifies the way to get the encryption key. - **/ -typedef enum -{ - FSDP_ENCRYPTION_METHOD_UNDEFINED, /**< Not provided */ - FSDP_ENCRYPTION_METHOD_CLEAR, /**< The key field is the - untransformed key */ - FSDP_ENCRYPTION_METHOD_BASE64, /**< The key is base64 - encoded */ - FSDP_ENCRYPTION_METHOD_URI, /**< The key value provided is - a URI pointing to the actual - key */ - FSDP_ENCRYPTION_METHOD_PROMPT /**< The key is not provided - but should be got prompting - the user */ -} fsdp_encryption_method_t; - -/** - * @short Advised reception/transmission mode - * - * Depending on wheter sendrecv, recvonly, sendonly or inactive - * attribute is given, the tools used to participate in the session - * should be started in the corresponding transmission - * mode. FSDP_SENDRECV_SENDRECV is the default for sessions which are - * not of the conference type broadcast or H332. - **/ -typedef enum -{ - FSDP_SENDRECV_UNDEFINED, /**< Not specified */ - FSDP_SENDRECV_SENDRECV, /**< Send and receive */ - FSDP_SENDRECV_RECVONLY, /**< Receive only */ - FSDP_SENDRECV_SENDONLY, /**< Send only */ - FSDP_SENDRECV_INACTIVE /**< Do not send nor receive */ -} fsdp_sendrecv_mode_t; - -/** - * @short Values for `orient' media attribute. - * - * Normally used with whiteboard media, this attribute specifies the - * orientation of the whiteboard. - **/ -typedef enum -{ - FSDP_ORIENT_UNDEFINED, /**< Not specified */ - FSDP_ORIENT_PORTRAIT, /**< Portrait */ - FSDP_ORIENT_LANDSCAPE, /**< Landscape */ - FSDP_ORIENT_SEASCAPE /**< Upside down landscape */ -} fsdp_orient_t; - -/** - * @short Type of the conference - * - * The following types are initially defined: broadcast, meeting, - * moderated, test and H332. - **/ -typedef enum -{ - FSDP_SESSION_TYPE_UNDEFINED, /**< Not specified */ - FSDP_SESSION_TYPE_BROADCAST, /**< Broadcast session */ - FSDP_SESSION_TYPE_MEETING, /**< Meeting session */ - FSDP_SESSION_TYPE_MODERATED, /**< Moderated session */ - FSDP_SESSION_TYPE_TEST, /**< Test (do not display) */ - FSDP_SESSION_TYPE_H332 /**< H332 session */ -} fsdp_session_type_t; - -/** - * @short Media type - * - * The following types are defined initially: audio, video, - * application, data and control. - **/ -typedef enum -{ - FSDP_MEDIA_UNDEFINED, /**< Not specified */ - FSDP_MEDIA_VIDEO, /**< Video */ - FSDP_MEDIA_AUDIO, /**< Audio */ - FSDP_MEDIA_APPLICATION, /**< Application, such as whiteboard */ - FSDP_MEDIA_DATA, /**< bulk data */ - FSDP_MEDIA_CONTROL /**< Control channel */ -} fsdp_media_t; - -/** - * @short Transport protocol - * - * The transport protocol used depends on the address type. Initially, - * RTP over UDP Audio/Video Profile, and UDP are defined. - * - **/ -typedef enum -{ - FSDP_TP_UNDEFINED, /**< Not specified */ - FSDP_TP_RTP_AVP, /**< RTP Audio/Video Profile */ - FSDP_TP_UDP, /**< UDP */ - FSDP_TP_TCP, /**< TCP */ - FSDP_TP_UDPTL, /**< ITU-T T.38*/ - FSDP_TP_VAT, /**< old vat protocol (historic)*/ - FSDP_TP_OLD_RTP, /**< old rtp protocols (historic)*/ - FSDP_TP_H320 /**< TODO: add to the parser */ -} fsdp_transport_protocol_t; - -/** - * Session-level attributes whose value is specified as a character - * string in FreeSDP. These values are usually given to - * fsdp_get_strn_att() in order to get the corresponding value. - * - **/ -typedef enum -{ - FSDP_SESSION_STR_ATT_CATEGORY, - FSDP_SESSION_STR_ATT_KEYWORDS, - FSDP_SESSION_STR_ATT_TOOL, - FSDP_SESSION_STR_ATT_CHARSET, -} fsdp_session_str_att_t; - -/** - * @short FreeSDP SDP description media object. - * - * Object for media specific information in SDP descriptions. Each SDP - * description may include any number of media section. A - * fsdp_media_description_t object encapsulates the information in a - * media section, such as video, audio or whiteboard. - **/ -typedef struct fsdp_media_description_t_s fsdp_media_description_t; - -/** - * @short FreeSDP SDP session description object. - * - * Contains all the information extracted from a textual SDP - * description, including all the media announcements. - **/ -typedef struct fsdp_description_t_s fsdp_description_t; - -/** - * Allocates memory and initializes values for a new - * fsdp_description_t object. If you call this routine, do not forget - * about fsdp_description_delete() - * - * @return new fsdp_description_t object - **/ -fsdp_description_t *fsdp_description_new (void); - -/** - * Destroys a fsdp_description_t object. - * - * @param dsc pointer to the fsdp_description_t object to delete. - **/ -void fsdp_description_delete (fsdp_description_t * dsc); - -/** - * Calling this function over a description is equivalent to calling - * fsdp_description_delete and then fsdp_description_delete. This - * function is however more suitable and efficient for description - * processing loops. - * - * @param dsc pointer to the fsdp_description_t object to - * renew/recycle. - **/ -void fsdp_description_recycle (fsdp_description_t * dsc); - -/** - * * Returns a string correspondent to the error number. - * * - * * @param err_no error number. - * **/ -const char *fsdp_strerror (fsdp_error_t err_no); - - /*@}*//* closes addtogroup common */ - -END_C_DECLS -#endif /* FSDP_COMMON_H */ diff --git a/stream/freesdp/errorlist.c b/stream/freesdp/errorlist.c deleted file mode 100644 index 1fb6e93851..0000000000 --- a/stream/freesdp/errorlist.c +++ /dev/null @@ -1,72 +0,0 @@ -/* - This file is part of FreeSDP - Copyright (C) 2001, 2002 Federico Montesino Pouzols - - FreeSDP is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -/** - * @file errorlist.c - * - * @short Translation table for error numbers - * - */ - -#ifndef FSDP_ERRORLIST_C -#define FSDP_ERRORLIST_C - -#include "common.h" - -const char *fsdp_error_t_s[] = { - "No error",/** FSDPE_OK **/ - "Illegal character detected",/** FSDPE_ILLEGAL_CHARACTER **/ - "Missing version item", /** FSDPE_MISSING_VERSION **/ - "Invalid version item", /** FSDPE_INVALID_VERSION **/ - "Owner item not present", /** FSDPE_MISSING_OWNER **/ - "Parse error in owner item", /** FSDPE_INVALID_OWNER **/ - "Session name not present", /** FSDPE_MISSING_NAME **/ - "Empty session name item", /** FSDPE_EMPTY_NAME **/ - "Syntax error in connection item", /** FSDPE_INVALID_CONNECTION **/ - "Unrecognized address type in connection item", /** FSDPE_INVALID_CONNECTION_ADDRTYPE **/ - "Unrecognized network type in connection item", /** FSDPE_INVALID_CONNECTION_NETTYPE **/ - "Parse error in bandwith item", /** FSDPE_INVALID_BANDWIDTH **/ - "No time period for the session", /** FSDPE_MISSING_TIME **/ - "Parse error in time item", /** FSDPE_INVALID_TIME **/ - "Parse error in repeat time item", /** FSDPE_INVALID_REPEAT **/ - "Parse error in timezone item", /** FSDPE_INVALID_TIMEZONE **/ - "Unknown encryption method", /** FSDPE_INVALID_ENCRYPTION_METHOD **/ - "Syntax error in an attribute item", /** FSDPE_INVALID_ATTRIBUTE **/ - "Syntax error in an rtpmap attribute item", /** FSDPE_INVALID_ATTRIBUTE_RTPMAP **/ - "Unknown session type in a session-level attribute", /** FSDPE_INVALID_SESSION_TYPE **/ - "Parse error in media item", /** FSDPE_INVALID_MEDIA **/ - "Unknown media type in media item", /** FSDPE_UNKNOWN_MEDIA_TYPE **/ - "Unknown media transport", /** FSDPE_UNKNOWN_MEDIA_TRANSPORT **/ - "Unknown extra lines in description item", /** FSDPE_OVERFILLED **/ - "Unknown line found", /** FSDPE_INVALID_LINE **/ - "No connection information provided", /** FSDPE_MISSING_CONNECTION_INFO **/ - "Description item does not fit in MAXSIZE", /** FSDPE_INVALID_INDEX **/ - "Internal error", /** FSDPE_INTERNAL_ERROR **/ - "Invalid function parameters", /** FSDPE_INVALID_PARAMETER **/ - "Buffer overflow" /** FSDPE_BUFFER_OVERFLOW **/ -}; - - -const char * -fsdp_strerror (fsdp_error_t err_no) -{ - return (fsdp_error_t_s[err_no]); -} - -#endif /* FSDP_ERRORLIST_C */ diff --git a/stream/freesdp/parser.c b/stream/freesdp/parser.c deleted file mode 100644 index cb093c2bae..0000000000 --- a/stream/freesdp/parser.c +++ /dev/null @@ -1,1890 +0,0 @@ -/* - This file is part of FreeSDP - Copyright (C) 2001,2002,2003 Federico Montesino Pouzols - - FreeSDP is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - Benjamin Zores, (C) 2006 - added support in parser for the a=control: lines. - added support in parser for the a=range: lines. -*/ - -/** - * @file parser.c - * - * @short Parsing module implementation. - * - * This file implements the parsing routine fsdp_parse - * and the fsdp_get_xxxx routines that allow to get the - * session properties from a session description object build through - * the application of fsdp_parse to a textual SDP session - * description. - **/ - -#include "parserpriv.h" - -/** - * \brief find the start of the next line - * \param c pointer to current position in string - * \return pointer to start of next line or NULL if illegal (i.e. - * a '\r' is not followed by a '\n' - */ -static const char *next_line(const char *c) { - c += strcspn(c, "\n\r"); - if (*c == 0) return c; - if (*c == '\r') c++; - if (*c == '\n') - return c + 1; - return NULL; -} - -/** - * Moves the c pointer up to the beginning of the next - * line. - * - * @param c char pointer to pointer - * @retval FSDPE_ILLEGAL_CHARACTER, when an illegal '\r' character - * (not followed by a '\n') is found, returns - */ -#define NEXT_LINE(c) do { if (!(c = next_line(c))) return FSDPE_ILLEGAL_CHARACTER; } while (0); - -fsdp_error_t -fsdp_parse (const char *text_description, fsdp_description_t * dsc) -{ - fsdp_error_t result; - const char *p = text_description, *p2; - unsigned int j; - /* temps for sscanf */ - const unsigned int TEMPCHARS = 6; - char fsdp_buf[TEMPCHARS][MAXSHORTFIELDLEN]; - char longfsdp_buf[MAXLONGFIELDLEN]; - const unsigned int TEMPINTS = 2; - unsigned long int wuint[TEMPINTS]; - - if ((NULL == text_description) || (NULL == dsc)) - return FSDPE_INVALID_PARAMETER; - - /***************************************************************************/ - /* A) parse session-level description */ - /***************************************************************************/ - - /* `v=' line (protocol version) */ - /* according to the RFC, only `v=0' is valid */ - if (sscanf (p, "v=%1lu", &wuint[0])) - { - if (wuint[0] != 0) - return FSDPE_INVALID_VERSION; - } - else - { - return FSDPE_MISSING_VERSION; - } - NEXT_LINE (p); - - /* `o=' line (owner/creator and session identifier) */ - /* o=
-
*/ - if (!strncmp (p, "o=", 2)) - { - p += 2; - /* note that the following max lengths may vary in the future and - are quite arbitary */ - if (sscanf - (p, - "%" MSFLENS "[\x21-\xFF] %" MSFLENS "[0-9] %" MSFLENS - "[0-9] %2s %3s %" MSFLENS "s", fsdp_buf[0], fsdp_buf[1], - fsdp_buf[2], fsdp_buf[3], fsdp_buf[4], fsdp_buf[5]) != 6) - return FSDPE_INVALID_OWNER; - dsc->o_username = strdup (fsdp_buf[0]); - dsc->o_session_id = strdup (fsdp_buf[1]); - dsc->o_announcement_version = strdup (fsdp_buf[2]); - if (!strncmp (fsdp_buf[3], "IN", 2)) - { - dsc->o_network_type = FSDP_NETWORK_TYPE_INET; - if (!strncmp (fsdp_buf[4], "IP4", 3)) - dsc->o_address_type = FSDP_ADDRESS_TYPE_IPV4; - else if (!strncmp (fsdp_buf[4], "IP6", 3)) - dsc->o_address_type = FSDP_ADDRESS_TYPE_IPV6; - else - return FSDPE_INVALID_OWNER; - } - else - { - return FSDPE_INVALID_OWNER; - } - /* TODO? check valid unicast address/FQDN */ - dsc->o_address = strdup (fsdp_buf[5]); - } - else - { - return FSDPE_MISSING_OWNER; - } - NEXT_LINE (p); - - /* `s=' line (session name) -note that the name string cannot be empty */ - /* s= */ - if (!strncmp (p, "s=", 2)) - { - if (sscanf (p, "s=%" MLFLENS "[^\r\n]", longfsdp_buf) < 1) - return FSDPE_EMPTY_NAME; - dsc->s_name = strdup (longfsdp_buf); - } - else - { - return FSDPE_MISSING_NAME; - } - NEXT_LINE (p); - - /* `i=' line (session information) [optional] */ - /* i= */ - if (!strncmp (p, "i=", 2) - && sscanf (p, "i=%" MLFLENS "[^\r\n]", longfsdp_buf)) - { - dsc->i_information = strdup (longfsdp_buf); - NEXT_LINE (p); - } - else - { - /* (optional) information absent */ - } - - /* `u=' line (URI of description) [optional] */ - /* u= */ - if (!strncmp (p, "u=", 2) - && sscanf (p, "u=%" MLFLENS "[^\r\n]", longfsdp_buf)) - { - /* TODO? check valid uri */ - dsc->u_uri = strdup (longfsdp_buf); - NEXT_LINE (p); - } - else - { - /* (optional) uri absent */ - } - - /* `e=' lines (email address) [zero or more] */ - /* e= */ - p2 = p; - j = 0; - while (!strncmp (p2, "e=", 2)) - { - /* First, count how many emails are there */ - j++; - NEXT_LINE (p2); - } - dsc->emails_count = j; - if (dsc->emails_count > 0) - { - /* Then, build the array of emails */ - dsc->emails = calloc (j, sizeof (const char *)); - for (j = 0; j < dsc->emails_count; j++) - { - sscanf (p, "e=%" MLFLENS "[^\r\n]", longfsdp_buf); - /* TODO? check valid email-address. */ - dsc->emails[j] = strdup (longfsdp_buf); - NEXT_LINE (p); - } - } - - /* `p=' lines (phone number) [zero or more] */ - /* p= */ - j = 0; - /* assert ( p2 == p ); */ - while (!strncmp (p2, "p=", 2)) - { - j++; - NEXT_LINE (p2); - } - dsc->phones_count = j; - if (dsc->phones_count > 0) - { - dsc->phones = calloc (j, sizeof (const char *)); - for (j = 0; j < dsc->phones_count; j++) - { - sscanf (p, "p=%" MLFLENS "[^\r\n]", longfsdp_buf); - /* TODO? check valid phone-number. */ - dsc->phones[j] = strdup (longfsdp_buf); - NEXT_LINE (p); - } - } - - /* `c=' line (connection information - not required if included in all media) [optional] */ - /* c=
*/ - result = fsdp_parse_c (&p, &(dsc->c_network_type), &(dsc->c_address_type), - &(dsc->c_address)); - if (FSDPE_OK != result) - return result; - - /* `b=' lines (bandwidth information) [optional] */ - /* b=: */ - result = - fsdp_parse_b (&p, &(dsc->bw_modifiers), &(dsc->bw_modifiers_count)); - if (FSDPE_OK != result) - return result; - - /* A.1) Time descriptions: */ - - /* `t=' lines (time the session is active) [1 or more] */ - /* t= */ - j = 0; - p2 = p; - while (!strncmp (p2, "t=", 2)) - { - j++; - NEXT_LINE (p2); - while (!strncmp (p2, "r=", 2)) - NEXT_LINE (p2); - } - dsc->time_periods_count = j; - if (dsc->time_periods_count == 0) - return FSDPE_MISSING_TIME; - dsc->time_periods = calloc (dsc->time_periods_count, - sizeof (fsdp_time_period_t *)); - for (j = 0; j < dsc->time_periods_count; j++) - { - unsigned int h = 0; - if (sscanf (p, "t=%10lu %10lu", &wuint[0], &wuint[1]) != 2) - { - /* not all periods have been successfully parsed */ - dsc->time_periods_count = j; - return FSDPE_INVALID_TIME; - } - dsc->time_periods[j] = calloc (1, sizeof (fsdp_time_period_t)); - - /* convert from NTP to time_t time */ - if (wuint[0] != 0) - wuint[0] -= NTP_EPOCH_OFFSET; - if (wuint[1] != 0) - wuint[1] -= NTP_EPOCH_OFFSET; - dsc->time_periods[j]->start = wuint[0]; - dsc->time_periods[j]->stop = wuint[1]; - NEXT_LINE (p); - - /* `r' lines [zero or more repeat times for each t=] */ - /*r= */ - p2 = p; - while (!strncmp (p2, "r=", 2)) - { - h++; - NEXT_LINE (p2); - } - dsc->time_periods[j]->repeats_count = h; - if (h > 0) - { - unsigned int index2 = 0; - dsc->time_periods[j]->repeats = - calloc (h, sizeof (fsdp_repeat_t *)); - for (h = 0; h < dsc->time_periods[j]->repeats_count; h++) - { - if (sscanf (p, "r=%10s %10s %" MLFLENS "[^\r\n]", - fsdp_buf[0], fsdp_buf[1], longfsdp_buf) == 3) - { - fsdp_repeat_t *repeat; - dsc->time_periods[j]->repeats[h] = - calloc (1, sizeof (fsdp_repeat_t)); - repeat = dsc->time_periods[j]->repeats[h]; - /* get interval, duration and list of offsets */ - result = - fsdp_repeat_time_to_uint (fsdp_buf[0], - &(repeat->interval)); - if (result == FSDPE_OK) - { - result = - fsdp_repeat_time_to_uint (fsdp_buf[1], - &(repeat->duration)); - if (result == FSDPE_OK) - { - unsigned int k = 1; - const char *i = longfsdp_buf; - while (NULL != (i = strchr (i, ' '))) - { - k++; - if (NULL != i) - i++; - } - repeat->offsets_count = k; - repeat->offsets = calloc (k, sizeof (time_t)); - i = longfsdp_buf; - for (k = 0; - (k < repeat->offsets_count) - && (result == FSDPE_OK); k++) - { - result = - fsdp_repeat_time_to_uint (i, - &(repeat-> - offsets[k])); - i = strchr (i, ' '); - if (NULL != i) - i++; - } - if (k < repeat->offsets_count) - { - /* there where invalid repeat offsets */ - dsc->time_periods[j]->repeats_count = k; - return FSDPE_INVALID_REPEAT; - } - } - } - if (result != FSDPE_OK) - { - /* not all repeats have been succesfully parsed */ - dsc->time_periods[j]->repeats_count = h; - return FSDPE_INVALID_REPEAT; - } - NEXT_LINE (p); - } - else - { - /* not all repeats have been succesfully parsed */ - dsc->time_periods[j]->repeats_count = h; - return FSDPE_INVALID_REPEAT; - } - index2++; - } - } - } - - /* `z=' line (time zone adjustments) [zero or more] */ - /* z= .... */ - if (!strncmp (p, "z=", 2)) - { - if (sscanf (p, "z=%" MLFLENS "[^\r\n]", longfsdp_buf)) - { - /* TODO: guess how many pairs are there and process them */ - dsc->timezone_adj = strdup (longfsdp_buf); - NEXT_LINE (p); - } - else - { - return FSDPE_INVALID_TIMEZONE; - } - } - - /* `k=' line (encryption key) [optional] */ - /* k= - k=: */ - result = fsdp_parse_k (&p, &(dsc->k_encryption_method), - &(dsc->k_encryption_content)); - if (result != FSDPE_OK) - return result; - - /* A.2) Attributes */ - /* `a=' lines (session attribute) [0 or more] */ - /* a= - a=: */ - while (!strncmp (p, "a=", 2)) - { - /* The "9" length specifier of the first string is subject to - changes */ - if (sscanf - (p, "a=%9[^:\r\n]:%" MSFLENS "[^\r\n]", fsdp_buf[0], - fsdp_buf[1]) == 2) - { - /* session-level value attributes */ - if (!strncmp (fsdp_buf[0], "cat", 3)) - dsc->a_category = strdup (fsdp_buf[1]); - else if (!strncmp (fsdp_buf[0], "keywds", 6)) - dsc->a_keywords = strdup (fsdp_buf[1]); - else if (!strncmp (fsdp_buf[0], "tool", 4)) - dsc->a_keywords = strdup (fsdp_buf[1]); - else if (!strncmp (fsdp_buf[0], "rtpmap", 6)) - fsdp_parse_rtpmap (&(dsc->a_rtpmaps), - &(dsc->a_rtpmaps_count), fsdp_buf[1]); - else if (!strncmp (fsdp_buf[0], "type", 4)) - { - if (!strncmp (fsdp_buf[1], "broadcast", 9)) - dsc->a_type = FSDP_SESSION_TYPE_BROADCAST; - else if (!strncmp (fsdp_buf[1], "meeting", 7)) - dsc->a_type = FSDP_SESSION_TYPE_MEETING; - else if (!strncmp (fsdp_buf[1], "moderated", 9)) - dsc->a_type = FSDP_SESSION_TYPE_MODERATED; - else if (!strncmp (fsdp_buf[1], "test", 4)) - dsc->a_type = FSDP_SESSION_TYPE_TEST; - else if (!strncmp (fsdp_buf[1], "H332", 4)) - dsc->a_type = FSDP_SESSION_TYPE_H332; - else - return FSDPE_INVALID_SESSION_TYPE; - } - else if (!strncmp (fsdp_buf[0], "charset", 7)) - dsc->a_charset = strdup (fsdp_buf[1]); - else if (!strncmp (fsdp_buf[0], "sdplang", 7)) - { - if (NULL == dsc->a_sdplangs) - { - dsc->a_sdplangs_count = 0; - dsc->a_sdplangs = - calloc (SDPLANGS_MAX_COUNT, sizeof (char *)); - } - if (dsc->a_sdplangs_count < SDPLANGS_MAX_COUNT) - { - dsc->a_sdplangs[dsc->a_sdplangs_count] = - strdup (fsdp_buf[1]); - dsc->a_sdplangs_count++; - } - } - else if (!strncmp (fsdp_buf[0], "lang", 4)) - { - if (NULL == dsc->a_langs) - { - dsc->a_langs_count = 0; - dsc->a_langs = calloc (SDPLANGS_MAX_COUNT, sizeof (char *)); - } - if (dsc->a_langs_count < SDPLANGS_MAX_COUNT) - { - dsc->a_langs[dsc->a_langs_count] = strdup (fsdp_buf[1]); - dsc->a_langs_count++; - } - } - else if (!strncmp (fsdp_buf[0], "control", 7)) - { - if (NULL == dsc->a_controls) - { - dsc->a_controls_count = 0; - dsc->a_controls = - calloc (SDPCONTROLS_MAX_COUNT, sizeof (char *)); - } - if (dsc->a_controls_count < SDPCONTROLS_MAX_COUNT) - { - dsc->a_controls[dsc->a_controls_count] = - strdup (fsdp_buf[1]); - dsc->a_controls_count++; - } - } - else if (!strncmp (fsdp_buf[0], "range", 5)) - { - free (dsc->a_range); - dsc->a_range = strdup (fsdp_buf[1]); - } - else - { - /* ignore unknown attributes, but provide access to them */ - *longfsdp_buf = '\0'; - strncat (longfsdp_buf, fsdp_buf[0], MAXLONGFIELDLEN-1); - strncat (longfsdp_buf, ":", MAXLONGFIELDLEN-strlen(longfsdp_buf)-1); - strncat (longfsdp_buf, fsdp_buf[1], MAXLONGFIELDLEN-strlen(longfsdp_buf)-1); - if (NULL == dsc->unidentified_attributes) - { - dsc->unidentified_attributes_count = 0; - dsc->unidentified_attributes = - calloc (UNIDENTIFIED_ATTRIBUTES_MAX_COUNT, - sizeof (char *)); - } - if (dsc->unidentified_attributes_count < - UNIDENTIFIED_ATTRIBUTES_MAX_COUNT) - { - dsc->unidentified_attributes - [dsc->unidentified_attributes_count] = - strdup (longfsdp_buf); - dsc->unidentified_attributes_count++; - } - } - NEXT_LINE (p); - } - else if (sscanf (p, "a=%20s", fsdp_buf[0]) == 1) - { - /* session-level property attributes */ - if (!strncmp (fsdp_buf[0], "recvonly", 8)) - dsc->a_sendrecv_mode = FSDP_SENDRECV_RECVONLY; - else if (!strncmp (fsdp_buf[0], "sendonly", 8)) - dsc->a_sendrecv_mode = FSDP_SENDRECV_SENDONLY; - else if (!strncmp (fsdp_buf[0], "inactive", 8)) - dsc->a_sendrecv_mode = FSDP_SENDRECV_INACTIVE; - else if (!strncmp (fsdp_buf[0], "sendrecv", 8)) - dsc->a_sendrecv_mode = FSDP_SENDRECV_SENDRECV; - else - { - /* ignore unknown attributes, but provide access to them */ - *longfsdp_buf = '\0'; - strncat (longfsdp_buf, fsdp_buf[0], MAXLONGFIELDLEN-1); - if (NULL == dsc->unidentified_attributes) - { - dsc->unidentified_attributes_count = 0; - dsc->unidentified_attributes = - calloc (UNIDENTIFIED_ATTRIBUTES_MAX_COUNT, - sizeof (char *)); - } - if (dsc->unidentified_attributes_count < - UNIDENTIFIED_ATTRIBUTES_MAX_COUNT) - { - dsc->unidentified_attributes - [dsc->unidentified_attributes_count] = - strdup (longfsdp_buf); - dsc->unidentified_attributes_count++; - } - } - NEXT_LINE (p); - } - else - return FSDPE_INVALID_ATTRIBUTE; - } - - /***************************************************************************/ - /* B) parse media-level descriptions */ - /***************************************************************************/ - p2 = p; - j = 0; - while ((*p2 != '\0') && !strncmp (p2, "m=", 2)) - { - char c; - j++; - NEXT_LINE (p2); - while (sscanf (p2, "%c=", &c) == 1) - { - if (c == 'i' || c == 'c' || c == 'b' || c == 'k' || c == 'a') - { - NEXT_LINE (p2); - } - else if (c == 'm') - { - break; - } - else - { - return FSDPE_INVALID_LINE; - } - } - } - dsc->media_announcements_count = j; - if (dsc->media_announcements_count == 0) - { - ; - /*return FSDPE_MISSING_MEDIA; */ - } - else - { /* dsc->media_announcements_count > 0 */ - dsc->media_announcements = - calloc (j, sizeof (fsdp_media_announcement_t *)); - for (j = 0; j < dsc->media_announcements_count; j++) - { - fsdp_media_announcement_t *media = NULL; - /* `m=' line (media name, transport address and format list) */ - /* m= */ - /* The max. string lengths are subject to change */ - if (sscanf (p, "m=%11s %8s %7s %" MLFLENS "[^\r\n]", - fsdp_buf[0], fsdp_buf[1], fsdp_buf[2], - longfsdp_buf) != 4) - { - return FSDPE_INVALID_MEDIA; - } - else - { - dsc->media_announcements[j] = - calloc (1, sizeof (fsdp_media_announcement_t)); - media = dsc->media_announcements[j]; - if (!strncmp (fsdp_buf[0], "audio", 5)) - media->media_type = FSDP_MEDIA_AUDIO; - else if (!strncmp (fsdp_buf[0], "video", 5)) - media->media_type = FSDP_MEDIA_VIDEO; - else if (!strncmp (fsdp_buf[0], "application", 11)) - media->media_type = FSDP_MEDIA_APPLICATION; - else if (!strncmp (fsdp_buf[0], "data", 4)) - media->media_type = FSDP_MEDIA_DATA; - else if (!strncmp (fsdp_buf[0], "control", 7)) - media->media_type = FSDP_MEDIA_CONTROL; - else - return FSDPE_UNKNOWN_MEDIA_TYPE; - { /* try to get port specification as port/number */ - char *slash; - if ((slash = strchr (fsdp_buf[1], '/'))) - { - *slash = '\0'; - slash++; - media->port = strtol (fsdp_buf[1], NULL, 10); - media->port_count = strtol (slash, NULL, 10); - } - else - { - media->port = strtol (fsdp_buf[1], NULL, 10); - media->port_count = 0; - } - } - if (!strncmp (fsdp_buf[2], "RTP/AVP", 7)) - media->transport = FSDP_TP_RTP_AVP; - else if (!strncmp (fsdp_buf[2], "udp", 3)) - media->transport = FSDP_TP_UDP; - else if (!strncmp (fsdp_buf[2], "TCP", 3)) - media->transport = FSDP_TP_TCP; - else if (!strncmp (fsdp_buf[2], "UDPTL", 5)) - media->transport = FSDP_TP_UDPTL; - else if (!strncmp (fsdp_buf[2], "vat", 3)) - media->transport = FSDP_TP_VAT; - else if (!strncmp (fsdp_buf[2], "rtp", 3)) - media->transport = FSDP_TP_OLD_RTP; - else - return FSDPE_UNKNOWN_MEDIA_TRANSPORT; - { - unsigned int k = 0; - char *s = longfsdp_buf; - while (NULL != (s = strchr (s, ' '))) - { - k++; - if (NULL != s) - s++; - } - k++; /* when there is no space left, count the last format */ - media->formats_count = k; - media->formats = calloc (k, sizeof (char *)); - s = longfsdp_buf; - for (k = 0; k < media->formats_count; k++) - { - char *space = strchr (s, ' '); - if (NULL != space) - *space = '\0'; - media->formats[k] = strdup (s); - s = space + 1; - } - } - NEXT_LINE (p); - } - - /* `i=' line (media title) [optional] */ - /* i= */ - if (!strncmp (p, "i=", 2) - && sscanf (p, "i=%" MLFLENS "[^\r\n]", longfsdp_buf)) - { - media->i_title = strdup (longfsdp_buf); - NEXT_LINE (p); - } - else - { - /* (optional) information absent */ - } - - /* `c=' line (connection information - overrides session-level - line) [optional if provided at session-level] */ - /* c=
*/ - result = fsdp_parse_c (&p, &(media->c_network_type), - &(media->c_address_type), - &(media->c_address)); - if (result != FSDPE_OK) - return result; - - /* `b=' lines (bandwidth information) [optional] */ - /* b=: */ - result = fsdp_parse_b (&p, &(media->bw_modifiers), - &(media->bw_modifiers_count)); - if (FSDPE_OK != result) - return result; - - /* `k=' line (encryption key) [optional] */ - /* k= - k=: */ - result = fsdp_parse_k (&p, &(media->k_encryption_method), - &(media->k_encryption_content)); - if (result != FSDPE_OK) - return result; - - /* B.1) Attributes */ - - /* `a=' lines (zero or more media attribute lines) [optional] */ - /* a= - a=: */ - while (!strncmp (p, "a=", 2)) - { - if (sscanf - (p, "a=%9[^:\r\n]:%" MLFLENS "[^\r\n]", fsdp_buf[0], - longfsdp_buf) == 2) - { - /* media-level value attributes */ - if (!strncmp (fsdp_buf[0], "ptime", 5)) - media->a_ptime = strtoul (longfsdp_buf, NULL, 10); - else if (!strncmp (fsdp_buf[0], "maxptime", 8)) - media->a_maxptime = strtoul (longfsdp_buf, NULL, 10); - else if (!strncmp (fsdp_buf[0], "rtpmap", 6)) - fsdp_parse_rtpmap (&(media->a_rtpmaps), - &(media->a_rtpmaps_count), - longfsdp_buf); - else if (!strncmp (fsdp_buf[0], "orient", 6)) - { - if (!strncmp (longfsdp_buf, "portrait", 8)) - media->a_orient = FSDP_ORIENT_PORTRAIT; - else if (!strncmp (longfsdp_buf, "landscape", 9)) - media->a_orient = FSDP_ORIENT_LANDSCAPE; - else if (!strncmp (longfsdp_buf, "seascape", 9)) - media->a_orient = FSDP_ORIENT_SEASCAPE; - } - else if (!strncmp (fsdp_buf[0], "sdplang", 7)) - { - if (NULL == dsc->a_sdplangs) - { - media->a_sdplangs_count = 0; - media->a_sdplangs = - calloc (SDPLANGS_MAX_COUNT, sizeof (char *)); - } - if (media->a_sdplangs_count < SDPLANGS_MAX_COUNT) - { - media->a_sdplangs[dsc->a_sdplangs_count] = - strdup (longfsdp_buf); - media->a_sdplangs_count++; - } - } - else if (!strncmp (fsdp_buf[0], "lang", 4)) - { - if (NULL == dsc->a_langs) - { - media->a_langs_count = 0; - media->a_langs = - calloc (SDPLANGS_MAX_COUNT, sizeof (char *)); - } - if (media->a_langs_count < SDPLANGS_MAX_COUNT) - { - media->a_langs[dsc->a_langs_count] = - strdup (longfsdp_buf); - media->a_langs_count++; - } - } - else if (!strncmp (fsdp_buf[0], "control", 7)) - { - if (NULL == media->a_controls) - { - media->a_controls_count = 0; - media->a_controls = - calloc (SDPCONTROLS_MAX_COUNT, sizeof (char *)); - } - if (media->a_controls_count < SDPCONTROLS_MAX_COUNT) - { - media->a_controls[media->a_controls_count] = - strdup (longfsdp_buf); - media->a_controls_count++; - } - } - else if (!strncmp (fsdp_buf[0], "range", 5)) - { - free (media->a_range); - media->a_range = strdup (fsdp_buf[1]); - } - else if (!strncmp (fsdp_buf[0], "framerate", 9)) - media->a_framerate = strtod (longfsdp_buf, NULL); - else if (!strncmp (fsdp_buf[0], "fmtp", 4)) - { - if (NULL == media->a_fmtps) - { - media->a_fmtps_count = 0; - media->a_fmtps = - calloc (SDPLANGS_MAX_COUNT, sizeof (char *)); - } - if (media->a_fmtps_count < SDPLANGS_MAX_COUNT) - { - media->a_fmtps[media->a_fmtps_count] = - strdup (longfsdp_buf); - media->a_fmtps_count++; - } - } - else if (!strncmp (fsdp_buf[0], "rtcp", 4)) - { - int opts = 0; - /* rtcp attribute: a=rtcp:
*/ - opts = - sscanf (longfsdp_buf, "%lu %2s %3s %" MSFLENS "s", - &wuint[0], fsdp_buf[0], fsdp_buf[1], - fsdp_buf[2]); - if (opts >= 1) - { - media->a_rtcp_port = wuint[0]; - if (opts >= 2) - { - if (!strncmp (fsdp_buf[0], "IN", 2)) - { - media->a_rtcp_network_type = - FSDP_NETWORK_TYPE_INET; - } /* else - ; TODO: define error code? */ - if (opts >= 3) - { - if (!strncmp (fsdp_buf[1], "IP4", 3)) - media->a_rtcp_address_type = - FSDP_ADDRESS_TYPE_IPV4; - else if (!strncmp (fsdp_buf[1], "IP6", 3)) - media->a_rtcp_address_type = - FSDP_ADDRESS_TYPE_IPV6; - else - return FSDPE_INVALID_CONNECTION_NETTYPE; - /*add specific code? */ - if (opts >= 4) - media->a_rtcp_address = - strdup (fsdp_buf[2]); - } - } - } - } - else - { - /* ignore unknown attributes, but provide access to them */ - *fsdp_buf[1] = '\0'; - strncat (fsdp_buf[1], fsdp_buf[0], MAXSHORTFIELDLEN-1); - strncat (fsdp_buf[1], ":", MAXSHORTFIELDLEN-strlen(fsdp_buf[1])-1); - strncat (fsdp_buf[1], longfsdp_buf, MAXSHORTFIELDLEN-strlen(fsdp_buf[1])-1); - if (NULL == media->unidentified_attributes) - { - media->unidentified_attributes_count = 0; - media->unidentified_attributes = - calloc (UNIDENTIFIED_ATTRIBUTES_MAX_COUNT, - sizeof (char *)); - } - if (media->unidentified_attributes_count < - UNIDENTIFIED_ATTRIBUTES_MAX_COUNT) - { - media->unidentified_attributes - [media->unidentified_attributes_count] = - strdup (fsdp_buf[1]); - media->unidentified_attributes_count++; - } - } - NEXT_LINE (p); - } - else if (sscanf (p, "a=%8s", fsdp_buf[0]) == 1) - { - /* media-level property attributes */ - if (!strncmp (fsdp_buf[0], "recvonly", 8)) - media->a_sendrecv_mode = FSDP_SENDRECV_RECVONLY; - else if (!strncmp (fsdp_buf[0], "sendonly", 8)) - media->a_sendrecv_mode = FSDP_SENDRECV_SENDONLY; - else if (!strncmp (fsdp_buf[0], "inactive", 8)) - media->a_sendrecv_mode = FSDP_SENDRECV_INACTIVE; - else if (!strncmp (fsdp_buf[0], "sendrecv", 8)) - media->a_sendrecv_mode = FSDP_SENDRECV_SENDRECV; - else - { - /* ignore unknown attributes, but provide access to them */ - *longfsdp_buf = '\0'; - strncat (longfsdp_buf, fsdp_buf[0], MAXLONGFIELDLEN-1); - if (NULL == media->unidentified_attributes) - { - media->unidentified_attributes_count = 0; - media->unidentified_attributes = - calloc (UNIDENTIFIED_ATTRIBUTES_MAX_COUNT, - sizeof (char *)); - } - if (media->unidentified_attributes_count < - UNIDENTIFIED_ATTRIBUTES_MAX_COUNT) - { - media->unidentified_attributes - [media->unidentified_attributes_count] = - strdup (longfsdp_buf); - media->unidentified_attributes_count++; - } - } - NEXT_LINE (p); - } - else - return FSDPE_INVALID_ATTRIBUTE; - } - } /* end of for */ - } - - /* Check c= has been given at session level or at media level for - all media */ - if (NULL == dsc->c_address.address) - { - unsigned int c; - for (c = 0; c < dsc->media_announcements_count; c++) - if (NULL == dsc->media_announcements[c]->c_address.address) - return FSDPE_MISSING_CONNECTION_INFO; - } - - /* finish */ - if (*p == '\0') - return FSDPE_OK; - else - return FSDPE_OVERFILLED; -} - -static fsdp_error_t -fsdp_parse_c (const char **p, fsdp_network_type_t * ntype, - fsdp_address_type_t * atype, - fsdp_connection_address_t * address) -{ - const unsigned int TEMPCHARS = 3; - char fsdp_buf[TEMPCHARS][MAXSHORTFIELDLEN]; - - if (!strncmp (*p, "c=", 2)) - { - if (sscanf (*p, "c=%2s %3s %" MSFLENS "s", - fsdp_buf[0], fsdp_buf[1], fsdp_buf[2])) - { - if (!strncmp (fsdp_buf[0], "IN", 2)) - { - *ntype = FSDP_NETWORK_TYPE_INET; - if (!strncmp (fsdp_buf[1], "IP4", 3)) - *atype = FSDP_ADDRESS_TYPE_IPV4; - else if (!strncmp (fsdp_buf[1], "IP6", 3)) - *atype = FSDP_ADDRESS_TYPE_IPV6; - else - return FSDPE_INVALID_CONNECTION_NETTYPE; - } - else - { - return FSDPE_INVALID_CONNECTION_ADDRTYPE; - } - { - char *slash = strchr (fsdp_buf[2], '/'); - if (NULL == slash) - { - address->address = strdup (fsdp_buf[2]); - address->address_ttl = 0; - address->address_count = 0; - } - else - { - /* address is IP4 multicast */ - char *slash2; - *slash = '\0'; - slash++; - address->address = strdup (fsdp_buf[2]); - slash2 = strchr (slash + 1, '/'); - if (NULL == slash2) - { - address->address_ttl = strtol (slash, NULL, 10); - address->address_count = 0; - } - else - { - *slash2 = '\0'; - slash2++; - address->address_ttl = strtol (slash, NULL, 10); - address->address_count = strtol (slash2, NULL, 10); - } - } - } - NEXT_LINE (*p); - } - else - { - return FSDPE_INVALID_CONNECTION; - } - } - return FSDPE_OK; -} - -static fsdp_error_t -fsdp_parse_b (const char **p, fsdp_bw_modifier_t ** bw_modifiers, - unsigned int *bw_modifiers_count) -{ - char fsdp_buf[MAXSHORTFIELDLEN]; - unsigned long int wuint; - unsigned int i = 0; - const char *lp = *p; - - /* count b= lines */ - while (!strncmp (lp, "b=", 2)) - { - NEXT_LINE (lp); - i++; - } - *bw_modifiers = calloc (i, sizeof (fsdp_bw_modifier_t)); - *bw_modifiers_count = i; - - while (i > 0) - { - unsigned int index = *bw_modifiers_count - i; - if (2 == sscanf (*p, "b=%20[^:\r\n]:%lu", fsdp_buf, &wuint)) - { - if (!strncmp (fsdp_buf, "CT", 2)) - (*bw_modifiers)[index].b_mod_type = - FSDP_BW_MOD_TYPE_CONFERENCE_TOTAL; - else if (!strncmp (fsdp_buf, "AS", 2)) - (*bw_modifiers)[index].b_mod_type = - FSDP_BW_MOD_TYPE_APPLICATION_SPECIFIC; - else if (!strncmp (fsdp_buf, "RS", 2)) - (*bw_modifiers)[index].b_mod_type = FSDP_BW_MOD_TYPE_RTCP_SENDERS; - else if (!strncmp (fsdp_buf, "RR", 2)) - (*bw_modifiers)[index].b_mod_type = - FSDP_BW_MOD_TYPE_RTCP_RECEIVERS; - else - { - (*bw_modifiers)[index].b_mod_type = FSDP_BW_MOD_TYPE_UNKNOWN; - (*bw_modifiers)[index].b_unknown_bw_modt = - (char *) strdup (fsdp_buf); - } - (*bw_modifiers)[index].b_value = wuint; - NEXT_LINE (*p); - } - else - { - *bw_modifiers_count -= i; - return FSDPE_INVALID_BANDWIDTH; - } - i--; - } - return FSDPE_OK; -} - -static fsdp_error_t -fsdp_parse_k (const char **p, fsdp_encryption_method_t * method, - char **content) -{ - char fsdp_buf[MAXSHORTFIELDLEN]; - char longfsdp_buf[MAXLONGFIELDLEN]; - - if (!strncmp (*p, "k=", 2)) - { - if (sscanf (*p, "k=prompt")) - { - *method = FSDP_ENCRYPTION_METHOD_PROMPT; - *content = NULL; - NEXT_LINE (*p); - } - else - { - if (sscanf - (*p, "k=%6[^:\r\n]:%" MLFLENS "s", fsdp_buf, longfsdp_buf)) - { - if (!strncmp (fsdp_buf, "clear", 5)) - *method = FSDP_ENCRYPTION_METHOD_CLEAR; - else if (!strncmp (fsdp_buf, "base64", 6)) - *method = FSDP_ENCRYPTION_METHOD_BASE64; - else if (!strncmp (fsd