1*103e46e4SHarish Mahendrakar // Copyright (c) 2012 The WebM project authors. All Rights Reserved.
2*103e46e4SHarish Mahendrakar //
3*103e46e4SHarish Mahendrakar // Use of this source code is governed by a BSD-style license
4*103e46e4SHarish Mahendrakar // that can be found in the LICENSE file in the root of the source
5*103e46e4SHarish Mahendrakar // tree. An additional intellectual property rights grant can be found
6*103e46e4SHarish Mahendrakar // in the file PATENTS. All contributing project authors may
7*103e46e4SHarish Mahendrakar // be found in the AUTHORS file in the root of the source tree.
8*103e46e4SHarish Mahendrakar
9*103e46e4SHarish Mahendrakar #include "mkvmuxer/mkvmuxerutil.h"
10*103e46e4SHarish Mahendrakar
11*103e46e4SHarish Mahendrakar #ifdef __ANDROID__
12*103e46e4SHarish Mahendrakar #include <fcntl.h>
13*103e46e4SHarish Mahendrakar #include <unistd.h>
14*103e46e4SHarish Mahendrakar #endif
15*103e46e4SHarish Mahendrakar
16*103e46e4SHarish Mahendrakar #include <cassert>
17*103e46e4SHarish Mahendrakar #include <cmath>
18*103e46e4SHarish Mahendrakar #include <cstdio>
19*103e46e4SHarish Mahendrakar #include <cstdlib>
20*103e46e4SHarish Mahendrakar #include <cstring>
21*103e46e4SHarish Mahendrakar #include <ctime>
22*103e46e4SHarish Mahendrakar #include <new>
23*103e46e4SHarish Mahendrakar
24*103e46e4SHarish Mahendrakar #include "common/webmids.h"
25*103e46e4SHarish Mahendrakar #include "mkvmuxer/mkvmuxer.h"
26*103e46e4SHarish Mahendrakar #include "mkvmuxer/mkvwriter.h"
27*103e46e4SHarish Mahendrakar
28*103e46e4SHarish Mahendrakar namespace mkvmuxer {
29*103e46e4SHarish Mahendrakar
30*103e46e4SHarish Mahendrakar namespace {
31*103e46e4SHarish Mahendrakar
32*103e46e4SHarish Mahendrakar // Date elements are always 8 octets in size.
33*103e46e4SHarish Mahendrakar const int kDateElementSize = 8;
34*103e46e4SHarish Mahendrakar
WriteBlock(IMkvWriter * writer,const Frame * const frame,int64 timecode,uint64 timecode_scale)35*103e46e4SHarish Mahendrakar uint64 WriteBlock(IMkvWriter* writer, const Frame* const frame, int64 timecode,
36*103e46e4SHarish Mahendrakar uint64 timecode_scale) {
37*103e46e4SHarish Mahendrakar uint64 block_additional_elem_size = 0;
38*103e46e4SHarish Mahendrakar uint64 block_addid_elem_size = 0;
39*103e46e4SHarish Mahendrakar uint64 block_more_payload_size = 0;
40*103e46e4SHarish Mahendrakar uint64 block_more_elem_size = 0;
41*103e46e4SHarish Mahendrakar uint64 block_additions_payload_size = 0;
42*103e46e4SHarish Mahendrakar uint64 block_additions_elem_size = 0;
43*103e46e4SHarish Mahendrakar if (frame->additional()) {
44*103e46e4SHarish Mahendrakar block_additional_elem_size =
45*103e46e4SHarish Mahendrakar EbmlElementSize(libwebm::kMkvBlockAdditional, frame->additional(),
46*103e46e4SHarish Mahendrakar frame->additional_length());
47*103e46e4SHarish Mahendrakar block_addid_elem_size = EbmlElementSize(
48*103e46e4SHarish Mahendrakar libwebm::kMkvBlockAddID, static_cast<uint64>(frame->add_id()));
49*103e46e4SHarish Mahendrakar
50*103e46e4SHarish Mahendrakar block_more_payload_size =
51*103e46e4SHarish Mahendrakar block_addid_elem_size + block_additional_elem_size;
52*103e46e4SHarish Mahendrakar block_more_elem_size =
53*103e46e4SHarish Mahendrakar EbmlMasterElementSize(libwebm::kMkvBlockMore, block_more_payload_size) +
54*103e46e4SHarish Mahendrakar block_more_payload_size;
55*103e46e4SHarish Mahendrakar block_additions_payload_size = block_more_elem_size;
56*103e46e4SHarish Mahendrakar block_additions_elem_size =
57*103e46e4SHarish Mahendrakar EbmlMasterElementSize(libwebm::kMkvBlockAdditions,
58*103e46e4SHarish Mahendrakar block_additions_payload_size) +
59*103e46e4SHarish Mahendrakar block_additions_payload_size;
60*103e46e4SHarish Mahendrakar }
61*103e46e4SHarish Mahendrakar
62*103e46e4SHarish Mahendrakar uint64 discard_padding_elem_size = 0;
63*103e46e4SHarish Mahendrakar if (frame->discard_padding() != 0) {
64*103e46e4SHarish Mahendrakar discard_padding_elem_size =
65*103e46e4SHarish Mahendrakar EbmlElementSize(libwebm::kMkvDiscardPadding,
66*103e46e4SHarish Mahendrakar static_cast<int64>(frame->discard_padding()));
67*103e46e4SHarish Mahendrakar }
68*103e46e4SHarish Mahendrakar
69*103e46e4SHarish Mahendrakar const uint64 reference_block_timestamp =
70*103e46e4SHarish Mahendrakar frame->reference_block_timestamp() / timecode_scale;
71*103e46e4SHarish Mahendrakar uint64 reference_block_elem_size = 0;
72*103e46e4SHarish Mahendrakar if (!frame->is_key()) {
73*103e46e4SHarish Mahendrakar reference_block_elem_size =
74*103e46e4SHarish Mahendrakar EbmlElementSize(libwebm::kMkvReferenceBlock, reference_block_timestamp);
75*103e46e4SHarish Mahendrakar }
76*103e46e4SHarish Mahendrakar
77*103e46e4SHarish Mahendrakar const uint64 duration = frame->duration() / timecode_scale;
78*103e46e4SHarish Mahendrakar uint64 block_duration_elem_size = 0;
79*103e46e4SHarish Mahendrakar if (duration > 0)
80*103e46e4SHarish Mahendrakar block_duration_elem_size =
81*103e46e4SHarish Mahendrakar EbmlElementSize(libwebm::kMkvBlockDuration, duration);
82*103e46e4SHarish Mahendrakar
83*103e46e4SHarish Mahendrakar const uint64 block_payload_size = 4 + frame->length();
84*103e46e4SHarish Mahendrakar const uint64 block_elem_size =
85*103e46e4SHarish Mahendrakar EbmlMasterElementSize(libwebm::kMkvBlock, block_payload_size) +
86*103e46e4SHarish Mahendrakar block_payload_size;
87*103e46e4SHarish Mahendrakar
88*103e46e4SHarish Mahendrakar const uint64 block_group_payload_size =
89*103e46e4SHarish Mahendrakar block_elem_size + block_additions_elem_size + block_duration_elem_size +
90*103e46e4SHarish Mahendrakar discard_padding_elem_size + reference_block_elem_size;
91*103e46e4SHarish Mahendrakar
92*103e46e4SHarish Mahendrakar if (!WriteEbmlMasterElement(writer, libwebm::kMkvBlockGroup,
93*103e46e4SHarish Mahendrakar block_group_payload_size)) {
94*103e46e4SHarish Mahendrakar return 0;
95*103e46e4SHarish Mahendrakar }
96*103e46e4SHarish Mahendrakar
97*103e46e4SHarish Mahendrakar if (!WriteEbmlMasterElement(writer, libwebm::kMkvBlock, block_payload_size))
98*103e46e4SHarish Mahendrakar return 0;
99*103e46e4SHarish Mahendrakar
100*103e46e4SHarish Mahendrakar if (WriteUInt(writer, frame->track_number()))
101*103e46e4SHarish Mahendrakar return 0;
102*103e46e4SHarish Mahendrakar
103*103e46e4SHarish Mahendrakar if (SerializeInt(writer, timecode, 2))
104*103e46e4SHarish Mahendrakar return 0;
105*103e46e4SHarish Mahendrakar
106*103e46e4SHarish Mahendrakar // For a Block, flags is always 0.
107*103e46e4SHarish Mahendrakar if (SerializeInt(writer, 0, 1))
108*103e46e4SHarish Mahendrakar return 0;
109*103e46e4SHarish Mahendrakar
110*103e46e4SHarish Mahendrakar if (writer->Write(frame->frame(), static_cast<uint32>(frame->length())))
111*103e46e4SHarish Mahendrakar return 0;
112*103e46e4SHarish Mahendrakar
113*103e46e4SHarish Mahendrakar if (frame->additional()) {
114*103e46e4SHarish Mahendrakar if (!WriteEbmlMasterElement(writer, libwebm::kMkvBlockAdditions,
115*103e46e4SHarish Mahendrakar block_additions_payload_size)) {
116*103e46e4SHarish Mahendrakar return 0;
117*103e46e4SHarish Mahendrakar }
118*103e46e4SHarish Mahendrakar
119*103e46e4SHarish Mahendrakar if (!WriteEbmlMasterElement(writer, libwebm::kMkvBlockMore,
120*103e46e4SHarish Mahendrakar block_more_payload_size))
121*103e46e4SHarish Mahendrakar return 0;
122*103e46e4SHarish Mahendrakar
123*103e46e4SHarish Mahendrakar if (!WriteEbmlElement(writer, libwebm::kMkvBlockAddID,
124*103e46e4SHarish Mahendrakar static_cast<uint64>(frame->add_id())))
125*103e46e4SHarish Mahendrakar return 0;
126*103e46e4SHarish Mahendrakar
127*103e46e4SHarish Mahendrakar if (!WriteEbmlElement(writer, libwebm::kMkvBlockAdditional,
128*103e46e4SHarish Mahendrakar frame->additional(), frame->additional_length())) {
129*103e46e4SHarish Mahendrakar return 0;
130*103e46e4SHarish Mahendrakar }
131*103e46e4SHarish Mahendrakar }
132*103e46e4SHarish Mahendrakar
133*103e46e4SHarish Mahendrakar if (frame->discard_padding() != 0 &&
134*103e46e4SHarish Mahendrakar !WriteEbmlElement(writer, libwebm::kMkvDiscardPadding,
135*103e46e4SHarish Mahendrakar static_cast<int64>(frame->discard_padding()))) {
136*103e46e4SHarish Mahendrakar return false;
137*103e46e4SHarish Mahendrakar }
138*103e46e4SHarish Mahendrakar
139*103e46e4SHarish Mahendrakar if (!frame->is_key() && !WriteEbmlElement(writer, libwebm::kMkvReferenceBlock,
140*103e46e4SHarish Mahendrakar reference_block_timestamp)) {
141*103e46e4SHarish Mahendrakar return false;
142*103e46e4SHarish Mahendrakar }
143*103e46e4SHarish Mahendrakar
144*103e46e4SHarish Mahendrakar if (duration > 0 &&
145*103e46e4SHarish Mahendrakar !WriteEbmlElement(writer, libwebm::kMkvBlockDuration, duration)) {
146*103e46e4SHarish Mahendrakar return false;
147*103e46e4SHarish Mahendrakar }
148*103e46e4SHarish Mahendrakar return EbmlMasterElementSize(libwebm::kMkvBlockGroup,
149*103e46e4SHarish Mahendrakar block_group_payload_size) +
150*103e46e4SHarish Mahendrakar block_group_payload_size;
151*103e46e4SHarish Mahendrakar }
152*103e46e4SHarish Mahendrakar
WriteSimpleBlock(IMkvWriter * writer,const Frame * const frame,int64 timecode)153*103e46e4SHarish Mahendrakar uint64 WriteSimpleBlock(IMkvWriter* writer, const Frame* const frame,
154*103e46e4SHarish Mahendrakar int64 timecode) {
155*103e46e4SHarish Mahendrakar if (WriteID(writer, libwebm::kMkvSimpleBlock))
156*103e46e4SHarish Mahendrakar return 0;
157*103e46e4SHarish Mahendrakar
158*103e46e4SHarish Mahendrakar const int32 size = static_cast<int32>(frame->length()) + 4;
159*103e46e4SHarish Mahendrakar if (WriteUInt(writer, size))
160*103e46e4SHarish Mahendrakar return 0;
161*103e46e4SHarish Mahendrakar
162*103e46e4SHarish Mahendrakar if (WriteUInt(writer, static_cast<uint64>(frame->track_number())))
163*103e46e4SHarish Mahendrakar return 0;
164*103e46e4SHarish Mahendrakar
165*103e46e4SHarish Mahendrakar if (SerializeInt(writer, timecode, 2))
166*103e46e4SHarish Mahendrakar return 0;
167*103e46e4SHarish Mahendrakar
168*103e46e4SHarish Mahendrakar uint64 flags = 0;
169*103e46e4SHarish Mahendrakar if (frame->is_key())
170*103e46e4SHarish Mahendrakar flags |= 0x80;
171*103e46e4SHarish Mahendrakar
172*103e46e4SHarish Mahendrakar if (SerializeInt(writer, flags, 1))
173*103e46e4SHarish Mahendrakar return 0;
174*103e46e4SHarish Mahendrakar
175*103e46e4SHarish Mahendrakar if (writer->Write(frame->frame(), static_cast<uint32>(frame->length())))
176*103e46e4SHarish Mahendrakar return 0;
177*103e46e4SHarish Mahendrakar
178*103e46e4SHarish Mahendrakar return GetUIntSize(libwebm::kMkvSimpleBlock) + GetCodedUIntSize(size) + 4 +
179*103e46e4SHarish Mahendrakar frame->length();
180*103e46e4SHarish Mahendrakar }
181*103e46e4SHarish Mahendrakar
182*103e46e4SHarish Mahendrakar } // namespace
183*103e46e4SHarish Mahendrakar
GetCodedUIntSize(uint64 value)184*103e46e4SHarish Mahendrakar int32 GetCodedUIntSize(uint64 value) {
185*103e46e4SHarish Mahendrakar if (value < 0x000000000000007FULL)
186*103e46e4SHarish Mahendrakar return 1;
187*103e46e4SHarish Mahendrakar else if (value < 0x0000000000003FFFULL)
188*103e46e4SHarish Mahendrakar return 2;
189*103e46e4SHarish Mahendrakar else if (value < 0x00000000001FFFFFULL)
190*103e46e4SHarish Mahendrakar return 3;
191*103e46e4SHarish Mahendrakar else if (value < 0x000000000FFFFFFFULL)
192*103e46e4SHarish Mahendrakar return 4;
193*103e46e4SHarish Mahendrakar else if (value < 0x00000007FFFFFFFFULL)
194*103e46e4SHarish Mahendrakar return 5;
195*103e46e4SHarish Mahendrakar else if (value < 0x000003FFFFFFFFFFULL)
196*103e46e4SHarish Mahendrakar return 6;
197*103e46e4SHarish Mahendrakar else if (value < 0x0001FFFFFFFFFFFFULL)
198*103e46e4SHarish Mahendrakar return 7;
199*103e46e4SHarish Mahendrakar return 8;
200*103e46e4SHarish Mahendrakar }
201*103e46e4SHarish Mahendrakar
GetUIntSize(uint64 value)202*103e46e4SHarish Mahendrakar int32 GetUIntSize(uint64 value) {
203*103e46e4SHarish Mahendrakar if (value < 0x0000000000000100ULL)
204*103e46e4SHarish Mahendrakar return 1;
205*103e46e4SHarish Mahendrakar else if (value < 0x0000000000010000ULL)
206*103e46e4SHarish Mahendrakar return 2;
207*103e46e4SHarish Mahendrakar else if (value < 0x0000000001000000ULL)
208*103e46e4SHarish Mahendrakar return 3;
209*103e46e4SHarish Mahendrakar else if (value < 0x0000000100000000ULL)
210*103e46e4SHarish Mahendrakar return 4;
211*103e46e4SHarish Mahendrakar else if (value < 0x0000010000000000ULL)
212*103e46e4SHarish Mahendrakar return 5;
213*103e46e4SHarish Mahendrakar else if (value < 0x0001000000000000ULL)
214*103e46e4SHarish Mahendrakar return 6;
215*103e46e4SHarish Mahendrakar else if (value < 0x0100000000000000ULL)
216*103e46e4SHarish Mahendrakar return 7;
217*103e46e4SHarish Mahendrakar return 8;
218*103e46e4SHarish Mahendrakar }
219*103e46e4SHarish Mahendrakar
GetIntSize(int64 value)220*103e46e4SHarish Mahendrakar int32 GetIntSize(int64 value) {
221*103e46e4SHarish Mahendrakar // Doubling the requested value ensures positive values with their high bit
222*103e46e4SHarish Mahendrakar // set are written with 0-padding to avoid flipping the signedness.
223*103e46e4SHarish Mahendrakar const uint64 v = (value < 0) ? value ^ -1LL : value;
224*103e46e4SHarish Mahendrakar return GetUIntSize(2 * v);
225*103e46e4SHarish Mahendrakar }
226*103e46e4SHarish Mahendrakar
EbmlMasterElementSize(uint64 type,uint64 value)227*103e46e4SHarish Mahendrakar uint64 EbmlMasterElementSize(uint64 type, uint64 value) {
228*103e46e4SHarish Mahendrakar // Size of EBML ID
229*103e46e4SHarish Mahendrakar int32 ebml_size = GetUIntSize(type);
230*103e46e4SHarish Mahendrakar
231*103e46e4SHarish Mahendrakar // Datasize
232*103e46e4SHarish Mahendrakar ebml_size += GetCodedUIntSize(value);
233*103e46e4SHarish Mahendrakar
234*103e46e4SHarish Mahendrakar return ebml_size;
235*103e46e4SHarish Mahendrakar }
236*103e46e4SHarish Mahendrakar
EbmlElementSize(uint64 type,int64 value)237*103e46e4SHarish Mahendrakar uint64 EbmlElementSize(uint64 type, int64 value) {
238*103e46e4SHarish Mahendrakar // Size of EBML ID
239*103e46e4SHarish Mahendrakar int32 ebml_size = GetUIntSize(type);
240*103e46e4SHarish Mahendrakar
241*103e46e4SHarish Mahendrakar // Datasize
242*103e46e4SHarish Mahendrakar ebml_size += GetIntSize(value);
243*103e46e4SHarish Mahendrakar
244*103e46e4SHarish Mahendrakar // Size of Datasize
245*103e46e4SHarish Mahendrakar ebml_size++;
246*103e46e4SHarish Mahendrakar
247*103e46e4SHarish Mahendrakar return ebml_size;
248*103e46e4SHarish Mahendrakar }
249*103e46e4SHarish Mahendrakar
EbmlElementSize(uint64 type,uint64 value)250*103e46e4SHarish Mahendrakar uint64 EbmlElementSize(uint64 type, uint64 value) {
251*103e46e4SHarish Mahendrakar return EbmlElementSize(type, value, 0);
252*103e46e4SHarish Mahendrakar }
253*103e46e4SHarish Mahendrakar
EbmlElementSize(uint64 type,uint64 value,uint64 fixed_size)254*103e46e4SHarish Mahendrakar uint64 EbmlElementSize(uint64 type, uint64 value, uint64 fixed_size) {
255*103e46e4SHarish Mahendrakar // Size of EBML ID
256*103e46e4SHarish Mahendrakar uint64 ebml_size = GetUIntSize(type);
257*103e46e4SHarish Mahendrakar
258*103e46e4SHarish Mahendrakar // Datasize
259*103e46e4SHarish Mahendrakar ebml_size += (fixed_size > 0) ? fixed_size : GetUIntSize(value);
260*103e46e4SHarish Mahendrakar
261*103e46e4SHarish Mahendrakar // Size of Datasize
262*103e46e4SHarish Mahendrakar ebml_size++;
263*103e46e4SHarish Mahendrakar
264*103e46e4SHarish Mahendrakar return ebml_size;
265*103e46e4SHarish Mahendrakar }
266*103e46e4SHarish Mahendrakar
EbmlElementSize(uint64 type,float)267*103e46e4SHarish Mahendrakar uint64 EbmlElementSize(uint64 type, float /* value */) {
268*103e46e4SHarish Mahendrakar // Size of EBML ID
269*103e46e4SHarish Mahendrakar uint64 ebml_size = GetUIntSize(type);
270*103e46e4SHarish Mahendrakar
271*103e46e4SHarish Mahendrakar // Datasize
272*103e46e4SHarish Mahendrakar ebml_size += sizeof(float);
273*103e46e4SHarish Mahendrakar
274*103e46e4SHarish Mahendrakar // Size of Datasize
275*103e46e4SHarish Mahendrakar ebml_size++;
276*103e46e4SHarish Mahendrakar
277*103e46e4SHarish Mahendrakar return ebml_size;
278*103e46e4SHarish Mahendrakar }
279*103e46e4SHarish Mahendrakar
EbmlElementSize(uint64 type,const char * value)280*103e46e4SHarish Mahendrakar uint64 EbmlElementSize(uint64 type, const char* value) {
281*103e46e4SHarish Mahendrakar if (!value)
282*103e46e4SHarish Mahendrakar return 0;
283*103e46e4SHarish Mahendrakar
284*103e46e4SHarish Mahendrakar // Size of EBML ID
285*103e46e4SHarish Mahendrakar uint64 ebml_size = GetUIntSize(type);
286*103e46e4SHarish Mahendrakar
287*103e46e4SHarish Mahendrakar // Datasize
288*103e46e4SHarish Mahendrakar ebml_size += strlen(value);
289*103e46e4SHarish Mahendrakar
290*103e46e4SHarish Mahendrakar // Size of Datasize
291*103e46e4SHarish Mahendrakar ebml_size += GetCodedUIntSize(strlen(value));
292*103e46e4SHarish Mahendrakar
293*103e46e4SHarish Mahendrakar return ebml_size;
294*103e46e4SHarish Mahendrakar }
295*103e46e4SHarish Mahendrakar
EbmlElementSize(uint64 type,const uint8 * value,uint64 size)296*103e46e4SHarish Mahendrakar uint64 EbmlElementSize(uint64 type, const uint8* value, uint64 size) {
297*103e46e4SHarish Mahendrakar if (!value)
298*103e46e4SHarish Mahendrakar return 0;
299*103e46e4SHarish Mahendrakar
300*103e46e4SHarish Mahendrakar // Size of EBML ID
301*103e46e4SHarish Mahendrakar uint64 ebml_size = GetUIntSize(type);
302*103e46e4SHarish Mahendrakar
303*103e46e4SHarish Mahendrakar // Datasize
304*103e46e4SHarish Mahendrakar ebml_size += size;
305*103e46e4SHarish Mahendrakar
306*103e46e4SHarish Mahendrakar // Size of Datasize
307*103e46e4SHarish Mahendrakar ebml_size += GetCodedUIntSize(size);
308*103e46e4SHarish Mahendrakar
309*103e46e4SHarish Mahendrakar return ebml_size;
310*103e46e4SHarish Mahendrakar }
311*103e46e4SHarish Mahendrakar
EbmlDateElementSize(uint64 type)312*103e46e4SHarish Mahendrakar uint64 EbmlDateElementSize(uint64 type) {
313*103e46e4SHarish Mahendrakar // Size of EBML ID
314*103e46e4SHarish Mahendrakar uint64 ebml_size = GetUIntSize(type);
315*103e46e4SHarish Mahendrakar
316*103e46e4SHarish Mahendrakar // Datasize
317*103e46e4SHarish Mahendrakar ebml_size += kDateElementSize;
318*103e46e4SHarish Mahendrakar
319*103e46e4SHarish Mahendrakar // Size of Datasize
320*103e46e4SHarish Mahendrakar ebml_size++;
321*103e46e4SHarish Mahendrakar
322*103e46e4SHarish Mahendrakar return ebml_size;
323*103e46e4SHarish Mahendrakar }
324*103e46e4SHarish Mahendrakar
SerializeInt(IMkvWriter * writer,int64 value,int32 size)325*103e46e4SHarish Mahendrakar int32 SerializeInt(IMkvWriter* writer, int64 value, int32 size) {
326*103e46e4SHarish Mahendrakar if (!writer || size < 1 || size > 8)
327*103e46e4SHarish Mahendrakar return -1;
328*103e46e4SHarish Mahendrakar
329*103e46e4SHarish Mahendrakar for (int32 i = 1; i <= size; ++i) {
330*103e46e4SHarish Mahendrakar const int32 byte_count = size - i;
331*103e46e4SHarish Mahendrakar const int32 bit_count = byte_count * 8;
332*103e46e4SHarish Mahendrakar
333*103e46e4SHarish Mahendrakar const int64 bb = value >> bit_count;
334*103e46e4SHarish Mahendrakar const uint8 b = static_cast<uint8>(bb);
335*103e46e4SHarish Mahendrakar
336*103e46e4SHarish Mahendrakar const int32 status = writer->Write(&b, 1);
337*103e46e4SHarish Mahendrakar
338*103e46e4SHarish Mahendrakar if (status < 0)
339*103e46e4SHarish Mahendrakar return status;
340*103e46e4SHarish Mahendrakar }
341*103e46e4SHarish Mahendrakar
342*103e46e4SHarish Mahendrakar return 0;
343*103e46e4SHarish Mahendrakar }
344*103e46e4SHarish Mahendrakar
SerializeFloat(IMkvWriter * writer,float f)345*103e46e4SHarish Mahendrakar int32 SerializeFloat(IMkvWriter* writer, float f) {
346*103e46e4SHarish Mahendrakar if (!writer)
347*103e46e4SHarish Mahendrakar return -1;
348*103e46e4SHarish Mahendrakar
349*103e46e4SHarish Mahendrakar assert(sizeof(uint32) == sizeof(float));
350*103e46e4SHarish Mahendrakar // This union is merely used to avoid a reinterpret_cast from float& to
351*103e46e4SHarish Mahendrakar // uint32& which will result in violation of strict aliasing.
352*103e46e4SHarish Mahendrakar union U32 {
353*103e46e4SHarish Mahendrakar uint32 u32;
354*103e46e4SHarish Mahendrakar float f;
355*103e46e4SHarish Mahendrakar } value;
356*103e46e4SHarish Mahendrakar value.f = f;
357*103e46e4SHarish Mahendrakar
358*103e46e4SHarish Mahendrakar for (int32 i = 1; i <= 4; ++i) {
359*103e46e4SHarish Mahendrakar const int32 byte_count = 4 - i;
360*103e46e4SHarish Mahendrakar const int32 bit_count = byte_count * 8;
361*103e46e4SHarish Mahendrakar
362*103e46e4SHarish Mahendrakar const uint8 byte = static_cast<uint8>(value.u32 >> bit_count);
363*103e46e4SHarish Mahendrakar
364*103e46e4SHarish Mahendrakar const int32 status = writer->Write(&byte, 1);
365*103e46e4SHarish Mahendrakar
366*103e46e4SHarish Mahendrakar if (status < 0)
367*103e46e4SHarish Mahendrakar return status;
368*103e46e4SHarish Mahendrakar }
369*103e46e4SHarish Mahendrakar
370*103e46e4SHarish Mahendrakar return 0;
371*103e46e4SHarish Mahendrakar }
372*103e46e4SHarish Mahendrakar
WriteUInt(IMkvWriter * writer,uint64 value)373*103e46e4SHarish Mahendrakar int32 WriteUInt(IMkvWriter* writer, uint64 value) {
374*103e46e4SHarish Mahendrakar if (!writer)
375*103e46e4SHarish Mahendrakar return -1;
376*103e46e4SHarish Mahendrakar
377*103e46e4SHarish Mahendrakar int32 size = GetCodedUIntSize(value);
378*103e46e4SHarish Mahendrakar
379*103e46e4SHarish Mahendrakar return WriteUIntSize(writer, value, size);
380*103e46e4SHarish Mahendrakar }
381*103e46e4SHarish Mahendrakar
WriteUIntSize(IMkvWriter * writer,uint64 value,int32 size)382*103e46e4SHarish Mahendrakar int32 WriteUIntSize(IMkvWriter* writer, uint64 value, int32 size) {
383*103e46e4SHarish Mahendrakar if (!writer || size < 0 || size > 8)
384*103e46e4SHarish Mahendrakar return -1;
385*103e46e4SHarish Mahendrakar
386*103e46e4SHarish Mahendrakar if (size > 0) {
387*103e46e4SHarish Mahendrakar const uint64 bit = 1LL << (size * 7);
388*103e46e4SHarish Mahendrakar
389*103e46e4SHarish Mahendrakar if (value > (bit - 2))
390*103e46e4SHarish Mahendrakar return -1;
391*103e46e4SHarish Mahendrakar
392*103e46e4SHarish Mahendrakar value |= bit;
393*103e46e4SHarish Mahendrakar } else {
394*103e46e4SHarish Mahendrakar size = 1;
395*103e46e4SHarish Mahendrakar int64 bit;
396*103e46e4SHarish Mahendrakar
397*103e46e4SHarish Mahendrakar for (;;) {
398*103e46e4SHarish Mahendrakar bit = 1LL << (size * 7);
399*103e46e4SHarish Mahendrakar const uint64 max = bit - 2;
400*103e46e4SHarish Mahendrakar
401*103e46e4SHarish Mahendrakar if (value <= max)
402*103e46e4SHarish Mahendrakar break;
403*103e46e4SHarish Mahendrakar
404*103e46e4SHarish Mahendrakar ++size;
405*103e46e4SHarish Mahendrakar }
406*103e46e4SHarish Mahendrakar
407*103e46e4SHarish Mahendrakar if (size > 8)
408*103e46e4SHarish Mahendrakar return false;
409*103e46e4SHarish Mahendrakar
410*103e46e4SHarish Mahendrakar value |= bit;
411*103e46e4SHarish Mahendrakar }
412*103e46e4SHarish Mahendrakar
413*103e46e4SHarish Mahendrakar return SerializeInt(writer, value, size);
414*103e46e4SHarish Mahendrakar }
415*103e46e4SHarish Mahendrakar
WriteID(IMkvWriter * writer,uint64 type)416*103e46e4SHarish Mahendrakar int32 WriteID(IMkvWriter* writer, uint64 type) {
417*103e46e4SHarish Mahendrakar if (!writer)
418*103e46e4SHarish Mahendrakar return -1;
419*103e46e4SHarish Mahendrakar
420*103e46e4SHarish Mahendrakar writer->ElementStartNotify(type, writer->Position());
421*103e46e4SHarish Mahendrakar
422*103e46e4SHarish Mahendrakar const int32 size = GetUIntSize(type);
423*103e46e4SHarish Mahendrakar
424*103e46e4SHarish Mahendrakar return SerializeInt(writer, type, size);
425*103e46e4SHarish Mahendrakar }
426*103e46e4SHarish Mahendrakar
WriteEbmlMasterElement(IMkvWriter * writer,uint64 type,uint64 size)427*103e46e4SHarish Mahendrakar bool WriteEbmlMasterElement(IMkvWriter* writer, uint64 type, uint64 size) {
428*103e46e4SHarish Mahendrakar if (!writer)
429*103e46e4SHarish Mahendrakar return false;
430*103e46e4SHarish Mahendrakar
431*103e46e4SHarish Mahendrakar if (WriteID(writer, type))
432*103e46e4SHarish Mahendrakar return false;
433*103e46e4SHarish Mahendrakar
434*103e46e4SHarish Mahendrakar if (WriteUInt(writer, size))
435*103e46e4SHarish Mahendrakar return false;
436*103e46e4SHarish Mahendrakar
437*103e46e4SHarish Mahendrakar return true;
438*103e46e4SHarish Mahendrakar }
439*103e46e4SHarish Mahendrakar
WriteEbmlElement(IMkvWriter * writer,uint64 type,uint64 value)440*103e46e4SHarish Mahendrakar bool WriteEbmlElement(IMkvWriter* writer, uint64 type, uint64 value) {
441*103e46e4SHarish Mahendrakar return WriteEbmlElement(writer, type, value, 0);
442*103e46e4SHarish Mahendrakar }
443*103e46e4SHarish Mahendrakar
WriteEbmlElement(IMkvWriter * writer,uint64 type,uint64 value,uint64 fixed_size)444*103e46e4SHarish Mahendrakar bool WriteEbmlElement(IMkvWriter* writer, uint64 type, uint64 value,
445*103e46e4SHarish Mahendrakar uint64 fixed_size) {
446*103e46e4SHarish Mahendrakar if (!writer)
447*103e46e4SHarish Mahendrakar return false;
448*103e46e4SHarish Mahendrakar
449*103e46e4SHarish Mahendrakar if (WriteID(writer, type))
450*103e46e4SHarish Mahendrakar return false;
451*103e46e4SHarish Mahendrakar
452*103e46e4SHarish Mahendrakar uint64 size = GetUIntSize(value);
453*103e46e4SHarish Mahendrakar if (fixed_size > 0) {
454*103e46e4SHarish Mahendrakar if (size > fixed_size)
455*103e46e4SHarish Mahendrakar return false;
456*103e46e4SHarish Mahendrakar size = fixed_size;
457*103e46e4SHarish Mahendrakar }
458*103e46e4SHarish Mahendrakar if (WriteUInt(writer, size))
459*103e46e4SHarish Mahendrakar return false;
460*103e46e4SHarish Mahendrakar
461*103e46e4SHarish Mahendrakar if (SerializeInt(writer, value, static_cast<int32>(size)))
462*103e46e4SHarish Mahendrakar return false;
463*103e46e4SHarish Mahendrakar
464*103e46e4SHarish Mahendrakar return true;
465*103e46e4SHarish Mahendrakar }
466*103e46e4SHarish Mahendrakar
WriteEbmlElement(IMkvWriter * writer,uint64 type,int64 value)467*103e46e4SHarish Mahendrakar bool WriteEbmlElement(IMkvWriter* writer, uint64 type, int64 value) {
468*103e46e4SHarish Mahendrakar if (!writer)
469*103e46e4SHarish Mahendrakar return false;
470*103e46e4SHarish Mahendrakar
471*103e46e4SHarish Mahendrakar if (WriteID(writer, type))
472*103e46e4SHarish Mahendrakar return 0;
473*103e46e4SHarish Mahendrakar
474*103e46e4SHarish Mahendrakar const uint64 size = GetIntSize(value);
475*103e46e4SHarish Mahendrakar if (WriteUInt(writer, size))
476*103e46e4SHarish Mahendrakar return false;
477*103e46e4SHarish Mahendrakar
478*103e46e4SHarish Mahendrakar if (SerializeInt(writer, value, static_cast<int32>(size)))
479*103e46e4SHarish Mahendrakar return false;
480*103e46e4SHarish Mahendrakar
481*103e46e4SHarish Mahendrakar return true;
482*103e46e4SHarish Mahendrakar }
483*103e46e4SHarish Mahendrakar
WriteEbmlElement(IMkvWriter * writer,uint64 type,float value)484*103e46e4SHarish Mahendrakar bool WriteEbmlElement(IMkvWriter* writer, uint64 type, float value) {
485*103e46e4SHarish Mahendrakar if (!writer)
486*103e46e4SHarish Mahendrakar return false;
487*103e46e4SHarish Mahendrakar
488*103e46e4SHarish Mahendrakar if (WriteID(writer, type))
489*103e46e4SHarish Mahendrakar return false;
490*103e46e4SHarish Mahendrakar
491*103e46e4SHarish Mahendrakar if (WriteUInt(writer, 4))
492*103e46e4SHarish Mahendrakar return false;
493*103e46e4SHarish Mahendrakar
494*103e46e4SHarish Mahendrakar if (SerializeFloat(writer, value))
495*103e46e4SHarish Mahendrakar return false;
496*103e46e4SHarish Mahendrakar
497*103e46e4SHarish Mahendrakar return true;
498*103e46e4SHarish Mahendrakar }
499*103e46e4SHarish Mahendrakar
WriteEbmlElement(IMkvWriter * writer,uint64 type,const char * value)500*103e46e4SHarish Mahendrakar bool WriteEbmlElement(IMkvWriter* writer, uint64 type, const char* value) {
501*103e46e4SHarish Mahendrakar if (!writer || !value)
502*103e46e4SHarish Mahendrakar return false;
503*103e46e4SHarish Mahendrakar
504*103e46e4SHarish Mahendrakar if (WriteID(writer, type))
505*103e46e4SHarish Mahendrakar return false;
506*103e46e4SHarish Mahendrakar
507*103e46e4SHarish Mahendrakar const uint64 length = strlen(value);
508*103e46e4SHarish Mahendrakar if (WriteUInt(writer, length))
509*103e46e4SHarish Mahendrakar return false;
510*103e46e4SHarish Mahendrakar
511*103e46e4SHarish Mahendrakar if (writer->Write(value, static_cast<uint32>(length)))
512*103e46e4SHarish Mahendrakar return false;
513*103e46e4SHarish Mahendrakar
514*103e46e4SHarish Mahendrakar return true;
515*103e46e4SHarish Mahendrakar }
516*103e46e4SHarish Mahendrakar
WriteEbmlElement(IMkvWriter * writer,uint64 type,const uint8 * value,uint64 size)517*103e46e4SHarish Mahendrakar bool WriteEbmlElement(IMkvWriter* writer, uint64 type, const uint8* value,
518*103e46e4SHarish Mahendrakar uint64 size) {
519*103e46e4SHarish Mahendrakar if (!writer || !value || size < 1)
520*103e46e4SHarish Mahendrakar return false;
521*103e46e4SHarish Mahendrakar
522*103e46e4SHarish Mahendrakar if (WriteID(writer, type))
523*103e46e4SHarish Mahendrakar return false;
524*103e46e4SHarish Mahendrakar
525*103e46e4SHarish Mahendrakar if (WriteUInt(writer, size))
526*103e46e4SHarish Mahendrakar return false;
527*103e46e4SHarish Mahendrakar
528*103e46e4SHarish Mahendrakar if (writer->Write(value, static_cast<uint32>(size)))
529*103e46e4SHarish Mahendrakar return false;
530*103e46e4SHarish Mahendrakar
531*103e46e4SHarish Mahendrakar return true;
532*103e46e4SHarish Mahendrakar }
533*103e46e4SHarish Mahendrakar
WriteEbmlDateElement(IMkvWriter * writer,uint64 type,int64 value)534*103e46e4SHarish Mahendrakar bool WriteEbmlDateElement(IMkvWriter* writer, uint64 type, int64 value) {
535*103e46e4SHarish Mahendrakar if (!writer)
536*103e46e4SHarish Mahendrakar return false;
537*103e46e4SHarish Mahendrakar
538*103e46e4SHarish Mahendrakar if (WriteID(writer, type))
539*103e46e4SHarish Mahendrakar return false;
540*103e46e4SHarish Mahendrakar
541*103e46e4SHarish Mahendrakar if (WriteUInt(writer, kDateElementSize))
542*103e46e4SHarish Mahendrakar return false;
543*103e46e4SHarish Mahendrakar
544*103e46e4SHarish Mahendrakar if (SerializeInt(writer, value, kDateElementSize))
545*103e46e4SHarish Mahendrakar return false;
546*103e46e4SHarish Mahendrakar
547*103e46e4SHarish Mahendrakar return true;
548*103e46e4SHarish Mahendrakar }
549*103e46e4SHarish Mahendrakar
WriteFrame(IMkvWriter * writer,const Frame * const frame,Cluster * cluster)550*103e46e4SHarish Mahendrakar uint64 WriteFrame(IMkvWriter* writer, const Frame* const frame,
551*103e46e4SHarish Mahendrakar Cluster* cluster) {
552*103e46e4SHarish Mahendrakar if (!writer || !frame || !frame->IsValid() || !cluster ||
553*103e46e4SHarish Mahendrakar !cluster->timecode_scale())
554*103e46e4SHarish Mahendrakar return 0;
555*103e46e4SHarish Mahendrakar
556*103e46e4SHarish Mahendrakar // Technically the timecode for a block can be less than the
557*103e46e4SHarish Mahendrakar // timecode for the cluster itself (remember that block timecode
558*103e46e4SHarish Mahendrakar // is a signed, 16-bit integer). However, as a simplification we
559*103e46e4SHarish Mahendrakar // only permit non-negative cluster-relative timecodes for blocks.
560*103e46e4SHarish Mahendrakar const int64 relative_timecode = cluster->GetRelativeTimecode(
561*103e46e4SHarish Mahendrakar frame->timestamp() / cluster->timecode_scale());
562*103e46e4SHarish Mahendrakar if (relative_timecode < 0 || relative_timecode > kMaxBlockTimecode)
563*103e46e4SHarish Mahendrakar return 0;
564*103e46e4SHarish Mahendrakar
565*103e46e4SHarish Mahendrakar return frame->CanBeSimpleBlock()
566*103e46e4SHarish Mahendrakar ? WriteSimpleBlock(writer, frame, relative_timecode)
567*103e46e4SHarish Mahendrakar : WriteBlock(writer, frame, relative_timecode,
568*103e46e4SHarish Mahendrakar cluster->timecode_scale());
569*103e46e4SHarish Mahendrakar }
570*103e46e4SHarish Mahendrakar
WriteVoidElement(IMkvWriter * writer,uint64 size)571*103e46e4SHarish Mahendrakar uint64 WriteVoidElement(IMkvWriter* writer, uint64 size) {
572*103e46e4SHarish Mahendrakar if (!writer)
573*103e46e4SHarish Mahendrakar return false;
574*103e46e4SHarish Mahendrakar
575*103e46e4SHarish Mahendrakar // Subtract one for the void ID and the coded size.
576*103e46e4SHarish Mahendrakar uint64 void_entry_size = size - 1 - GetCodedUIntSize(size - 1);
577*103e46e4SHarish Mahendrakar uint64 void_size = EbmlMasterElementSize(libwebm::kMkvVoid, void_entry_size) +
578*103e46e4SHarish Mahendrakar void_entry_size;
579*103e46e4SHarish Mahendrakar
580*103e46e4SHarish Mahendrakar if (void_size != size)
581*103e46e4SHarish Mahendrakar return 0;
582*103e46e4SHarish Mahendrakar
583*103e46e4SHarish Mahendrakar const int64 payload_position = writer->Position();
584*103e46e4SHarish Mahendrakar if (payload_position < 0)
585*103e46e4SHarish Mahendrakar return 0;
586*103e46e4SHarish Mahendrakar
587*103e46e4SHarish Mahendrakar if (WriteID(writer, libwebm::kMkvVoid))
588*103e46e4SHarish Mahendrakar return 0;
589*103e46e4SHarish Mahendrakar
590*103e46e4SHarish Mahendrakar if (WriteUInt(writer, void_entry_size))
591*103e46e4SHarish Mahendrakar return 0;
592*103e46e4SHarish Mahendrakar
593*103e46e4SHarish Mahendrakar const uint8 value = 0;
594*103e46e4SHarish Mahendrakar for (int32 i = 0; i < static_cast<int32>(void_entry_size); ++i) {
595*103e46e4SHarish Mahendrakar if (writer->Write(&value, 1))
596*103e46e4SHarish Mahendrakar return 0;
597*103e46e4SHarish Mahendrakar }
598*103e46e4SHarish Mahendrakar
599*103e46e4SHarish Mahendrakar const int64 stop_position = writer->Position();
600*103e46e4SHarish Mahendrakar if (stop_position < 0 ||
601*103e46e4SHarish Mahendrakar stop_position - payload_position != static_cast<int64>(void_size))
602*103e46e4SHarish Mahendrakar return 0;
603*103e46e4SHarish Mahendrakar
604*103e46e4SHarish Mahendrakar return void_size;
605*103e46e4SHarish Mahendrakar }
606*103e46e4SHarish Mahendrakar
GetVersion(int32 * major,int32 * minor,int32 * build,int32 * revision)607*103e46e4SHarish Mahendrakar void GetVersion(int32* major, int32* minor, int32* build, int32* revision) {
608*103e46e4SHarish Mahendrakar *major = 0;
609*103e46e4SHarish Mahendrakar *minor = 3;
610*103e46e4SHarish Mahendrakar *build = 3;
611*103e46e4SHarish Mahendrakar *revision = 0;
612*103e46e4SHarish Mahendrakar }
613*103e46e4SHarish Mahendrakar
MakeUID(unsigned int * seed)614*103e46e4SHarish Mahendrakar uint64 MakeUID(unsigned int* seed) {
615*103e46e4SHarish Mahendrakar uint64 uid = 0;
616*103e46e4SHarish Mahendrakar
617*103e46e4SHarish Mahendrakar #ifdef __MINGW32__
618*103e46e4SHarish Mahendrakar srand(*seed);
619*103e46e4SHarish Mahendrakar #endif
620*103e46e4SHarish Mahendrakar
621*103e46e4SHarish Mahendrakar for (int i = 0; i < 7; ++i) { // avoid problems with 8-byte values
622*103e46e4SHarish Mahendrakar uid <<= 8;
623*103e46e4SHarish Mahendrakar
624*103e46e4SHarish Mahendrakar // TODO(fgalligan): Move random number generation to platform specific code.
625*103e46e4SHarish Mahendrakar #ifdef _MSC_VER
626*103e46e4SHarish Mahendrakar (void)seed;
627*103e46e4SHarish Mahendrakar const int32 nn = rand();
628*103e46e4SHarish Mahendrakar #elif __ANDROID__
629*103e46e4SHarish Mahendrakar (void)seed;
630*103e46e4SHarish Mahendrakar int32 temp_num = 1;
631*103e46e4SHarish Mahendrakar int fd = open("/dev/urandom", O_RDONLY);
632*103e46e4SHarish Mahendrakar if (fd != -1) {
633*103e46e4SHarish Mahendrakar read(fd, &temp_num, sizeof(temp_num));
634*103e46e4SHarish Mahendrakar close(fd);
635*103e46e4SHarish Mahendrakar }
636*103e46e4SHarish Mahendrakar const int32 nn = temp_num;
637*103e46e4SHarish Mahendrakar #elif defined __MINGW32__
638*103e46e4SHarish Mahendrakar const int32 nn = rand();
639*103e46e4SHarish Mahendrakar #else
640*103e46e4SHarish Mahendrakar const int32 nn = rand_r(seed);
641*103e46e4SHarish Mahendrakar #endif
642*103e46e4SHarish Mahendrakar const int32 n = 0xFF & (nn >> 4); // throw away low-order bits
643*103e46e4SHarish Mahendrakar
644*103e46e4SHarish Mahendrakar uid |= n;
645*103e46e4SHarish Mahendrakar }
646*103e46e4SHarish Mahendrakar
647*103e46e4SHarish Mahendrakar return uid;
648*103e46e4SHarish Mahendrakar }
649*103e46e4SHarish Mahendrakar
IsMatrixCoefficientsValueValid(uint64_t value)650*103e46e4SHarish Mahendrakar bool IsMatrixCoefficientsValueValid(uint64_t value) {
651*103e46e4SHarish Mahendrakar switch (value) {
652*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kGbr:
653*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kBt709:
654*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kUnspecifiedMc:
655*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kReserved:
656*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kFcc:
657*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kBt470bg:
658*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kSmpte170MMc:
659*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kSmpte240MMc:
660*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kYcocg:
661*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kBt2020NonConstantLuminance:
662*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kBt2020ConstantLuminance:
663*103e46e4SHarish Mahendrakar return true;
664*103e46e4SHarish Mahendrakar }
665*103e46e4SHarish Mahendrakar return false;
666*103e46e4SHarish Mahendrakar }
667*103e46e4SHarish Mahendrakar
IsChromaSitingHorzValueValid(uint64_t value)668*103e46e4SHarish Mahendrakar bool IsChromaSitingHorzValueValid(uint64_t value) {
669*103e46e4SHarish Mahendrakar switch (value) {
670*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kUnspecifiedCsh:
671*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kLeftCollocated:
672*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kHalfCsh:
673*103e46e4SHarish Mahendrakar return true;
674*103e46e4SHarish Mahendrakar }
675*103e46e4SHarish Mahendrakar return false;
676*103e46e4SHarish Mahendrakar }
677*103e46e4SHarish Mahendrakar
IsChromaSitingVertValueValid(uint64_t value)678*103e46e4SHarish Mahendrakar bool IsChromaSitingVertValueValid(uint64_t value) {
679*103e46e4SHarish Mahendrakar switch (value) {
680*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kUnspecifiedCsv:
681*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kTopCollocated:
682*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kHalfCsv:
683*103e46e4SHarish Mahendrakar return true;
684*103e46e4SHarish Mahendrakar }
685*103e46e4SHarish Mahendrakar return false;
686*103e46e4SHarish Mahendrakar }
687*103e46e4SHarish Mahendrakar
IsColourRangeValueValid(uint64_t value)688*103e46e4SHarish Mahendrakar bool IsColourRangeValueValid(uint64_t value) {
689*103e46e4SHarish Mahendrakar switch (value) {
690*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kUnspecifiedCr:
691*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kBroadcastRange:
692*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kFullRange:
693*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kMcTcDefined:
694*103e46e4SHarish Mahendrakar return true;
695*103e46e4SHarish Mahendrakar }
696*103e46e4SHarish Mahendrakar return false;
697*103e46e4SHarish Mahendrakar }
698*103e46e4SHarish Mahendrakar
IsTransferCharacteristicsValueValid(uint64_t value)699*103e46e4SHarish Mahendrakar bool IsTransferCharacteristicsValueValid(uint64_t value) {
700*103e46e4SHarish Mahendrakar switch (value) {
701*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kIturBt709Tc:
702*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kUnspecifiedTc:
703*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kReservedTc:
704*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kGamma22Curve:
705*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kGamma28Curve:
706*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kSmpte170MTc:
707*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kSmpte240MTc:
708*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kLinear:
709*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kLog:
710*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kLogSqrt:
711*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kIec6196624:
712*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kIturBt1361ExtendedColourGamut:
713*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kIec6196621:
714*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kIturBt202010bit:
715*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kIturBt202012bit:
716*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kSmpteSt2084:
717*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kSmpteSt4281Tc:
718*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kAribStdB67Hlg:
719*103e46e4SHarish Mahendrakar return true;
720*103e46e4SHarish Mahendrakar }
721*103e46e4SHarish Mahendrakar return false;
722*103e46e4SHarish Mahendrakar }
723*103e46e4SHarish Mahendrakar
IsPrimariesValueValid(uint64_t value)724*103e46e4SHarish Mahendrakar bool IsPrimariesValueValid(uint64_t value) {
725*103e46e4SHarish Mahendrakar switch (value) {
726*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kReservedP0:
727*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kIturBt709P:
728*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kUnspecifiedP:
729*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kReservedP3:
730*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kIturBt470M:
731*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kIturBt470Bg:
732*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kSmpte170MP:
733*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kSmpte240MP:
734*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kFilm:
735*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kIturBt2020:
736*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kSmpteSt4281P:
737*103e46e4SHarish Mahendrakar case mkvmuxer::Colour::kJedecP22Phosphors:
738*103e46e4SHarish Mahendrakar return true;
739*103e46e4SHarish Mahendrakar }
740*103e46e4SHarish Mahendrakar return false;
741*103e46e4SHarish Mahendrakar }
742*103e46e4SHarish Mahendrakar
743*103e46e4SHarish Mahendrakar } // namespace mkvmuxer
744