Skip to content

Commit d8db7bf

Browse files
committed
acap/aes67: Factor creating a Sap_session from SDP into own function
1 parent 87049aa commit d8db7bf

File tree

1 file changed

+52
-54
lines changed

1 file changed

+52
-54
lines changed

src/audio/capture/aes67.cpp

Lines changed: 52 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -299,63 +299,10 @@ static void start_rtp_thread(state_aes67_cap *s, const Sap_session& new_sess){
299299
s->rtp_thread = std::thread(aes67_rtp_worker, s, new_sess.streams[s->req_stream_idx]);
300300
}
301301

302-
static void parse_sap(state_aes67_cap *s, std::string_view sap){
303-
Sap_packet_view pkt = Sap_packet_view::from_buffer(sap.data(), sap.size());
304-
305-
if(!pkt.isValid()){
306-
log_msg(LOG_LEVEL_WARNING, MOD_NAME "Invalid SDP packet\n");
307-
return;
308-
}
309-
310-
if(pkt.isCompressed() || pkt.isEncrypted()){
311-
log_msg(LOG_LEVEL_WARNING, MOD_NAME "Compressed or encrypted SAP packets are not supported\n");
312-
return;
313-
}
314-
if(pkt.isIpv6()){
315-
log_msg(LOG_LEVEL_WARNING, MOD_NAME "IPv6 SAP packets are not supported\n");
316-
return;
317-
}
318-
319-
if(s->sap_hash_to_sess_id_map.find(pkt.hash) != s->sap_hash_to_sess_id_map.end()){
320-
if(pkt.isDeletion()){
321-
uint64_t sess_id = s->sap_hash_to_sess_id_map[pkt.hash];
322-
auto& sess = s->sap_sessions[sess_id];
323-
log_msg(LOG_LEVEL_NOTICE, MOD_NAME "Removing session %x\n", sess.unique_identifier);
324-
if(s->curr_sap_hash == sess.sap_hash){
325-
stop_rtp_thread(s);
326-
}
327-
s->sap_sessions.erase(sess_id);
328-
} else {
329-
log_msg(LOG_LEVEL_INFO, MOD_NAME "SAP with hash %x already known\n", pkt.hash);
330-
}
331-
332-
return;
333-
}
334-
335-
log_msg(LOG_LEVEL_NOTICE, MOD_NAME "New SAP %x\n", pkt.hash);
336-
337-
log_msg(LOG_LEVEL_VERBOSE, MOD_NAME "Source %u.%u.%u.%u\n",
338-
(unsigned char) pkt.source[0],
339-
(unsigned char) pkt.source[1],
340-
(unsigned char) pkt.source[2],
341-
(unsigned char) pkt.source[3]);
342-
343-
if(pkt.payload_type != "application/sdp"){
344-
log_msg(LOG_LEVEL_WARNING, MOD_NAME "Unknown SAP payload type \"%s\"\n", std::string(pkt.payload_type).c_str());
345-
return;
346-
}
347-
348-
Sdp_view sdp = Sdp_view::from_buffer(pkt.payload.data(), pkt.payload.size());
349-
350-
if(!sdp.isValid()){
351-
log_msg(LOG_LEVEL_ERROR, MOD_NAME "Failed to parse SDP\n");
352-
return;
353-
}
354-
302+
static Sap_session sap_session_from_sdp(const Sdp_view& sdp){
355303
Sap_session new_sess{};
356304
new_sess.unique_identifier = get_unique_sdp_identifier(sdp);
357305
new_sess.sess_ver = sdp.sess_version;
358-
new_sess.sap_hash = pkt.hash;
359306
new_sess.name = sdp.session_name;
360307
new_sess.description = sdp.session_info;
361308

@@ -417,6 +364,57 @@ static void parse_sap(state_aes67_cap *s, std::string_view sap){
417364
new_sess.streams.push_back(std::move(new_stream));
418365
}
419366

367+
return new_sess;
368+
}
369+
370+
static void parse_sap(state_aes67_cap *s, std::string_view sap){
371+
Sap_packet_view pkt = Sap_packet_view::from_buffer(sap.data(), sap.size());
372+
373+
if(!pkt.isValid()){
374+
log_msg(LOG_LEVEL_WARNING, MOD_NAME "Invalid SDP packet\n");
375+
return;
376+
}
377+
378+
if(pkt.isCompressed() || pkt.isEncrypted()){
379+
log_msg(LOG_LEVEL_WARNING, MOD_NAME "Compressed or encrypted SAP packets are not supported\n");
380+
return;
381+
}
382+
if(pkt.isIpv6()){
383+
log_msg(LOG_LEVEL_WARNING, MOD_NAME "IPv6 SAP packets are not supported\n");
384+
return;
385+
}
386+
387+
if(s->sap_hash_to_sess_id_map.find(pkt.hash) != s->sap_hash_to_sess_id_map.end()){
388+
if(pkt.isDeletion()){
389+
uint64_t sess_id = s->sap_hash_to_sess_id_map[pkt.hash];
390+
auto& sess = s->sap_sessions[sess_id];
391+
log_msg(LOG_LEVEL_NOTICE, MOD_NAME "Removing session %x\n", sess.unique_identifier);
392+
if(s->curr_sap_hash == sess.sap_hash){
393+
stop_rtp_thread(s);
394+
}
395+
s->sap_sessions.erase(sess_id);
396+
} else {
397+
log_msg(LOG_LEVEL_INFO, MOD_NAME "SAP with hash %x already known\n", pkt.hash);
398+
}
399+
400+
return;
401+
}
402+
403+
if(pkt.payload_type != "application/sdp"){
404+
log_msg(LOG_LEVEL_WARNING, MOD_NAME "Unknown SAP payload type \"%s\"\n", std::string(pkt.payload_type).c_str());
405+
return;
406+
}
407+
408+
Sdp_view sdp = Sdp_view::from_buffer(pkt.payload.data(), pkt.payload.size());
409+
410+
if(!sdp.isValid()){
411+
log_msg(LOG_LEVEL_ERROR, MOD_NAME "Failed to parse SDP\n");
412+
return;
413+
}
414+
415+
auto new_sess = sap_session_from_sdp(sdp);
416+
new_sess.sap_hash = pkt.hash;
417+
420418
s->sap_hash_to_sess_id_map[new_sess.sap_hash] = new_sess.unique_identifier;
421419

422420
if(auto it = s->sap_sessions.find(new_sess.unique_identifier); it != s->sap_sessions.end()){

0 commit comments

Comments
 (0)