1 #include <c++utilities/chrono/format.h> 5 #include "../abstracttrack.h" 6 #include "../mpegaudio/mpegaudioframe.h" 7 #include "../mp4/mp4ids.h" 8 #include "../matroska/matroskacontainer.h" 10 #include <c++utilities/chrono/timespan.h> 11 #include <c++utilities/conversion/binaryconversion.h> 12 #include <c++utilities/conversion/stringconversion.h> 13 #include <c++utilities/io/misc.h> 38 void OverallTests::checkMkvTestfile1()
40 CPPUNIT_ASSERT_EQUAL(ContainerFormat::Matroska, m_fileInfo.containerFormat());
41 CPPUNIT_ASSERT_EQUAL(TimeSpan::fromMinutes(1) + TimeSpan::fromSeconds(27) + TimeSpan::fromMilliseconds(336), m_fileInfo.duration());
42 const auto tracks = m_fileInfo.tracks();
43 CPPUNIT_ASSERT_EQUAL(2_st, tracks.size());
44 for(
const auto &track : tracks) {
48 CPPUNIT_ASSERT_EQUAL(GeneralMediaFormat::MicrosoftMpeg4, track->format().general);
53 CPPUNIT_ASSERT_EQUAL(48000u, track->samplingFrequency());
56 CPPUNIT_FAIL(
"unknown track ID");
59 const auto tags = m_fileInfo.tags();
62 CPPUNIT_ASSERT(tags.size() == 1);
63 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Title).toString() ==
"Big Buck Bunny - test 1");
65 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Comment).toString() ==
"Matroska Validation File1, basic MPEG4.2 and MP3 with only SimpleBlock");
69 checkMkvTestMetaData();
72 CPPUNIT_ASSERT_EQUAL(0_st, tags.size());
74 CPPUNIT_ASSERT(m_fileInfo.worstNotificationTypeIncludingRelatedObjects() <= NotificationType::Information);
80 void OverallTests::checkMkvTestfile2()
82 CPPUNIT_ASSERT_EQUAL(ContainerFormat::Matroska, m_fileInfo.containerFormat());
83 CPPUNIT_ASSERT_EQUAL(TimeSpan::fromSeconds(47) + TimeSpan::fromMilliseconds(509), m_fileInfo.duration());
84 const auto tracks = m_fileInfo.tracks();
85 CPPUNIT_ASSERT_EQUAL(2_st, tracks.size());
86 for(
const auto &track : tracks) {
91 CPPUNIT_ASSERT(track->displaySize() ==
Size(1354, 576));
96 CPPUNIT_ASSERT(track->samplingFrequency() == 48000);
99 CPPUNIT_FAIL(
"unknown track ID");
102 const auto tags = m_fileInfo.tags();
103 switch(m_tagStatus) {
105 CPPUNIT_ASSERT(tags.size() == 1);
106 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Title).toString() ==
"Elephant Dream - test 2");
108 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Comment).toString() ==
"Matroska Validation File 2, 100,000 timecode scale, odd aspect ratio, and CRC-32. Codecs are AVC and AAC");
111 checkMkvTestMetaData();
114 CPPUNIT_ASSERT_EQUAL(0_st, tags.size());
116 CPPUNIT_ASSERT(m_fileInfo.worstNotificationTypeIncludingRelatedObjects() <= NotificationType::Information);
122 void OverallTests::checkMkvTestfile3()
124 CPPUNIT_ASSERT_EQUAL(ContainerFormat::Matroska, m_fileInfo.containerFormat());
125 CPPUNIT_ASSERT_EQUAL(TimeSpan::fromSeconds(49) + TimeSpan::fromMilliseconds(64), m_fileInfo.duration());
126 const auto tracks = m_fileInfo.tracks();
127 CPPUNIT_ASSERT_EQUAL(2_st, tracks.size());
128 for(
const auto &track : tracks) {
129 switch(track->id()) {
133 CPPUNIT_ASSERT(track->displaySize() ==
Size(1024, 576));
138 CPPUNIT_ASSERT(track->samplingFrequency() == 48000);
141 CPPUNIT_FAIL(
"unknown track ID");
144 const auto tags = m_fileInfo.tags();
145 switch(m_tagStatus) {
147 CPPUNIT_ASSERT(tags.size() == 1);
148 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Title).toString() ==
"Elephant Dream - test 3");
150 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Comment).toString() ==
"Matroska Validation File 3, header stripping on the video track and no SimpleBlock");
153 checkMkvTestMetaData();
156 CPPUNIT_ASSERT_EQUAL(0_st, tags.size());
158 CPPUNIT_ASSERT(m_fileInfo.worstNotificationTypeIncludingRelatedObjects() <= NotificationType::Information);
166 void OverallTests::checkMkvTestfile4()
168 CPPUNIT_ASSERT_EQUAL(ContainerFormat::Matroska, m_fileInfo.containerFormat());
169 CPPUNIT_ASSERT_EQUAL(
TimeSpan(), m_fileInfo.duration());
171 const auto tracks = m_fileInfo.tracks();
172 CPPUNIT_ASSERT_EQUAL(2_st, tracks.size());
173 for(
const auto &track : tracks) {
174 switch(track->id()) {
177 CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Theora);
178 CPPUNIT_ASSERT(track->displaySize() ==
Size(1280, 720));
182 CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Vorbis);
183 CPPUNIT_ASSERT(track->samplingFrequency() == 48000);
184 CPPUNIT_ASSERT(track->channelCount() == 2);
185 switch(m_tagStatus) {
188 CPPUNIT_ASSERT_EQUAL(
"und"s, track->language());
189 CPPUNIT_ASSERT_EQUAL(
string(), track->name());
190 CPPUNIT_ASSERT(track->isEnabled());
191 CPPUNIT_ASSERT(!track->isForced());
192 CPPUNIT_ASSERT(!track->isDefault());
195 CPPUNIT_ASSERT_EQUAL(
"ger"s, track->language());
196 CPPUNIT_ASSERT_EQUAL(
"the name"s, track->name());
197 CPPUNIT_ASSERT(track->isEnabled());
198 CPPUNIT_ASSERT(track->isForced());
199 CPPUNIT_ASSERT(track->isDefault());
204 CPPUNIT_FAIL(
"unknown track ID");
207 const auto tags = m_fileInfo.tags();
208 switch(m_tagStatus) {
211 CPPUNIT_ASSERT_EQUAL(0_st, tags.size());
214 checkMkvTestMetaData();
219 CPPUNIT_ASSERT(m_fileInfo.worstNotificationTypeIncludingRelatedObjects() <= NotificationType::Critical);
225 void OverallTests::checkMkvTestfile5()
227 CPPUNIT_ASSERT_EQUAL(ContainerFormat::Matroska, m_fileInfo.containerFormat());
228 CPPUNIT_ASSERT_EQUAL(TimeSpan::fromSeconds(46) + TimeSpan::fromMilliseconds(665), m_fileInfo.duration());
229 const auto tracks = m_fileInfo.tracks();
230 CPPUNIT_ASSERT_EQUAL(11_st, tracks.size());
231 for(
const auto &track : tracks) {
232 switch(track->id()) {
236 CPPUNIT_ASSERT(track->displaySize() ==
Size(1024, 576));
241 CPPUNIT_ASSERT(track->samplingFrequency() == 48000);
245 CPPUNIT_ASSERT(track->mediaType() == MediaType::Text);
247 CPPUNIT_ASSERT(track->language() ==
"ger");
253 const auto tags = m_fileInfo.tags();
254 switch(m_tagStatus) {
256 CPPUNIT_ASSERT(tags.size() == 1);
257 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Title).toString() ==
"Big Buck Bunny - test 8");
259 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Comment).toString() ==
"Matroska Validation File 8, secondary audio commentary track, misc subtitle tracks");
262 checkMkvTestMetaData();
265 CPPUNIT_ASSERT_EQUAL(0_st, tags.size());
267 CPPUNIT_ASSERT(m_fileInfo.worstNotificationTypeIncludingRelatedObjects() <= NotificationType::Information);
273 void OverallTests::checkMkvTestfile6()
275 CPPUNIT_ASSERT_EQUAL(ContainerFormat::Matroska, m_fileInfo.containerFormat());
276 CPPUNIT_ASSERT_EQUAL(TimeSpan::fromMinutes(1) + TimeSpan::fromSeconds(27) + TimeSpan::fromMilliseconds(336), m_fileInfo.duration());
277 const auto tracks = m_fileInfo.tracks();
278 CPPUNIT_ASSERT_EQUAL(2_st, tracks.size());
279 for(
const auto &track : tracks) {
280 switch(track->id()) {
283 CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::MicrosoftMpeg4);
284 CPPUNIT_ASSERT(track->pixelSize() ==
Size(854, 480));
289 CPPUNIT_ASSERT(track->samplingFrequency() == 48000);
290 CPPUNIT_ASSERT(track->channelConfig() ==
static_cast<byte
>(MpegChannelMode::Stereo));
293 CPPUNIT_FAIL(
"unknown track ID");
296 const auto tags = m_fileInfo.tags();
297 switch(m_tagStatus) {
299 CPPUNIT_ASSERT(tags.size() == 1);
300 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Title).toString() ==
"Big Buck Bunny - test 6");
302 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Comment).toString() ==
"Matroska Validation File 6, random length to code the size of Clusters and Blocks, no Cues for seeking");
305 checkMkvTestMetaData();
308 CPPUNIT_ASSERT_EQUAL(0_st, tags.size());
310 CPPUNIT_ASSERT(m_fileInfo.worstNotificationTypeIncludingRelatedObjects() <= NotificationType::Information);
316 void OverallTests::checkMkvTestfile7()
318 CPPUNIT_ASSERT_EQUAL(ContainerFormat::Matroska, m_fileInfo.containerFormat());
319 CPPUNIT_ASSERT_EQUAL(TimeSpan::fromSeconds(37) + TimeSpan::fromMilliseconds(43), m_fileInfo.duration());
320 const auto tracks = m_fileInfo.tracks();
321 CPPUNIT_ASSERT_EQUAL(2_st, tracks.size());
322 for(
const auto &track : tracks) {
323 switch(track->id()) {
327 CPPUNIT_ASSERT(track->pixelSize() ==
Size(1024, 576));
328 CPPUNIT_ASSERT(!strcmp(track->chromaFormat(),
"YUV 4:2:0"));
333 CPPUNIT_ASSERT(track->samplingFrequency() == 48000);
337 CPPUNIT_FAIL(
"unknown track ID");
340 const auto tags = m_fileInfo.tags();
341 switch(m_tagStatus) {
343 CPPUNIT_ASSERT_EQUAL(1_st, tags.size());
344 CPPUNIT_ASSERT_EQUAL(
"Big Buck Bunny - test 7"s, tags.front()->value(
KnownField::Title).toString());
346 CPPUNIT_ASSERT_EQUAL(
"Matroska Validation File 7, junk elements are present at the beggining or end of clusters, the parser should skip it. There is also a damaged element at 451418"s, tags.front()->value(
KnownField::Comment).toString());
349 checkMkvTestMetaData();
352 CPPUNIT_ASSERT_EQUAL(0_st, tags.size());
355 for(
const Notification ¬ification : m_fileInfo.gatherRelatedNotifications()) {
356 if(notification.type() != NotificationType::Warning) {
359 CPPUNIT_ASSERT(startsWith(notification.context(),
"parsing header of EBML element 0xEA \"cue codec state\" at"));
360 CPPUNIT_ASSERT_EQUAL(
"Data of EBML element seems to be truncated; unable to parse siblings of that element."s, notification.message());
362 CPPUNIT_ASSERT(m_fileInfo.worstNotificationTypeIncludingRelatedObjects() <= NotificationType::Warning);
368 void OverallTests::checkMkvTestfile8()
370 CPPUNIT_ASSERT_EQUAL(ContainerFormat::Matroska, m_fileInfo.containerFormat());
371 CPPUNIT_ASSERT_EQUAL(TimeSpan::fromSeconds(47) + TimeSpan::fromMilliseconds(341), m_fileInfo.duration());
372 const auto tracks = m_fileInfo.tracks();
373 CPPUNIT_ASSERT_EQUAL(2_st, tracks.size());
374 for(
const auto &track : tracks) {
375 switch(track->id()) {
379 CPPUNIT_ASSERT(track->pixelSize() ==
Size(1024, 576));
380 CPPUNIT_ASSERT(!strcmp(track->chromaFormat(),
"YUV 4:2:0"));
385 CPPUNIT_ASSERT(track->samplingFrequency() == 48000);
389 CPPUNIT_FAIL(
"unknown track ID");
392 const auto tags = m_fileInfo.tags();
393 switch(m_tagStatus) {
395 CPPUNIT_ASSERT_EQUAL(1_st, tags.size());
396 CPPUNIT_ASSERT_EQUAL(
"Big Buck Bunny - test 8"s, tags.front()->value(
KnownField::Title).toString());
398 CPPUNIT_ASSERT_EQUAL(
"Matroska Validation File 8, audio missing between timecodes 6.019s and 6.360s"s, tags.front()->value(
KnownField::Comment).toString());
401 checkMkvTestMetaData();
404 CPPUNIT_ASSERT_EQUAL(0_st, tags.size());
406 CPPUNIT_ASSERT(m_fileInfo.worstNotificationTypeIncludingRelatedObjects() <= NotificationType::Information);
412 void OverallTests::checkMkvTestfileHandbrakeChapters()
414 CPPUNIT_ASSERT_EQUAL(ContainerFormat::Matroska, m_fileInfo.containerFormat());
415 CPPUNIT_ASSERT_EQUAL(TimeSpan::fromSeconds(27) + TimeSpan::fromMilliseconds(569), m_fileInfo.duration());
416 const auto tracks = m_fileInfo.tracks();
417 CPPUNIT_ASSERT_EQUAL(2_st, tracks.size());
418 for(
const auto &track : tracks) {
419 switch(track->id()) {
423 CPPUNIT_ASSERT_EQUAL(4.0, track->version());
424 CPPUNIT_ASSERT(track->pixelSize() ==
Size(1280, 544));
425 CPPUNIT_ASSERT(track->displaySize() ==
Size(1280, 544));
426 CPPUNIT_ASSERT(track->fps() == 23);
431 CPPUNIT_ASSERT(track->samplingFrequency() == 44100);
435 CPPUNIT_FAIL(argsToString(
"unknown track ID ", track->id()));
438 const auto chapters = m_fileInfo.chapters();
439 CPPUNIT_ASSERT_EQUAL(2_st, chapters.size());
440 for(
const auto &chapter : chapters) {
441 switch(chapter->id()) {
443 CPPUNIT_ASSERT(!strcmp(chapter->names().at(0).data(),
"Kapitel 01"));
444 CPPUNIT_ASSERT_EQUAL(0l, chapter->startTime().totalTicks());
445 CPPUNIT_ASSERT_EQUAL(15, chapter->endTime().seconds());
448 CPPUNIT_ASSERT(!strcmp(chapter->names().at(0).data(),
"Kapitel 02"));
449 CPPUNIT_ASSERT_EQUAL(15, chapter->startTime().seconds());
450 CPPUNIT_ASSERT_EQUAL(27, chapter->endTime().seconds());
453 CPPUNIT_FAIL(argsToString(
"unknown chapter ID ", chapter->id()));
456 const auto tags = m_fileInfo.tags();
457 switch(m_tagStatus) {
459 CPPUNIT_ASSERT_EQUAL(2_st, tags.size());
460 CPPUNIT_ASSERT(tags[0]->target().isEmpty());
461 CPPUNIT_ASSERT_EQUAL(
""s, static_cast<MatroskaTag *>(tags[0])->value(
"CREATION_TIME").toString());
463 CPPUNIT_ASSERT_EQUAL(2_st, tags[1]->target().tracks().at(0));
464 CPPUNIT_ASSERT_EQUAL(
"eng"s, tags[1]->value(KnownField::Language).toString());
467 checkMkvTestMetaData();
470 CPPUNIT_ASSERT_EQUAL(0_st, tags.size());
472 CPPUNIT_ASSERT(m_fileInfo.worstNotificationTypeIncludingRelatedObjects() <= NotificationType::Information);
478 void OverallTests::checkMkvTestfileNestedTags()
480 CPPUNIT_ASSERT_EQUAL(ContainerFormat::Matroska, m_fileInfo.containerFormat());
481 const auto tags = m_fileInfo.tags();
482 bool generalTagFound =
false;
483 switch(m_tagStatus) {
486 CPPUNIT_ASSERT_EQUAL(5_st, tags.size());
487 for(
const Tag *tag : tags) {
488 CPPUNIT_ASSERT(tag->type() == TagType::MatroskaTag);
489 const auto *mkvTag =
static_cast<const MatroskaTag *
>(tag);
490 const auto &target = mkvTag->
target();
491 if(target.level() == 50 && target.tracks().empty()) {
492 generalTagFound =
true;
494 const auto &fields = mkvTag->fields();
496 CPPUNIT_ASSERT(artistField != fields.end());
497 CPPUNIT_ASSERT_EQUAL(
"Test artist"s, artistField->second.value().toString());
498 const auto &nestedFields = artistField->second.nestedFields();
499 CPPUNIT_ASSERT_EQUAL(1_st, nestedFields.size());
500 CPPUNIT_ASSERT_EQUAL(
"ADDRESS"s, nestedFields[0].idToString());
501 CPPUNIT_ASSERT_EQUAL(
"Test address"s, nestedFields[0].value().toString());
504 CPPUNIT_ASSERT(generalTagFound);
507 CPPUNIT_ASSERT_EQUAL(0_st, tags.size());
512 for(
const Notification ¬ification : m_fileInfo.gatherRelatedNotifications()) {
513 if(notification.type() != NotificationType::Warning) {
516 CPPUNIT_ASSERT(startsWith(notification.message(),
"\"SimpleTag\"-element contains unknown element 0x44B4 at"));
518 CPPUNIT_ASSERT(m_fileInfo.worstNotificationTypeIncludingRelatedObjects() <= NotificationType::Warning);
524 void OverallTests::checkMkvTestMetaData()
527 const auto tags = m_fileInfo.tags();
528 const auto tracks = m_fileInfo.tracks();
529 CPPUNIT_ASSERT_EQUAL(2_st, tags.size());
530 CPPUNIT_ASSERT_EQUAL(m_testTitle.toString(), tags.front()->value(
KnownField::Title).toString());
532 CPPUNIT_ASSERT_EQUAL(m_testComment.toString(), tags.front()->value(
KnownField::Comment).toString());
533 CPPUNIT_ASSERT_EQUAL(30_st, tags[1]->target().level());
534 CPPUNIT_ASSERT_EQUAL(tracks.at(0)->id(), tags[1]->target().tracks().at(0));
535 CPPUNIT_ASSERT_EQUAL(m_testAlbum.toString(), tags[1]->value(
KnownField::Album).toString());
536 CPPUNIT_ASSERT_EQUAL(m_testPartNumber.toInteger(), tags[1]->value(KnownField::PartNumber).toInteger());
537 CPPUNIT_ASSERT_EQUAL(m_testTotalParts.toInteger(), tags[1]->value(KnownField::TotalParts).toInteger());
540 const auto attachments = m_fileInfo.attachments();
541 CPPUNIT_ASSERT_EQUAL(1_st, attachments.size());
542 CPPUNIT_ASSERT(attachments[0]->mimeType() ==
"image/png");
543 CPPUNIT_ASSERT(attachments[0]->name() ==
"cover.jpg");
545 CPPUNIT_ASSERT(attachmentData !=
nullptr);
546 if (m_testCover.empty()) {
547 m_testCover = readFile(testFilePath(
"matroska_wave1/logo3_256x256.png"), 20000);
549 CPPUNIT_ASSERT_EQUAL(m_testCover.size(),
static_cast<size_t>(attachmentData->
size()));
550 istream &attachmentSteam = attachmentData->
stream();
551 attachmentSteam.seekg(attachmentData->
startOffset());
552 for (
char expectedChar : m_testCover) {
553 CPPUNIT_ASSERT_EQUAL(expectedChar, static_cast<char>(attachmentSteam.get()));
560 void OverallTests::checkMkvConstraints()
564 CPPUNIT_ASSERT(m_fileInfo.container());
567 CPPUNIT_ASSERT_EQUAL(4096_st, m_fileInfo.paddingSize());
569 CPPUNIT_ASSERT(m_fileInfo.paddingSize() >= 1024);
570 CPPUNIT_ASSERT(m_fileInfo.paddingSize() <= (4096 + 1024));
573 CPPUNIT_ASSERT_EQUAL(m_expectedTagPos, m_fileInfo.container()->determineTagPosition());
576 CPPUNIT_ASSERT_EQUAL(m_expectedIndexPos, m_fileInfo.container()->determineIndexPosition());
584 void OverallTests::setMkvTestMetaData()
586 CPPUNIT_ASSERT_EQUAL(ContainerFormat::Matroska, m_fileInfo.containerFormat());
590 const string fileName(m_fileInfo.fileName());
591 if(fileName ==
"test4.mkv") {
596 CPPUNIT_ASSERT(track);
602 }
else if(fileName ==
"handbrake-chapters-2.mkv") {
604 m_fileInfo.removeTag(m_fileInfo.tags().at(1));
606 Tag *firstTag = m_fileInfo.tags().at(0);
611 trackIds.emplace_back(m_fileInfo.tracks().at(0)->id());
612 Tag *newTag = container->createTag(
TagTarget(30, trackIds));
613 CPPUNIT_ASSERT_MESSAGE(
"create tag", newTag);
615 newTag->
setValue(KnownField::PartNumber, m_testPartNumber);
616 newTag->
setValue(KnownField::TotalParts, m_testTotalParts);
619 CPPUNIT_ASSERT_MESSAGE(
"create attachment", attachment);
620 attachment->
setFile(TestUtilities::testFilePath(
"matroska_wave1/logo3_256x256.png"));
622 attachment->
setName(
"cover.jpg");
630 void OverallTests::createMkvWithNestedTags()
633 m_nestedTagsMkvPath = workingCopyPathMode(
"mtx-test-data/mkv/nested-tags.mkv", WorkingCopyMode::NoCopy);
634 remove(m_nestedTagsMkvPath.data());
636 cerr <<
"\n\n- Create testfile \"" << m_nestedTagsMkvPath <<
"\" with mkvmerge" << endl;
637 const string tagsMkvPath(testFilePath(
"mtx-test-data/mkv/tags.mkv"));
638 const string tagsXmlPath(testFilePath(
"mkv/nested-tags.xml"));
639 const char *
const mkvmergeArgs[] = {
640 "--ui-language en_US",
641 "--output", m_nestedTagsMkvPath.data(),
642 "--no-global-tags",
"--language",
"0:und",
"--default-track",
"0:yes",
"--language",
"1:und",
"--default-track",
"1:yes",
643 "(", tagsMkvPath.data(),
")",
644 "--global-tags", tagsXmlPath.data(),
"--track-order",
"0:0,0:1",
nullptr 646 string mkvmergeOutput, mkvmergeErrors;
647 int res = execHelperApp(
"/bin/mkvmerge", mkvmergeArgs, mkvmergeOutput, mkvmergeErrors);
648 cout << mkvmergeOutput << endl;
649 cerr << mkvmergeErrors << endl;
651 cerr <<
"- failure (exit code " << res <<
"); unable to test nested tags" << endl;
652 remove(m_nestedTagsMkvPath.data());
653 m_nestedTagsMkvPath.clear();
663 cerr << endl <<
"Matroska parser" << endl;
664 m_fileInfo.setForceFullParse(
false);
666 parseFile(TestUtilities::testFilePath(
"matroska_wave1/test1.mkv"), &OverallTests::checkMkvTestfile1);
667 parseFile(TestUtilities::testFilePath(
"matroska_wave1/test2.mkv"), &OverallTests::checkMkvTestfile2);
668 parseFile(TestUtilities::testFilePath(
"matroska_wave1/test3.mkv"), &OverallTests::checkMkvTestfile3);
669 parseFile(TestUtilities::testFilePath(
"matroska_wave1/test4.mkv"), &OverallTests::checkMkvTestfile4);
670 parseFile(TestUtilities::testFilePath(
"matroska_wave1/test5.mkv"), &OverallTests::checkMkvTestfile5);
671 parseFile(TestUtilities::testFilePath(
"matroska_wave1/test6.mkv"), &OverallTests::checkMkvTestfile6);
672 parseFile(TestUtilities::testFilePath(
"matroska_wave1/test7.mkv"), &OverallTests::checkMkvTestfile7);
673 parseFile(TestUtilities::testFilePath(
"matroska_wave1/test8.mkv"), &OverallTests::checkMkvTestfile8);
674 parseFile(TestUtilities::testFilePath(
"mtx-test-data/mkv/handbrake-chapters-2.mkv"), &OverallTests::checkMkvTestfileHandbrakeChapters);
675 createMkvWithNestedTags();
676 if(!m_nestedTagsMkvPath.empty()) {
677 parseFile(m_nestedTagsMkvPath, &OverallTests::checkMkvTestfileNestedTags);
689 void OverallTests::testMkvMakingWithDifferentSettings()
692 m_fileInfo.setForceFullParse(
true);
695 for(m_mode = 0; m_mode != 0x100; ++m_mode) {
701 m_fileInfo.setTagPosition(ElementPosition::Keep);
703 m_fileInfo.setTagPosition(m_mode &
TagsBeforeData ? ElementPosition::BeforeData : ElementPosition::AfterData);
709 m_fileInfo.setIndexPosition(ElementPosition::Keep);
711 m_fileInfo.setIndexPosition(m_mode &
IndexBeforeData ? ElementPosition::BeforeData : ElementPosition::AfterData);
715 m_fileInfo.setMaxPadding(m_mode &
PaddingConstraints ? (4096 + 1024) : static_cast<size_t>(-1));
716 m_fileInfo.setForceTagPosition(m_mode &
ForceTagPos);
720 list<string> testConditions;
722 testConditions.emplace_back(
"forcing rewrite");
726 testConditions.emplace_back(
"removing tag");
728 testConditions.emplace_back(
"keeping tag position");
731 testConditions.emplace_back(
"tags before data");
733 testConditions.emplace_back(
"tags after data");
736 testConditions.emplace_back(
"keeping index position");
738 testConditions.emplace_back(
"index before data");
740 testConditions.emplace_back(
"index after data");
743 testConditions.emplace_back(
"padding constraints");
746 testConditions.emplace_back(
"forcing tag position");
749 testConditions.emplace_back(
"forcing index position");
751 cerr << endl <<
"Matroska maker - testmode " << m_mode <<
": " << joinStrings(testConditions,
", ") << endl;
755 void (
OverallTests::*modifyRoutine)(void) = (m_mode &
RemoveTag) ? &OverallTests::removeAllTags : &OverallTests::setMkvTestMetaData;
756 makeFile(TestUtilities::workingCopyPath(
"matroska_wave1/test1.mkv"), modifyRoutine, &OverallTests::checkMkvTestfile1);
757 makeFile(TestUtilities::workingCopyPath(
"matroska_wave1/test2.mkv"), modifyRoutine, &OverallTests::checkMkvTestfile2);
758 makeFile(TestUtilities::workingCopyPath(
"matroska_wave1/test3.mkv"), modifyRoutine, &OverallTests::checkMkvTestfile3);
759 makeFile(TestUtilities::workingCopyPath(
"matroska_wave1/test4.mkv"), modifyRoutine, &OverallTests::checkMkvTestfile4);
760 makeFile(TestUtilities::workingCopyPath(
"matroska_wave1/test5.mkv"), modifyRoutine, &OverallTests::checkMkvTestfile5);
761 makeFile(TestUtilities::workingCopyPath(
"matroska_wave1/test6.mkv"), modifyRoutine, &OverallTests::checkMkvTestfile6);
762 makeFile(TestUtilities::workingCopyPath(
"matroska_wave1/test7.mkv"), modifyRoutine, &OverallTests::checkMkvTestfile7);
763 makeFile(TestUtilities::workingCopyPath(
"matroska_wave1/test8.mkv"), modifyRoutine, &OverallTests::checkMkvTestfile8);
764 makeFile(TestUtilities::workingCopyPath(
"mtx-test-data/mkv/handbrake-chapters-2.mkv"), modifyRoutine, &OverallTests::checkMkvTestfileHandbrakeChapters);
772 void OverallTests::testMkvMakingNestedTags()
774 createMkvWithNestedTags();
775 if(!m_nestedTagsMkvPath.empty()) {
776 cerr << endl <<
"Matroska maker - rewrite file with nested tags" << endl;
777 m_fileInfo.setMinPadding(0);
778 m_fileInfo.setMaxPadding(0);
779 m_fileInfo.setTagPosition(ElementPosition::BeforeData);
780 m_fileInfo.setIndexPosition(ElementPosition::BeforeData);
781 makeFile(m_nestedTagsMkvPath, &OverallTests::noop, &OverallTests::checkMkvTestfileNestedTags);
The OverallTests class tests reading and writing tags and parsing technical information for all suppo...
void testMkvParsing()
Tests the Matroska parser via MediaFileInfo.