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}