📄 sdp_encode.c
字号:
dohead = !dohead;
aptr = aptr->next;
}
if (dohead == FALSE)
ADD_STR_TO_ENCODE_WITH_RETURN(se, "\n");
return (0);
}
static int encode_orient (media_desc_t *mptr, sdp_encode_t *se)
{
const char *temp;
switch (mptr->orient_type) {
case ORIENT_TYPE_NONE:
default:
return (0);
case ORIENT_TYPE_PORTRAIT:
temp = "portrait";
break;
case ORIENT_TYPE_LANDSCAPE:
temp = "landscape";
break;
case ORIENT_TYPE_SEASCAPE:
temp = "seascape";
break;
case ORIENT_TYPE_USER:
temp = mptr->orient_user_type;
break;
}
ADD_STR_TO_ENCODE_WITH_RETURN(se, "a=orient:");
ADD_STR_TO_ENCODE_WITH_RETURN(se, temp);
ADD_STR_TO_ENCODE_WITH_RETURN(se, "\n");
return(0);
}
static int encode_media (media_desc_t *mptr, sdp_encode_t *se)
{
format_list_t *fptr;
char buffer[80];
ADD_STR_TO_ENCODE_WITH_RETURN(se, "m=");
ADD_STR_TO_ENCODE_WITH_RETURN(se, mptr->media);
sprintf(buffer, " %u", mptr->port);
ADD_STR_TO_ENCODE_WITH_RETURN(se, buffer);
if (mptr->num_ports) {
sprintf(buffer,"/%u", mptr->num_ports);
ADD_STR_TO_ENCODE_WITH_RETURN(se, buffer);
}
ADD_STR_TO_ENCODE_WITH_RETURN(se, " ");
ADD_STR_TO_ENCODE_WITH_RETURN(se, mptr->proto);
fptr = mptr->fmt;
while (fptr != NULL) {
ADD_STR_TO_ENCODE_WITH_RETURN(se, " ");
ADD_STR_TO_ENCODE_WITH_RETURN(se, fptr->fmt);
fptr = fptr->next;
}
ADD_STR_TO_ENCODE_WITH_RETURN(se, "\n");
if (mptr->media_desc) {
ADD_STR_TO_ENCODE_WITH_RETURN(se, "i=");
ADD_STR_TO_ENCODE_WITH_RETURN(se, mptr->media_desc);
ADD_STR_TO_ENCODE_WITH_RETURN(se, "\n");
}
if (mptr->media_connect.used) {
CHECK_RETURN(encode_connect(&mptr->media_connect, se));
}
CHECK_RETURN(encode_bandwidth(mptr->media_bandwidth, se));
CHECK_RETURN(encode_key(&mptr->key, se));
if (mptr->ptime_present) {
ADD_STR_TO_ENCODE_WITH_RETURN(se, "a=ptime:");
sprintf(buffer, "%u\n", mptr->ptime);
ADD_STR_TO_ENCODE_WITH_RETURN(se, buffer);
}
if (mptr->quality_present) {
ADD_STR_TO_ENCODE_WITH_RETURN(se, "a=quality:");
sprintf(buffer, "%u\n", mptr->quality);
ADD_STR_TO_ENCODE_WITH_RETURN(se, buffer);
}
if (mptr->framerate_present) {
ADD_STR_TO_ENCODE_WITH_RETURN(se, "a=framerate:");
sprintf(buffer, "%g\n", mptr->framerate);
ADD_STR_TO_ENCODE_WITH_RETURN(se, buffer);
}
if (mptr->control_string) {
ADD_STR_TO_ENCODE_WITH_RETURN(se, "a=control:");
ADD_STR_TO_ENCODE_WITH_RETURN(se, mptr->control_string);
ADD_STR_TO_ENCODE_WITH_RETURN(se, "\n");
}
if (mptr->sdplang) {
ADD_STR_TO_ENCODE_WITH_RETURN(se, "a=sdplang:");
ADD_STR_TO_ENCODE_WITH_RETURN(se, mptr->sdplang);
ADD_STR_TO_ENCODE_WITH_RETURN(se, "\n");
}
if (mptr->lang) {
ADD_STR_TO_ENCODE_WITH_RETURN(se, "a=lang:");
ADD_STR_TO_ENCODE_WITH_RETURN(se, mptr->lang);
ADD_STR_TO_ENCODE_WITH_RETURN(se, "\n");
}
fptr = mptr->fmt;
while (fptr != NULL) {
if (fptr->rtpmap != NULL) {
ADD_STR_TO_ENCODE_WITH_RETURN(se, "a=rtpmap:");
ADD_STR_TO_ENCODE_WITH_RETURN(se, fptr->fmt);
ADD_STR_TO_ENCODE_WITH_RETURN(se, " ");
ADD_STR_TO_ENCODE_WITH_RETURN(se, fptr->rtpmap->encode_name);
sprintf(buffer, "/%u", fptr->rtpmap->clock_rate);
ADD_STR_TO_ENCODE_WITH_RETURN(se, buffer);
if (fptr->rtpmap->encode_param != 0) {
sprintf(buffer, "/%u", fptr->rtpmap->encode_param);
ADD_STR_TO_ENCODE_WITH_RETURN(se, buffer);
}
ADD_STR_TO_ENCODE_WITH_RETURN(se, "\n");
}
if (fptr->fmt_param != NULL) {
ADD_STR_TO_ENCODE_WITH_RETURN(se, "a=fmtp:");
ADD_STR_TO_ENCODE_WITH_RETURN(se, fptr->fmt);
ADD_STR_TO_ENCODE_WITH_RETURN(se, " ");
ADD_STR_TO_ENCODE_WITH_RETURN(se, fptr->fmt_param);
ADD_STR_TO_ENCODE_WITH_RETURN(se, "\n");
}
fptr = fptr->next;
}
CHECK_RETURN(encode_a_ints(mptr->recvonly,
mptr->sendrecv,
mptr->sendonly,
se));
CHECK_RETURN(encode_orient(mptr, se));
CHECK_RETURN(encode_range(&mptr->media_range, se));
CHECK_RETURN(encode_string_list(mptr->unparsed_a_lines, se, "", NULL));
return (0);
}
static int sdp_encode (session_desc_t *sptr, sdp_encode_t *se)
{
int temp, temp1;
media_desc_t *mptr;
char buffer[80];
if (sptr->create_addr_type == NULL ||
sptr->create_addr == NULL) {
return (ESDP_ORIGIN);
}
ADD_STR_TO_ENCODE_WITH_RETURN(se, "v=0\no=");
ADD_STR_TO_ENCODE_WITH_RETURN(se,
sptr->orig_username == NULL ?
"-" : sptr->orig_username);
sprintf(buffer, " %lld %lld IN ",
sptr->session_id,
sptr->session_version);
ADD_STR_TO_ENCODE_WITH_RETURN(se, buffer);
ADD_STR_TO_ENCODE_WITH_RETURN(se, sptr->create_addr_type);
ADD_STR_TO_ENCODE_WITH_RETURN(se, " ");
ADD_STR_TO_ENCODE_WITH_RETURN(se, sptr->create_addr);
ADD_STR_TO_ENCODE_WITH_RETURN(se, "\ns=");
ADD_STR_TO_ENCODE_WITH_RETURN(se, sptr->session_name);
ADD_STR_TO_ENCODE_WITH_RETURN(se, "\n");
if (sptr->session_desc != NULL) {
ADD_STR_TO_ENCODE_WITH_RETURN(se, "i=");
ADD_STR_TO_ENCODE_WITH_RETURN(se, sptr->session_desc);
ADD_STR_TO_ENCODE_WITH_RETURN(se, "\n");
}
if (sptr->uri != NULL) {
ADD_STR_TO_ENCODE_WITH_RETURN(se, "u=");
ADD_STR_TO_ENCODE_WITH_RETURN(se, sptr->uri);
ADD_STR_TO_ENCODE_WITH_RETURN(se, "\n");
}
CHECK_RETURN(encode_string_list(sptr->admin_email, se, "e=", &temp));
CHECK_RETURN(encode_string_list(sptr->admin_phone, se, "p=", &temp1));
if (temp + temp1 == 0) {
ADD_STR_TO_ENCODE_WITH_RETURN(se, "e=NONE\n");
}
if (sptr->session_connect.used) {
CHECK_RETURN(encode_connect(&sptr->session_connect, se));
}
CHECK_RETURN(encode_bandwidth(sptr->session_bandwidth, se));
CHECK_RETURN(encode_time(sptr->time_desc, se));
CHECK_RETURN(encode_time_adj(sptr->time_adj_desc, se));
CHECK_RETURN(encode_key(&sptr->key, se));
if (sptr->control_string) {
ADD_STR_TO_ENCODE_WITH_RETURN(se, "a=control:");
ADD_STR_TO_ENCODE_WITH_RETURN(se, sptr->control_string);
ADD_STR_TO_ENCODE_WITH_RETURN(se, "\n");
}
CHECK_RETURN(encode_category(sptr->category_list, se));
if (sptr->keywds) {
ADD_STR_TO_ENCODE_WITH_RETURN(se, "u=");
ADD_STR_TO_ENCODE_WITH_RETURN(se, sptr->uri);
ADD_STR_TO_ENCODE_WITH_RETURN(se, "\n");
}
CHECK_RETURN(encode_conf_type(sptr, se));
if (sptr->tool) {
ADD_STR_TO_ENCODE_WITH_RETURN(se, "a=tool:");
ADD_STR_TO_ENCODE_WITH_RETURN(se, sptr->tool);
ADD_STR_TO_ENCODE_WITH_RETURN(se, "\n");
}
if (sptr->charset) {
ADD_STR_TO_ENCODE_WITH_RETURN(se, "a=charset:");
ADD_STR_TO_ENCODE_WITH_RETURN(se, sptr->charset);
ADD_STR_TO_ENCODE_WITH_RETURN(se, "\n");
}
if (sptr->sdplang) {
ADD_STR_TO_ENCODE_WITH_RETURN(se, "a=sdplang:");
ADD_STR_TO_ENCODE_WITH_RETURN(se, sptr->sdplang);
ADD_STR_TO_ENCODE_WITH_RETURN(se, "\n");
}
if (sptr->lang) {
ADD_STR_TO_ENCODE_WITH_RETURN(se, "a=lang:");
ADD_STR_TO_ENCODE_WITH_RETURN(se, sptr->lang);
ADD_STR_TO_ENCODE_WITH_RETURN(se, "\n");
}
if (sptr->etag) {
ADD_STR_TO_ENCODE_WITH_RETURN(se, "a=etag:");
ADD_STR_TO_ENCODE_WITH_RETURN(se, sptr->etag);
ADD_STR_TO_ENCODE_WITH_RETURN(se, "\n");
}
CHECK_RETURN(encode_range(&sptr->session_range, se));
CHECK_RETURN(encode_a_ints(sptr->recvonly,
sptr->sendrecv,
sptr->sendonly,
se));
CHECK_RETURN(encode_string_list(sptr->unparsed_a_lines, se, "", NULL));
mptr = sptr->media;
while (mptr != NULL) {
CHECK_RETURN(encode_media(mptr, se));
mptr = mptr->next;
}
return (0);
}
int sdp_encode_one_to_file (session_desc_t *sptr,
const char *filename,
int append)
{
FILE *ofile;
sdp_encode_t sdp;
CHECK_RETURN(prepare_sdp_encode(&sdp));
CHECK_RETURN(sdp_encode(sptr, &sdp));
ofile = fopen(filename, append ? "a" : "w");
if (ofile == NULL) {
free(sdp.buffer);
return (-1);
}
fputs(sdp.buffer, ofile);
fclose(ofile);
free(sdp.buffer);
return (0);
}
int sdp_encode_list_to_file (session_desc_t *sptr,
const char *filename,
int append)
{
FILE *ofile;
sdp_encode_t sdp;
int ret;
CHECK_RETURN(prepare_sdp_encode(&sdp));
ofile = fopen(filename, append ? "a" : "w");
if (ofile == NULL) {
free(sdp.buffer);
return (-1);
}
while (sptr != NULL) {
sdp.used = 0;
ret = sdp_encode(sptr, &sdp);
if (ret != 0) {
break;
}
fputs(sdp.buffer, ofile);
sptr = sptr->next;
}
fclose(ofile);
free(sdp.buffer);
return (0);
}
int sdp_encode_one_to_memory (session_desc_t *sptr, char **mem)
{
sdp_encode_t sdp;
int ret;
*mem = NULL;
CHECK_RETURN(prepare_sdp_encode(&sdp));
ret = sdp_encode(sptr, &sdp);
if (ret != 0) {
free(sdp.buffer);
return (ret);
}
*mem = sdp.buffer;
return (0);
}
int sdp_encode_list_to_memory (session_desc_t *sptr, char **mem, int *count)
{
sdp_encode_t sdp;
int ret;
int cnt;
*mem = NULL;
CHECK_RETURN(prepare_sdp_encode(&sdp));
cnt = 0;
ret = 0;
while (sptr != NULL && ret == 0) {
ret = sdp_encode(sptr, &sdp);
if (ret == 0)
cnt++;
sptr = sptr->next;
}
*mem = sdp.buffer;
if (count != NULL)
*count = cnt;
return (ret);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -