mirror of https://github.com/mpv-player/mpv
275 lines
7.1 KiB
C
275 lines
7.1 KiB
C
/*
|
|
This file is part of FreeSDP
|
|
Copyright (C) 2001,2002,2003 Federico Montesino Pouzols <fedemp@altern.org>
|
|
|
|
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 priv.h
|
|
*
|
|
* @short Common private header for both formatting and parsing modules.
|
|
**/
|
|
|
|
#ifndef FSDP_PRIV_H
|
|
#define FSDP_PRIV_H
|
|
|
|
#define _GNU_SOURCE
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include "common.h"
|
|
|
|
#define NTP_EPOCH_OFFSET 2208988800UL
|
|
|
|
#define FSDP_MAX_LENGTH 2000
|
|
|
|
/* Tags for doxygen documentation */
|
|
|
|
/**
|
|
* @mainpage FreeSDP Library Reference Manual
|
|
* @section overview Overview (README)
|
|
* @verbinclude ../../README
|
|
*
|
|
**/
|
|
|
|
/**
|
|
* @example formatdemo.c
|
|
*
|
|
* A basic SDP descriptions formatter based on FreeSDP.
|
|
**/
|
|
|
|
/**
|
|
* @example parsedemo.c
|
|
*
|
|
* A basic SDP descriptions parser based on FreeSDP.
|
|
**/
|
|
|
|
/* Private routines declarations */
|
|
|
|
BEGIN_C_DECLS
|
|
/**
|
|
* @short bandwidth modifier
|
|
*
|
|
* Holds type of modifier and value. Also holds the literal bandwidth
|
|
* modifier if unknown.
|
|
**/
|
|
typedef struct
|
|
{
|
|
fsdp_bw_modifier_type_t b_mod_type;
|
|
unsigned long int b_value;
|
|
char *b_unknown_bw_modt;
|
|
} fsdp_bw_modifier_t;
|
|
|
|
/**
|
|
* @short a=rtpmap: attribute
|
|
*
|
|
* Holds payload type, enconding name, RTP clock rate, and encofing
|
|
* parameters.
|
|
**/
|
|
typedef struct
|
|
{
|
|
char *pt;
|
|
char *encoding_name;
|
|
unsigned int clock_rate;
|
|
char *parameters;
|
|
} fsdp_rtpmap_t;
|
|
|
|
/**
|
|
* @short Connection address specification
|
|
*
|
|
* Holds address (unicast or multicast) as well as TTL and number of
|
|
* ports, when it is an IP4 multicast address.
|
|
**/
|
|
typedef struct fsdp_connection_address_t_s
|
|
{
|
|
char *address;
|
|
unsigned int address_ttl;
|
|
unsigned int address_count;
|
|
} fsdp_connection_address_t;
|
|
|
|
/**
|
|
* @short Struct for each media in a session description.
|
|
**/
|
|
struct fsdp_media_description_t_s
|
|
{
|
|
/* from `m=<media> <port> <transport> <fmt list>' line */
|
|
fsdp_media_t media_type;
|
|
unsigned int port;
|
|
unsigned int port_count;
|
|
fsdp_transport_protocol_t transport;
|
|
char **formats;
|
|
unsigned int formats_count;
|
|
/* from i=<media title> */
|
|
char *i_title;
|
|
/* from `c=<network type> <address type> <connection address>' line
|
|
(optional) */
|
|
fsdp_network_type_t c_network_type;
|
|
fsdp_address_type_t c_address_type;
|
|
fsdp_connection_address_t c_address;
|
|
/* from `b=<modifier>:<bandwidth-value>' lines (optional) */
|
|
fsdp_bw_modifier_t *bw_modifiers;
|
|
unsigned int bw_modifiers_count;
|
|
/* from `k=<method>' or `k=<method>:<encryption key>' line
|
|
(optional) */
|
|
fsdp_encryption_method_t k_encryption_method;
|
|
char *k_encryption_content;
|
|
/* from `a=<attribute>' or `a=<attribute>:<value>' lines (opt) */
|
|
unsigned long int a_ptime;
|
|
unsigned long int a_maxptime;
|
|
/* rtpmap */
|
|
fsdp_rtpmap_t **a_rtpmaps;
|
|
unsigned int a_rtpmaps_count;
|
|
fsdp_orient_t a_orient;
|
|
fsdp_sendrecv_mode_t a_sendrecv_mode;
|
|
|
|
char **a_sdplangs;
|
|
unsigned int a_sdplangs_count;
|
|
char **a_langs;
|
|
unsigned int a_langs_count;
|
|
|
|
char **a_controls;
|
|
unsigned int a_controls_count;
|
|
|
|
char *a_range;
|
|
|
|
float a_framerate;
|
|
unsigned int a_quality;
|
|
char **a_fmtps;
|
|
unsigned int a_fmtps_count;
|
|
/* rtcp attribute */
|
|
unsigned int a_rtcp_port;
|
|
fsdp_network_type_t a_rtcp_network_type;
|
|
fsdp_address_type_t a_rtcp_address_type;
|
|
char *a_rtcp_address;
|
|
/* media attributes that are not directly supported */
|
|
char **unidentified_attributes;
|
|
unsigned int unidentified_attributes_count;
|
|
};
|
|
|
|
typedef struct fsdp_media_description_t_s fsdp_media_announcement_t;
|
|
|
|
/**
|
|
* @short Information for a repeat (struct for r= lines)
|
|
**/
|
|
typedef struct
|
|
{
|
|
/* times in seconds */
|
|
unsigned long int interval;
|
|
unsigned long int duration;
|
|
unsigned long int *offsets;
|
|
unsigned int offsets_count;
|
|
} fsdp_repeat_t;
|
|
|
|
/**
|
|
* @short Information about a time period
|
|
*
|
|
* The start and stop times as well as the information from the r=
|
|
* lines for a t= line are stored in this structures.
|
|
**/
|
|
typedef struct
|
|
{
|
|
time_t start;
|
|
time_t stop;
|
|
fsdp_repeat_t **repeats;
|
|
unsigned int repeats_count;
|
|
} fsdp_time_period_t;
|
|
|
|
/**
|
|
* @short Struct for session descriptions.
|
|
**/
|
|
struct fsdp_description_t_s
|
|
{
|
|
/* from v=... line */
|
|
unsigned int version;
|
|
/* from o=... line */
|
|
char *o_username;
|
|
char *o_session_id;
|
|
char *o_announcement_version;
|
|
fsdp_network_type_t o_network_type;
|
|
fsdp_address_type_t o_address_type;
|
|
char *o_address;
|
|
/* from s=... line */
|
|
char *s_name;
|
|
/* from i=... line (opt) */
|
|
char *i_information;
|
|
/* from u=... line (opt) */
|
|
char *u_uri;
|
|
/* from e=... lines (0 or more) */
|
|
const char **emails;
|
|
unsigned int emails_count;
|
|
/* from p=... lines (0 or more) */
|
|
const char **phones;
|
|
unsigned int phones_count;
|
|
/* from `c=<network type> <address type> <connection address>' line */
|
|
fsdp_network_type_t c_network_type;
|
|
fsdp_address_type_t c_address_type;
|
|
fsdp_connection_address_t c_address;
|
|
/* from `b=<modifier>:<bandwidth-value>' lines (optional) */
|
|
fsdp_bw_modifier_t *bw_modifiers;
|
|
unsigned int bw_modifiers_count;
|
|
/* from `t=<start time> <stop time>' lines (1 or more) */
|
|
/* from `r=<repeat interval> <active duration> <list of offsets from
|
|
start-time>' */
|
|
fsdp_time_period_t **time_periods;
|
|
unsigned int time_periods_count;
|
|
/* from `z=<adjustment time> <offset> <adjustment time> <offset>
|
|
....' lines */
|
|
char *timezone_adj;
|
|
/* from `k=<method>' or `k=<method>:<encryption key>' line (opt) */
|
|
fsdp_encryption_method_t k_encryption_method;
|
|
char *k_encryption_content;
|
|
/* from `a=<attribute>' or `a=<attribute>:<value>' lines (opt) */
|
|
char *a_category;
|
|
char *a_keywords;
|
|
char *a_tool;
|
|
char *a_range;
|
|
/* rtpmap */
|
|
fsdp_rtpmap_t **a_rtpmaps;
|
|
unsigned int a_rtpmaps_count;
|
|
fsdp_sendrecv_mode_t a_sendrecv_mode;
|
|
fsdp_session_type_t a_type;
|
|
char *a_charset;
|
|
|
|
char **a_sdplangs;
|
|
unsigned int a_sdplangs_count;
|
|
char **a_langs;
|
|
unsigned int a_langs_count;
|
|
|
|
char **a_controls;
|
|
unsigned int a_controls_count;
|
|
/* from `m=<media> <port>/<number of ports> <transport> <fmt list>'
|
|
lines [one or more] */
|
|
fsdp_media_announcement_t **media_announcements;
|
|
unsigned int media_announcements_count;
|
|
/* session attributes that are not directly supported */
|
|
char **unidentified_attributes;
|
|
unsigned int unidentified_attributes_count;
|
|
};
|
|
|
|
#define MEDIA_RTPMAPS_MAX_COUNT 5
|
|
#define SDPLANGS_MAX_COUNT 5
|
|
#define SDPCONTROLS_MAX_COUNT 10
|
|
#define UNIDENTIFIED_ATTRIBUTES_MAX_COUNT 5
|
|
|
|
END_C_DECLS
|
|
#endif /* FSDP_PRIV_H */
|