webrtc_media/
lib.rs

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