scuffle_flv/
aac.rs

1use bytes::Bytes;
2use nutype_enum::nutype_enum;
3
4nutype_enum! {
5    /// FLV AAC Packet Type
6    ///
7    /// Defined in the FLV specification. Chapter 1 - AACAUDIODATA
8    ///
9    /// The AACPacketType indicates the type of data in the AACAUDIODATA.
10    pub enum AacPacketType(u8) {
11        /// Sequence Header
12        SequenceHeader = 0x0,
13        /// Raw
14        Raw = 0x1,
15    }
16}
17
18/// AAC Packet
19/// This is a container for aac data.
20/// This enum contains the data for the different types of aac packets.
21/// Defined in the FLV specification. Chapter 1 - AACAUDIODATA
22#[derive(Debug, Clone, PartialEq)]
23pub enum AacPacket {
24    /// AAC Sequence Header
25    SequenceHeader(Bytes),
26    /// AAC Raw
27    Raw(Bytes),
28    /// Data we don't know how to parse
29    Unknown { aac_packet_type: AacPacketType, data: Bytes },
30}
31
32impl AacPacket {
33    /// Create a new AAC packet from the given data and packet type
34    pub fn new(aac_packet_type: AacPacketType, data: Bytes) -> Self {
35        match aac_packet_type {
36            AacPacketType::Raw => AacPacket::Raw(data),
37            AacPacketType::SequenceHeader => AacPacket::SequenceHeader(data),
38            _ => AacPacket::Unknown { aac_packet_type, data },
39        }
40    }
41}
42
43#[cfg(test)]
44#[cfg_attr(all(test, coverage_nightly), coverage(off))]
45mod tests {
46    use super::*;
47
48    #[test]
49    fn test_new() {
50        let cases = [
51            (
52                AacPacketType::Raw,
53                Bytes::from(vec![0, 1, 2, 3]),
54                AacPacket::Raw(Bytes::from(vec![0, 1, 2, 3])),
55            ),
56            (
57                AacPacketType::SequenceHeader,
58                Bytes::from(vec![0, 1, 2, 3]),
59                AacPacket::SequenceHeader(Bytes::from(vec![0, 1, 2, 3])),
60            ),
61            (
62                AacPacketType(0x0),
63                Bytes::from(vec![0, 1, 2, 3]),
64                AacPacket::SequenceHeader(Bytes::from(vec![0, 1, 2, 3])),
65            ),
66            (
67                AacPacketType(0x1),
68                Bytes::from(vec![0, 1, 2, 3]),
69                AacPacket::Raw(Bytes::from(vec![0, 1, 2, 3])),
70            ),
71            (
72                AacPacketType(0x2),
73                Bytes::from(vec![0, 1, 2, 3]),
74                AacPacket::Unknown {
75                    aac_packet_type: AacPacketType(0x2),
76                    data: Bytes::from(vec![0, 1, 2, 3]),
77                },
78            ),
79            (
80                AacPacketType(0x3),
81                Bytes::from(vec![0, 1, 2, 3]),
82                AacPacket::Unknown {
83                    aac_packet_type: AacPacketType(0x3),
84                    data: Bytes::from(vec![0, 1, 2, 3]),
85                },
86            ),
87        ];
88
89        for (packet_type, data, expected) in cases {
90            let packet = AacPacket::new(packet_type, data.clone());
91            assert_eq!(packet, expected);
92        }
93    }
94
95    #[test]
96    fn test_aac_packet_type() {
97        assert_eq!(
98            format!("{:?}", AacPacketType::SequenceHeader),
99            "AacPacketType::SequenceHeader"
100        );
101        assert_eq!(format!("{:?}", AacPacketType::Raw), "AacPacketType::Raw");
102        assert_eq!(format!("{:?}", AacPacketType(0x2)), "AacPacketType(2)");
103        assert_eq!(format!("{:?}", AacPacketType(0x3)), "AacPacketType(3)");
104
105        assert_eq!(AacPacketType(0x01), AacPacketType::Raw);
106        assert_eq!(AacPacketType(0x00), AacPacketType::SequenceHeader);
107    }
108}