1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
|
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
use std::fmt;
// To ensure we don't use stdlib allocating types by accident
#[allow(dead_code)]
struct Vec;
#[allow(dead_code)]
struct Box;
#[allow(dead_code)]
struct HashMap;
#[allow(dead_code)]
struct String;
macro_rules! box_database {
($($(#[$attr:meta])* $boxenum:ident $boxtype:expr),*,) => {
#[derive(Clone, Copy, PartialEq)]
pub enum BoxType {
$($(#[$attr])* $boxenum),*,
UnknownBox(u32),
}
impl From<u32> for BoxType {
fn from(t: u32) -> BoxType {
use self::BoxType::*;
match t {
$($(#[$attr])* $boxtype => $boxenum),*,
_ => UnknownBox(t),
}
}
}
impl From<BoxType> for u32 {
fn from(b: BoxType) -> u32 {
use self::BoxType::*;
match b {
$($(#[$attr])* $boxenum => $boxtype),*,
UnknownBox(t) => t,
}
}
}
}
}
impl fmt::Debug for BoxType {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let fourcc: FourCC = From::from(*self);
fourcc.fmt(f)
}
}
#[derive(Default, Eq, Hash, PartialEq, Clone)]
pub struct FourCC {
pub value: [u8; 4],
}
impl From<u32> for FourCC {
fn from(number: u32) -> FourCC {
FourCC {
value: number.to_be_bytes(),
}
}
}
impl From<BoxType> for FourCC {
fn from(t: BoxType) -> FourCC {
let box_num: u32 = Into::into(t);
From::from(box_num)
}
}
impl From<[u8; 4]> for FourCC {
fn from(v: [u8; 4]) -> FourCC {
FourCC { value: v }
}
}
impl fmt::Debug for FourCC {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match std::str::from_utf8(&self.value) {
Ok(s) => f.write_str(s),
Err(_) => self.value.fmt(f),
}
}
}
impl fmt::Display for FourCC {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str(std::str::from_utf8(&self.value).unwrap_or("null"))
}
}
impl PartialEq<&[u8; 4]> for FourCC {
fn eq(&self, other: &&[u8; 4]) -> bool {
self.value.eq(*other)
}
}
box_database!(
FileTypeBox 0x6674_7970, // "ftyp"
MediaDataBox 0x6d64_6174, // "mdat"
PrimaryItemBox 0x7069_746d, // "pitm"
ItemDataBox 0x6964_6174, // "idat"
ItemInfoBox 0x6969_6e66, // "iinf"
ItemInfoEntry 0x696e_6665, // "infe"
ItemLocationBox 0x696c_6f63, // "iloc"
MovieBox 0x6d6f_6f76, // "moov"
MovieHeaderBox 0x6d76_6864, // "mvhd"
TrackBox 0x7472_616b, // "trak"
TrackHeaderBox 0x746b_6864, // "tkhd"
EditBox 0x6564_7473, // "edts"
MediaBox 0x6d64_6961, // "mdia"
EditListBox 0x656c_7374, // "elst"
MediaHeaderBox 0x6d64_6864, // "mdhd"
HandlerBox 0x6864_6c72, // "hdlr"
MediaInformationBox 0x6d69_6e66, // "minf"
ItemReferenceBox 0x6972_6566, // "iref"
ItemPropertiesBox 0x6970_7270, // "iprp"
ItemPropertyContainerBox 0x6970_636f, // "ipco"
ItemPropertyAssociationBox 0x6970_6d61, // "ipma"
ColourInformationBox 0x636f_6c72, // "colr"
ImageSpatialExtentsProperty 0x6973_7065, // "ispe"
PixelAspectRatioBox 0x7061_7370, // "pasp"
PixelInformationBox 0x7069_7869, // "pixi"
AuxiliaryTypeProperty 0x6175_7843, // "auxC"
CleanApertureBox 0x636c_6170, // "clap"
ImageRotation 0x6972_6f74, // "irot"
ImageMirror 0x696d_6972, // "imir"
OperatingPointSelectorProperty 0x6131_6f70, // "a1op"
AV1LayeredImageIndexingProperty 0x6131_6c78, // "a1lx"
LayerSelectorProperty 0x6c73_656c, // "lsel"
SampleTableBox 0x7374_626c, // "stbl"
SampleDescriptionBox 0x7374_7364, // "stsd"
TimeToSampleBox 0x7374_7473, // "stts"
SampleToChunkBox 0x7374_7363, // "stsc"
SampleSizeBox 0x7374_737a, // "stsz"
ChunkOffsetBox 0x7374_636f, // "stco"
ChunkLargeOffsetBox 0x636f_3634, // "co64"
SyncSampleBox 0x7374_7373, // "stss"
AVCSampleEntry 0x6176_6331, // "avc1"
AVC3SampleEntry 0x6176_6333, // "avc3" - Need to check official name in spec.
AVCConfigurationBox 0x6176_6343, // "avcC"
H263SampleEntry 0x7332_3633, // "s263"
H263SpecificBox 0x6432_3633, // "d263"
MP4AudioSampleEntry 0x6d70_3461, // "mp4a"
MP4VideoSampleEntry 0x6d70_3476, // "mp4v"
#[cfg(feature = "3gpp")]
AMRNBSampleEntry 0x7361_6d72, // "samr" - AMR narrow-band
#[cfg(feature = "3gpp")]
AMRWBSampleEntry 0x7361_7762, // "sawb" - AMR wide-band
#[cfg(feature = "3gpp")]
AMRSpecificBox 0x6461_6d72, // "damr"
ESDBox 0x6573_6473, // "esds"
VP8SampleEntry 0x7670_3038, // "vp08"
VP9SampleEntry 0x7670_3039, // "vp09"
VPCodecConfigurationBox 0x7670_6343, // "vpcC"
AV1SampleEntry 0x6176_3031, // "av01"
AV1CodecConfigurationBox 0x6176_3143, // "av1C"
FLACSampleEntry 0x664c_6143, // "fLaC"
FLACSpecificBox 0x6466_4c61, // "dfLa"
OpusSampleEntry 0x4f70_7573, // "Opus"
OpusSpecificBox 0x644f_7073, // "dOps"
ProtectedVisualSampleEntry 0x656e_6376, // "encv" - Need to check official name in spec.
ProtectedAudioSampleEntry 0x656e_6361, // "enca" - Need to check official name in spec.
MovieExtendsBox 0x6d76_6578, // "mvex"
MovieExtendsHeaderBox 0x6d65_6864, // "mehd"
QTWaveAtom 0x7761_7665, // "wave" - quicktime atom
ProtectionSystemSpecificHeaderBox 0x7073_7368, // "pssh"
SchemeInformationBox 0x7363_6869, // "schi"
TrackEncryptionBox 0x7465_6e63, // "tenc"
ProtectionSchemeInfoBox 0x7369_6e66, // "sinf"
OriginalFormatBox 0x6672_6d61, // "frma"
SchemeTypeBox 0x7363_686d, // "schm"
MP3AudioSampleEntry 0x2e6d_7033, // ".mp3" - from F4V.
CompositionOffsetBox 0x6374_7473, // "ctts"
LPCMAudioSampleEntry 0x6c70_636d, // "lpcm" - quicktime atom
ALACSpecificBox 0x616c_6163, // "alac" - Also used by ALACSampleEntry
UuidBox 0x7575_6964, // "uuid"
MetadataBox 0x6d65_7461, // "meta"
MetadataHeaderBox 0x6d68_6472, // "mhdr"
MetadataItemKeysBox 0x6b65_7973, // "keys"
MetadataItemListEntry 0x696c_7374, // "ilst"
MetadataItemDataEntry 0x6461_7461, // "data"
MetadataItemNameBox 0x6e61_6d65, // "name"
#[cfg(feature = "meta-xml")]
MetadataXMLBox 0x786d_6c20, // "xml "
#[cfg(feature = "meta-xml")]
MetadataBXMLBox 0x6278_6d6c, // "bxml"
UserdataBox 0x7564_7461, // "udta"
AlbumEntry 0xa961_6c62, // "©alb"
ArtistEntry 0xa941_5254, // "©ART"
ArtistLowercaseEntry 0xa961_7274, // "©art"
AlbumArtistEntry 0x6141_5254, // "aART"
CommentEntry 0xa963_6d74, // "©cmt"
DateEntry 0xa964_6179, // "©day"
TitleEntry 0xa96e_616d, // "©nam"
CustomGenreEntry 0xa967_656e, // "©gen"
StandardGenreEntry 0x676e_7265, // "gnre"
TrackNumberEntry 0x7472_6b6e, // "trkn"
DiskNumberEntry 0x6469_736b, // "disk"
ComposerEntry 0xa977_7274, // "©wrt"
EncoderEntry 0xa974_6f6f, // "©too"
EncodedByEntry 0xa965_6e63, // "©enc"
TempoEntry 0x746d_706f, // "tmpo"
CopyrightEntry 0x6370_7274, // "cprt"
CompilationEntry 0x6370_696c, // "cpil"
CoverArtEntry 0x636f_7672, // "covr"
AdvisoryEntry 0x7274_6e67, // "rtng"
RatingEntry 0x7261_7465, // "rate"
GroupingEntry 0xa967_7270, // "©grp"
MediaTypeEntry 0x7374_696b, // "stik"
PodcastEntry 0x7063_7374, // "pcst"
CategoryEntry 0x6361_7467, // "catg"
KeywordEntry 0x6b65_7977, // "keyw"
PodcastUrlEntry 0x7075_726c, // "purl"
PodcastGuidEntry 0x6567_6964, // "egid"
DescriptionEntry 0x6465_7363, // "desc"
LongDescriptionEntry 0x6c64_6573, // "ldes"
LyricsEntry 0xa96c_7972, // "©lyr"
TVNetworkNameEntry 0x7476_6e6e, // "tvnn"
TVShowNameEntry 0x7476_7368, // "tvsh"
TVEpisodeNameEntry 0x7476_656e, // "tven"
TVSeasonNumberEntry 0x7476_736e, // "tvsn"
TVEpisodeNumberEntry 0x7476_6573, // "tves"
PurchaseDateEntry 0x7075_7264, // "purd"
GaplessPlaybackEntry 0x7067_6170, // "pgap"
OwnerEntry 0x6f77_6e72, // "ownr"
HDVideoEntry 0x6864_7664, // "hdvd"
SortNameEntry 0x736f_6e6d, // "sonm"
SortAlbumEntry 0x736f_616c, // "soal"
SortArtistEntry 0x736f_6172, // "soar"
SortAlbumArtistEntry 0x736f_6161, // "soaa"
SortComposerEntry 0x736f_636f, // "soco"
);
|