mm_client_common/
packet.rs

1// Copyright 2024 Colin Marc <hi@colinmarc.com>
2//
3// SPDX-License-Identifier: MIT
4
5mod ring;
6use std::collections::VecDeque;
7
8pub(crate) use ring::*;
9
10#[derive(Debug, Clone, uniffi::Object)]
11pub struct Packet {
12    pub(crate) pts: u64,
13    pub(crate) seq: u64,
14    pub(crate) stream_seq: u64,
15    pub(crate) hierarchical_layer: u32,
16    data: VecDeque<bytes::Bytes>,
17}
18
19#[derive(Debug, Clone, uniffi::Record)]
20pub struct DroppedPacket {
21    pub pts: u64,
22    pub seq: u64,
23    pub stream_seq: u64,
24    pub hierarchical_layer: u32,
25}
26
27#[uniffi::export]
28impl Packet {
29    pub fn pts(&self) -> u64 {
30        self.pts
31    }
32
33    pub fn stream_seq(&self) -> u64 {
34        self.stream_seq
35    }
36
37    pub fn seq(&self) -> u64 {
38        self.seq
39    }
40
41    pub fn hierarchical_layer(&self) -> u32 {
42        self.hierarchical_layer
43    }
44
45    pub fn data(&self) -> Vec<u8> {
46        if self.data.len() == 1 {
47            self.data[0].to_vec()
48        } else {
49            use bytes::buf::BufMut;
50
51            let mut buf = Vec::with_capacity(self.len());
52            for chunk in self.data.iter() {
53                buf.put(chunk.clone());
54            }
55
56            buf
57        }
58    }
59}
60
61impl Packet {
62    pub fn len(&self) -> usize {
63        self.data.iter().map(|c| c.len()).sum()
64    }
65
66    pub fn is_empty(&self) -> bool {
67        self.len() == 0
68    }
69
70    // Copies the packet data into dst. The length of dst must match the
71    pub fn copy_to_slice(&self, mut dst: &mut [u8]) {
72        use bytes::buf::BufMut;
73
74        for chunk in self.data.iter() {
75            dst.put(chunk.clone());
76        }
77    }
78}