use crossbeam_channel::Sender;
use str0m::{
RtcError,
change::{SdpAnswer, SdpOffer},
format::Codec,
media::{Direction, MediaKind, Mid},
};
use thiserror::Error as ThisError;
use crate::buffer::MediaBuffer;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct TrackId(pub(super) u64);
#[derive(Debug, ThisError)]
pub enum WebRtcError {
#[error("str0m error: {0}")]
Str0m(#[from] RtcError),
#[error("network error: {0}")]
Io(#[from] std::io::Error),
#[error(
"WebRtcTrackSink only accepts already-encoded Packet buffers \
(an encoder's output), got a {0}"
)]
UnsupportedBuffer(&'static str),
#[error("WebRTC packet has no PTS")]
MissingPacketPts,
#[error("WebRTC packet has a negative PTS: {0}")]
NegativePacketPts(i64),
#[error("WebRTC packet has an invalid time base: {numerator}/{denominator}")]
InvalidPacketTimeBase { numerator: i32, denominator: i32 },
#[error(
"WebRTC packet timestamp overflows MediaTime: pts={pts}, time_base={numerator}/{denominator}"
)]
PacketTimestampOverflow {
pts: u64,
numerator: i32,
denominator: i32,
},
#[error("WebRtcPeer's run() has already ended")]
Closed,
}
pub(super) enum Command {
AddTrack(TrackId, MediaKind, Direction, Codec),
Push(TrackId, MediaBuffer),
SetAnswer(SdpAnswer),
AcceptOffer(
SdpOffer,
Sender<std::result::Result<SdpAnswer, WebRtcError>>,
),
}
pub(super) enum TrackOutState {
ToOpen(MediaKind, Direction),
Negotiating(Mid),
Open(Mid),
}
impl TrackOutState {
pub(super) fn mid(&self) -> Option<Mid> {
match self {
TrackOutState::ToOpen(..) => None,
TrackOutState::Negotiating(mid) | TrackOutState::Open(mid) => Some(*mid),
}
}
}