dvb_si/descriptors/
enhanced_ac3.rs1use crate::error::{Error, Result};
8use crate::traits::Descriptor;
9use dvb_common::{Parse, Serialize};
10
11pub const TAG: u8 = 0x7A;
13const HEADER_LEN: usize = 2;
14
15#[derive(Debug, Clone, PartialEq, Eq)]
18#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
19pub struct EnhancedAc3Descriptor<'a> {
20 #[cfg_attr(feature = "serde", serde(borrow))]
22 pub body: &'a [u8],
23}
24
25impl<'a> Parse<'a> for EnhancedAc3Descriptor<'a> {
26 type Error = crate::error::Error;
27 fn parse(bytes: &'a [u8]) -> Result<Self> {
28 if bytes.len() < HEADER_LEN {
29 return Err(Error::BufferTooShort {
30 need: HEADER_LEN,
31 have: bytes.len(),
32 what: "EnhancedAc3Descriptor header",
33 });
34 }
35 if bytes[0] != TAG {
36 return Err(Error::InvalidDescriptor {
37 tag: bytes[0],
38 reason: "unexpected tag for EAC-3 descriptor",
39 });
40 }
41 let length = bytes[1] as usize;
42 let end = HEADER_LEN + length;
43 if bytes.len() < end {
44 return Err(Error::BufferTooShort {
45 need: end,
46 have: bytes.len(),
47 what: "EnhancedAc3Descriptor body",
48 });
49 }
50 Ok(Self {
51 body: &bytes[HEADER_LEN..end],
52 })
53 }
54}
55
56impl Serialize for EnhancedAc3Descriptor<'_> {
57 type Error = crate::error::Error;
58 fn serialized_len(&self) -> usize {
59 HEADER_LEN + self.body.len()
60 }
61
62 fn serialize_into(&self, buf: &mut [u8]) -> Result<usize> {
63 let len = self.serialized_len();
64 if buf.len() < len {
65 return Err(Error::OutputBufferTooSmall {
66 need: len,
67 have: buf.len(),
68 });
69 }
70 buf[0] = TAG;
71 buf[1] = self.body.len() as u8;
72 buf[HEADER_LEN..len].copy_from_slice(self.body);
73 Ok(len)
74 }
75}
76
77impl<'a> Descriptor<'a> for EnhancedAc3Descriptor<'a> {
78 const TAG: u8 = TAG;
79 fn descriptor_length(&self) -> u8 {
80 self.body.len() as u8
81 }
82}
83
84impl<'a> crate::traits::DescriptorDef<'a> for EnhancedAc3Descriptor<'a> {
85 const TAG: u8 = TAG;
86 const NAME: &'static str = "ENHANCED_AC3";
87}
88
89#[cfg(test)]
90mod tests {
91 use super::*;
92
93 #[test]
94 fn parse_extracts_body() {
95 let bytes = [TAG, 3, 0xAA, 0xBB, 0xCC];
96 let d = EnhancedAc3Descriptor::parse(&bytes).unwrap();
97 assert_eq!(d.body, &[0xAA, 0xBB, 0xCC]);
98 }
99
100 #[test]
101 fn parse_rejects_wrong_tag() {
102 assert!(matches!(
103 EnhancedAc3Descriptor::parse(&[0x6A, 0]).unwrap_err(),
104 Error::InvalidDescriptor { tag: 0x6A, .. }
105 ));
106 }
107
108 #[test]
109 fn parse_rejects_short_buffer() {
110 assert!(matches!(
111 EnhancedAc3Descriptor::parse(&[TAG]).unwrap_err(),
112 Error::BufferTooShort { .. }
113 ));
114 }
115
116 #[test]
117 fn serialize_round_trip() {
118 let d = EnhancedAc3Descriptor {
119 body: &[0x01, 0x02, 0x03],
120 };
121 let mut buf = vec![0u8; d.serialized_len()];
122 d.serialize_into(&mut buf).unwrap();
123 assert_eq!(EnhancedAc3Descriptor::parse(&buf).unwrap(), d);
124 }
125
126 #[test]
127 fn empty_body_valid() {
128 let d = EnhancedAc3Descriptor::parse(&[TAG, 0]).unwrap();
129 assert_eq!(d.body, &[] as &[u8]);
130 }
131}