#ifndef _LIBSDP_H_
#define _LIBSDP_H_
#ifdef __cplusplus
extern "C" {
#endif
#ifdef SDP_API_EXPORTS
# ifdef _WIN32
# define SDP_API __declspec(dllexport)
# else
# define SDP_API __attribute__((visibility("default")))
# endif
#else
# define SDP_API
#endif
#include <errno.h>
#include <inttypes.h>
#include <time.h>
#include <futils/list.h>
enum sdp_media_type {
SDP_MEDIA_TYPE_AUDIO = 0,
SDP_MEDIA_TYPE_VIDEO,
SDP_MEDIA_TYPE_TEXT,
SDP_MEDIA_TYPE_APPLICATION,
SDP_MEDIA_TYPE_MESSAGE,
SDP_MEDIA_TYPE_MAX,
};
enum sdp_start_mode {
SDP_START_MODE_UNSPECIFIED = 0,
SDP_START_MODE_RECVONLY,
SDP_START_MODE_SENDRECV,
SDP_START_MODE_SENDONLY,
SDP_START_MODE_INACTIVE,
SDP_START_MODE_MAX,
};
enum sdp_rtcp_xr_rtt_report_mode {
SDP_RTCP_XR_RTT_REPORT_NONE = 0,
SDP_RTCP_XR_RTT_REPORT_ALL,
SDP_RTCP_XR_RTT_REPORT_SENDER,
SDP_RTCP_XR_RTT_REPORT_MAX,
};
struct sdp_attr {
char *key;
char *value;
struct list_node node;
};
enum sdp_time_format {
SDP_TIME_FORMAT_UNKNOWN = 0,
SDP_TIME_FORMAT_NPT,
SDP_TIME_FORMAT_SMPTE,
SDP_TIME_FORMAT_ABSOLUTE,
};
struct sdp_time_npt {
int now;
int infinity;
time_t sec;
uint32_t usec;
};
struct sdp_time_smpte {
int infinity;
time_t sec;
unsigned int frames;
};
struct sdp_time_absolute {
int infinity;
time_t sec;
uint32_t usec;
};
struct sdp_time {
enum sdp_time_format format;
union {
struct sdp_time_npt npt;
struct sdp_time_smpte smpte;
struct sdp_time_absolute absolute;
};
};
struct sdp_range {
struct sdp_time start;
struct sdp_time stop;
};
struct sdp_h264_fmtp {
int valid;
unsigned int packetization_mode;
unsigned int profile_idc;
unsigned int profile_iop;
unsigned int level_idc;
uint8_t *sps;
unsigned int sps_size;
uint8_t *pps;
unsigned int pps_size;
};
struct sdp_rtcp_xr {
int valid;
int loss_rle_report;
unsigned int loss_rle_report_max_size;
int dup_rle_report;
unsigned int dup_rle_report_max_size;
int pkt_receipt_times_report;
unsigned int pkt_receipt_times_report_max_size;
enum sdp_rtcp_xr_rtt_report_mode rtt_report;
unsigned int rtt_report_max_size;
int stats_summary_report_loss;
int stats_summary_report_dup;
int stats_summary_report_jitter;
int stats_summary_report_ttl;
int stats_summary_report_hl;
int voip_metrics_report;
int djb_metrics_report;
};
struct sdp_media {
enum sdp_media_type type;
char *media_title;
char *connection_addr;
int multicast;
unsigned int dst_stream_port;
unsigned int dst_control_port;
unsigned int payload_type;
char *control_url;
enum sdp_start_mode start_mode;
struct sdp_range range;
char *encoding_name;
char *encoding_params;
unsigned int clock_rate;
struct sdp_h264_fmtp h264_fmtp;
struct sdp_rtcp_xr rtcp_xr;
unsigned int attr_count;
struct list_node attrs;
struct list_node node;
};
struct sdp_session {
int deletion;
uint64_t session_id;
uint64_t session_version;
char *server_addr;
char *session_name;
char *session_info;
char *uri;
char *email;
char *phone;
char *tool;
char *type;
char *charset;
char *connection_addr;
int multicast;
char *control_url;
enum sdp_start_mode start_mode;
struct sdp_range range;
struct sdp_rtcp_xr rtcp_xr;
unsigned int attr_count;
struct list_node attrs;
unsigned int media_count;
struct list_node medias;
};
SDP_API struct sdp_session *sdp_session_new(void);
SDP_API int sdp_session_destroy(struct sdp_session *session);
SDP_API int sdp_session_copy(const struct sdp_session *src,
struct sdp_session *dst);
SDP_API int sdp_session_compare(const struct sdp_session *a,
const struct sdp_session *b);
SDP_API struct sdp_media *sdp_media_new(void);
SDP_API int sdp_media_destroy(struct sdp_media *media);
SDP_API int sdp_media_copy(const struct sdp_media *src, struct sdp_media *dst);
SDP_API struct sdp_attr *sdp_attr_new(void);
SDP_API int sdp_attr_destroy(struct sdp_attr *attr);
SDP_API int sdp_attr_copy(const struct sdp_attr *src, struct sdp_attr *dst);
SDP_API int sdp_session_attr_add(struct sdp_session *session,
struct sdp_attr **ret_obj);
SDP_API int sdp_session_attr_add_existing(struct sdp_session *session,
struct sdp_attr *attr);
SDP_API int sdp_session_attr_remove(struct sdp_session *session,
struct sdp_attr *attr);
SDP_API int sdp_session_media_add(struct sdp_session *session,
struct sdp_media **ret_obj);
SDP_API int sdp_session_media_add_existing(struct sdp_session *session,
struct sdp_media *media);
SDP_API int sdp_session_media_remove(struct sdp_session *session,
struct sdp_media *media);
SDP_API int sdp_media_attr_add(struct sdp_media *media,
struct sdp_attr **ret_obj);
SDP_API int sdp_media_attr_add_existing(struct sdp_media *media,
struct sdp_attr *attr);
SDP_API int sdp_media_attr_remove(struct sdp_media *media,
struct sdp_attr *attr);
SDP_API int sdp_description_read(const char *session_desc,
struct sdp_session **ret_obj);
SDP_API int sdp_description_write(const struct sdp_session *session,
char **ret_str);
SDP_API const char *sdp_media_type_str(enum sdp_media_type val);
SDP_API const char *sdp_start_mode_str(enum sdp_start_mode val);
SDP_API const char *
sdp_rtcp_xr_rtt_report_mode_str(enum sdp_rtcp_xr_rtt_report_mode val);
SDP_API const char *sdp_time_format_str(enum sdp_time_format val);
static inline int sdp_time_us_to_npt(uint64_t time_us,
struct sdp_time_npt *time_npt)
{
if (time_npt == NULL)
return -EINVAL;
time_npt->now = 0;
time_npt->infinity = 0;
time_npt->sec = time_us / 1000000;
time_npt->usec = time_us - time_npt->sec * 1000000;
return 0;
}
static inline int sdp_time_npt_to_us(const struct sdp_time_npt *time_npt,
uint64_t *time_us)
{
if ((time_npt == NULL) || (time_us == NULL))
return -EINVAL;
if ((time_npt->now) || (time_npt->infinity))
return -EINVAL;
*time_us = time_npt->sec * 1000000 + time_npt->usec;
return 0;
}
#ifdef __cplusplus
}
#endif
#endif