mkvmuxerutil.cc 18 KB

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