1 #pragma once
2 /*****************************************************************************
3  *
4  * Copyright 2016 Varol Okan. All rights reserved.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *     http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  ****************************************************************************/
19 
20 #include <stdint.h>
21 #include <string>
22 #include <limits>
23 
24 #include <QtEndian>
25 #if defined(Q_OS_WIN) || defined(Q_OS_MAC)
26 #  define htobe16(x) qToBigEndian(x)
27 #  define htole16(x) qToLittleEndian(x)
28 #  define be16toh(x) qFromBigEndian(x)
29 #  define le16toh(x) qFromLittleEndian(x)
30 #  define htobe32(x) qToBigEndian(x)
31 #  define htole32(x) qToLittleEndian(x)
32 #  define be32toh(x) qFromBigEndian(x)
33 #  define le32toh(x) qFromLittleEndian(x)
34 #  define htobe64(x) qToBigEndian(x)
35 #  define htole64(x) qtoLittleEndian(x)
36 #  define be64toh(x) qFromBigEndian(x)
37 #  define le64toh(x) qFromLittleEndian(x)
38 #elif !defined(__FreeBSD__) && !defined(__DragonFly__)
39 #  include <endian.h>
40 #elif defined(__FreeBSD__) || defined(__DragonFly__)
41 #  include <sys/endian.h>
42 #endif
43 
44 struct AudioMetadata {
AudioMetadataAudioMetadata45   AudioMetadata ( )  {
46     ambisonic_order = 1;
47     ambisonic_type  = "periphonic";
48     ambisonic_channel_ordering = "ACN";
49     ambisonic_normalization    = "SN3D";
50     for ( uint32_t t=0; t<4; t++ )
51       channel_map[t] = t;
52   };
53   uint32_t ambisonic_order;
54   std::string ambisonic_type;
55   std::string ambisonic_channel_ordering;
56   std::string ambisonic_normalization;
57   uint32_t channel_map[4];
58 };
59 
60 // MPEG-4 constants
61 namespace constants
62 {
63 
64 static const char *TRAK_TYPE_VIDE = "vide";
65 
66 // Leaf types.
67 static const char *TAG_STCO = "stco";
68 static const char *TAG_CO64 = "co64";
69 static const char *TAG_FREE = "free";
70 static const char *TAG_MDAT = "mdat";
71 static const char *TAG_XML  = "xml ";
72 static const char *TAG_HDLR = "hdlr";
73 static const char *TAG_FTYP = "ftyp";
74 static const char *TAG_ESDS = "esds";
75 static const char *TAG_SOUN = "soun";
76 static const char *TAG_SA3D = "SA3D";
77 
78 // Container types.
79 static const char *TAG_MOOV = "moov";
80 static const char *TAG_UDTA = "udta";
81 static const char *TAG_META = "meta";
82 static const char *TAG_TRAK = "trak";
83 static const char *TAG_MDIA = "mdia";
84 static const char *TAG_MINF = "minf";
85 static const char *TAG_STBL = "stbl";
86 static const char *TAG_STSD = "stsd";
87 static const char *TAG_UUID = "uuid";
88 static const char *TAG_WAVE = "wave";
89 
90 // Sound sample descriptions.
91 static const char *TAG_NONE = "NONE";
92 static const char *TAG_RAW_ = "raw ";
93 static const char *TAG_TWOS = "twos";
94 static const char *TAG_SOWT = "sowt";
95 static const char *TAG_FL32 = "fl32";
96 static const char *TAG_FL64 = "fl64";
97 static const char *TAG_IN24 = "in24";
98 static const char *TAG_IN32 = "in32";
99 static const char *TAG_ULAW = "ulaw";
100 static const char *TAG_ALAW = "alaw";
101 static const char *TAG_LPCM = "lpcm";
102 static const char *TAG_MP4A = "mp4a";
103 
104 static const char * SOUND_SAMPLE_DESCRIPTIONS[12] = {
105     TAG_NONE,
106     TAG_RAW_,
107     TAG_TWOS,
108     TAG_SOWT,
109     TAG_FL32,
110     TAG_FL64,
111     TAG_IN24,
112     TAG_IN32,
113     TAG_ULAW,
114     TAG_ALAW,
115     TAG_LPCM,
116     TAG_MP4A
117 };
118 
119 static const char * CONTAINERS_LIST[20] = {
120     TAG_MDIA,
121     TAG_MINF,
122     TAG_MOOV,
123     TAG_STBL,
124     TAG_STSD,
125     TAG_TRAK,
126     TAG_UDTA,
127     TAG_WAVE,
128 
129     TAG_NONE,
130     TAG_RAW_,
131     TAG_TWOS,
132     TAG_SOWT,
133     TAG_FL32,
134     TAG_FL64,
135     TAG_IN24,
136     TAG_IN32,
137     TAG_ULAW,
138     TAG_ALAW,
139     TAG_LPCM,
140     TAG_MP4A
141 };
142 
143   enum Type {
144     Box = 0,
145     Container,
146     ContainerLeaf,
147     None
148   };
149 
150 };  // End of namespace constants
151 
152