1 #include "../mediafileinfo.h" 3 #include "../abstracttrack.h" 4 #include "../mp4/mp4ids.h" 5 #include "../mpegaudio/mpegaudioframe.h" 6 #include "../matroska/matroskacontainer.h" 7 #include "../id3/id3v1tag.h" 8 #include "../id3/id3v2tag.h" 9 #include "../mp4/mp4tag.h" 10 #include "../vorbis/vorbiscomment.h" 12 #include <c++utilities/conversion/binaryconversion.h> 13 #include <c++utilities/conversion/stringconversion.h> 14 #include <c++utilities/tests/testutils.h> 16 #include <cppunit/extensions/HelperMacros.h> 17 #include <cppunit/TestFixture.h> 28 using namespace Media;
46 CPPUNIT_TEST(testMp4Parsing);
47 CPPUNIT_TEST(testMp3Parsing);
48 CPPUNIT_TEST(testOggParsing);
49 CPPUNIT_TEST(testFlacParsing);
50 CPPUNIT_TEST(testMkvParsing);
52 CPPUNIT_TEST(testMp4Making);
53 CPPUNIT_TEST(testMp3Making);
54 CPPUNIT_TEST(testOggMaking);
55 CPPUNIT_TEST(testFlacMaking);
56 CPPUNIT_TEST(testMkvMaking);
58 CPPUNIT_TEST_SUITE_END();
64 void parseFile(
const string &path,
void (
OverallTests::* checkRoutine)(
void));
65 void makeFile(
const string &path,
void (
OverallTests::* modifyRoutine)(
void),
void (
OverallTests::* checkRoutine)(
void));
67 void checkMkvTestfile1();
68 void checkMkvTestfile2();
69 void checkMkvTestfile3();
70 void checkMkvTestfile4();
71 void checkMkvTestfile5();
72 void checkMkvTestfile6();
73 void checkMkvTestfile7();
74 void checkMkvTestfile8();
75 void checkMkvTestMetaData();
76 void checkMkvPaddingConstraints();
78 void checkMp4Testfile1();
79 void checkMp4Testfile2();
80 void checkMp4Testfile3();
81 void checkMp4Testfile4();
82 void checkMp4Testfile5();
83 void checkMp4TestMetaData();
84 void checkMp4PaddingConstraints();
86 void checkMp3Testfile1();
87 void checkMp3TestMetaData();
88 void checkMp3PaddingConstraints();
90 void checkOggTestfile1();
91 void checkOggTestfile2();
92 void checkOggTestMetaData();
94 void checkFlacTestfile1();
95 void checkFlacTestfile2();
97 void setMkvTestMetaData();
98 void setMp4TestMetaData();
99 void setMp3TestMetaData();
100 void setOggTestMetaData();
101 void removeAllTags();
103 void testMkvParsing();
104 void testMp4Parsing();
105 void testMp3Parsing();
106 void testOggParsing();
107 void testFlacParsing();
109 void testMkvMaking();
110 void testMp4Making();
111 void testMp3Making();
112 void testOggMaking();
113 void testFlacMaking();
124 queue<TagValue> m_preservedMetaData;
139 m_testPartNumber.assignInteger(41);
140 m_testTotalParts.assignInteger(61);
153 cerr <<
"- testing " << path << endl;
155 m_fileInfo.setPath(path);
156 m_fileInfo.reopen(
true);
157 m_fileInfo.parseEverything();
159 (this->*checkRoutine)();
170 cerr <<
"- testing " << path << endl;
172 m_fileInfo.setPath(path);
173 m_fileInfo.reopen(
true);
174 m_fileInfo.parseEverything();
176 (this->*modifyRoutine)();
178 m_fileInfo.applyChanges();
179 m_fileInfo.clearParsingResults();
181 m_fileInfo.parseEverything();
182 (this->*checkRoutine)();
184 switch(m_fileInfo.containerFormat()) {
185 case ContainerFormat::Matroska:
186 checkMkvPaddingConstraints();
189 checkMp4PaddingConstraints();
193 checkMp3PaddingConstraints();
200 remove(path.c_str());
201 remove((path +
".bak").c_str());
209 CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::Matroska);
210 const auto tracks = m_fileInfo.tracks();
211 CPPUNIT_ASSERT(tracks.size() == 2);
212 for(
const auto &track : tracks) {
213 switch(track->id()) {
216 CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::MicrosoftMpeg4);
221 CPPUNIT_ASSERT(track->samplingFrequency() == 48000);
224 CPPUNIT_FAIL(
"unknown track ID");
227 const auto tags = m_fileInfo.tags();
228 switch(m_tagStatus) {
230 CPPUNIT_ASSERT(tags.size() == 1);
231 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Title).toString() ==
"Big Buck Bunny - test 1");
233 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Comment).toString() ==
"Matroska Validation File1, basic MPEG4.2 and MP3 with only SimpleBlock");
237 checkMkvTestMetaData();
240 CPPUNIT_ASSERT(tags.size() == 0);
249 CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::Matroska);
250 const auto tracks = m_fileInfo.tracks();
251 CPPUNIT_ASSERT(tracks.size() == 2);
252 for(
const auto &track : tracks) {
253 switch(track->id()) {
257 CPPUNIT_ASSERT(track->displaySize() ==
Size(1354, 576));
262 CPPUNIT_ASSERT(track->samplingFrequency() == 48000);
265 CPPUNIT_FAIL(
"unknown track ID");
268 const auto tags = m_fileInfo.tags();
269 switch(m_tagStatus) {
271 CPPUNIT_ASSERT(tags.size() == 1);
272 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Title).toString() ==
"Elephant Dream - test 2");
274 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");
277 checkMkvTestMetaData();
280 CPPUNIT_ASSERT(tags.size() == 0);
289 CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::Matroska);
290 const auto tracks = m_fileInfo.tracks();
291 CPPUNIT_ASSERT(tracks.size() == 2);
292 for(
const auto &track : tracks) {
293 switch(track->id()) {
297 CPPUNIT_ASSERT(track->displaySize() ==
Size(1024, 576));
302 CPPUNIT_ASSERT(track->samplingFrequency() == 48000);
305 CPPUNIT_FAIL(
"unknown track ID");
308 const auto tags = m_fileInfo.tags();
309 switch(m_tagStatus) {
311 CPPUNIT_ASSERT(tags.size() == 1);
312 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Title).toString() ==
"Elephant Dream - test 3");
314 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Comment).toString() ==
"Matroska Validation File 3, header stripping on the video track and no SimpleBlock");
317 checkMkvTestMetaData();
320 CPPUNIT_ASSERT(tags.size() == 0);
329 CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::Matroska);
331 const auto tracks = m_fileInfo.tracks();
332 CPPUNIT_ASSERT(tracks.size() == 2);
333 for(
const auto &track : tracks) {
334 switch(track->id()) {
337 CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Theora);
338 CPPUNIT_ASSERT(track->displaySize() ==
Size(1280, 720));
342 CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Vorbis);
343 CPPUNIT_ASSERT(track->samplingFrequency() == 48000);
344 CPPUNIT_ASSERT(track->channelCount() == 2);
347 CPPUNIT_FAIL(
"unknown track ID");
350 const auto tags = m_fileInfo.tags();
351 switch(m_tagStatus) {
354 CPPUNIT_ASSERT(tags.size() == 0);
357 checkMkvTestMetaData();
367 CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::Matroska);
368 const auto tracks = m_fileInfo.tracks();
369 CPPUNIT_ASSERT(tracks.size() == 11);
370 for(
const auto &track : tracks) {
371 switch(track->id()) {
375 CPPUNIT_ASSERT(track->displaySize() ==
Size(1024, 576));
380 CPPUNIT_ASSERT(track->samplingFrequency() == 48000);
384 CPPUNIT_ASSERT(track->mediaType() == MediaType::Text);
386 CPPUNIT_ASSERT(track->language() ==
"ger");
392 const auto tags = m_fileInfo.tags();
393 switch(m_tagStatus) {
395 CPPUNIT_ASSERT(tags.size() == 1);
396 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Title).toString() ==
"Big Buck Bunny - test 8");
398 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Comment).toString() ==
"Matroska Validation File 8, secondary audio commentary track, misc subtitle tracks");
401 checkMkvTestMetaData();
404 CPPUNIT_ASSERT(tags.size() == 0);
413 CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::Matroska);
414 const auto tracks = m_fileInfo.tracks();
415 CPPUNIT_ASSERT(tracks.size() == 2);
416 for(
const auto &track : tracks) {
417 switch(track->id()) {
420 CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::MicrosoftMpeg4);
421 CPPUNIT_ASSERT(track->pixelSize() ==
Size(854, 480));
426 CPPUNIT_ASSERT(track->samplingFrequency() == 48000);
427 CPPUNIT_ASSERT(track->channelConfig() ==
static_cast<byte
>(MpegChannelMode::Stereo));
430 CPPUNIT_FAIL(
"unknown track ID");
433 const auto tags = m_fileInfo.tags();
434 switch(m_tagStatus) {
436 CPPUNIT_ASSERT(tags.size() == 1);
437 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Title).toString() ==
"Big Buck Bunny - test 6");
439 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");
442 checkMkvTestMetaData();
445 CPPUNIT_ASSERT(tags.size() == 0);
454 CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::Matroska);
455 const auto tracks = m_fileInfo.tracks();
456 CPPUNIT_ASSERT(tracks.size() == 2);
457 for(
const auto &track : tracks) {
458 switch(track->id()) {
462 CPPUNIT_ASSERT(track->pixelSize() ==
Size(1024, 576));
463 CPPUNIT_ASSERT(!strcmp(track->chromaFormat(),
"YUV 4:2:0"));
468 CPPUNIT_ASSERT(track->samplingFrequency() == 48000);
472 CPPUNIT_FAIL(
"unknown track ID");
475 const auto tags = m_fileInfo.tags();
476 switch(m_tagStatus) {
478 CPPUNIT_ASSERT(tags.size() == 1);
479 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Title).toString() ==
"Big Buck Bunny - test 7");
481 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Comment).toString() ==
"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");
484 checkMkvTestMetaData();
487 CPPUNIT_ASSERT(tags.size() == 0);
496 CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::Matroska);
497 const auto tracks = m_fileInfo.tracks();
498 CPPUNIT_ASSERT(tracks.size() == 2);
499 for(
const auto &track : tracks) {
500 switch(track->id()) {
504 CPPUNIT_ASSERT(track->pixelSize() ==
Size(1024, 576));
505 CPPUNIT_ASSERT(!strcmp(track->chromaFormat(),
"YUV 4:2:0"));
510 CPPUNIT_ASSERT(track->samplingFrequency() == 48000);
514 CPPUNIT_FAIL(
"unknown track ID");
517 const auto tags = m_fileInfo.tags();
518 switch(m_tagStatus) {
520 CPPUNIT_ASSERT(tags.size() == 1);
521 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Title).toString() ==
"Big Buck Bunny - test 8");
523 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Comment).toString() ==
"Matroska Validation File 8, audio missing between timecodes 6.019s and 6.360s");
526 checkMkvTestMetaData();
529 CPPUNIT_ASSERT(tags.size() == 0);
539 const auto tags = m_fileInfo.tags();
540 const auto tracks = m_fileInfo.tracks();
541 CPPUNIT_ASSERT(tags.size() == 2);
542 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Title).toString() == m_testTitle.toString());
544 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Comment).toString() == m_testComment.toString());
545 CPPUNIT_ASSERT(tags[1]->target().level() == 30);
546 CPPUNIT_ASSERT(tags[1]->target().tracks().at(0) == tracks.at(0)->id());
547 CPPUNIT_ASSERT(tags[1]->value(
KnownField::Album).toString() == m_testAlbum.toString());
548 CPPUNIT_ASSERT(tags[1]->value(KnownField::PartNumber).toInteger() == m_testPartNumber.toInteger());
549 CPPUNIT_ASSERT(tags[1]->value(KnownField::TotalParts).toInteger() == m_testTotalParts.toInteger());
552 const auto attachments = m_fileInfo.attachments();
553 CPPUNIT_ASSERT(attachments.size() == 1);
554 CPPUNIT_ASSERT(attachments[0]->mimeType() ==
"image/png");
555 CPPUNIT_ASSERT(attachments[0]->name() ==
"cover.jpg");
556 CPPUNIT_ASSERT(attachments[0]->data() !=
nullptr);
557 CPPUNIT_ASSERT(attachments[0]->data()->size() == 11964);
566 if((m_mode & 0x8) && (m_mode & 0x1)) {
567 CPPUNIT_ASSERT(m_fileInfo.paddingSize() == 4096);
568 }
else if(m_mode & 0x8) {
569 CPPUNIT_ASSERT(m_fileInfo.paddingSize() >= 1024);
570 CPPUNIT_ASSERT(m_fileInfo.paddingSize() <= (4096 + 1024));
581 const auto tracks = m_fileInfo.tracks();
582 CPPUNIT_ASSERT(tracks.size() == 1);
583 for(
const auto &track : tracks) {
584 switch(track->id()) {
588 CPPUNIT_ASSERT(track->creationTime().year() == 2012);
589 CPPUNIT_ASSERT(track->samplingFrequency() == 44100);
593 CPPUNIT_FAIL(
"unknown track ID");
596 const auto tags = m_fileInfo.tags();
597 switch(m_tagStatus) {
599 CPPUNIT_ASSERT(tags.size() == 1);
600 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Title).toString() ==
"Danse Macabre, Op.40");
602 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Genre).toString() ==
"Classical");
603 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Encoder).toString() ==
"qaac 1.32, CoreAudioToolbox 7.9.7.3, AAC-LC Encoder, TVBR q63, Quality 96");
607 checkMp4TestMetaData();
610 CPPUNIT_ASSERT(tags.size() == 0);
620 const auto tracks = m_fileInfo.tracks();
621 CPPUNIT_ASSERT(tracks.size() == 5);
622 for(
const auto &track : tracks) {
623 switch(track->id()) {
628 CPPUNIT_ASSERT(track->version() == 4);
629 CPPUNIT_ASSERT(track->creationTime().year() == 2013);
630 CPPUNIT_ASSERT(track->pixelSize() ==
Size(1920, 750));
638 CPPUNIT_ASSERT(track->language() ==
"eng");
639 CPPUNIT_ASSERT(track->creationTime().year() == 2013);
640 CPPUNIT_ASSERT(track->samplingFrequency() == 48000);
646 CPPUNIT_ASSERT(track->language() ==
"eng");
647 CPPUNIT_ASSERT(track->creationTime().year() == 2013);
651 CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::DtsHd);
652 CPPUNIT_ASSERT(track->language() ==
"eng");
653 CPPUNIT_ASSERT(track->creationTime().year() == 2013);
656 CPPUNIT_ASSERT(track->mediaType() == MediaType::Text);
657 CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::TimedText);
658 CPPUNIT_ASSERT(track->creationTime().year() == 2013);
661 CPPUNIT_FAIL(
"unknown track ID");
664 const auto tags = m_fileInfo.tags();
665 switch(m_tagStatus) {
667 CPPUNIT_ASSERT(tags.size() == 0);
670 checkMp4TestMetaData();
673 CPPUNIT_ASSERT(tags.size() == 0);
683 CPPUNIT_ASSERT(m_fileInfo.container() && m_fileInfo.container()->documentType() ==
"dash");
684 const auto tracks = m_fileInfo.tracks();
685 CPPUNIT_ASSERT(tracks.size() == 1);
686 for(
const auto &track : tracks) {
687 switch(track->id()) {
692 CPPUNIT_ASSERT(track->version() == 3.1);
693 CPPUNIT_ASSERT(track->creationTime().year() == 2014);
694 CPPUNIT_ASSERT(track->pixelSize() ==
Size(854, 480));
695 CPPUNIT_ASSERT(!strcmp(track->chromaFormat(),
"YUV 4:2:0"));
698 CPPUNIT_FAIL(
"unknown track ID");
701 const auto tags = m_fileInfo.tags();
702 switch(m_tagStatus) {
704 CPPUNIT_ASSERT(tags.size() == 0);
707 checkMp4TestMetaData();
710 CPPUNIT_ASSERT(tags.size() == 0);
720 CPPUNIT_ASSERT(m_fileInfo.container() && m_fileInfo.container()->documentType() ==
"M4A ");
721 const auto tracks = m_fileInfo.tracks();
722 CPPUNIT_ASSERT(tracks.size() == 1);
723 for(
const auto &track : tracks) {
724 switch(track->id()) {
728 CPPUNIT_ASSERT(track->creationTime().year() == 2008);
729 CPPUNIT_ASSERT(track->channelCount() == 2);
730 CPPUNIT_ASSERT(track->bitsPerSample() == 16);
733 CPPUNIT_FAIL(
"unknown track ID");
736 const auto tags = m_fileInfo.tags();
737 switch(m_tagStatus) {
739 CPPUNIT_ASSERT(tags.size() == 1);
742 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Album).toString() ==
"Don't Go Away (Apple Lossless)");
743 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Genre).toString() ==
"Alternative & Punk");
748 CPPUNIT_ASSERT(BE::toUInt64(tags.front()->value(
KnownField::Cover).dataPointer()) == 0xFFD8FFE000104A46);
753 checkMp4TestMetaData();
756 CPPUNIT_ASSERT(tags.size() == 0);
766 CPPUNIT_ASSERT(m_fileInfo.container() && m_fileInfo.container()->documentType() ==
"mp42");
767 const auto tracks = m_fileInfo.tracks();
768 CPPUNIT_ASSERT(tracks.size() == 1);
769 for(
const auto &track : tracks) {
770 switch(track->id()) {
777 CPPUNIT_ASSERT(track->creationTime().year() == 2014);
778 CPPUNIT_ASSERT(track->channelCount() == 2);
781 CPPUNIT_ASSERT(track->samplingFrequency() == 24000);
782 CPPUNIT_ASSERT(track->extensionSamplingFrequency() == 48000);
783 CPPUNIT_ASSERT(track->bitsPerSample() == 16);
786 CPPUNIT_FAIL(
"unknown track ID");
789 const auto tags = m_fileInfo.tags();
790 switch(m_tagStatus) {
792 CPPUNIT_ASSERT(tags.size() == 0);
795 checkMp4TestMetaData();
798 CPPUNIT_ASSERT(tags.size() == 0);
808 const auto tags = m_fileInfo.tags();
809 Mp4Tag *tag = m_fileInfo.mp4Tag();
810 CPPUNIT_ASSERT(tags.size() == 1);
811 CPPUNIT_ASSERT(tag !=
nullptr);
821 m_preservedMetaData.pop();
829 if((m_mode & 0x4) && (m_mode & 0x1)) {
830 CPPUNIT_ASSERT(m_fileInfo.paddingSize() == 4096);
831 }
else if(m_mode & 0x4) {
832 CPPUNIT_ASSERT(m_fileInfo.paddingSize() >= 1024);
833 CPPUNIT_ASSERT(m_fileInfo.paddingSize() <= (4096 + 1024));
844 const auto tracks = m_fileInfo.tracks();
845 CPPUNIT_ASSERT(tracks.size() == 1);
846 for(
const auto &track : tracks) {
850 CPPUNIT_ASSERT(track->channelCount() == 2);
851 CPPUNIT_ASSERT(track->channelConfig() ==
static_cast<byte
>(MpegChannelMode::JointStereo));
852 CPPUNIT_ASSERT(track->samplingFrequency() == 44100);
853 CPPUNIT_ASSERT(track->duration().seconds() == 3);
855 const auto tags = m_fileInfo.tags();
856 switch(m_tagStatus) {
858 CPPUNIT_ASSERT(m_fileInfo.id3v1Tag());
859 CPPUNIT_ASSERT(m_fileInfo.id3v2Tags().size() == 1);
860 CPPUNIT_ASSERT(tags.size() == 2);
861 for(
const auto &tag : tags) {
864 switch(tag->type()) {
865 case TagType::Id3v1Tag:
868 CPPUNIT_ASSERT(tag->value(
KnownField::Album).toString() ==
"Double Nickels On The Dime");
872 case TagType::Id3v2Tag:
873 CPPUNIT_ASSERT(tag->value(
KnownField::Title).dataEncoding() == TagTextEncoding::Utf16LittleEndian);
878 CPPUNIT_ASSERT(tag->value(
KnownField::Album).toWString() == u
"Double Nickels On The Dime");
885 CPPUNIT_ASSERT(tag->value(KnownField::Length).toTimeSpan().isNull());
894 checkMp3TestMetaData();
897 CPPUNIT_ASSERT(tags.size() == 0);
911 CPPUNIT_ASSERT(id3v1Tag = m_fileInfo.id3v1Tag());
912 CPPUNIT_ASSERT(id3v2Tag = m_fileInfo.id3v2Tags().at(0).get());
913 }
else if(m_mode & 0x8) {
914 CPPUNIT_ASSERT(id3v1Tag = m_fileInfo.id3v1Tag());
915 CPPUNIT_ASSERT(m_fileInfo.id3v2Tags().empty());
917 CPPUNIT_ASSERT(!m_fileInfo.id3v1Tag());
918 CPPUNIT_ASSERT(id3v2Tag = m_fileInfo.id3v2Tags().at(0).get());
922 for(
Tag *tag : initializer_list<Tag *>{id3v1Tag, id3v2Tag}) {
929 m_preservedMetaData.pop();
948 if(!(m_mode & 0x8)) {
949 if((m_mode & 0x4) && (m_mode & 0x1)) {
950 CPPUNIT_ASSERT(m_fileInfo.paddingSize() == 4096);
951 }
else if((m_mode & 0x4)) {
952 CPPUNIT_ASSERT(m_fileInfo.paddingSize() >= 1024);
953 CPPUNIT_ASSERT(m_fileInfo.paddingSize() <= (4096 + 1024));
967 const auto tracks = m_fileInfo.tracks();
968 CPPUNIT_ASSERT(tracks.size() == 2);
969 for(
const auto &track : tracks) {
970 switch(track->id()) {
973 CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Theora);
977 CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Vorbis);
978 CPPUNIT_ASSERT(track->channelCount() == 2);
979 CPPUNIT_ASSERT(track->samplingFrequency() == 44100);
980 CPPUNIT_ASSERT(track->duration().minutes() == 4);
983 CPPUNIT_FAIL(
"unknown track ID");
986 const auto tags = m_fileInfo.tags();
987 switch(m_tagStatus) {
989 CPPUNIT_ASSERT(tags.size() == 1);
990 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Encoder).toString() ==
"ffmpeg2theora 0.13");
995 checkOggTestMetaData();
998 CPPUNIT_ASSERT(tags.size() == 0);
1008 const auto tracks = m_fileInfo.tracks();
1009 CPPUNIT_ASSERT(tracks.size() == 1);
1010 for(
const auto &track : tracks) {
1011 switch(track->id()) {
1014 CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Opus);
1015 CPPUNIT_ASSERT(track->channelCount() == 2);
1016 CPPUNIT_ASSERT(track->samplingFrequency() == 48000);
1017 CPPUNIT_ASSERT(track->duration().minutes() == 1);
1020 CPPUNIT_FAIL(
"unknown track ID");
1023 const auto tags = m_fileInfo.tags();
1024 switch(m_tagStatus) {
1026 CPPUNIT_ASSERT(tags.size() == 1);
1027 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Encoder).toString() ==
"opusenc from opus-tools 0.1.6");
1030 checkOggTestMetaData();
1033 CPPUNIT_ASSERT(tags.size() == 0);
1043 const auto tags = m_fileInfo.tags();
1045 CPPUNIT_ASSERT(tags.size() == 1);
1046 CPPUNIT_ASSERT(tag !=
nullptr);
1056 m_preservedMetaData.pop();
1066 const auto tracks = m_fileInfo.tracks();
1067 CPPUNIT_ASSERT(tracks.size() == 1);
1068 for(
const auto &track : tracks) {
1071 CPPUNIT_ASSERT(track->channelCount() == 2);
1072 CPPUNIT_ASSERT(track->samplingFrequency() == 44100);
1073 CPPUNIT_ASSERT(track->bitsPerSample() == 16);
1074 CPPUNIT_ASSERT(track->duration().minutes() == 4);
1076 const auto tags = m_fileInfo.tags();
1077 switch(m_tagStatus) {
1080 CPPUNIT_ASSERT(tags.size() == 1);
1081 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Title).toString() ==
"Sad Song");
1083 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Album).toString() ==
"Don't Go Away (Apple Lossless)");
1084 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Genre).toString() ==
"Alternative & Punk");
1086 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Year).toString() ==
"1998");
1094 checkOggTestMetaData();
1097 CPPUNIT_ASSERT(tags.size() == 0);
1108 const auto tracks = m_fileInfo.tracks();
1109 CPPUNIT_ASSERT(tracks.size() == 1);
1110 for(
const auto &track : tracks) {
1113 CPPUNIT_ASSERT(track->channelCount() == 2);
1114 CPPUNIT_ASSERT(track->samplingFrequency() == 44100);
1115 CPPUNIT_ASSERT(track->bitsPerSample() == 16);
1116 CPPUNIT_ASSERT(track->duration().minutes() == 4);
1118 const auto tags = m_fileInfo.tags();
1119 switch(m_tagStatus) {
1121 CPPUNIT_ASSERT(tags.size() == 1);
1124 checkOggTestMetaData();
1127 CPPUNIT_ASSERT(tags.size() == 0);
1137 if(!m_fileInfo.container()->tagCount()) {
1139 m_fileInfo.container()->createTag(
TagTarget(50));
1141 Tag *firstTag = m_fileInfo.tags().at(0);
1146 trackIds.emplace_back(m_fileInfo.tracks().at(0)->id());
1147 if(
Tag *newTag = m_fileInfo.container()->createTag(
TagTarget(30, trackIds))) {
1149 newTag->setValue(KnownField::PartNumber, m_testPartNumber);
1150 newTag->setValue(KnownField::TotalParts, m_testTotalParts);
1152 CPPUNIT_FAIL(
"can not create tag");
1156 attachment->setFile(TestUtilities::testFilePath(
"matroska_wave1/logo3_256x256.png"));
1157 attachment->setMimeType(
"image/png");
1158 attachment->setName(
"cover.jpg");
1160 CPPUNIT_FAIL(
"can not create attachment");
1167 Tag *tag = m_fileInfo.container()->createTag();
1185 id3v1Tag = m_fileInfo.createId3v1Tag();
1186 id3v2Tag = m_fileInfo.createId3v2Tag();
1187 }
else if(m_mode & 0x8) {
1188 id3v1Tag = m_fileInfo.createId3v1Tag();
1189 m_fileInfo.removeAllId3v2Tags();
1191 m_fileInfo.removeId3v1Tag();
1192 id3v2Tag = m_fileInfo.createId3v2Tag();
1196 for(
Tag *tag : initializer_list<Tag *>{id3v1Tag, id3v2Tag}) {
1229 m_fileInfo.removeAllTags();
1237 cerr << endl <<
"Matroska parser" << endl;
1238 m_fileInfo.setForceFullParse(
false);
1250 #ifdef PLATFORM_UNIX 1255 void OverallTests::testMkvMaking()
1258 m_fileInfo.setForceFullParse(
true);
1261 for(m_mode = 0; m_mode != 0x100; ++m_mode) {
1263 m_fileInfo.setForceRewrite(m_mode & 0x1);
1265 m_fileInfo.setTagPosition(ElementPosition::Keep);
1267 m_fileInfo.setTagPosition(m_mode & 0x40 ? ElementPosition::BeforeData : ElementPosition::AfterData);
1273 m_fileInfo.setIndexPosition(ElementPosition::Keep);
1275 m_fileInfo.setIndexPosition(m_mode & 0x80 ? ElementPosition::BeforeData : ElementPosition::AfterData);
1277 m_fileInfo.setPreferredPadding(m_mode & 0x8 ? 4096 : 0);
1278 m_fileInfo.setMinPadding(m_mode & 0x8 ? 1024 : 0);
1279 m_fileInfo.setMaxPadding(m_mode & 0x8 ? (4096 + 1024) : static_cast<size_t>(-1));
1280 m_fileInfo.setForceTagPosition(m_mode & 0x10);
1281 m_fileInfo.setForceIndexPosition(m_mode & 0x20);
1284 list<string> testConditions;
1286 testConditions.emplace_back(
"forcing rewrite");
1290 testConditions.emplace_back(
"removing tag");
1292 testConditions.emplace_back(
"keeping tag position");
1294 }
else if(m_mode & 0x40) {
1295 testConditions.emplace_back(
"tags before data");
1297 testConditions.emplace_back(
"tags after data");
1300 testConditions.emplace_back(
"keeping index position");
1301 }
else if(m_mode & 0x80) {
1302 testConditions.emplace_back(
"index before data");
1304 testConditions.emplace_back(
"index after data");
1307 testConditions.emplace_back(
"padding constraints");
1310 testConditions.emplace_back(
"forcing tag position");
1313 testConditions.emplace_back(
"forcing index position");
1315 cerr << endl <<
"Matroska maker - testmode " << m_mode <<
": " << joinStrings(testConditions,
", ") << endl;
1318 bool remove = (m_mode & 0x40) && (m_mode & 0x2);
1338 cerr << endl <<
"MP4 parser" << endl;
1339 m_fileInfo.setForceFullParse(
false);
1348 #ifdef PLATFORM_UNIX 1353 void OverallTests::testMp4Making()
1356 m_fileInfo.setForceFullParse(
true);
1359 for(m_mode = 0; m_mode != 0x20; ++m_mode) {
1361 m_fileInfo.setForceRewrite(m_mode & 0x1);
1363 m_fileInfo.setTagPosition(ElementPosition::Keep);
1365 m_fileInfo.setTagPosition(m_mode & 0x10 ? ElementPosition::BeforeData : ElementPosition::AfterData);
1367 m_fileInfo.setIndexPosition(m_fileInfo.tagPosition());
1368 m_fileInfo.setPreferredPadding(m_mode & 0x4 ? 4096 : 0);
1369 m_fileInfo.setMinPadding(m_mode & 0x4 ? 1024 : 0);
1370 m_fileInfo.setMaxPadding(m_mode & 0x4 ? (4096 + 1024) : static_cast<size_t>(-1));
1371 m_fileInfo.setForceTagPosition(m_mode & 0x8);
1372 m_fileInfo.setForceIndexPosition(m_mode & 0x8);
1375 list<string> testConditions;
1377 testConditions.emplace_back(
"forcing rewrite");
1381 testConditions.emplace_back(
"removing tag");
1383 testConditions.emplace_back(
"keeping tag position");
1385 }
else if(m_mode & 0x10) {
1386 testConditions.emplace_back(
"tags before data");
1388 testConditions.emplace_back(
"tags after data");
1391 testConditions.emplace_back(
"padding constraints");
1394 testConditions.emplace_back(
"forcing tag position");
1396 cerr << endl <<
"MP4 maker - testmode " << m_mode <<
": " << joinStrings(testConditions,
", ") << endl;
1399 bool remove = (m_mode & 0x10) && (m_mode & 0x2);
1404 makeFile(TestUtilities::workingCopyPath(
"mtx-test-data/mp4/dash/dragon-age-inquisition-H1LkM6IVlm4-video.mp4"), modifyRoutine, &
OverallTests::checkMp4Testfile3);
1416 cerr << endl <<
"MP3 parser" << endl;
1417 m_fileInfo.setForceFullParse(
false);
1422 #ifdef PLATFORM_UNIX 1427 void OverallTests::testMp3Making()
1430 m_fileInfo.setForceFullParse(
true);
1433 for(m_mode = 0; m_mode != 0x10; ++m_mode) {
1435 m_fileInfo.setForceRewrite(m_mode & 0x1);
1436 m_fileInfo.setTagPosition(ElementPosition::Keep);
1437 m_fileInfo.setIndexPosition(ElementPosition::Keep);
1438 m_fileInfo.setPreferredPadding(m_mode & 0x4 ? 4096 : 0);
1439 m_fileInfo.setMinPadding(m_mode & 0x4 ? 1024 : 0);
1440 m_fileInfo.setMaxPadding(m_mode & 0x4 ? (4096 + 1024) : static_cast<size_t>(-1));
1441 m_fileInfo.setForceTagPosition(
false);
1442 m_fileInfo.setForceIndexPosition(
false);
1445 list<string> testConditions;
1447 testConditions.emplace_back(
"forcing rewrite");
1451 testConditions.emplace_back(
"removing tag");
1453 testConditions.emplace_back(
"ID3v1 and ID3v2");
1455 }
else if(m_mode & 0x8) {
1456 testConditions.emplace_back(
"ID3v1 only");
1458 testConditions.emplace_back(
"ID3v2 only");
1461 testConditions.emplace_back(
"padding constraints");
1463 cerr << endl <<
"MP3 maker - testmode " << m_mode <<
": " << joinStrings(testConditions,
", ") << endl;
1466 bool remove = (m_mode & 0x10) && (m_mode & 0x2);
1480 cerr << endl <<
"OGG parser" << endl;
1481 m_fileInfo.setForceFullParse(
false);
1487 #ifdef PLATFORM_UNIX 1494 void OverallTests::testOggMaking()
1497 m_fileInfo.setForceFullParse(
true);
1500 for(m_mode = 0; m_mode != 0x2; ++m_mode) {
1505 list<string> testConditions;
1507 testConditions.emplace_back(
"removing tag");
1509 testConditions.emplace_back(
"modifying tag");
1511 cerr << endl <<
"OGG maker - testmode " << m_mode <<
": " << joinStrings(testConditions,
", ") << endl;
1514 bool remove = m_mode & 0x1;
1528 cerr << endl <<
"FLAC parser" << endl;
1529 m_fileInfo.setForceFullParse(
false);
1535 #ifdef PLATFORM_UNIX 1540 void OverallTests::testFlacMaking()
1543 m_fileInfo.setForceFullParse(
true);
1546 for(m_mode = 0; m_mode != 0x2; ++m_mode) {
1550 list<string> testConditions;
1552 testConditions.emplace_back(
"removing tag");
1554 testConditions.emplace_back(
"modifying tag");
1556 cerr << endl <<
"FLAC maker - testmode " << m_mode <<
": " << joinStrings(testConditions,
", ") << endl;
1559 bool remove = m_mode & 0x1;
void checkMp3TestMetaData()
Checks whether test meta data for MP3 files has been applied correctly.
void checkOggTestfile2()
Checks "mtx-test-data/opus/v-opus.ogg".
void makeFile(const string &path, void(OverallTests::*modifyRoutine)(void), void(OverallTests::*checkRoutine)(void))
Parses the specified file, modifies it using the specified modify routine, parses the file again and ...
void checkMp3PaddingConstraints()
Checks whether padding constraints are met.
void removeAllTags()
Removes all tags.
void checkMp4PaddingConstraints()
Checks whether padding constraints are met.
void testFlacParsing()
Tests the FLAC parser via MediaFileInfo.
void checkMp4Testfile3()
Checks "mtx-test-data/mp4/dash/dragon-age-inquisition-H1LkM6IVlm4-video.mp4".
void setOggTestMetaData()
void checkMp4Testfile2()
Checks "mtx-test-data/mp4/1080p-DTS-HD-7.1.mp4".
void checkOggTestfile1()
Checks "mtx-test-data/ogg/qt4dance_medium.ogg".
void checkMkvTestfile3()
Checks "matroska_wave1/test3.mkv".
void checkMkvTestMetaData()
Checks whether test meta data for Matroska files has been applied correctly.
void checkMp4Testfile5()
Checks "mtx-test-data/aac/he-aacv2-ps.m4a".
void checkMkvTestfile6()
Checks "matroska_wave1/test6.mkv".
void checkFlacTestfile2()
Checks "flac/test.ogg" (converted from "flac/test.flac" via ffmpeg).
void checkMkvTestfile7()
Checks "matroska_wave1/test7.mkv".
void checkMkvTestfile2()
Checks "matroska_wave1/test2.mkv".
void checkMkvPaddingConstraints()
Checks whether padding constraints are met.
void checkOggTestMetaData()
Checks whether test meta data for OGG files has been applied correctly.
The OverallTests class tests reading and writing tags and parsing technical information for all suppo...
void testOggParsing()
Tests the Ogg parser via MediaFileInfo.
void checkMp3Testfile1()
Checks "mtx-test-data/mp3/id3-tag-and-xing-header.mp3".
void setMp3TestMetaData()
void checkMkvTestfile1()
Checks "matroska_wave1/test1.mkv".
void checkMp4TestMetaData()
Checks whether test meta data for MP4 files has been applied correctly.
void checkMp4Testfile4()
Checks "mtx-test-data/mp4/alac/othertest-itunes.m4a".
void setMp4TestMetaData()
void parseFile(const string &path, void(OverallTests::*checkRoutine)(void))
Parses the specified file and tests the results using the specified check routine.
void testMkvParsing()
Tests the Matroska parser via MediaFileInfo.
void testMp3Parsing()
Tests the MP3 parser via MediaFileInfo.
void checkMkvTestfile8()
Checks "matroska_wave1/test8.mkv".
void checkMkvTestfile5()
Checks "matroska_wave1/test5.mkv".
void checkMkvTestfile4()
Checks "matroska_wave1/test4.mkv".
void checkMp4Testfile1()
Checks "mtx-test-data/mp4/10-DanseMacabreOp.40.m4a".
void testMp4Parsing()
Tests the MP4 parser via MediaFileInfo.
void setMkvTestMetaData()
Creates a tag targeting the first track with some test meta data.
void setUp()
Creates some test meta data.
CPPUNIT_TEST_SUITE_REGISTRATION(OverallTests)
void checkFlacTestfile1()
Checks "flac/test.flac" (converted from "mtx-test-data/alac/othertest-itunes.m4a" via ffmpeg)...