@@ -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