use super::errors::Result;
use sdp::extmap;
use webrtc::api::media_engine::MediaEngine;
use webrtc::rtp_transceiver::rtp_codec::RTCRtpCodecCapability;
use webrtc::rtp_transceiver::rtp_codec::RTCRtpCodecParameters;
use webrtc::rtp_transceiver::rtp_codec::RTCRtpHeaderExtensionCapability;
use webrtc::rtp_transceiver::rtp_codec::RTPCodecType;
use webrtc::rtp_transceiver::RTCPFeedback;
const MIME_TYPE_H264: &str = "video/h264";
const MIME_TYPE_OPUS: &str = "audio/opus";
const MIME_TYPE_VP8: &str = "video/vp8";
const MIME_TYPE_VP9: &str = "video/vp9";
const FRAME_MARKING: &str = "urn:ietf:params:rtp-hdrext:framemarking";
pub(super) async fn get_publisher_media_engine() -> Result<MediaEngine> {
let mut me = MediaEngine::default();
me.register_codec(
RTCRtpCodecParameters {
capability: RTCRtpCodecCapability {
mime_type: String::from(MIME_TYPE_OPUS),
clock_rate: 48000,
channels: 2,
sdp_fmtp_line: String::from("minptime=10;useinbandfec=1"),
rtcp_feedback: Vec::new(),
},
payload_type: 111,
..Default::default()
},
RTPCodecType::Audio,
)?;
let feedbacks = vec![
RTCPFeedback {
typ: String::from("goog-remb"),
parameter: String::from(""),
},
RTCPFeedback {
typ: String::from("ccm"),
parameter: String::from("fir"),
},
RTCPFeedback {
typ: String::from("nack"),
parameter: String::from(""),
},
RTCPFeedback {
typ: String::from("nack"),
parameter: String::from("pli"),
},
];
let codc_parameters = vec![
RTCRtpCodecParameters {
capability: RTCRtpCodecCapability {
mime_type: String::from(MIME_TYPE_VP8),
clock_rate: 90000,
rtcp_feedback: feedbacks.clone(),
..Default::default()
},
payload_type: 96,
..Default::default()
},
RTCRtpCodecParameters {
capability: RTCRtpCodecCapability {
mime_type: String::from(MIME_TYPE_VP9),
clock_rate: 90000,
sdp_fmtp_line: String::from("profile-id=0"),
rtcp_feedback: feedbacks.clone(),
..Default::default()
},
payload_type: 98,
..Default::default()
},
RTCRtpCodecParameters {
capability: RTCRtpCodecCapability {
mime_type: String::from(MIME_TYPE_VP9),
clock_rate: 90000,
sdp_fmtp_line: String::from("profile-id=1"),
rtcp_feedback: feedbacks.clone(),
..Default::default()
},
payload_type: 100,
..Default::default()
},
RTCRtpCodecParameters {
capability: RTCRtpCodecCapability {
mime_type: String::from(MIME_TYPE_H264),
clock_rate: 90000,
sdp_fmtp_line: String::from(
"level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f",
),
rtcp_feedback: feedbacks.clone(),
..Default::default()
},
payload_type: 102,
..Default::default()
},
RTCRtpCodecParameters {
capability: RTCRtpCodecCapability {
mime_type: String::from(MIME_TYPE_H264),
clock_rate: 90000,
sdp_fmtp_line: String::from(
"level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f",
),
rtcp_feedback: feedbacks.clone(),
..Default::default()
},
payload_type: 127,
..Default::default()
},
RTCRtpCodecParameters {
capability: RTCRtpCodecCapability {
mime_type: String::from(MIME_TYPE_H264),
clock_rate: 90000,
sdp_fmtp_line: String::from(
"level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f",
),
rtcp_feedback: feedbacks.clone(),
..Default::default()
},
payload_type: 125,
..Default::default()
},
RTCRtpCodecParameters {
capability: RTCRtpCodecCapability {
mime_type: String::from(MIME_TYPE_H264),
clock_rate: 90000,
sdp_fmtp_line: String::from(
"level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f",
),
rtcp_feedback: feedbacks.clone(),
..Default::default()
},
payload_type: 108,
..Default::default()
},
RTCRtpCodecParameters {
capability: RTCRtpCodecCapability {
mime_type: String::from(MIME_TYPE_VP8),
clock_rate: 90000,
sdp_fmtp_line: String::from(
"level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=640032",
),
rtcp_feedback: feedbacks,
..Default::default()
},
payload_type: 123,
..Default::default()
},
];
for codec in codc_parameters {
me.register_codec(codec, RTPCodecType::Video)?;
}
let extensions_video = vec![
extmap::SDES_MID_URI,
extmap::SDES_RTP_STREAM_ID_URI,
extmap::TRANSPORT_CC_URI,
FRAME_MARKING,
];
for extention in extensions_video {
me.register_header_extension(
RTCRtpHeaderExtensionCapability {
uri: String::from(extention),
},
RTPCodecType::Video,
None,
)?;
}
let extensions_audio = vec![
extmap::SDES_MID_URI,
extmap::SDES_RTP_STREAM_ID_URI,
extmap::AUDIO_LEVEL_URI,
];
for extention in extensions_audio {
me.register_header_extension(
RTCRtpHeaderExtensionCapability {
uri: String::from(extention),
},
RTPCodecType::Audio,
None,
)?;
}
Ok(me)
}
pub(super) fn get_subscriber_media_engine() -> Result<MediaEngine> {
Ok(MediaEngine::default())
}