scuffle_flv/audio/body/legacy/
aac.rs

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