async_mp4/mp4box/
tkhd.rs

1use std::hash::{Hash, Hasher};
2pub use async_trait::async_trait;
3use bitregions::bitregions;
4use fixed::types::I8F8;
5use fixed_macro::fixed;
6use crate::matrix::MP4Matrix;
7use crate::full_box;
8use crate::types::date::Mp4DateTime;
9use crate::types::duration::Mp4Duration;
10use fixed::types::I16F16;
11
12bitregions! {
13    pub TrakFlags u32 {
14        ENABLED:                0b0001,
15        IN_MOVIE:               0b0010,
16        IN_PREVIEW:             0b0100,
17        SIZE_IS_ASPECT_RATIO:   0b1000,
18    }
19}
20impl Eq for TrakFlags {}
21impl Hash for TrakFlags {
22    fn hash<H: Hasher>(&self, state: &mut H) {
23        self.0.hash(state)
24    }
25}
26
27
28full_box! {
29    box (b"tkhd", Tkhd, TkhdBox, @save flags: TrakFlags)
30    data {
31        creation_time: Mp4DateTime,
32        modification_time: Mp4DateTime,
33        track_id: u32,
34        _r1: u32,
35        duration: Mp4Duration,
36        _r2: [u32; 2],
37        layer: i16,
38        alternate_group: i16,
39        volume: I8F8,
40        _r3: u16,
41        matrix: MP4Matrix,
42        width: I16F16,
43        height: I16F16
44    }
45}
46
47impl Default for Tkhd {
48    fn default() -> Self {
49        Self {
50            flags: TrakFlags::default() | TrakFlags::ENABLED,
51            creation_time:  Default::default(),
52            modification_time:  Default::default(),
53            track_id: 1,
54            _r1:  Default::default(),
55            duration: Default::default(),
56            _r2:  Default::default(),
57            layer: 0,
58            alternate_group: 0,
59            volume: fixed!(1: I8F8),
60            _r3:  Default::default(),
61            matrix: Default::default(),
62            width: fixed!(0: I16F16),
63            height: fixed!(0: I16F16)
64        }
65    }
66}