stream-deploy/ZLM/3rdpart/media-server/librtsp/source/sdp-a-rtpmap.c

90 lines
2.0 KiB
C++

// RFC-4566 SDP
// 6. SDP Attributes (p25)
// a=rtpmap:<payload type> <encoding name>/<clock rate>[/<encoding parameters>]
//
// a=rtpmap:98 L16/16000/2
//
// m=<media> <port>/<number of ports> <transport> <fmt list>
// m=audio 49230 RTP/AVP 96 97 98
// a=rtpmap:96 L8/8000
// a=rtpmap:97 L16/8000
// a=rtpmap:98 L16/11025/2
#include "sdp-a-rtpmap.h"
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <stdio.h>
int sdp_a_rtpmap(const char* rtpmap, int *payload, char encoding[16], int* rate, char parameters[64])
{
const char *p1;
const char *p = rtpmap;
// payload type
p1 = strchr(p, ' ');
if(!p1)
return -1;
if(payload)
{
*payload = atoi(p);
}
p = p1 + 1;
// encoding name
assert(' ' == *p1);
p1 = strchr(p, '/');
if(!p1)
return -1;
if(encoding)
{
if (p1 - p < 16)
snprintf(encoding, 16, "%.*s", (int)(p1 - p), p);
else
*encoding = 0;
}
// clock rate
assert('/' == *p1);
if(rate)
{
*rate = atoi(p1+1);
}
// encoding parameters
if(parameters)
{
p1 = strchr(p1 + 1, '/');
if (p1 && strlen(p1) < 64)
snprintf(parameters, 64, "%s", p1 + 1);
else
*parameters = 0;
}
return 0;
}
#if defined(DEBUG) || defined(_DEBUG)
void sdp_a_rtpmap_test(void)
{
int payload = 0;
int rate = 0;
char encoding[32] = { 0 };
char parameters[64] = { 0 };
assert(0 == sdp_a_rtpmap("96 L8/8000", &payload, encoding, &rate, parameters));
assert(96 == payload && 8000 == rate && 0 == strcmp(encoding, "L8") && '\0' == parameters[0]);
assert(0 == sdp_a_rtpmap("97 L16/8000", &payload, encoding, &rate, parameters));
assert(97 == payload && 8000 == rate && 0 == strcmp(encoding, "L16") && '\0' == parameters[0]);
assert(0 == sdp_a_rtpmap("98 L16/11025/2", &payload, encoding, &rate, parameters));
assert(98 == payload && 11025 == rate && 0 == strcmp(encoding, "L16") && 0==strcmp("2", parameters));
assert(0 == sdp_a_rtpmap("102 G726-16/8000", &payload, encoding, &rate, parameters));
assert(102 == payload && 8000 == rate && 0 == strcmp(encoding, "G726-16") && 0 == strcmp("", parameters));
}
#endif