T1.2: Add MediaType enum
This commit is contained in:
@@ -17,6 +17,7 @@ pub mod codec_id;
|
||||
pub mod dred_tuner;
|
||||
pub mod error;
|
||||
pub mod jitter;
|
||||
pub mod media_type;
|
||||
pub mod packet;
|
||||
pub mod quality;
|
||||
pub mod session;
|
||||
@@ -27,6 +28,7 @@ pub use bandwidth::{BandwidthEstimator, CongestionState};
|
||||
pub use codec_id::{CodecId, QualityProfile};
|
||||
pub use dred_tuner::{DredTuner, DredTuning};
|
||||
pub use error::*;
|
||||
pub use media_type::MediaType;
|
||||
pub use packet::{
|
||||
CallAcceptMode, FRAME_TYPE_FULL, FRAME_TYPE_MINI, HangupReason, MediaHeader, MediaHeaderV1,
|
||||
MediaHeaderV2, MediaPacket, MiniFrameContext, MiniHeader, PresenceUser, QualityReport,
|
||||
|
||||
51
crates/wzp-proto/src/media_type.rs
Normal file
51
crates/wzp-proto/src/media_type.rs
Normal file
@@ -0,0 +1,51 @@
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
/// Media stream type carried in a v2 [`MediaHeader`](crate::MediaHeaderV2).
|
||||
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
|
||||
#[repr(u8)]
|
||||
pub enum MediaType {
|
||||
Audio = 0,
|
||||
Video = 1,
|
||||
Data = 2,
|
||||
Control = 3,
|
||||
}
|
||||
|
||||
impl MediaType {
|
||||
pub const fn to_wire(self) -> u8 {
|
||||
self as u8
|
||||
}
|
||||
|
||||
pub const fn from_wire(v: u8) -> Option<Self> {
|
||||
match v {
|
||||
0 => Some(Self::Audio),
|
||||
1 => Some(Self::Video),
|
||||
2 => Some(Self::Data),
|
||||
3 => Some(Self::Control),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn media_type_roundtrip() {
|
||||
for mt in [
|
||||
MediaType::Audio,
|
||||
MediaType::Video,
|
||||
MediaType::Data,
|
||||
MediaType::Control,
|
||||
] {
|
||||
assert_eq!(MediaType::from_wire(mt.to_wire()), Some(mt));
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn media_type_unknown_rejected() {
|
||||
for v in 4u8..=255 {
|
||||
assert!(MediaType::from_wire(v).is_none(), "v={v}");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
use bytes::{Buf, BufMut, Bytes, BytesMut};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::CodecId;
|
||||
use crate::{CodecId, MediaType};
|
||||
|
||||
/// 12-byte v1 media packet header for the lossy link.
|
||||
///
|
||||
@@ -163,9 +163,9 @@ pub type MediaHeader = MediaHeaderV1;
|
||||
/// 16-byte v2 media header. See docs/PRD/PRD-wire-format-v2.md.
|
||||
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||
pub struct MediaHeaderV2 {
|
||||
pub version: u8, // always 2
|
||||
pub flags: u8, // bit 7 T, bit 6 Q, bit 5 KeyFrame, bit 4 FrameEnd
|
||||
pub media_type: u8, // TODO(T1.2): replace with MediaType
|
||||
pub version: u8, // always 2
|
||||
pub flags: u8, // bit 7 T, bit 6 Q, bit 5 KeyFrame, bit 4 FrameEnd
|
||||
pub media_type: MediaType,
|
||||
pub codec_id: CodecId,
|
||||
pub stream_id: u8,
|
||||
pub fec_ratio: u8, // 0..200 -> 0.0..2.0
|
||||
@@ -181,7 +181,7 @@ impl MediaHeaderV2 {
|
||||
pub fn write_to(&self, buf: &mut impl BufMut) {
|
||||
buf.put_u8(self.version);
|
||||
buf.put_u8(self.flags);
|
||||
buf.put_u8(self.media_type);
|
||||
buf.put_u8(self.media_type.to_wire());
|
||||
buf.put_u8(self.codec_id.to_wire());
|
||||
buf.put_u8(self.stream_id);
|
||||
buf.put_u8(self.fec_ratio);
|
||||
@@ -199,7 +199,7 @@ impl MediaHeaderV2 {
|
||||
return None;
|
||||
}
|
||||
let flags = buf.get_u8();
|
||||
let media_type = buf.get_u8();
|
||||
let media_type = MediaType::from_wire(buf.get_u8())?;
|
||||
let codec_id = CodecId::from_wire(buf.get_u8())?;
|
||||
let stream_id = buf.get_u8();
|
||||
let fec_ratio = buf.get_u8();
|
||||
@@ -1289,7 +1289,7 @@ mod tests {
|
||||
let h = MediaHeaderV2 {
|
||||
version: 2,
|
||||
flags: MediaHeaderV2::FLAG_QUALITY,
|
||||
media_type: 0, // TODO(T1.2): MediaType::Audio
|
||||
media_type: MediaType::Audio,
|
||||
codec_id: CodecId::Opus24k,
|
||||
stream_id: 0,
|
||||
fec_ratio: 50,
|
||||
|
||||
Reference in New Issue
Block a user