4 #include "../abstracttrack.h" 5 #include "../mp4/mp4ids.h" 6 #include "../mp4/mp4tag.h" 7 #include "../mp4/mp4container.h" 24 void OverallTests::checkMp4Testfile1()
27 const auto tracks = m_fileInfo.tracks();
28 CPPUNIT_ASSERT(tracks.size() == 1);
29 for(
const auto &track : tracks) {
34 CPPUNIT_ASSERT_EQUAL(2012, track->creationTime().year());
35 CPPUNIT_ASSERT_EQUAL(44100u, track->samplingFrequency());
39 CPPUNIT_FAIL(
"unknown track ID");
42 const auto tags = m_fileInfo.tags();
45 CPPUNIT_ASSERT(tags.size() == 1);
46 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Title).toString() ==
"Danse Macabre, Op.40");
49 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Encoder).toString() ==
"qaac 1.32, CoreAudioToolbox 7.9.7.3, AAC-LC Encoder, TVBR q63, Quality 96");
53 checkMp4TestMetaData();
56 CPPUNIT_ASSERT_EQUAL(0_st, tracks.size());
63 void OverallTests::checkMp4Testfile2()
66 const auto tracks = m_fileInfo.tracks();
67 CPPUNIT_ASSERT_EQUAL(5_st, tracks.size());
68 for(
const auto &track : tracks) {
74 CPPUNIT_ASSERT_EQUAL(4.0, track->version());
75 CPPUNIT_ASSERT_EQUAL(2013, track->creationTime().year());
76 CPPUNIT_ASSERT(track->pixelSize() ==
Size(1920, 750));
84 CPPUNIT_ASSERT_EQUAL(
"eng"s, track->language());
85 CPPUNIT_ASSERT_EQUAL(2013, track->creationTime().year());
86 CPPUNIT_ASSERT_EQUAL(48000u, track->samplingFrequency());
92 CPPUNIT_ASSERT_EQUAL(
"eng"s, track->language());
93 CPPUNIT_ASSERT_EQUAL(2013, track->creationTime().year());
97 CPPUNIT_ASSERT_EQUAL(GeneralMediaFormat::DtsHd, track->format().general);
98 CPPUNIT_ASSERT_EQUAL(
"eng"s, track->language());
99 CPPUNIT_ASSERT_EQUAL(2013, track->creationTime().year());
102 CPPUNIT_ASSERT_EQUAL(MediaType::Text, track->mediaType());
103 CPPUNIT_ASSERT_EQUAL(GeneralMediaFormat::TimedText, track->format().general);
104 CPPUNIT_ASSERT_EQUAL(2013, track->creationTime().year());
107 CPPUNIT_FAIL(
"unknown track ID");
110 const auto tags = m_fileInfo.tags();
111 switch(m_tagStatus) {
113 CPPUNIT_ASSERT_EQUAL(0_st, tags.size());
116 checkMp4TestMetaData();
119 CPPUNIT_ASSERT_EQUAL(0_st, tags.size());
126 void OverallTests::checkMp4Testfile3()
129 CPPUNIT_ASSERT(m_fileInfo.container() && m_fileInfo.container()->documentType() ==
"dash");
130 const auto tracks = m_fileInfo.tracks();
131 CPPUNIT_ASSERT(tracks.size() == 1);
132 for(
const auto &track : tracks) {
133 switch(track->id()) {
138 CPPUNIT_ASSERT(track->version() == 3.1);
139 CPPUNIT_ASSERT(track->creationTime().year() == 2014);
140 CPPUNIT_ASSERT(track->pixelSize() ==
Size(854, 480));
141 CPPUNIT_ASSERT(!strcmp(track->chromaFormat(),
"YUV 4:2:0"));
144 CPPUNIT_FAIL(
"unknown track ID");
147 const auto tags = m_fileInfo.tags();
148 switch(m_tagStatus) {
150 CPPUNIT_ASSERT_EQUAL(0_st, tags.size());
153 checkMp4TestMetaData();
156 CPPUNIT_ASSERT_EQUAL(0_st, tags.size());
163 void OverallTests::checkMp4Testfile4()
166 CPPUNIT_ASSERT(m_fileInfo.container() && m_fileInfo.container()->documentType() ==
"M4A ");
167 const auto tracks = m_fileInfo.tracks();
168 CPPUNIT_ASSERT(tracks.size() == 1);
169 for(
const auto &track : tracks) {
170 switch(track->id()) {
174 CPPUNIT_ASSERT(track->creationTime().year() == 2008);
175 CPPUNIT_ASSERT(track->channelCount() == 2);
176 CPPUNIT_ASSERT(track->bitsPerSample() == 16);
179 CPPUNIT_FAIL(
"unknown track ID");
182 const auto tags = m_fileInfo.tags();
183 switch(m_tagStatus) {
185 CPPUNIT_ASSERT(tags.size() == 1);
188 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Album).toString() ==
"Don't Go Away (Apple Lossless)");
189 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Genre).toString() ==
"Alternative & Punk");
194 CPPUNIT_ASSERT(BE::toUInt64(tags.front()->value(
KnownField::Cover).dataPointer()) == 0xFFD8FFE000104A46);
199 checkMp4TestMetaData();
202 CPPUNIT_ASSERT_EQUAL(0_st, tracks.size());
209 void OverallTests::checkMp4Testfile5()
212 CPPUNIT_ASSERT(m_fileInfo.container() && m_fileInfo.container()->documentType() ==
"mp42");
213 const auto tracks = m_fileInfo.tracks();
214 CPPUNIT_ASSERT(tracks.size() == 1);
215 for(
const auto &track : tracks) {
216 switch(track->id()) {
223 CPPUNIT_ASSERT(track->creationTime().year() == 2014);
224 CPPUNIT_ASSERT(track->channelCount() == 2);
227 CPPUNIT_ASSERT(track->samplingFrequency() == 24000);
228 CPPUNIT_ASSERT(track->extensionSamplingFrequency() == 48000);
229 CPPUNIT_ASSERT(track->bitsPerSample() == 16);
232 CPPUNIT_FAIL(
"unknown track ID");
235 const auto tags = m_fileInfo.tags();
236 switch(m_tagStatus) {
238 CPPUNIT_ASSERT_EQUAL(0_st, tags.size());
241 checkMp4TestMetaData();
244 CPPUNIT_ASSERT_EQUAL(0_st, tags.size());
251 void OverallTests::checkMp4Testfile6()
254 const auto tracks = m_fileInfo.tracks();
256 CPPUNIT_ASSERT_EQUAL(4_st, tracks.size());
258 CPPUNIT_ASSERT_EQUAL(6_st, tracks.size());
260 bool track2Present =
false, track5Present =
false;
261 for(
const auto &track : tracks) {
262 switch(track->id()) {
267 CPPUNIT_ASSERT_EQUAL(4.0, track->version());
268 CPPUNIT_ASSERT_EQUAL(2013, track->creationTime().year());
269 CPPUNIT_ASSERT(track->pixelSize() ==
Size(1920, 750));
272 CPPUNIT_ASSERT(track2Present = !track2Present);
278 CPPUNIT_ASSERT_EQUAL(
"ger"s, track->language());
279 CPPUNIT_ASSERT_EQUAL(
"test"s, track->name());
280 CPPUNIT_ASSERT_EQUAL(2013, track->creationTime().year());
281 CPPUNIT_ASSERT_EQUAL(48000u, track->samplingFrequency());
287 CPPUNIT_ASSERT_EQUAL(
"eng"s, track->language());
288 CPPUNIT_ASSERT_EQUAL(2013, track->creationTime().year());
292 CPPUNIT_ASSERT_EQUAL(GeneralMediaFormat::DtsHd, track->format().general);
293 CPPUNIT_ASSERT_EQUAL(
"eng"s, track->language());
294 CPPUNIT_ASSERT_EQUAL(2013, track->creationTime().year());
297 CPPUNIT_ASSERT(track5Present = !track5Present);
300 CPPUNIT_ASSERT_EQUAL(2012, track->creationTime().year());
301 CPPUNIT_ASSERT_EQUAL(44100u, track->samplingFrequency());
303 CPPUNIT_ASSERT_EQUAL(
"new track"s, track->name());
306 CPPUNIT_ASSERT_EQUAL(MediaType::Text, track->mediaType());
307 CPPUNIT_ASSERT_EQUAL(GeneralMediaFormat::TimedText, track->format().general);
308 CPPUNIT_ASSERT_EQUAL(2013, track->creationTime().year());
311 CPPUNIT_FAIL(
"unknown track ID");
314 if(m_mode & Mp4TestFlags::RemoveTagOrTrack) {
315 CPPUNIT_ASSERT(!track2Present);
316 CPPUNIT_ASSERT(!track5Present);
318 CPPUNIT_ASSERT(track2Present);
319 CPPUNIT_ASSERT(track5Present);
322 CPPUNIT_ASSERT_EQUAL(0_st, m_fileInfo.tags().size());
328 void OverallTests::checkMp4TestMetaData()
331 const auto tags = m_fileInfo.tags();
332 Mp4Tag *tag = m_fileInfo.mp4Tag();
333 CPPUNIT_ASSERT(tags.size() == 1);
334 CPPUNIT_ASSERT(tag !=
nullptr);
345 m_preservedMetaData.pop();
351 void OverallTests::checkMp4Constraints()
355 CPPUNIT_ASSERT(m_fileInfo.container());
358 CPPUNIT_ASSERT_EQUAL(4096_st, m_fileInfo.paddingSize());
360 CPPUNIT_ASSERT(m_fileInfo.paddingSize() >= 1024);
361 CPPUNIT_ASSERT(m_fileInfo.paddingSize() <= (4096 + 1024));
363 if(!(m_mode &
RemoveTagOrTrack) && (m_fileInfo.container()->documentType() !=
"dash") && ((m_mode & ForceRewring) || (m_mode &
ForceTagPos))) {
364 const ElementPosition currentTagPos = m_fileInfo.container()->determineTagPosition();
365 if(currentTagPos == ElementPosition::Keep) {
366 CPPUNIT_ASSERT_EQUAL(m_expectedTagPos, m_fileInfo.container()->determineIndexPosition());
375 void OverallTests::setMp4TestMetaData()
378 Tag *tag = m_fileInfo.container()->createTag();
397 void OverallTests::alterMp4Tracks()
399 m_additionalFileInfo.setPath(TestUtilities::testFilePath(
"mtx-test-data/mp4/10-DanseMacabreOp.40.m4a"));
400 m_additionalFileInfo.reopen(
true);
401 m_additionalFileInfo.parseContainerFormat();
402 m_additionalFileInfo.parseTracks();
405 const auto &tracks = m_additionalFileInfo.tracks();
406 CPPUNIT_ASSERT_EQUAL(1_st, tracks.size());
407 CPPUNIT_ASSERT_EQUAL(TrackType::Mp4Track, tracks[0]->type());
408 auto *track =
static_cast<Mp4Track *
>(tracks[0]);
409 CPPUNIT_ASSERT(static_cast<Mp4Container *>(m_additionalFileInfo.container())->removeTrack(track));
410 CPPUNIT_ASSERT_EQUAL(0_st, m_additionalFileInfo.trackCount());
412 auto *container =
static_cast<Mp4Container *
>(m_fileInfo.container());
413 CPPUNIT_ASSERT_EQUAL(5_st, container->trackCount());
415 CPPUNIT_ASSERT_EQUAL(6_st, container->trackCount());
416 auto &secondTrack = container->tracks()[1];
417 secondTrack->setLanguage(
"ger");
418 secondTrack->setName(
"test");
426 cerr << endl <<
"MP4 parser" << endl;
427 m_fileInfo.setForceFullParse(
false);
429 parseFile(TestUtilities::testFilePath(
"mtx-test-data/mp4/10-DanseMacabreOp.40.m4a"), &OverallTests::checkMp4Testfile1);
430 parseFile(TestUtilities::testFilePath(
"mtx-test-data/mp4/1080p-DTS-HD-7.1.mp4"), &OverallTests::checkMp4Testfile2);
431 parseFile(TestUtilities::testFilePath(
"mtx-test-data/mp4/dash/dragon-age-inquisition-H1LkM6IVlm4-video.mp4"), &OverallTests::checkMp4Testfile3);
432 parseFile(TestUtilities::testFilePath(
"mtx-test-data/alac/othertest-itunes.m4a"), &OverallTests::checkMp4Testfile4);
433 parseFile(TestUtilities::testFilePath(
"mtx-test-data/aac/he-aacv2-ps.m4a"), &OverallTests::checkMp4Testfile5);
441 void OverallTests::testMp4Making()
444 m_fileInfo.setForceFullParse(
true);
447 for(m_mode = 0; m_mode != 0x20; ++m_mode) {
454 m_fileInfo.setTagPosition(ElementPosition::Keep);
456 m_fileInfo.setTagPosition(m_mode &
TagsBeforeData ? ElementPosition::BeforeData : ElementPosition::AfterData);
458 m_fileInfo.setIndexPosition(m_fileInfo.tagPosition());
460 m_fileInfo.setMinPadding(m_mode & PaddingConstraints ? 1024 : 0);
461 m_fileInfo.setMaxPadding(m_mode & PaddingConstraints ? (4096 + 1024) : static_cast<size_t>(-1));
462 m_fileInfo.setForceTagPosition(m_mode &
ForceTagPos);
463 m_fileInfo.setForceIndexPosition(m_mode & ForceTagPos);
466 list<string> testConditions;
467 if(m_mode & ForceRewring) {
468 testConditions.emplace_back(
"forcing rewrite");
470 if(m_mode & KeepTagPos) {
472 testConditions.emplace_back(
"removing tag");
474 testConditions.emplace_back(
"keeping tag position");
477 testConditions.emplace_back(
"tags before data");
479 testConditions.emplace_back(
"tags after data");
481 if(m_mode & PaddingConstraints) {
482 testConditions.emplace_back(
"padding constraints");
484 if(m_mode & ForceTagPos) {
485 testConditions.emplace_back(
"forcing tag position");
487 cerr << endl <<
"MP4 maker - testmode " << m_mode <<
": " << joinStrings(testConditions,
", ") << endl;
492 void (
OverallTests::*modifyRoutine)(void) = (m_mode &
RemoveTagOrTrack) ? &OverallTests::removeAllTags : &OverallTests::setMp4TestMetaData;
493 makeFile(TestUtilities::workingCopyPath(
"mtx-test-data/mp4/10-DanseMacabreOp.40.m4a"), modifyRoutine, &OverallTests::checkMp4Testfile1);
494 makeFile(TestUtilities::workingCopyPath(
"mtx-test-data/mp4/1080p-DTS-HD-7.1.mp4"), modifyRoutine, &OverallTests::checkMp4Testfile2);
495 makeFile(TestUtilities::workingCopyPath(
"mtx-test-data/mp4/dash/dragon-age-inquisition-H1LkM6IVlm4-video.mp4"), modifyRoutine, &OverallTests::checkMp4Testfile3);
496 makeFile(TestUtilities::workingCopyPath(
"mtx-test-data/alac/othertest-itunes.m4a"), modifyRoutine, &OverallTests::checkMp4Testfile4);
497 makeFile(TestUtilities::workingCopyPath(
"mtx-test-data/aac/he-aacv2-ps.m4a"), modifyRoutine, &OverallTests::checkMp4Testfile5);
499 modifyRoutine = (m_mode &
RemoveTagOrTrack) ? &OverallTests::removeSecondTrack : &OverallTests::alterMp4Tracks;
500 m_fileInfo.setTagPosition(ElementPosition::Keep);
501 makeFile(TestUtilities::workingCopyPath(
"mtx-test-data/mp4/1080p-DTS-HD-7.1.mp4"), modifyRoutine, &OverallTests::checkMp4Testfile6);
The OverallTests class tests reading and writing tags and parsing technical information for all suppo...
void testMp4Parsing()
Tests the MP4 parser via MediaFileInfo.