From c0ffeea62cb8472495562755ebfb40aea8fab71b Mon Sep 17 00:00:00 2001 From: Hendrik Sollich Date: Mon, 17 Jan 2022 20:55:45 +0100 Subject: [PATCH] fix: serialize all rtp, rtcp_fb and fmtp entrys --- src/attributes/rtpmap.rs | 8 ++++++++ src/lines/media.rs | 3 ++- src/udisplay.rs | 37 +++++++++++++++++++++++++++++++++---- 3 files changed, 43 insertions(+), 5 deletions(-) diff --git a/src/attributes/rtpmap.rs b/src/attributes/rtpmap.rs index de7c4b4..2513523 100644 --- a/src/attributes/rtpmap.rs +++ b/src/attributes/rtpmap.rs @@ -127,6 +127,14 @@ fn test_rtpmap_line() { assert_line_print!(rtpmap_line, "a=rtpmap:127 red/90000"); assert_line_print!(rtpmap_line, "a=rtpmap:123 rtx/90000"); assert_line_print!(rtpmap_line, "a=rtpmap:125 ulpfec/90000"); + assert_line!(rtpmap_line, "a=rtpmap:122 red/90000", + RtpMap { + payload: 122, + encoding_name: "red".into(), + clock_rate: Some(90_000), + encoding: None, + } +,print); assert_line!( rtpmap_line, "a=rtpmap:113 telephone-event/16000", diff --git a/src/lines/media.rs b/src/lines/media.rs index 58a41b4..361074a 100644 --- a/src/lines/media.rs +++ b/src/lines/media.rs @@ -9,6 +9,7 @@ use crate::parsers::*; #[cfg(test)] use crate::{assert_line, assert_line_print}; +/// [RFC4566#5.14](https://datatracker.ietf.org/doc/html/rfc4566#section-5.14) #[derive(Clone, IntoOwned, PartialEq)] #[cfg_attr(feature = "debug", derive(Debug))] #[cfg_attr( @@ -31,7 +32,7 @@ pub fn media_line(input: &str) -> IResult<&str, Media> { wsf(cowify(read_string)), // type wsf(read_number), // port wsf(slash_separated_cow_strings), // protocol - wsf(read_as_cow_strings), //payloads + wsf(read_as_cow_strings), // payloads )), |(r#type, port, protocol, payloads)| Media { r#type, diff --git a/src/udisplay.rs b/src/udisplay.rs index 40c9019..ee1ef21 100644 --- a/src/udisplay.rs +++ b/src/udisplay.rs @@ -110,14 +110,43 @@ impl ufmt::uDisplay for MediaSection<'_> { uwriteln!(f, "{}", rtcp_option)?; } - for payload in self.payloads.iter().filter_map(|p| p.parse::().ok()) { - for rtp in self.rtp_map.iter().filter(|r| r.payload == payload) { + let known_payloads = self + .payloads + .iter() + .filter_map(|p| p.parse::().ok()) + .collect::>(); + + for payload in &known_payloads { + for rtp in self.rtp_map.iter().filter(|r| r.payload == *payload) { uwriteln!(f, "{}", rtp)?; } - for rtcp_fb in self.rtcp_fb.iter().filter(|r| r.payload == payload) { + for rtcp_fb in self.rtcp_fb.iter().filter(|r| r.payload == *payload) { uwriteln!(f, "{}", rtcp_fb)?; } - for fmtp in self.fmtp.iter().filter(|r| r.payload == payload) { + for fmtp in self.fmtp.iter().filter(|r| r.payload == *payload) { + uwriteln!(f, "{}", fmtp)?; + } + } // one more round for those not listed in the fmt field + { + for rtp in self + .rtp_map + .iter() + .filter(|r| !known_payloads.contains(&r.payload)) + { + uwriteln!(f, "{}", rtp)?; + } + for rtcp_fb in self + .rtcp_fb + .iter() + .filter(|r| !known_payloads.contains(&r.payload)) + { + uwriteln!(f, "{}", rtcp_fb)?; + } + for fmtp in self + .fmtp + .iter() + .filter(|r| !known_payloads.contains(&r.payload)) + { uwriteln!(f, "{}", fmtp)?; } }