mp4_atom/meta/ilst/
desc.rs1use crate::*;
2
3#[derive(Debug, Clone, PartialEq, Eq)]
13#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
14pub struct Desc {
15 pub country_indicator: u16,
16 pub language_indicator: u16,
17 pub text: String,
18}
19
20impl Atom for Desc {
21 const KIND: FourCC = FourCC::new(b"desc");
22
23 fn decode_body<B: Buf>(buf: &mut B) -> Result<Self> {
24 let data = super::data::decode_text(buf)?;
25 Ok(Desc {
26 country_indicator: data.country_indicator,
27 language_indicator: data.language_indicator,
28 text: data.text,
29 })
30 }
31
32 fn encode_body<B: BufMut>(&self, buf: &mut B) -> Result<()> {
33 super::data::encode_text(
34 self.country_indicator,
35 self.language_indicator,
36 &self.text,
37 buf,
38 )
39 }
40}
41
42#[cfg(test)]
43mod tests {
44 use super::*;
45
46 const ENCODED_DESC_LONG: &[u8] = &[
50 0x00, 0x00, 0x00, 0x1E, b'd', b'e', b's', b'c', 0x00, 0x00, 0x00, 0x16, b'd', b'a', b't', b'a', 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, b'a', b' ', b'd', b'e', b's', b'c',
57 ];
58
59 #[test]
60 fn test_desc_long_style() {
61 let decoded = Desc::decode(&mut &ENCODED_DESC_LONG[..]).unwrap();
62 assert_eq!(decoded.country_indicator, 0);
63 assert_eq!(decoded.language_indicator, 0);
64 assert_eq!(decoded.text, "a desc");
65
66 let mut out = Vec::new();
68 decoded.encode(&mut out).unwrap();
69 assert_eq!(out, ENCODED_DESC_LONG);
70 }
71
72 #[test]
74 fn test_desc_short_style() {
75 let buf = [
76 0x00, 0x00, 0x00, 0x16, b'd', b'e', b's', b'c', 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, b'a', b' ', b'd', b'e', b's', b'c',
81 ];
82 let decoded = Desc::decode(&mut &buf[..]).unwrap();
83 assert_eq!(decoded.country_indicator, 0);
84 assert_eq!(decoded.language_indicator, 0);
85 assert_eq!(decoded.text, "a desc");
86 }
87}