mp4_atom/moov/
mod.rs

1mod mvex;
2mod mvhd;
3mod trak;
4mod udta;
5
6pub use mvex::*;
7pub use mvhd::*;
8pub use trak::*;
9pub use udta::*;
10
11use crate::*;
12
13#[derive(Debug, Clone, PartialEq, Default)]
14#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15pub struct Moov {
16    pub mvhd: Mvhd,
17    pub meta: Option<Meta>,
18    pub mvex: Option<Mvex>,
19    pub trak: Vec<Trak>,
20    pub udta: Option<Udta>,
21}
22
23impl Atom for Moov {
24    const KIND: FourCC = FourCC::new(b"moov");
25
26    nested! {
27        required: [ Mvhd ],
28        optional: [ Meta, Mvex, Udta ],
29        multiple: [ Trak ],
30    }
31}
32
33#[cfg(test)]
34mod test {
35    use super::*;
36
37    #[test]
38    fn test_meta() {
39        const ENCODED: &[u8] = &[
40            0x00, 0x00, 0x03, 0x3A, 0x6D, 0x6F, 0x6F, 0x76, 0x00, 0x00, 0x00, 0x6C, 0x6D, 0x76,
41            0x68, 0x64, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xEF, 0xCF, 0xD6, 0xE0, 0xEF, 0xCF, 0xD6,
42            0x00, 0x01, 0x5F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00,
43            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
44            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
45            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
46            0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
47            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
48            0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x8D, 0x6D, 0x65, 0x74, 0x61, 0x00, 0x00,
49            0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x68, 0x64, 0x6C, 0x72, 0x00, 0x00, 0x00, 0x00,
50            0x00, 0x00, 0x00, 0x00, 0x49, 0x44, 0x33, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
51            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x49, 0x44, 0x33, 0x32,
52            0x00, 0x00, 0x00, 0x00, 0x15, 0xC7, 0x49, 0x44, 0x33, 0x04, 0x00, 0x00, 0x00, 0x00,
53            0x00, 0x49, 0x50, 0x52, 0x49, 0x56, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x68, 0x74,
54            0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2E, 0x63,
55            0x6F, 0x6D, 0x2F, 0x67, 0x6F, 0x6F, 0x67, 0x6C, 0x65, 0x2F, 0x73, 0x68, 0x61, 0x6B,
56            0x61, 0x2D, 0x70, 0x61, 0x63, 0x6B, 0x61, 0x67, 0x65, 0x72, 0x00, 0x76, 0x32, 0x2E,
57            0x36, 0x2E, 0x31, 0x2D, 0x36, 0x33, 0x34, 0x61, 0x66, 0x36, 0x35, 0x2D, 0x72, 0x65,
58            0x6C, 0x65, 0x61, 0x73, 0x65, 0x00, 0x00, 0x02, 0x01, 0x74, 0x72, 0x61, 0x6B, 0x00,
59            0x00, 0x00, 0x5C, 0x74, 0x6B, 0x68, 0x64, 0x00, 0x00, 0x00, 0x07, 0xE0, 0xEF, 0xCF,
60            0xD6, 0xE0, 0xEF, 0xCF, 0xD6, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
61            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
62            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
63            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
64            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x07,
65            0x80, 0x00, 0x00, 0x04, 0x38, 0x00, 0x00, 0x00, 0x00, 0x01, 0x79, 0x6D, 0x64, 0x69,
66            0x61, 0x00, 0x00, 0x00, 0x20, 0x6D, 0x64, 0x68, 0x64, 0x00, 0x00, 0x00, 0x00, 0xE0,
67            0xEF, 0xCF, 0xD6, 0xE0, 0xEF, 0xCF, 0xD6, 0x00, 0x01, 0x5F, 0x90, 0x00, 0x00, 0x00,
68            0x00, 0x55, 0xC4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x68, 0x64, 0x6C, 0x72, 0x00,
69            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x69, 0x64, 0x65, 0x00, 0x00, 0x00,
70            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x69, 0x64, 0x65, 0x6F,
71            0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x72, 0x00, 0x00, 0x00, 0x01, 0x24, 0x6D, 0x69,
72            0x6E, 0x66, 0x00, 0x00, 0x00, 0x24, 0x64, 0x69, 0x6E, 0x66, 0x00, 0x00, 0x00, 0x1C,
73            0x64, 0x72, 0x65, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
74            0x00, 0x0C, 0x75, 0x72, 0x6C, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xE4,
75            0x73, 0x74, 0x62, 0x6C, 0x00, 0x00, 0x00, 0x98, 0x73, 0x74, 0x73, 0x64, 0x00, 0x00,
76            0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x88, 0x61, 0x76, 0x63, 0x31,
77            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
78            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x04, 0x38,
79            0x00, 0x48, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
80            0x0A, 0x41, 0x56, 0x43, 0x20, 0x43, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x00, 0x00, 0x00,
81            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
82            0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x32, 0x61, 0x76,
83            0x63, 0x43, 0x01, 0x64, 0x00, 0x28, 0xFF, 0xE1, 0x00, 0x1A, 0x67, 0x64, 0x00, 0x28,
84            0xAC, 0xD9, 0x40, 0x78, 0x02, 0x27, 0xE5, 0x84, 0x00, 0x00, 0x03, 0x00, 0x04, 0x00,
85            0x00, 0x03, 0x00, 0xF0, 0x3C, 0x60, 0xC6, 0x58, 0x01, 0x00, 0x05, 0x68, 0xEB, 0xEC,
86            0xB2, 0x2C, 0x00, 0x00, 0x00, 0x10, 0x73, 0x74, 0x74, 0x73, 0x00, 0x00, 0x00, 0x00,
87            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x73, 0x74, 0x73, 0x63, 0x00, 0x00,
88            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x73, 0x74, 0x73, 0x7A,
89            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
90            0x00, 0x10, 0x73, 0x74, 0x63, 0x6F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
91            0x00, 0x00, 0x00, 0x14, 0x76, 0x6D, 0x68, 0x64, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
92            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x65, 0x64, 0x74, 0x73,
93            0x00, 0x00, 0x00, 0x1C, 0x65, 0x6C, 0x73, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
94            0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x70, 0x00, 0x01, 0x00, 0x00,
95            0x00, 0x00, 0x00, 0x38, 0x6D, 0x76, 0x65, 0x78, 0x00, 0x00, 0x00, 0x10, 0x6D, 0x65,
96            0x68, 0x64, 0x00, 0x00, 0x00, 0x00, 0x01, 0xB9, 0x31, 0x50, 0x00, 0x00, 0x00, 0x20,
97            0x74, 0x72, 0x65, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
98            0x00, 0x01, 0x00, 0x00, 0x0B, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
99        ];
100
101        let decoded = Moov::decode(&mut &ENCODED[..]).unwrap();
102        assert_eq!(
103            decoded,
104            Moov {
105                mvhd: Mvhd {
106                    creation_time: 3773812694,
107                    modification_time: 3773812694,
108                    timescale: 90000,
109                    rate: 1.into(),
110                    volume: 1.into(),
111                    next_track_id: 2,
112                    ..Default::default()
113                },
114                meta: Some(Meta {
115                    hdlr: Hdlr {
116                        handler: FourCC::new(b"ID32"),
117                        name: "".into()
118                    },
119                    pitm: None,
120                    dinf: None,
121                    iloc: None,
122                    iinf: None,
123                    iprp: None,
124                    iref: None,
125                    idat: None,
126                    ilst: None,
127                    unknown: vec![Any::Unknown(
128                        FourCC::new(b"ID32"),
129                        vec![
130                            0, 0, 0, 0, 21, 199, 73, 68, 51, 4, 0, 0, 0, 0, 0, 73, 80, 82, 73, 86,
131                            0, 0, 0, 63, 0, 0, 104, 116, 116, 112, 115, 58, 47, 47, 103, 105, 116,
132                            104, 117, 98, 46, 99, 111, 109, 47, 103, 111, 111, 103, 108, 101, 47,
133                            115, 104, 97, 107, 97, 45, 112, 97, 99, 107, 97, 103, 101, 114, 0, 118,
134                            50, 46, 54, 46, 49, 45, 54, 51, 52, 97, 102, 54, 53, 45, 114, 101, 108,
135                            101, 97, 115, 101
136                        ]
137                    )]
138                }),
139                mvex: Some(Mvex {
140                    mehd: Some(Mehd {
141                        fragment_duration: 28914000
142                    }),
143                    trex: vec![Trex {
144                        track_id: 1,
145                        default_sample_description_index: 1,
146                        default_sample_duration: 3000,
147                        ..Default::default()
148                    }]
149                }),
150                trak: vec![Trak {
151                    tkhd: Tkhd {
152                        creation_time: 3773812694,
153                        modification_time: 3773812694,
154                        track_id: 1,
155                        enabled: true,
156                        width: 1920.into(),
157                        height: 1080.into(),
158                        ..Default::default()
159                    },
160                    edts: Some(Edts {
161                        elst: Some(Elst {
162                            entries: vec![ElstEntry {
163                                media_time: 6000,
164                                media_rate: 1,
165                                ..Default::default()
166                            }]
167                        })
168                    }),
169                    meta: None,
170                    mdia: Mdia {
171                        mdhd: Mdhd {
172                            creation_time: 3773812694,
173                            modification_time: 3773812694,
174                            timescale: 90000,
175                            duration: 0,
176                            language: "und".to_string(),
177                        },
178                        hdlr: Hdlr {
179                            handler: b"vide".into(),
180                            name: "VideoHandler".to_string(),
181                        },
182                        minf: Minf {
183                            vmhd: Some(Vmhd {
184                                graphics_mode: 0,
185                                op_color: RgbColor {
186                                    red: 0,
187                                    green: 0,
188                                    blue: 0
189                                }
190                            }),
191                            smhd: None,
192                            dinf: Dinf {
193                                dref: Dref {
194                                    urls: vec![Url::default()]
195                                }
196                            },
197                            stbl: Stbl {
198                                stsd: Stsd {
199                                    codecs: vec![Avc1 {
200                                        visual: Visual {
201                                            data_reference_index: 1,
202                                            width: 1920,
203                                            height: 1080,
204                                            horizresolution: 72.into(),
205                                            vertresolution: 72.into(),
206                                            frame_count: 1,
207                                            compressor: "\nAVC Coding".into(),
208                                            depth: 24,
209                                        },
210                                        avcc: Avcc {
211                                            configuration_version: 1,
212                                            avc_profile_indication: 100,
213                                            profile_compatibility: 0,
214                                            avc_level_indication: 40,
215                                            length_size: 4,
216                                            sequence_parameter_sets: vec![vec![
217                                                103, 100, 0, 40, 172, 217, 64, 120, 2, 39, 229,
218                                                132, 0, 0, 3, 0, 4, 0, 0, 3, 0, 240, 60, 96, 198,
219                                                88
220                                            ]],
221                                            picture_parameter_sets: vec![vec![
222                                                104, 235, 236, 178, 44
223                                            ]],
224                                            ext: None,
225                                        },
226                                        btrt: None,
227                                        colr: None,
228                                        pasp: None,
229                                        taic: None,
230                                    }
231                                    .into()],
232                                },
233                                stco: Some(Stco::default()),
234                                ..Default::default()
235                            }
236                        }
237                    }
238                }],
239                udta: None,
240            }
241        )
242    }
243}