1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
#![warn(rust_2018_idioms)]
#![allow(dead_code)]
pub mod audio;
mod error;
pub mod io;
pub mod video;
use std::time::{Duration, SystemTime};
use bytes::Bytes;
pub use error::Error;
/// A Sample contains encoded media and timing information
#[derive(Debug)]
pub struct Sample {
/// The assembled data in the sample, as a bitstream.
///
/// The format is Codec dependant, but is always a bitstream format
/// rather than the packetized format used when carried over RTP.
///
/// See: [`rtp::packetizer::Depacketizer`] and implementations of it for more details.
pub data: Bytes,
/// The wallclock time when this sample was generated.
pub timestamp: SystemTime,
/// The duration of this sample
pub duration: Duration,
/// The RTP packet timestamp of this sample.
///
/// For all RTP packets that contributed to a single sample the timestamp is the same.
pub packet_timestamp: u32,
/// The number of packets that were dropped prior to building this sample.
///
/// Packets being dropped doesn't necessarily indicate something wrong, e.g., packets are sometimes
/// dropped because they aren't relevant for sample building.
pub prev_dropped_packets: u16,
/// The number of packets that were identified as padding prior to building this sample.
///
/// Some implementations, notably libWebRTC, send padding packets to keep the send rate steady.
/// These packets don't carry media and aren't useful for building samples.
///
/// This field can be combined with [`Sample::prev_dropped_packets`] to determine if any
/// dropped packets are likely to have detrimental impact on the steadiness of the RTP stream.
///
/// ## Example adjustment
///
/// ```rust
/// # use bytes::Bytes;
/// # use std::time::{SystemTime, Duration};
/// # use webrtc_media::Sample;
/// # let sample = Sample {
/// # data: Bytes::new(),
/// # timestamp: SystemTime::now(),
/// # duration: Duration::from_secs(0),
/// # packet_timestamp: 0,
/// # prev_dropped_packets: 10,
/// # prev_padding_packets: 15
/// # };
/// #
/// let adjusted_dropped =
/// sample.prev_dropped_packets.saturating_sub(sample.prev_padding_packets);
/// ```
pub prev_padding_packets: u16,
}
impl Default for Sample {
fn default() -> Self {
Sample {
data: Bytes::new(),
timestamp: SystemTime::now(),
duration: Duration::from_secs(0),
packet_timestamp: 0,
prev_dropped_packets: 0,
prev_padding_packets: 0,
}
}
}
impl PartialEq for Sample {
fn eq(&self, other: &Self) -> bool {
let mut equal: bool = true;
if self.data != other.data {
equal = false;
}
if self.timestamp.elapsed().unwrap().as_secs()
!= other.timestamp.elapsed().unwrap().as_secs()
{
equal = false;
}
if self.duration != other.duration {
equal = false;
}
if self.packet_timestamp != other.packet_timestamp {
equal = false;
}
if self.prev_dropped_packets != other.prev_dropped_packets {
equal = false;
}
if self.prev_padding_packets != other.prev_padding_packets {
equal = false;
}
equal
}
}