1use std::hash::{Hash, Hasher};
2use bitregions::bitregions;
3use crate::{flag_option, full_box};
4use crate::mp4box::trex::SampleFlags;
5
6bitregions! {
7 pub TfhdFlags u32 {
8 HAS_BASE_DATA_OFFSET: 0b0000000000000000__0000_0000_0000_0001,
9 HAS_SAMPLE_DESCRIPTION_INDEX: 0b0000000000000000__0000_0000_0000_0010,
10 HAS_DEFAULT_SAMPLE_DURATION: 0b0000000000000000__0000_0000_0000_1000,
11 HAS_DEFAULT_SAMPLE_SIZE: 0b0000000000000000__0000_0000_0001_0000,
12 HAS_DEFAULT_SAMPLE_FLAGS: 0b0000000000000000__0000_0000_0010_0000,
13 DURATION_IS_EMPTY: 0b0000000000000001__0000_0000_0000_0000,
14 DEFAULT_BASE_IS_MOOF: 0b0000000000000010__0000_0000_0000_0000,
15 }
16}
17
18impl Eq for TfhdFlags {}
19impl Hash for TfhdFlags {
20 fn hash<H: Hasher>(&self, state: &mut H) {
21 self.0.hash(state)
22 }
23}
24
25flag_option! {
26 #[derive(Default, Debug, Copy, Clone, Eq, PartialEq, Hash)]
27 pub struct TfhdDataOffset(pub u64, TfhdFlags, HAS_BASE_DATA_OFFSET);
28}
29
30flag_option! {
31 #[derive(Default, Debug, Copy, Clone, Eq, PartialEq, Hash)]
32 pub struct TfhdSampleDescriptionIndex(pub u32, TfhdFlags, HAS_SAMPLE_DESCRIPTION_INDEX);
33}
34
35flag_option! {
36 #[derive(Default, Debug, Copy, Clone, Eq, PartialEq, Hash)]
37 pub struct TfhdDefaultSampleDuration(pub u32, TfhdFlags, HAS_DEFAULT_SAMPLE_DURATION);
38}
39
40flag_option! {
41 #[derive(Default, Debug, Copy, Clone, Eq, PartialEq, Hash)]
42 pub struct TfhdDefaultSampleSize(pub u32, TfhdFlags, HAS_DEFAULT_SAMPLE_SIZE);
43}
44
45flag_option! {
46 #[derive(Default, Debug, Copy, Clone, Eq, PartialEq, Hash)]
47 pub struct TfhdDefaultSampleFlags(pub SampleFlags, TfhdFlags, HAS_DEFAULT_SAMPLE_FLAGS);
48}
49
50full_box! {
51 box (b"tfhd", Tfhd, TfhdBox, @save flags: TfhdFlags)
52 data {
53 track_id: u32,
54 base_data_offset: TfhdDataOffset,
55 sample_description_index: TfhdSampleDescriptionIndex,
56 default_sample_duration: TfhdDefaultSampleDuration,
57 default_sample_size: TfhdDefaultSampleSize,
58 default_sample_flags: TfhdDefaultSampleFlags,
59 }
60}