mirror of
https://github.com/DigitalDevices/pvr.octonet.git
synced 2023-10-10 13:36:57 +02:00
rtsp_client: Parse RTCP APP packets
This commit is contained in:
parent
415d2c98ac
commit
c5b90f130b
@ -124,6 +124,16 @@ static url parse_url(const std::string& str) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void split_string(const string& s, char delim, vector<string>& elems) {
|
||||||
|
stringstream ss;
|
||||||
|
ss.str(s);
|
||||||
|
|
||||||
|
string item;
|
||||||
|
while(getline(ss, item, delim)) {
|
||||||
|
elems.push_back(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int tcp_sock_read_line(string &line) {
|
static int tcp_sock_read_line(string &line) {
|
||||||
static string buf;
|
static string buf;
|
||||||
|
|
||||||
@ -375,11 +385,49 @@ error:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void parse_rtcp(const char *buf, int size) {
|
||||||
|
int offset = 0;
|
||||||
|
while(size > 4) {
|
||||||
|
const rtcp_app *app = reinterpret_cast<const rtcp_app *>(buf + offset);
|
||||||
|
uint16_t len = 4 * (ntohs(app->len) + 1);
|
||||||
|
|
||||||
|
if((app->pt != 204) || (memcmp(app->name, "SES1", 4) != 0)) {
|
||||||
|
size -= len;
|
||||||
|
offset += len;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t string_len = ntohs(app->string_len);
|
||||||
|
string app_data(&buf[offset + sizeof(rtcp_app)], string_len);
|
||||||
|
|
||||||
|
vector<string> elems;
|
||||||
|
split_string(app_data, ';', elems);
|
||||||
|
if(elems.size() != 4) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<string> tuner;
|
||||||
|
split_string(elems[2], ',', tuner);
|
||||||
|
if(tuner.size() < 4) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
rtsp->level = atoi(tuner[1].c_str());
|
||||||
|
rtsp->quality = atoi(tuner[3].c_str());
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int rtsp_read(void *buf, unsigned buf_size) {
|
int rtsp_read(void *buf, unsigned buf_size) {
|
||||||
sockaddr addr;
|
sockaddr addr;
|
||||||
socklen_t addr_len = sizeof(addr);
|
socklen_t addr_len = sizeof(addr);
|
||||||
int ret = rtsp->udp_sock.recvfrom((char *)buf, buf_size, (sockaddr *)&addr, &addr_len);
|
int ret = rtsp->udp_sock.recvfrom((char *)buf, buf_size, (sockaddr *)&addr, &addr_len);
|
||||||
|
|
||||||
|
char rtcp_buf[RTCP_BUFFER_SIZE];
|
||||||
|
int rtcp_len = rtsp->rtcp_sock.recvfrom(rtcp_buf, RTCP_BUFFER_SIZE, (sockaddr *)&addr, &addr_len);
|
||||||
|
parse_rtcp(rtcp_buf, rtcp_len);
|
||||||
|
|
||||||
// TODO: check ip
|
// TODO: check ip
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
Loading…
Reference in New Issue
Block a user